diff --git a/AUTHORS b/AUTHORS
index db1dc56..dd2b644 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -304,6 +304,7 @@
 David Spellman <dspell@amazon.com>
 David Valachovic <adenflorian@gmail.com>
 Dax Kelson <dkelson@gurulabs.com>
+Debadree Chatterjee <debadree333@gmail.com>
 Debashish Samantaray <d.samantaray@samsung.com>
 Debug Wang <debugwang@tencent.com>
 Deepak Dilip Borade <deepak.db@samsung.com>
diff --git a/DEPS b/DEPS
index 66fa8cc..73d8dbec7 100644
--- a/DEPS
+++ b/DEPS
@@ -304,19 +304,19 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '16c0f9028481fe725048ed5d55d5b613d7ce828a',
+  'skia_revision': '3e6bfdfea566b8368b10cd911499ae1bb09d3004',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'c8c08a594348bda9e69fa806b6627503371b8a3e',
+  'v8_revision': '6c3d4e0d5bfe8e8d07dd92b2d38dcb559c23c210',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'f569524452238c9857f624f167e7c1744e28900a',
+  'angle_revision': 'ba845fcf25d0d69eeefb6a86e7d86c512ea51975',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '9c9608fa94a9209f2635c1d821c3652c3fd2a5e8',
+  'swiftshader_revision': '0cc04d07ab240585873727a80b5845e30fe2a08f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -331,7 +331,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:12.20230321.0.1',
+  'fuchsia_version': 'version:12.20230321.2.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -375,7 +375,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '1eea7540584dffadf1f696e7ee3650fd1c7ecb5c',
+  'catapult_revision': '4fe34296daf80d052708c5f632a7bac54b0f538a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -431,7 +431,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'ed2eb3e9034a10934d1a2e21712010b89accc446',
+  'dawn_revision': '20b53ccc4434e78fa8c5c4f37de2caac09d8883a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -451,11 +451,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libavif
   # and whatever else without interference from each other.
-  'libavif_revision': '5d16f1f430c7053f9ea75ea33897df0dc2d2c847',
+  'libavif_revision': '24556f3c41b0efd06799da641229cff491f4a4a0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
-  'nearby_revision': '12156937ee28c595c6d07357edb599fc58e6e34d',
+  'nearby_revision': '39df20d821ba6988fa3e2aa0ae42eadf4298c617',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling securemessage
   # and whatever else without interference from each other.
@@ -467,7 +467,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'cros_components_revision': 'd3e2488a5e599be888bbac1b90f8c57db1a260fc',
+  'cros_components_revision': '19170eee4e6f65d47a32545803307dc06de1ff38',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -495,7 +495,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       '6f04403d621df9152d72185b75dd7fadfda72ef8',
+  'libcxx_revision':       'af83f5d2fada265d8b5adc0a23a29e060907b3e7',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:41fef642de70ecdcaaa26be96d56a0398f95abd4',
@@ -685,7 +685,7 @@
       'packages': [
         {
           'package': 'chromium/third_party/updater/chrome_mac_universal_prod',
-          'version': 'c7qrycwnkp4R8gi0EeUV9U8BnOE0r--LhZAC9uG6xWoC',
+          'version': 'qDhUmRj82uhWqE2eVqt12e1eJKWKgRpRjgQrBSrdyP4C',
         },
       ],
   },
@@ -790,7 +790,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '020d41089db7d2284fdb69042858b1cf849b05b0',
+    '38422c8448e725258d9ae7d36690c49d571750ae',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -979,7 +979,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': '9t50F82rctSMTgHqSy14mbIpy7lM-LZT5dhW2ENHzOAC',
+          'version': 'Xk3zPqbvCVuTuwcSd2b97hb0LA_Jo197S1RZiE_VIAsC',
       },
     ],
     'condition': 'checkout_android',
@@ -1050,7 +1050,7 @@
       'packages': [
           {
                'package': 'chromium/third_party/android_build_tools/lint',
-               'version': 'UwgKmRuzPgo_NJFKTlrK_7OSgm2s-sVVb7Uz4jER_soC',
+               'version': 'E86vFKi4re9HwIfUW9yq_Ig_hc7Vr0lcl-bO3BtPQLYC',
           },
       ],
       'condition': 'checkout_android',
@@ -1061,7 +1061,7 @@
       'packages': [
           {
                'package': 'chromium/third_party/android_build_tools/manifest_merger',
-               'version': 'lC0-JZAP05FMcCXlQn9Oej4oD6ytlLkFQEnExeLuAWkC',
+               'version': '_aoHU11YhUwqKZXVXsn5otnhI-ZVGFT7h1Z9eCcAZM0C',
           },
       ],
       'condition': 'checkout_android',
@@ -1198,7 +1198,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '2d4eb3b4566f3210b1833bc7b717dcc72855d9d5',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '529b06282255290815da45b70a43b91eec1fdbaf',
       'condition': 'checkout_chromeos',
   },
 
@@ -1230,13 +1230,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '7a8daa2f9fdaff02ee84f7e979254edb3f569353',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '479e1e9055020c8d1351bf2194d0a606aeca93d5',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '61838737ec7036888dafd02c8ec35b577cfb7f36',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '50aa78039b3b488da5d5769600d38127ee84271d',
     'condition': 'checkout_src_internal',
   },
 
@@ -1494,7 +1494,7 @@
     Var('chromium_git') + '/external/libaddressinput.git' + '@' + 'e8712e415627f22d0b00ebee8db99547077f39bd',
 
   'src/third_party/libaom/source/libaom':
-    Var('aomedia_git') + '/aom.git' + '@' +  '35410dede1a3a25d59e0704f2c139e737a6d6398',
+    Var('aomedia_git') + '/aom.git' + '@' +  '16e24831397a22504541e8ec2674e3cf219e0ac5',
 
   'src/third_party/libavif/src':
     Var('chromium_git') + '/external/github.com/AOMediaCodec/libavif.git' + '@' + Var('libavif_revision'),
@@ -1702,7 +1702,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '42426cb0e3015a13af1d85dd15ce6dca68acc452',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '1bb22965b0dc41cfe74569bedafeff6108a9fcf2',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1847,7 +1847,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@cb1ac534dea61b77554f2309f70ec33656aacc25',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@d5f7ad18e9a46685d206525f26cf5269cf6e789b',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1884,10 +1884,10 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'd1b65aa5a88f6efd900604dfcda840154e9f16e2',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'ca81780f0e959aeb07ddd7b0caa8454e0a239c7f',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '147f559d72a3c9642d192466dcaaf245cb720649',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '649c8186c7e7be64261e64e630d80986a8112794',
+    Var('webrtc_git') + '/src.git' + '@' + '0a025345fe7cc4cb5554a25c687f9b98bb15ae4a',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -1964,7 +1964,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': Var('chrome_git') + '/chrome/src-internal.git@8a78999d77824df7cda5a2a7ad4d571ed6dbc1ce',
+    'url': Var('chrome_git') + '/chrome/src-internal.git@e5beb44b3cff8c9cee1622339b2ea50bc360948a',
     'condition': 'checkout_src_internal',
   },
 
@@ -2005,7 +2005,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': '1Op4_qTMxrudfOQpSiKum7YINo9cm_3SY8xkXPdELckC',
+        'version': 'F64OcssxqyabjGLRpcDbljcEv_sa8tvyZ3NgfJve04EC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3442,17 +3442,6 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/android_deps/libs/net_sf_kxml_kxml2': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/android_deps/libs/net_sf_kxml_kxml2',
-              'version': 'version:2@2.3.0.cr1',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/android_deps/libs/org_bouncycastle_bcprov_jdk15on': {
       'packages': [
           {
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 8189e43..3684c4bb 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1612,7 +1612,6 @@
     'build/android/gyp/allot_native_libraries.pydeps',
     'build/android/gyp/apkbuilder.pydeps',
     'build/android/gyp/assert_static_initializers.pydeps',
-    'build/android/gyp/binary_baseline_profile.pydeps',
     'build/android/gyp/bytecode_processor.pydeps',
     'build/android/gyp/bytecode_rewriter.pydeps',
     'build/android/gyp/check_flag_expectations.pydeps',
diff --git a/WATCHLISTS b/WATCHLISTS
index 519efa9..289e66d 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -2904,7 +2904,7 @@
                            'csharrison+watch@chromium.org',
                            'loading-reviews+metrics@chromium.org',
                            'speed-metrics-reviews@chromium.org',
-                           'tommckee+watch@chromium.org'],
+                           'haoliuk+watch@chromium.org'],
     'panels': ['dimich@chromium.org',
                'jennb@chromium.org',
                'jianli@chromium.org'],
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 6f50b4e..640e92cf 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -16,6 +16,7 @@
 import("//chrome/android/expectations/expectations.gni")
 import("//chrome/android/trichrome.gni")
 import("//components/safe_browsing/buildflags.gni")
+import("//components/services/screen_ai/buildflags/features.gni")
 import("//components/spellcheck/spellcheck_build_features.gni")
 import("//components/supervised_user/buildflags.gni")
 import("//device/vr/buildflags/buildflags.gni")
@@ -1127,6 +1128,7 @@
     "enable_arcore=$enable_arcore",
     "enable_pdf=$enable_pdf",
     "enable_print_preview=$enable_print_preview",
+    "enable_screen_ai_service=$enable_screen_ai_service",
     "enable_vr=$enable_vr",
   ]
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwUncaughtExceptionTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwUncaughtExceptionTest.java
index dfab60d..f8ebd22 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwUncaughtExceptionTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwUncaughtExceptionTest.java
@@ -127,7 +127,7 @@
             backgroundThreadLooper.quitSafely();
         }
         mBackgroundThread.join();
-        ThreadUtils.setUiThread(null);
+        ThreadUtils.clearUiThreadForTesting();
         Thread.setDefaultUncaughtExceptionHandler(mDefaultUncaughtExceptionHandler);
     }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
index 75fff820..f8b4428 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
@@ -10,7 +10,6 @@
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SmallTest;
 
-import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
@@ -53,19 +52,11 @@
 
     @Before
     public void setUp() {
-        ThreadUtils.setUiThread(null);
-        ThreadUtils.setWillOverrideUiThread(true);
-
         // CookieManager assumes that native is loaded, but webview browser should not be loaded for
         // these tests as webview is not necessarily loaded when CookieManager is called.
         AwBrowserProcess.loadLibrary(null);
     }
 
-    @After
-    public void tearDown() {
-        ThreadUtils.setWillOverrideUiThread(false);
-    }
-
     /**
      * Called when a test wants to initiate normal Chromium process startup, after
      * doing any CookieManager calls that are supposed to happen before the UI thread
@@ -95,6 +86,7 @@
     @MediumTest
     @Feature({"AndroidWebView"})
     public void testStartup() throws Throwable {
+        ThreadUtils.setWillOverrideUiThread(true);
         TestWebServer webServer = TestWebServer.start();
         try {
             String path = "/cookie_test.html";
@@ -157,6 +149,7 @@
     @MediumTest
     @Feature({"AndroidWebView"})
     public void testShouldInterceptRequestDeadlock() throws Throwable {
+        ThreadUtils.setWillOverrideUiThread(true);
         ThreadUtils.setUiThread(Looper.getMainLooper());
         String url = "http://www.example.com";
         TestAwContentsClient contentsClient = new TestAwContentsClient() {
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 2e7c0d72..f1daaef6 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1390,6 +1390,8 @@
     "system/input_device_settings/input_device_settings_defaults.h",
     "system/input_device_settings/input_device_settings_dispatcher.cc",
     "system/input_device_settings/input_device_settings_dispatcher.h",
+    "system/input_device_settings/input_device_settings_metrics_manager.cc",
+    "system/input_device_settings/input_device_settings_metrics_manager.h",
     "system/input_device_settings/input_device_settings_pref_names.h",
     "system/input_device_settings/input_device_settings_utils.cc",
     "system/input_device_settings/input_device_settings_utils.h",
@@ -2211,6 +2213,8 @@
     "wm/desks/templates/restore_data_collector.h",
     "wm/desks/templates/saved_desk_animations.cc",
     "wm/desks/templates/saved_desk_animations.h",
+    "wm/desks/templates/saved_desk_controller.cc",
+    "wm/desks/templates/saved_desk_controller.h",
     "wm/desks/templates/saved_desk_dialog_controller.cc",
     "wm/desks/templates/saved_desk_dialog_controller.h",
     "wm/desks/templates/saved_desk_grid_view.cc",
@@ -3168,6 +3172,7 @@
     "system/input_device_settings/input_device_notifier_unittest.cc",
     "system/input_device_settings/input_device_settings_controller_unittest.cc",
     "system/input_device_settings/input_device_settings_dispatcher_unittest.cc",
+    "system/input_device_settings/input_device_settings_metrics_manager_unittest.cc",
     "system/input_device_settings/input_device_settings_utils_unittest.cc",
     "system/input_device_settings/input_device_tracker_unittest.cc",
     "system/input_device_settings/keyboard_modifier_metrics_recorder_unittest.cc",
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc
index 8b75e06e..673bba3 100644
--- a/ash/accelerators/accelerator_controller_impl.cc
+++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -436,7 +436,7 @@
   accelerator_history_->StoreCurrentAccelerator(accelerator);
 
   // Menu shouldn't be closed for an invalid accelerator.
-  AcceleratorAction* action_ptr =
+  const AcceleratorAction* action_ptr =
       accelerator_configuration_->FindAcceleratorAction(accelerator);
   return action_ptr && !base::Contains(actions_keeping_menu_open_, *action_ptr);
 }
@@ -453,7 +453,7 @@
 bool AcceleratorControllerImpl::DoesAcceleratorMatchAction(
     const ui::Accelerator& accelerator,
     AcceleratorAction action) {
-  AcceleratorAction* action_ptr =
+  const AcceleratorAction* action_ptr =
       accelerator_configuration_->FindAcceleratorAction(accelerator);
   return action_ptr && *action_ptr == action;
 }
@@ -478,20 +478,22 @@
 
 bool AcceleratorControllerImpl::AcceleratorPressed(
     const ui::Accelerator& accelerator) {
-  AcceleratorAction action =
-      accelerator_configuration_->GetAcceleratorAction(accelerator);
-  if (!CanPerformAction(action, accelerator))
+  const AcceleratorAction* action =
+      accelerator_configuration_->FindAcceleratorAction(accelerator);
+
+  if (!action || !CanPerformAction(*action, accelerator)) {
     return false;
+  }
 
   // Handling the deprecated accelerators (if any) only if action can be
   // performed.
-  if (MaybeDeprecatedAcceleratorPressed(action, accelerator) ==
+  if (MaybeDeprecatedAcceleratorPressed(*action, accelerator) ==
       AcceleratorProcessingStatus::STOP) {
     return false;
   }
 
-  PerformAction(action, accelerator);
-  return ShouldActionConsumeKeyEvent(action);
+  PerformAction(*action, accelerator);
+  return ShouldActionConsumeKeyEvent(*action);
 }
 
 bool AcceleratorControllerImpl::CanHandleAccelerators() const {
diff --git a/ash/accelerators/ash_accelerator_configuration.cc b/ash/accelerators/ash_accelerator_configuration.cc
index bdb08a5..5df2199 100644
--- a/ash/accelerators/ash_accelerator_configuration.cc
+++ b/ash/accelerators/ash_accelerator_configuration.cc
@@ -145,7 +145,19 @@
 
 bool AshAcceleratorConfiguration::IsDeprecated(
     const ui::Accelerator& accelerator) const {
-  return deprecated_accelerators_.contains(accelerator);
+  return deprecated_accelerators_to_id_.Find(accelerator);
+}
+
+const AcceleratorAction* AshAcceleratorConfiguration::FindAcceleratorAction(
+    const ui::Accelerator& accelerator) const {
+  // If the accelerator is deprecated, return the action ID first.
+  const AcceleratorAction* deprecated_action_id =
+      deprecated_accelerators_to_id_.Find(accelerator);
+  if (deprecated_action_id) {
+    return deprecated_action_id;
+  }
+
+  return accelerator_to_id_.Find(accelerator);
 }
 
 AcceleratorConfigResult AshAcceleratorConfiguration::AddUserAccelerator(
@@ -233,11 +245,16 @@
   accelerators_.clear();
   id_to_accelerators_.clear();
   accelerator_to_id_.Clear();
+  deprecated_accelerators_to_id_.Clear();
+  actions_with_deprecations_.clear();
 
   // TODO(jimmyxgong): Reset the prefs here too.
   id_to_accelerators_ = default_id_to_accelerators_cache_;
   accelerator_to_id_ = default_accelerators_to_id_cache_;
 
+  deprecated_accelerators_to_id_ = default_deprecated_accelerators_to_id_cache_;
+  actions_with_deprecations_ = default_actions_with_deprecations_cache_;
+
   UpdateAndNotifyAccelerators();
 
   return AcceleratorConfigResult::kSuccess;
@@ -251,7 +268,7 @@
 void AshAcceleratorConfiguration::Initialize(
     base::span<const AcceleratorData> accelerators) {
   accelerators_.clear();
-  deprecated_accelerators_.clear();
+  deprecated_accelerators_to_id_.Clear();
   id_to_accelerators_.clear();
   accelerator_to_id_.Clear();
   default_accelerators_to_id_cache_.Clear();
@@ -293,10 +310,15 @@
   }
 
   for (const auto& data : deprecated_accelerators) {
-    deprecated_accelerators_.emplace(data.keycode, data.modifiers);
+    deprecated_accelerators_to_id_.InsertNew(
+        {{data.keycode, data.modifiers},
+         static_cast<AcceleratorAction>(data.action)});
   }
 
-  AddAccelerators(deprecated_accelerators);
+  // Cache a copy of the default deprecated accelerators.
+  default_actions_with_deprecations_cache_ = actions_with_deprecations_;
+  default_deprecated_accelerators_to_id_cache_ = deprecated_accelerators_to_id_;
+  UpdateAndNotifyAccelerators();
 }
 
 void AshAcceleratorConfiguration::AddAccelerators(
@@ -310,7 +332,16 @@
     const ui::Accelerator& accelerator) {
   DCHECK(::features::IsShortcutCustomizationEnabled());
 
-  AcceleratorAction* found_id = accelerator_to_id_.Find(accelerator);
+  // If the accelerator is deprecated, remove it.
+  const AcceleratorAction* deprecated_action_id =
+      deprecated_accelerators_to_id_.Find(accelerator);
+  if (deprecated_action_id && *deprecated_action_id == action_id) {
+    deprecated_accelerators_to_id_.Erase(accelerator);
+    actions_with_deprecations_.erase(action_id);
+    return AcceleratorConfigResult::kSuccess;
+  }
+
+  const AcceleratorAction* found_id = accelerator_to_id_.Find(accelerator);
   auto found_accelerators_iter = id_to_accelerators_.find(action_id);
   if (found_accelerators_iter == id_to_accelerators_.end() || !found_id) {
     return AcceleratorConfigResult::kNotFound;
@@ -371,12 +402,19 @@
 }
 
 void AshAcceleratorConfiguration::UpdateAndNotifyAccelerators() {
+  // Re-populate `accelerators_` which contains all currently available
+  // accelerators and deprecated accelerators, if present.
   accelerators_.clear();
-  accelerators_.reserve(accelerator_to_id_.size());
+  accelerators_.reserve(accelerator_to_id_.size() +
+                        deprecated_accelerators_to_id_.size());
   for (const auto& [accel, action_id] : accelerator_to_id_) {
     accelerators_.push_back(accel);
   }
 
+  for (const auto& [accel, action_id] : deprecated_accelerators_to_id_) {
+    accelerators_.push_back(accel);
+  }
+
   UpdateAccelerators(id_to_accelerators_);
   NotifyAcceleratorsUpdated();
 }
diff --git a/ash/accelerators/ash_accelerator_configuration.h b/ash/accelerators/ash_accelerator_configuration.h
index 60e45e6d..d431a6a 100644
--- a/ash/accelerators/ash_accelerator_configuration.h
+++ b/ash/accelerators/ash_accelerator_configuration.h
@@ -77,23 +77,8 @@
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
-  AcceleratorAction* FindAcceleratorAction(const ui::Accelerator& accelerator) {
-    return accelerator_to_id_.Find(accelerator);
-  }
-
   const AcceleratorAction* FindAcceleratorAction(
-      const ui::Accelerator& accelerator) const {
-    return accelerator_to_id_.Find(accelerator);
-  }
-
-  AcceleratorAction& GetAcceleratorAction(const ui::Accelerator& accelerator) {
-    return accelerator_to_id_.Get(accelerator);
-  }
-
-  const AcceleratorAction& GetAcceleratorAction(
-      const ui::Accelerator& accelerator) const {
-    return accelerator_to_id_.Get(accelerator);
-  }
+      const ui::Accelerator& accelerator) const;
 
   const std::vector<ui::Accelerator>& GetAllAccelerators() {
     return accelerators_;
@@ -139,7 +124,7 @@
 
   std::vector<ui::Accelerator> accelerators_;
 
-  base::flat_set<ui::Accelerator> deprecated_accelerators_;
+  AcceleratorActionMap deprecated_accelerators_to_id_;
 
   // A map of accelerator ID's that are deprecated.
   std::map<AcceleratorActionId, const DeprecatedAcceleratorData*>
@@ -159,6 +144,9 @@
   // data is set.
   ActionIdToAcceleratorsMap default_id_to_accelerators_cache_;
   AcceleratorActionMap default_accelerators_to_id_cache_;
+  std::map<AcceleratorActionId, const DeprecatedAcceleratorData*>
+      default_actions_with_deprecations_cache_;
+  AcceleratorActionMap default_deprecated_accelerators_to_id_cache_;
 
   // List of all observer clients.
   base::ObserverList<Observer> observer_list_;
diff --git a/ash/accelerators/ash_accelerator_configuration_unittest.cc b/ash/accelerators/ash_accelerator_configuration_unittest.cc
index 195f1f0..22c18dc 100644
--- a/ash/accelerators/ash_accelerator_configuration_unittest.cc
+++ b/ash/accelerators/ash_accelerator_configuration_unittest.cc
@@ -163,7 +163,7 @@
   // overall accelerators list too.
   ExpectAllAcceleratorsEqual(expected_test_data, accelerators);
 
-  // Verify that the fetch deprecated accelerators are correct.
+  // Verify that the fetched deprecated accelerators are correct.
   std::vector<ui::Accelerator> deprecated_accelerators;
   for (const auto& accel : accelerators) {
     if (config_->IsDeprecated(accel)) {
@@ -189,6 +189,86 @@
   EXPECT_FALSE(config_->IsDeprecated(active_accelerator));
 }
 
+TEST_F(AshAcceleratorConfigurationTest,
+       RemoveAndRestoreDeprecatedAccelerators) {
+  // Test deprecated accelerators, in this case `SHOW_TASK_MANAGER` has two
+  // associated accelerators: (deprecated) ESCAPE + SHIFT and
+  // (active) ESCAPE + COMMAND.
+  const AcceleratorData initial_test_data[] = {
+      {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
+       CYCLE_FORWARD_MRU},
+      {/*trigger_on_press=*/true, ui::VKEY_TAB,
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+      {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
+       SHOW_TASK_MANAGER},
+  };
+
+  const AcceleratorData expected_test_data[] = {
+      {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
+       CYCLE_FORWARD_MRU},
+      {/*trigger_on_press=*/true, ui::VKEY_TAB,
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+      {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
+       SHOW_TASK_MANAGER},
+      {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN,
+       SHOW_TASK_MANAGER},
+  };
+
+  const DeprecatedAcceleratorData deprecated_data[] = {
+      {SHOW_TASK_MANAGER, /*uma_histogram_name=*/"deprecated.showTaskManager",
+       /*notification_message_id=*/1, /*old_shortcut_id=*/1,
+       /*new_shortcut_id=*/2, /*deprecated_enabled=*/true},
+  };
+
+  const AcceleratorData test_deprecated_accelerators[] = {
+      {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN,
+       SHOW_TASK_MANAGER},
+  };
+
+  config_->Initialize(initial_test_data);
+  config_->InitializeDeprecatedAccelerators(deprecated_data,
+                                            test_deprecated_accelerators);
+
+  const ui::Accelerator deprecated_accelerator(ui::VKEY_ESCAPE,
+                                               ui::EF_SHIFT_DOWN);
+
+  // Remove the deprecated accelerator ESCAPE + SHIFT.
+  const AcceleratorData updated_expected_test_data[] = {
+      {/*trigger_on_press=*/true, ui::VKEY_TAB, ui::EF_ALT_DOWN,
+       CYCLE_FORWARD_MRU},
+      {/*trigger_on_press=*/true, ui::VKEY_TAB,
+       ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU},
+      {/*trigger_on_press=*/true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN,
+       SHOW_TASK_MANAGER},
+  };
+  AcceleratorConfigResult result =
+      config_->RemoveAccelerator(SHOW_TASK_MANAGER, deprecated_accelerator);
+  EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
+  // Verify that the accelerator is no longer deprecated.
+  EXPECT_FALSE(config_->IsDeprecated(deprecated_accelerator));
+  EXPECT_FALSE(config_->GetDeprecatedAcceleratorData(SHOW_TASK_MANAGER));
+  ExpectAllAcceleratorsEqual(updated_expected_test_data,
+                             config_->GetAllAccelerators());
+
+  // Attempt to restore SHOW_TASK_MANAGER, expect deprecated accelerator to NOT
+  // be re-added.
+  result = config_->RestoreDefault(SHOW_TASK_MANAGER);
+  EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
+  EXPECT_FALSE(config_->IsDeprecated(deprecated_accelerator));
+  EXPECT_FALSE(config_->GetDeprecatedAcceleratorData(SHOW_TASK_MANAGER));
+  ExpectAllAcceleratorsEqual(updated_expected_test_data,
+                             config_->GetAllAccelerators());
+
+  // Now restore all accelerators, this time deprecated accelerators should be
+  // restored.
+  result = config_->RestoreAllDefaults();
+  EXPECT_EQ(AcceleratorConfigResult::kSuccess, result);
+  EXPECT_TRUE(config_->IsDeprecated(deprecated_accelerator));
+  EXPECT_EQ(deprecated_data,
+            config_->GetDeprecatedAcceleratorData(SHOW_TASK_MANAGER));
+  ExpectAllAcceleratorsEqual(expected_test_data, config_->GetAllAccelerators());
+}
+
 TEST_F(AshAcceleratorConfigurationTest, IsDefaultAccelerator) {
   const AcceleratorData test_data[] = {
       {/*trigger_on_press=*/true, ui::VKEY_ZOOM, ui::EF_CONTROL_DOWN,
diff --git a/ash/app_list/BUILD.gn b/ash/app_list/BUILD.gn
index fcdded8..e36fdcb 100644
--- a/ash/app_list/BUILD.gn
+++ b/ash/app_list/BUILD.gn
@@ -107,6 +107,8 @@
     "views/folder_header_view_delegate.h",
     "views/ghost_image_view.cc",
     "views/ghost_image_view.h",
+    "views/launcher_search_iph_view.cc",
+    "views/launcher_search_iph_view.h",
     "views/page_switcher.cc",
     "views/page_switcher.h",
     "views/paged_apps_grid_view.cc",
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index 802db3f..6a4f419c 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -11,6 +11,8 @@
 #include "ash/app_list/app_list_bubble_presenter.h"
 #include "ash/app_list/app_list_model_provider.h"
 #include "ash/app_list/app_list_presenter_impl.h"
+#include "ash/app_list/app_list_view_delegate.h"
+#include "ash/app_list/model/search/search_box_model.h"
 #include "ash/app_list/views/app_list_item_view.h"
 #include "ash/app_list/views/app_list_main_view.h"
 #include "ash/app_list/views/app_list_toast_container_view.h"
@@ -19,6 +21,7 @@
 #include "ash/app_list/views/contents_view.h"
 #include "ash/app_list/views/search_box_view.h"
 #include "ash/assistant/assistant_controller_impl.h"
+#include "ash/assistant/model/assistant_ui_model.h"
 #include "ash/assistant/ui/assistant_view_delegate.h"
 #include "ash/assistant/util/assistant_util.h"
 #include "ash/assistant/util/deep_link_util.h"
@@ -324,18 +327,26 @@
   return client_->GetNotifier();
 }
 
+std::unique_ptr<ScopedIphSession>
+AppListControllerImpl::CreateLauncherSearchIphSession() {
+  if (!client_) {
+    return nullptr;
+  }
+  return client_->CreateLauncherSearchIphSession();
+}
+
 void AppListControllerImpl::SetActiveModel(int profile_id,
                                            AppListModel* model,
                                            SearchModel* search_model) {
   profile_id_ = profile_id;
   model_provider_->SetActiveModel(model, search_model);
-  UpdateAssistantVisibility();
+  UpdateSearchBoxUiVisibilities();
 }
 
 void AppListControllerImpl::ClearActiveModel() {
   profile_id_ = kAppListInvalidProfileID;
   model_provider_->ClearActiveModel();
-  UpdateAssistantVisibility();
+  UpdateSearchBoxUiVisibilities();
 }
 
 void AppListControllerImpl::DismissAppList() {
@@ -848,16 +859,16 @@
 
 void AppListControllerImpl::OnAssistantStatusChanged(
     assistant::AssistantStatus status) {
-  UpdateAssistantVisibility();
+  UpdateSearchBoxUiVisibilities();
 }
 
 void AppListControllerImpl::OnAssistantSettingsEnabled(bool enabled) {
-  UpdateAssistantVisibility();
+  UpdateSearchBoxUiVisibilities();
 }
 
 void AppListControllerImpl::OnAssistantFeatureAllowedChanged(
     assistant::AssistantAllowedState state) {
-  UpdateAssistantVisibility();
+  UpdateSearchBoxUiVisibilities();
 }
 
 void AppListControllerImpl::OnDisplayConfigurationChanged() {
@@ -883,7 +894,7 @@
 }
 
 void AppListControllerImpl::OnAssistantReady() {
-  UpdateAssistantVisibility();
+  UpdateSearchBoxUiVisibilities();
 }
 
 void AppListControllerImpl::OnUiVisibilityChanged(
@@ -1187,7 +1198,7 @@
 }
 
 void AppListControllerImpl::ViewShown(int64_t display_id) {
-  UpdateAssistantVisibility();
+  UpdateSearchBoxUiVisibilities();
 
   if (client_)
     client_->ViewShown(display_id);
@@ -1608,9 +1619,15 @@
   return model_provider_->search_model();
 }
 
-void AppListControllerImpl::UpdateAssistantVisibility() {
+void AppListControllerImpl::UpdateSearchBoxUiVisibilities() {
   GetSearchModel()->search_box()->SetShowAssistantButton(
       IsAssistantAllowedAndEnabled());
+
+  if (!client_) {
+    return;
+  }
+
+  client_->QueryWouldTriggerLauncherSearchIph();
 }
 
 int64_t AppListControllerImpl::GetDisplayIdToShowAppListOn() {
diff --git a/ash/app_list/app_list_controller_impl.h b/ash/app_list/app_list_controller_impl.h
index c98b620b..0a58206c 100644
--- a/ash/app_list/app_list_controller_impl.h
+++ b/ash/app_list/app_list_controller_impl.h
@@ -16,6 +16,7 @@
 #include "ash/ash_export.h"
 #include "ash/assistant/model/assistant_ui_model_observer.h"
 #include "ash/display/window_tree_host_manager.h"
+#include "ash/public/cpp/app_list/app_list_client.h"
 #include "ash/public/cpp/app_list/app_list_controller.h"
 #include "ash/public/cpp/app_list/app_list_model_delegate.h"
 #include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
@@ -144,6 +145,8 @@
 
   // AppListViewDelegate:
   AppListNotifier* GetNotifier() override;
+  std::unique_ptr<ash::ScopedIphSession> CreateLauncherSearchIphSession()
+      override;
   void StartAssistant() override;
   void StartSearch(const std::u16string& raw_query) override;
   void StartZeroStateSearch(base::OnceClosure callback,
@@ -347,8 +350,9 @@
 
   std::unique_ptr<AppListItem> CreateAppListItem(
       std::unique_ptr<AppListItemMetadata> metadata);
-  // Update the visibility of Assistant functionality.
-  void UpdateAssistantVisibility();
+
+  // Update the visibility of UIs controlled by `SearchBoxModel`.
+  void UpdateSearchBoxUiVisibilities();
 
   int64_t GetDisplayIdToShowAppListOn();
 
diff --git a/ash/app_list/app_list_test_view_delegate.cc b/ash/app_list/app_list_test_view_delegate.cc
index 38488d18..8a497ab77 100644
--- a/ash/app_list/app_list_test_view_delegate.cc
+++ b/ash/app_list/app_list_test_view_delegate.cc
@@ -196,6 +196,11 @@
   return nullptr;
 }
 
+std::unique_ptr<ScopedIphSession>
+AppListTestViewDelegate::CreateLauncherSearchIphSession() {
+  return nullptr;
+}
+
 void AppListTestViewDelegate::RecordAppLaunched(
     ash::AppListLaunchedFrom launched_from) {
   RecordAppListAppLaunched(launched_from, app_list_view_state_,
diff --git a/ash/app_list/app_list_test_view_delegate.h b/ash/app_list/app_list_test_view_delegate.h
index 9da3d23..ab2fe8bf 100644
--- a/ash/app_list/app_list_test_view_delegate.h
+++ b/ash/app_list/app_list_test_view_delegate.h
@@ -16,6 +16,7 @@
 #include "ash/app_list/app_list_view_delegate.h"
 #include "ash/app_list/model/app_list_test_model.h"
 #include "ash/app_list/model/search/search_model.h"
+#include "ash/public/cpp/app_list/app_list_client.h"
 #include "ash/public/cpp/app_list/app_list_types.h"
 #include "base/functional/callback_forward.h"
 #include "ui/base/models/simple_menu_model.h"
@@ -102,6 +103,7 @@
   bool AppListTargetVisibility() const override;
   bool IsInTabletMode() override;
   AppListNotifier* GetNotifier() override;
+  std::unique_ptr<ScopedIphSession> CreateLauncherSearchIphSession() override;
   void LoadIcon(const std::string& app_id) override {}
   bool HasValidProfile() const override;
   bool ShouldHideContinueSection() const override;
diff --git a/ash/app_list/app_list_view_delegate.h b/ash/app_list/app_list_view_delegate.h
index d42a2790..adf74a7a 100644
--- a/ash/app_list/app_list_view_delegate.h
+++ b/ash/app_list/app_list_view_delegate.h
@@ -11,9 +11,11 @@
 
 #include "ash/app_list/app_list_metrics.h"
 #include "ash/assistant/ui/assistant_view_delegate.h"
+#include "ash/public/cpp/app_list/app_list_client.h"
 #include "ash/public/cpp/app_list/app_list_types.h"
 #include "ash/public/cpp/ash_public_export.h"
 #include "base/functional/callback_forward.h"
+#include "base/memory/weak_ptr.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/rect.h"
@@ -38,6 +40,13 @@
   // delegate.
   virtual AppListNotifier* GetNotifier() = 0;
 
+  // Creates a `ScopedIphSession` for interacting with LauncherSearchHelpUi
+  // feature. A caller must show an IPH UI after this returns a session. This
+  // returns nullptr if `feature_engagement::Tracker::ShouldTriggerHelpUI`
+  // returns false.
+  virtual std::unique_ptr<ScopedIphSession>
+  CreateLauncherSearchIphSession() = 0;
+
   // Invoked to start a new Google Assistant session.
   virtual void StartAssistant() = 0;
 
diff --git a/ash/app_list/model/search/search_box_model.cc b/ash/app_list/model/search/search_box_model.cc
index 555eb2f..354ea966 100644
--- a/ash/app_list/model/search/search_box_model.cc
+++ b/ash/app_list/model/search/search_box_model.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "ash/app_list/model/search/search_box_model_observer.h"
+#include "ash/public/cpp/app_list/app_list_client.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 
@@ -24,6 +25,18 @@
     observer.ShowAssistantChanged();
 }
 
+void SearchBoxModel::SetWouldTriggerIph(bool would_trigger_iph) {
+  if (would_trigger_iph_ == would_trigger_iph) {
+    return;
+  }
+
+  would_trigger_iph_ = would_trigger_iph;
+
+  for (auto& observer : observers_) {
+    observer.OnWouldTriggerIphChanged();
+  }
+}
+
 void SearchBoxModel::SetSearchEngineIsGoogle(bool is_google) {
   if (is_google == search_engine_is_google_)
     return;
diff --git a/ash/app_list/model/search/search_box_model.h b/ash/app_list/model/search/search_box_model.h
index 46b6846..d44a6c5 100644
--- a/ash/app_list/model/search/search_box_model.h
+++ b/ash/app_list/model/search/search_box_model.h
@@ -6,6 +6,8 @@
 #define ASH_APP_LIST_MODEL_SEARCH_SEARCH_BOX_MODEL_H_
 
 #include "ash/app_list/model/app_list_model_export.h"
+#include "ash/public/cpp/app_list/app_list_client.h"
+#include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 
 namespace ash {
@@ -24,6 +26,9 @@
   void SetShowAssistantButton(bool show);
   bool show_assistant_button() const { return show_assistant_button_; }
 
+  void SetWouldTriggerIph(bool would_trigger_iph);
+  bool would_trigger_iph() const { return would_trigger_iph_; }
+
   void SetSearchEngineIsGoogle(bool is_google);
   bool search_engine_is_google() const { return search_engine_is_google_; }
 
@@ -34,6 +39,11 @@
   bool search_engine_is_google_ = false;
   bool show_assistant_button_ = false;
 
+  // `would_trigger_iph_` indicates whether we should START showing an IPH or
+  // not. This can be set to false while an IPH is being shown and the IPH
+  // should be kept showing.
+  bool would_trigger_iph_ = false;
+
   base::ObserverList<SearchBoxModelObserver> observers_;
 };
 
diff --git a/ash/app_list/model/search/search_box_model_observer.h b/ash/app_list/model/search/search_box_model_observer.h
index 6ba5e45..47584322 100644
--- a/ash/app_list/model/search/search_box_model_observer.h
+++ b/ash/app_list/model/search/search_box_model_observer.h
@@ -19,6 +19,10 @@
   // Invoked when whether to show Assistant is changed.
   virtual void ShowAssistantChanged() = 0;
 
+  // Invoked when whether an IPH should be triggered or not have been
+  // changed.
+  virtual void OnWouldTriggerIphChanged() = 0;
+
  protected:
   ~SearchBoxModelObserver() override = default;
 };
diff --git a/ash/app_list/model/search/search_model.cc b/ash/app_list/model/search/search_model.cc
index 948f813..0bc77d83 100644
--- a/ash/app_list/model/search/search_model.cc
+++ b/ash/app_list/model/search/search_model.cc
@@ -23,6 +23,10 @@
   search_box_->SetSearchEngineIsGoogle(is_google);
 }
 
+void SearchModel::SetWouldTriggerLauncherSearchIph(bool would_trigger) {
+  search_box_->SetWouldTriggerIph(would_trigger);
+}
+
 std::vector<SearchResult*> SearchModel::FilterSearchResultsByFunction(
     SearchResults* results,
     const base::RepeatingCallback<bool(const SearchResult&)>& result_filter,
diff --git a/ash/app_list/model/search/search_model.h b/ash/app_list/model/search/search_model.h
index 64142dd..b9ca4d6 100644
--- a/ash/app_list/model/search/search_model.h
+++ b/ash/app_list/model/search/search_model.h
@@ -39,6 +39,9 @@
     return search_box_->search_engine_is_google();
   }
 
+  void SetWouldTriggerLauncherSearchIph(bool would_trigger);
+  bool would_trigger_iph() const { return search_box_->would_trigger_iph(); }
+
   // Filter the given |results| by those which |result_filter| returns true for.
   // The returned list is truncated to |max_results|.
   static std::vector<SearchResult*> FilterSearchResultsByFunction(
diff --git a/ash/app_list/test_app_list_client.cc b/ash/app_list/test_app_list_client.cc
index 6c47494c..043887f 100644
--- a/ash/app_list/test_app_list_client.cc
+++ b/ash/app_list/test_app_list_client.cc
@@ -83,6 +83,13 @@
   return nullptr;
 }
 
+void TestAppListClient::QueryWouldTriggerLauncherSearchIph() {}
+
+std::unique_ptr<ScopedIphSession>
+TestAppListClient::CreateLauncherSearchIphSession() {
+  return nullptr;
+}
+
 std::vector<TestAppListClient::SearchResultActionId>
 TestAppListClient::GetAndResetInvokedResultActions() {
   std::vector<SearchResultActionId> result;
diff --git a/ash/app_list/test_app_list_client.h b/ash/app_list/test_app_list_client.h
index f5e6722..1103f1e 100644
--- a/ash/app_list/test_app_list_client.h
+++ b/ash/app_list/test_app_list_client.h
@@ -59,6 +59,8 @@
       const std::string& setting_name,
       const std::map<std::string, int>& values) override {}
   AppListNotifier* GetNotifier() override;
+  void QueryWouldTriggerLauncherSearchIph() override;
+  std::unique_ptr<ScopedIphSession> CreateLauncherSearchIphSession() override;
   void LoadIcon(int profile_id, const std::string& app_id) override {}
   ash::AppListSortOrder GetPermanentSortingOrder() const override;
   void CommitTemporarySortOrder() override;
diff --git a/ash/app_list/views/app_list_bubble_view.cc b/ash/app_list/views/app_list_bubble_view.cc
index 8e6c47a..44740ca 100644
--- a/ash/app_list/views/app_list_bubble_view.cc
+++ b/ash/app_list/views/app_list_bubble_view.cc
@@ -485,6 +485,9 @@
       }
       a11y_announcer_->AnnounceAppListShown();
       MaybeFocusAndActivateSearchBox();
+      // As `current_page_` is reset to `kNone` in `OnHideAnimationEnded`, we
+      // can expect that this gets called every time a launcher gets shown.
+      search_box_view_->SetIsIphAllowed(true);
       break;
     case AppListBubblePage::kSearch:
       if (previous_page == AppListBubblePage::kApps) {
@@ -495,6 +498,7 @@
         search_page_->SetVisible(true);
       }
       MaybeFocusAndActivateSearchBox();
+      search_box_view_->SetIsIphAllowed(false);
       break;
     case AppListBubblePage::kAssistant:
       if (showing_folder_)
@@ -509,6 +513,7 @@
       search_box_view_->SetSearchBoxActive(false,
                                            /*event_type=*/ui::ET_UNKNOWN);
       assistant_page_->RequestFocus();
+      search_box_view_->SetIsIphAllowed(false);
       break;
   }
 }
@@ -754,6 +759,7 @@
   apps_page_->SetVisible(true);
   search_page_->SetVisible(false);
   assistant_page_->SetVisible(false);
+  search_box_view_->SetIsIphAllowed(false);
 
   is_hiding_ = false;
   if (on_hide_animation_ended_)
diff --git a/ash/app_list/views/app_list_toast_view.cc b/ash/app_list/views/app_list_toast_view.cc
index 5f9a0b7..9a37ea0 100644
--- a/ash/app_list/views/app_list_toast_view.cc
+++ b/ash/app_list/views/app_list_toast_view.cc
@@ -205,9 +205,7 @@
   bubble_utils::ApplyStyle(title_label_, TypographyToken::kCrosBody2);
   title_label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
   title_label_->SetMultiLine(true);
-  // TODO(crbug/682266): This is a temporary fix for the issue where the multi
-  // line label appears cut-off.
-  title_label_->SetMaximumWidth(GetExpandedTitleLabelWidth());
+  SetTitleLabelMaximumWidth();
 
   layout_manager_->SetFlexForView(label_container_, 1);
 }
@@ -409,10 +407,18 @@
 }
 
 int AppListToastView::GetExpandedTitleLabelWidth() {
+  // TODO(b/274260097): Investigate to use size() or GetPreferredSize().
   const int icon_width = icon_ ? icon_->size().width() : 0;
-  const int button_width = toast_button_ ? toast_button_->size().width() : 0;
+  const int button_width =
+      toast_button_ ? toast_button_->GetPreferredSize().width() : 0;
   return GetPreferredSize().width() - kInteriorMargin.width() - icon_width -
          button_width - kTitleContainerMargin.width();
 }
 
+void AppListToastView::SetTitleLabelMaximumWidth() {
+  // TODO(crbug/682266): This is a temporary fix for the issue where the multi
+  // line label appears cut-off.
+  title_label_->SetMaximumWidth(GetExpandedTitleLabelWidth());
+}
+
 }  // namespace ash
diff --git a/ash/app_list/views/app_list_toast_view.h b/ash/app_list/views/app_list_toast_view.h
index a485166..38a8780 100644
--- a/ash/app_list/views/app_list_toast_view.h
+++ b/ash/app_list/views/app_list_toast_view.h
@@ -117,6 +117,16 @@
   views::LabelButton* toast_button() const { return toast_button_; }
   views::Button* close_button() const { return close_button_; }
 
+  // TODO(b/274524838): Sets the maximum width of the `title_label_`.
+  // When any of the values in the `GetExpandedTitleLabelWidth()` changes, need
+  // to recalculate the width.
+  // It is possible that this view automatically recalculate the width when
+  // detect any changes. But for simplicity, the caller needs to call this
+  // method after set the button or icon.
+  void SetTitleLabelMaximumWidth();
+
+  views::Label* GetTitleLabelForTesting() const { return title_label_; }
+
  private:
   class ToastPillButton : public PillButton {
    public:
diff --git a/ash/app_list/views/assistant/assistant_main_stage.cc b/ash/app_list/views/assistant/assistant_main_stage.cc
index 16b674c..3693794 100644
--- a/ash/app_list/views/assistant/assistant_main_stage.cc
+++ b/ash/app_list/views/assistant/assistant_main_stage.cc
@@ -194,6 +194,9 @@
       std::make_unique<AssistantZeroStateView>(delegate_));
   zero_state_view_->SetPaintToLayer();
   zero_state_view_->layer()->SetFillsBoundsOpaquely(false);
+  // Expand the height of the `zero_state_view_` to the host height.
+  stack_layout->SetRespectDimensionForView(
+      zero_state_view_, StackLayout::RespectDimension::kWidth);
 
   return content_layout_container;
 }
diff --git a/ash/app_list/views/launcher_search_iph_view.cc b/ash/app_list/views/launcher_search_iph_view.cc
new file mode 100644
index 0000000..2dafe00
--- /dev/null
+++ b/ash/app_list/views/launcher_search_iph_view.cc
@@ -0,0 +1,55 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/app_list/views/launcher_search_iph_view.h"
+
+#include <memory>
+#include <utility>
+
+#include "ash/public/cpp/app_list/app_list_client.h"
+#include "ui/gfx/font_list.h"
+#include "ui/gfx/text_constants.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/box_layout.h"
+
+namespace ash {
+namespace {
+constexpr int kVerticalInset = 20;
+constexpr int kHorizontalInset = 24;
+
+constexpr int kTitleTextFontSize = 20;
+constexpr int kDescriptionTextFontSize = 16;
+
+constexpr char16_t kTitleTextPlaceholder[] = u"Title text";
+constexpr char16_t kDescriptionTextPlaceholder[] = u"Description text";
+}  // namespace
+
+LauncherSearchIphView::LauncherSearchIphView(
+    std::unique_ptr<ScopedIphSession> scoped_iph_session)
+    : scoped_iph_session_(std::move(scoped_iph_session)) {
+  SetID(kViewId);
+
+  SetLayoutManager(std::make_unique<views::BoxLayout>(
+      views::BoxLayout::Orientation::kVertical,
+      gfx::Insets::VH(kVerticalInset, kHorizontalInset)));
+
+  raw_ptr<views::Label> title_label =
+      AddChildView(std::make_unique<views::Label>(kTitleTextPlaceholder));
+  title_label->SetFontList(gfx::FontList().DeriveWithSizeDelta(
+      kTitleTextFontSize - gfx::FontList().GetFontSize()));
+  title_label->SetLineHeight(kTitleTextFontSize);
+  title_label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_TO_HEAD);
+
+  raw_ptr<views::Label> description_label =
+      AddChildView(std::make_unique<views::Label>(kDescriptionTextPlaceholder));
+  description_label->SetFontList(gfx::FontList().DeriveWithSizeDelta(
+      kDescriptionTextFontSize - gfx::FontList().GetFontSize()));
+  description_label->SetLineHeight(kDescriptionTextFontSize);
+  description_label->SetHorizontalAlignment(
+      gfx::HorizontalAlignment::ALIGN_TO_HEAD);
+}
+
+LauncherSearchIphView::~LauncherSearchIphView() = default;
+
+}  // namespace ash
diff --git a/ash/app_list/views/launcher_search_iph_view.h b/ash/app_list/views/launcher_search_iph_view.h
new file mode 100644
index 0000000..155c863
--- /dev/null
+++ b/ash/app_list/views/launcher_search_iph_view.h
@@ -0,0 +1,31 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_APP_LIST_VIEWS_LAUNCHER_SEARCH_IPH_VIEW_H_
+#define ASH_APP_LIST_VIEWS_LAUNCHER_SEARCH_IPH_VIEW_H_
+
+#include <memory>
+
+#include "ash/public/cpp/app_list/app_list_client.h"
+#include "ui/views/view.h"
+
+namespace ash {
+
+class LauncherSearchIphView : public views::View {
+ public:
+  static constexpr int kViewId = 1;
+
+  explicit LauncherSearchIphView(
+      std::unique_ptr<ScopedIphSession> scoped_iph_session);
+  ~LauncherSearchIphView() override;
+
+ private:
+  std::unique_ptr<ScopedIphSession> scoped_iph_session_;
+
+  base::WeakPtrFactory<LauncherSearchIphView> weak_ptr_factory_{this};
+};
+
+}  // namespace ash
+
+#endif  // ASH_APP_LIST_VIEWS_LAUNCHER_SEARCH_IPH_VIEW_H_
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc
index 5ac4eba..09d919d 100644
--- a/ash/app_list/views/search_box_view.cc
+++ b/ash/app_list/views/search_box_view.cc
@@ -10,10 +10,12 @@
 #include <vector>
 
 #include "ash/app_list/app_list_metrics.h"
+#include "ash/app_list/app_list_model_provider.h"
 #include "ash/app_list/app_list_util.h"
 #include "ash/app_list/app_list_view_delegate.h"
 #include "ash/app_list/model/search/search_box_model.h"
 #include "ash/app_list/model/search/search_model.h"
+#include "ash/app_list/views/launcher_search_iph_view.h"
 #include "ash/app_list/views/result_selection_controller.h"
 #include "ash/app_list/views/search_box_view_delegate.h"
 #include "ash/app_list/views/search_result_base_view.h"
@@ -233,6 +235,8 @@
   assistant_button->SetAccessibleName(assistant_button_label);
   assistant_button->SetTooltipText(assistant_button_label);
   SetShowAssistantButton(search_box_model->show_assistant_button());
+
+  UpdateIphViewVisibility();
 }
 
 SearchBoxView::~SearchBoxView() {
@@ -293,6 +297,11 @@
   ResetForShow();
   UpdateSearchIcon();
   ShowAssistantChanged();
+
+  // `UpdateIphViewVisibility` expect that `AppListModelProvider` returns the
+  // new model.
+  CHECK(search_model == AppListModelProvider::Get()->search_model());
+  UpdateIphViewVisibility();
 }
 
 void SearchBoxView::UpdateKeyboardVisibility() {
@@ -790,6 +799,16 @@
   return kBubbleLauncherSearchBoxButtonSizeDip;
 }
 
+void SearchBoxView::SetIsIphAllowed(bool iph_allowed) {
+  if (is_iph_allowed_ == iph_allowed) {
+    return;
+  }
+
+  is_iph_allowed_ = iph_allowed;
+
+  UpdateIphViewVisibility();
+}
+
 void SearchBoxView::CloseButtonPressed() {
   delegate_->CloseButtonPressed();
 }
@@ -1195,6 +1214,36 @@
                              ->show_assistant_button());
 }
 
+void SearchBoxView::UpdateIphViewVisibility() {
+  const bool would_trigger_iph =
+      AppListModelProvider::Get()->search_model()->would_trigger_iph();
+  const bool is_iph_showing = iph_view() != nullptr;
+
+  const bool should_show_iph =
+      is_iph_allowed_ && (would_trigger_iph || is_iph_showing);
+
+  if (should_show_iph == is_iph_showing) {
+    return;
+  }
+
+  if (should_show_iph) {
+    std::unique_ptr<ScopedIphSession> scoped_iph_session =
+        view_delegate_->CreateLauncherSearchIphSession();
+    if (!scoped_iph_session) {
+      return;
+    }
+
+    SetIphView(
+        std::make_unique<LauncherSearchIphView>(std::move(scoped_iph_session)));
+  } else {
+    DeleteIphView();
+  }
+}
+
+void SearchBoxView::OnWouldTriggerIphChanged() {
+  UpdateIphViewVisibility();
+}
+
 bool SearchBoxView::ShouldProcessAutocomplete() {
   // IME sets composition text while the user is typing, so avoid handling
   // autocomplete in this case to avoid conflicts.
diff --git a/ash/app_list/views/search_box_view.h b/ash/app_list/views/search_box_view.h
index bc2a65d8..d56a9192 100644
--- a/ash/app_list/views/search_box_view.h
+++ b/ash/app_list/views/search_box_view.h
@@ -161,6 +161,9 @@
   int GetSearchBoxIconSize();
   int GetSearchBoxButtonSize();
 
+  // Sets whether an IPH can be shown now or not.
+  void SetIsIphAllowed(bool iph_allowed);
+
  private:
   class FocusRingLayer;
 
@@ -183,6 +186,9 @@
   // Updates the search box placeholder text and accessible name.
   void UpdatePlaceholderTextAndAccessibleName();
 
+  // Updates the visibility of an IPH view.
+  void UpdateIphViewVisibility();
+
   // Notifies SearchBoxViewDelegate that the autocomplete text is valid.
   void AcceptAutocompleteText();
 
@@ -209,6 +215,7 @@
   // Overridden from SearchBoxModelObserver:
   void SearchEngineChanged() override;
   void ShowAssistantChanged() override;
+  void OnWouldTriggerIphChanged() override;
 
   // Updates search_box() for the |selected_result|. Should be called when the
   // selected search result changes.
@@ -250,6 +257,9 @@
   // The corner radius of the search box background.
   int corner_radius_ = 0;
 
+  // Whether an IPH is allowed to be shown or not.
+  bool is_iph_allowed_ = false;
+
   // Set by SearchResultPageView when the accessibility selection moves to a
   // search result view - the value is the ID of the currently selected result
   // view.
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index a5d0628e8..282094f 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -6363,12 +6363,15 @@
       <message name="IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_TITLE" desc="The title of dialog that appears when there is a connection error trying to stream app">
         Can't stream apps
       </message>
-      <message name="IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_MAIN_TEXT" desc="The main description in the dialog that appears when there is a connection error trying to stream app">
-        This network doesn't support streaming apps from your phone. Try turning on your phone's hotspot. Learn more.
+      <message name="IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_MAIN_TEXT" desc="The main description in the dialog that appears when there is a connection error trying to stream app">
+        This network doesn't support streaming apps from your phone. Try using your phone's hotspot. <ph name="LEARN_MORE">$1<ex>Learn more</ex></ph>
       </message>
       <message name="IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_TURN_ON_HOTSPOT" desc="The button in the dialog that appears when there is a connection error trying to stream app to turn on hotspot">
         Turn on hotspot
       </message>
+      <message name="IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_OK_TEXT" desc="Confirm button on the connection error dialog to acknowledge.">
+        Ok
+      </message>
 
       <!-- Deferred update dialog -->
       <message name="IDS_DEFERRED_UPDATE_DIALOG_TITLE" desc="Title of the dialog for notifying deferred update available to be applied.">
diff --git a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_MAIN_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_MAIN_TEXT.png.sha1
new file mode 100644
index 0000000..518a9357
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_MAIN_TEXT.png.sha1
@@ -0,0 +1 @@
+fc6d2fc17ebc565b4dc3025fa68ad7335a79a9a0
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_OK_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_OK_TEXT.png.sha1
new file mode 100644
index 0000000..518a9357
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_OK_TEXT.png.sha1
@@ -0,0 +1 @@
+fc6d2fc17ebc565b4dc3025fa68ad7335a79a9a0
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_MAIN_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_MAIN_TEXT.png.sha1
deleted file mode 100644
index 89f8cfb..0000000
--- a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_MAIN_TEXT.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-d51a7b6fe868ca874bcde99c4ddc0404fdfac611
\ No newline at end of file
diff --git a/ash/assistant/ui/DEPS b/ash/assistant/ui/DEPS
index 156d4f5..885562b 100644
--- a/ash/assistant/ui/DEPS
+++ b/ash/assistant/ui/DEPS
@@ -1,6 +1,7 @@
 noparent = True
 
 include_rules = [
+  "+ash/app_list/views/app_list_toast_view.h",
   "+ash/assistant/model",
   "+ash/assistant/ui",
   "+ash/assistant/util",
diff --git a/ash/assistant/ui/assistant_view_ids.h b/ash/assistant/ui/assistant_view_ids.h
index 892369e..07eb469 100644
--- a/ash/assistant/ui/assistant_view_ids.h
+++ b/ash/assistant/ui/assistant_view_ids.h
@@ -27,6 +27,7 @@
   kMainStage,
   kFooterView,
   kGreetingLabel,
+  kLearnMoreToast,
   kOptInView,
   kProgressIndicator,
   kQueryView,
diff --git a/ash/assistant/ui/main_stage/assistant_zero_state_view.cc b/ash/assistant/ui/main_stage/assistant_zero_state_view.cc
index 325c7f99..0efe2f6 100644
--- a/ash/assistant/ui/main_stage/assistant_zero_state_view.cc
+++ b/ash/assistant/ui/main_stage/assistant_zero_state_view.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "ash/app_list/views/app_list_toast_view.h"  //nogncheck
 #include "ash/assistant/model/assistant_ui_model.h"
 #include "ash/assistant/ui/assistant_ui_constants.h"
 #include "ash/assistant/ui/assistant_view_delegate.h"
@@ -15,9 +16,11 @@
 #include "ash/assistant/ui/main_stage/assistant_onboarding_view.h"
 #include "ash/constants/ash_features.h"
 #include "ash/public/cpp/assistant/assistant_state.h"
+#include "ash/public/cpp/assistant/controller/assistant_controller.h"
 #include "ash/public/cpp/assistant/controller/assistant_ui_controller.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_id.h"
+#include "base/strings/string_piece.h"
 #include "chromeos/ash/services/assistant/public/cpp/features.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -26,8 +29,10 @@
 #include "ui/views/background.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/label.h"
-#include "ui/views/layout/fill_layout.h"
+#include "ui/views/layout/box_layout.h"
 #include "ui/views/view.h"
+#include "ui/views/view_class_properties.h"
+#include "url/gurl.h"
 
 namespace ash {
 
@@ -37,6 +42,11 @@
 constexpr int kGreetingLabelTopMarginDip = 28;
 constexpr int kOnboardingViewTopMarginDip = 48;
 
+constexpr base::StringPiece kLearnMoreUrl =
+    "https://support.google.com/chromebook?p=assistant";
+constexpr auto kToastMarginDip = gfx::Insets::TLBR(0, 24, 4, 24);
+constexpr auto kToastPreferredSizeDip = gfx::Size(496, 64);
+
 }  // namespace
 
 AssistantZeroStateView::AssistantZeroStateView(AssistantViewDelegate* delegate)
@@ -95,8 +105,9 @@
 
 void AssistantZeroStateView::InitLayout() {
   // Layout.
-  auto* layout = SetLayoutManager(std::make_unique<views::FillLayout>());
-  layout->SetIncludeHiddenViews(false);
+  views::BoxLayout* layout =
+      SetLayoutManager(std::make_unique<views::BoxLayout>(
+          views::BoxLayout::Orientation::kVertical));
 
   // Onboarding.
   onboarding_view_ =
@@ -119,6 +130,26 @@
   greeting_label_->SetMultiLine(true);
   greeting_label_->SetText(
       l10n_util::GetStringUTF16(IDS_ASH_ASSISTANT_PROMPT_DEFAULT));
+
+  if (assistant::features::IsAssistantLearnMoreEnabled()) {
+    // Spacer.
+    auto* spacer = AddChildView(std::make_unique<views::View>());
+    layout->SetFlexForView(spacer, 1);
+
+    // Learn more toast.
+    // TODO(b/274527683, b/274525194): add i18n and a11y supports.
+    learn_more_toast_ = AddChildView(
+        AppListToastView::Builder(u"Learn more about Google Assistant")
+            .SetButton(l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE),
+                       base::BindRepeating(
+                           &AssistantZeroStateView::OnLearnMoreButtonPressed,
+                           base::Unretained(this)))
+            .Build());
+    learn_more_toast_->SetID(AssistantViewID::kLearnMoreToast);
+    learn_more_toast_->SetProperty(views::kMarginsKey, kToastMarginDip);
+    learn_more_toast_->SetPreferredSize(kToastPreferredSizeDip);
+    learn_more_toast_->SetTitleLabelMaximumWidth();
+  }
 }
 
 void AssistantZeroStateView::UpdateLayout() {
@@ -127,4 +158,8 @@
   greeting_label_->SetVisible(!show_onboarding);
 }
 
+void AssistantZeroStateView::OnLearnMoreButtonPressed() {
+  AssistantController::Get()->OpenUrl(GURL(kLearnMoreUrl));
+}
+
 }  // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_zero_state_view.h b/ash/assistant/ui/main_stage/assistant_zero_state_view.h
index 9a2e781..540a9a7 100644
--- a/ash/assistant/ui/main_stage/assistant_zero_state_view.h
+++ b/ash/assistant/ui/main_stage/assistant_zero_state_view.h
@@ -9,6 +9,7 @@
 #include "ash/public/cpp/assistant/controller/assistant_controller.h"
 #include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
 #include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
 #include "base/scoped_observation.h"
 #include "ui/views/view.h"
 
@@ -18,6 +19,7 @@
 
 namespace ash {
 
+class AppListToastView;
 class AssistantOnboardingView;
 class AssistantViewDelegate;
 
@@ -50,6 +52,7 @@
  private:
   void InitLayout();
   void UpdateLayout();
+  void OnLearnMoreButtonPressed();
 
   // Owned by AssistantController.
   AssistantViewDelegate* const delegate_;
@@ -57,6 +60,7 @@
   // Owned by view hierarchy;
   AssistantOnboardingView* onboarding_view_ = nullptr;
   views::Label* greeting_label_ = nullptr;
+  base::raw_ptr<AppListToastView> learn_more_toast_ = nullptr;
 
   base::ScopedObservation<AssistantController, AssistantControllerObserver>
       assistant_controller_observation_{this};
diff --git a/ash/assistant/ui/main_stage/assistant_zero_state_view_unittest.cc b/ash/assistant/ui/main_stage/assistant_zero_state_view_unittest.cc
index 3f8410c..8635d5d 100644
--- a/ash/assistant/ui/main_stage/assistant_zero_state_view_unittest.cc
+++ b/ash/assistant/ui/main_stage/assistant_zero_state_view_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "ash/assistant/ui/main_stage/assistant_zero_state_view.h"
 
+#include "ash/app_list/views/app_list_toast_view.h"
 #include "ash/assistant/test/assistant_ash_test_base.h"
 #include "ash/assistant/ui/assistant_ui_constants.h"
 #include "ash/assistant/ui/assistant_view_ids.h"
@@ -14,6 +15,7 @@
 #include "ash/shell.h"
 #include "ash/style/dark_light_mode_controller_impl.h"
 #include "base/test/scoped_feature_list.h"
+#include "chromeos/ash/services/assistant/public/cpp/features.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/chromeos/styles/cros_styles.h"
@@ -64,5 +66,130 @@
                                 /*use_debug_colors=*/false));
 }
 
+TEST_F(AssistantZeroStateViewUnittest, ZeroStateViewIsVisible) {
+  ShowAssistantUi();
+
+  AssistantZeroStateView* zero_state_view =
+      static_cast<AssistantZeroStateView*>(
+          page_view()->GetViewByID(AssistantViewID::kZeroStateView));
+  ASSERT_TRUE(zero_state_view->GetVisible());
+}
+
+TEST_F(AssistantZeroStateViewUnittest, ZeroStateViewIsNotVisibleAfterResponse) {
+  ShowAssistantUi();
+
+  AssistantZeroStateView* zero_state_view =
+      static_cast<AssistantZeroStateView*>(
+          page_view()->GetViewByID(AssistantViewID::kZeroStateView));
+  ASSERT_TRUE(zero_state_view->GetVisible());
+
+  MockTextInteraction().WithTextResponse("The response");
+  ASSERT_FALSE(zero_state_view->GetVisible());
+}
+
+TEST_F(AssistantZeroStateViewUnittest, LearnMoreToastViewIsNotVisible) {
+  base::test::ScopedFeatureList feature_list_;
+  feature_list_.InitAndDisableFeature(
+      assistant::features::kEnableAssistantLearnMore);
+
+  ShowAssistantUi();
+
+  AppListToastView* learn_more_toast = static_cast<AppListToastView*>(
+      page_view()->GetViewByID(AssistantViewID::kLearnMoreToast));
+  ASSERT_FALSE(learn_more_toast);
+}
+
+TEST_F(AssistantZeroStateViewUnittest, LearnMoreToastViewIsVisible) {
+  base::test::ScopedFeatureList scoped_feature_list(
+      assistant::features::kEnableAssistantLearnMore);
+
+  ShowAssistantUi();
+
+  AppListToastView* learn_more_toast = static_cast<AppListToastView*>(
+      page_view()->GetViewByID(AssistantViewID::kLearnMoreToast));
+  ASSERT_TRUE(learn_more_toast);
+  ASSERT_TRUE(learn_more_toast->GetVisible());
+  ASSERT_TRUE(learn_more_toast->IsDrawn());
+}
+
+TEST_F(AssistantZeroStateViewUnittest,
+       LearnMoreToastViewIsNotVisibleAfterResponse) {
+  base::test::ScopedFeatureList scoped_feature_list(
+      assistant::features::kEnableAssistantLearnMore);
+
+  ShowAssistantUi();
+
+  AppListToastView* learn_more_toast = static_cast<AppListToastView*>(
+      page_view()->GetViewByID(AssistantViewID::kLearnMoreToast));
+  ASSERT_TRUE(learn_more_toast);
+  ASSERT_TRUE(learn_more_toast->GetVisible());
+
+  MockTextInteraction().WithTextResponse("The response");
+  ASSERT_FALSE(learn_more_toast->IsDrawn());
+}
+
+TEST_F(AssistantZeroStateViewUnittest, LearnMoreToastTitleLabelMaxWidth) {
+  base::test::ScopedFeatureList scoped_feature_list(
+      assistant::features::kEnableAssistantLearnMore);
+
+  ShowAssistantUi();
+
+  AppListToastView* learn_more_toast = static_cast<AppListToastView*>(
+      page_view()->GetViewByID(AssistantViewID::kLearnMoreToast));
+  ASSERT_TRUE(learn_more_toast);
+  ASSERT_TRUE(learn_more_toast->GetVisible());
+
+  learn_more_toast->SetTitle(u"Short title single line");
+  learn_more_toast->toast_button()->SetText(u"Button with long text");
+  views::Label* title_label = learn_more_toast->GetTitleLabelForTesting();
+  int max_width_with_long_button_text = title_label->GetMaximumWidth();
+
+  learn_more_toast->toast_button()->SetText(u"text");
+  learn_more_toast->SetTitleLabelMaximumWidth();
+  int max_width_with_short_button_text = title_label->GetMaximumWidth();
+  EXPECT_GT(max_width_with_short_button_text, max_width_with_long_button_text);
+}
+
+TEST_F(AssistantZeroStateViewUnittest, ThemeDarkLightModeForToast) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatures(
+      {chromeos::features::kDarkLightMode,
+       assistant::features::kEnableAssistantLearnMore},
+      {});
+
+  auto* dark_light_mode_controller = DarkLightModeControllerImpl::Get();
+  dark_light_mode_controller->OnActiveUserPrefServiceChanged(
+      Shell::Get()->session_controller()->GetActivePrefService());
+  const bool initial_dark_mode_status =
+      dark_light_mode_controller->IsDarkModeEnabled();
+
+  ShowAssistantUi();
+
+  AppListToastView* learn_more_toast = static_cast<AppListToastView*>(
+      page_view()->GetViewByID(AssistantViewID::kLearnMoreToast));
+  ASSERT_TRUE(learn_more_toast);
+  ASSERT_TRUE(learn_more_toast->GetVisible());
+
+  views::Label* title_label = learn_more_toast->GetTitleLabelForTesting();
+
+  EXPECT_FALSE(title_label->background());
+  EXPECT_EQ(title_label->GetEnabledColor(),
+            cros_styles::ResolveColor(cros_styles::ColorName::kTextColorPrimary,
+                                      /*is_dark_mode=*/initial_dark_mode_status,
+                                      /*use_debug_colors=*/false));
+
+  // Switch the color mode.
+  dark_light_mode_controller->ToggleColorMode();
+  ASSERT_NE(initial_dark_mode_status,
+            dark_light_mode_controller->IsDarkModeEnabled());
+
+  EXPECT_FALSE(title_label->background());
+  EXPECT_EQ(
+      title_label->GetEnabledColor(),
+      cros_styles::ResolveColor(cros_styles::ColorName::kTextColorPrimary,
+                                /*is_dark_mode=*/!initial_dark_mode_status,
+                                /*use_debug_colors=*/false));
+}
+
 }  // namespace
 }  // namespace ash
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 87a1452d..56f74bc 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -759,11 +759,12 @@
 // Enables Device End Of Lifetime incentive notifications.
 BASE_FEATURE(kEolIncentive, "EolIncentive", base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::FeatureParam<EolIncentiveType>::Option eol_incentive_options[] = {
-    {EolIncentiveType::kNoOffer, "no_offer"},
-    {EolIncentiveType::kOffer, "offer"}};
-const base::FeatureParam<EolIncentiveType> kEolIncentiveTypeParam{
-    &kEolIncentive, "incentive_type", EolIncentiveType::kNoOffer,
+const base::FeatureParam<EolIncentiveParam>::Option eol_incentive_options[] = {
+    {EolIncentiveParam::kNoOffer, "no_offer"},
+    {EolIncentiveParam::kOffer, "offer"},
+    {EolIncentiveParam::kOfferWithWarning, "offer_with_warning"}};
+const base::FeatureParam<EolIncentiveParam> kEolIncentiveParam{
+    &kEolIncentive, "incentive_type", EolIncentiveParam::kNoOffer,
     &eol_incentive_options};
 
 // Enable or disable support for touchpad with haptic feedback.
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 36bf1784..0311d44 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -230,9 +230,9 @@
 BASE_DECLARE_FEATURE(kEnrollmentNudgingForTesting);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kEolWarningNotifications);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kEolIncentive);
-enum class EolIncentiveType { kNoOffer, kOffer };
+enum class EolIncentiveParam { kNoOffer, kOffer, kOfferWithWarning };
 COMPONENT_EXPORT(ASH_CONSTANTS)
-extern const base::FeatureParam<EolIncentiveType> kEolIncentiveTypeParam;
+extern const base::FeatureParam<EolIncentiveParam> kEolIncentiveParam;
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kExoHapticFeedbackSupport);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kExoLinuxDmabufV3);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kExoLinuxDmabufV4);
diff --git a/ash/events/OWNERS b/ash/events/OWNERS
index 385efa91..9bd82353 100644
--- a/ash/events/OWNERS
+++ b/ash/events/OWNERS
@@ -1,3 +1,3 @@
 per-file accessibility_event_rewriter*=file://ash/accessibility/OWNERS
 per-file select_to_speak_event_handler*=file://ash/accessibility/OWNERS
-per-file keyboard_capability*=zentaro@chromium.org
+per-file keyboard_capability*=zentaro@chromium.org,dpad@google.com
diff --git a/ash/events/accessibility_event_rewriter_unittest.cc b/ash/events/accessibility_event_rewriter_unittest.cc
index 82e41540..51479c50 100644
--- a/ash/events/accessibility_event_rewriter_unittest.cc
+++ b/ash/events/accessibility_event_rewriter_unittest.cc
@@ -13,6 +13,7 @@
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "base/check_op.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
@@ -137,7 +138,7 @@
   void SetModifierRemapping(const std::string& pref_name,
                             ui::mojom::ModifierKey value) {
     DCHECK_NE(ui::mojom::ModifierKey::kIsoLevel5ShiftMod3, value);
-    modifier_remapping_[pref_name] = static_cast<int>(value);
+    modifier_remapping_[pref_name] = value;
   }
 
   bool RewriteEventForChromeVox(
@@ -175,17 +176,20 @@
   // ui::EventRewriterChromeOS::Delegate:
   bool RewriteModifierKeys() override { return true; }
   void SuppressModifierKeyRewrites(bool should_suppress) override {}
-  bool RewriteMetaTopRowKeyComboEvents() const override { return true; }
+  bool RewriteMetaTopRowKeyComboEvents(int device_id) const override {
+    return true;
+  }
   void SuppressMetaTopRowKeyComboRewrites(bool should_suppress) override {}
 
-  bool GetKeyboardRemappedPrefValue(const std::string& pref_name,
-                                    int* value) const override {
+  absl::optional<ui::mojom::ModifierKey> GetKeyboardRemappedModifierValue(
+      int device_id,
+      ui::mojom::ModifierKey modifier_key,
+      const std::string& pref_name) const override {
     auto it = modifier_remapping_.find(pref_name);
     if (it == modifier_remapping_.end())
-      return false;
+      return absl::nullopt;
 
-    *value = it->second;
-    return true;
+    return it->second;
   }
 
   bool TopRowKeysAreFunctionKeys(int device_id) const override { return false; }
@@ -202,7 +206,7 @@
     return false;
   }
 
-  std::map<std::string, int> modifier_remapping_;
+  std::map<std::string, ui::mojom::ModifierKey> modifier_remapping_;
 };
 
 // The delegate should not intercept events when spoken feedback is disabled.
@@ -547,7 +551,7 @@
   void SetModifierRemapping(const std::string& pref_name,
                             ui::mojom::ModifierKey value) {
     DCHECK_NE(ui::mojom::ModifierKey::kIsoLevel5ShiftMod3, value);
-    modifier_remapping_[pref_name] = static_cast<int>(value);
+    modifier_remapping_[pref_name] = value;
   }
 
   const std::map<int, std::set<ui::InputDeviceType>> GetKeyCodesToCapture() {
@@ -570,17 +574,20 @@
   // ui::EventRewriterChromeOS::Delegate:
   bool RewriteModifierKeys() override { return true; }
   void SuppressModifierKeyRewrites(bool should_suppress) override {}
-  bool RewriteMetaTopRowKeyComboEvents() const override { return true; }
+  bool RewriteMetaTopRowKeyComboEvents(int device_id) const override {
+    return true;
+  }
   void SuppressMetaTopRowKeyComboRewrites(bool should_suppress) override {}
 
-  bool GetKeyboardRemappedPrefValue(const std::string& pref_name,
-                                    int* value) const override {
+  absl::optional<ui::mojom::ModifierKey> GetKeyboardRemappedModifierValue(
+      int device_id,
+      ui::mojom::ModifierKey modifier_key,
+      const std::string& pref_name) const override {
     auto it = modifier_remapping_.find(pref_name);
     if (it == modifier_remapping_.end())
-      return false;
+      return absl::nullopt;
 
-    *value = it->second;
-    return true;
+    return it->second;
   }
 
   bool TopRowKeysAreFunctionKeys(int device_id) const override { return false; }
@@ -597,7 +604,7 @@
     return false;
   }
 
-  std::map<std::string, int> modifier_remapping_;
+  std::map<std::string, ui::mojom::ModifierKey> modifier_remapping_;
 
  protected:
   ui::test::EventGenerator* generator_ = nullptr;
diff --git a/ash/events/select_to_speak_event_handler_unittest.cc b/ash/events/select_to_speak_event_handler_unittest.cc
index 0723c123..834cad4 100644
--- a/ash/events/select_to_speak_event_handler_unittest.cc
+++ b/ash/events/select_to_speak_event_handler_unittest.cc
@@ -71,8 +71,7 @@
   virtual ~TestDelegate() = default;
 
   bool CapturedMouseEvent(ui::EventType event_type) {
-    return mouse_events_captured_.find(event_type) !=
-           mouse_events_captured_.end();
+    return base::Contains(mouse_events_captured_, event_type);
   }
 
   void Reset() {
diff --git a/ash/host/ash_window_tree_host_unified.cc b/ash/host/ash_window_tree_host_unified.cc
index 138eddf..960fd52 100644
--- a/ash/host/ash_window_tree_host_unified.cc
+++ b/ash/host/ash_window_tree_host_unified.cc
@@ -12,7 +12,6 @@
 #include "ash/host/root_window_transformer.h"
 #include "base/check.h"
 #include "base/containers/contains.h"
-#include "base/memory/weak_ptr.h"
 #include "base/notreached.h"
 #include "base/ranges/algorithm.h"
 #include "ui/aura/window.h"
@@ -37,37 +36,36 @@
   UnifiedEventTargeter& operator=(const UnifiedEventTargeter&) = delete;
   ~UnifiedEventTargeter() override { delegate_ = nullptr; }
 
+  // aura::WindowTargeter:
   ui::EventTarget* FindTargetForEvent(ui::EventTarget* root,
                                       ui::Event* event) override {
+    delegate_->SetCurrentEventTargeterSourceHost(nullptr);
     if (root == src_root_ && !event->target()) {
-      delegate_->SetCurrentEventTargeterSourceHost(src_root_->GetHost());
-
-      if (event->IsLocatedEvent()) {
-        ui::LocatedEvent* located_event = static_cast<ui::LocatedEvent*>(event);
-        located_event->ConvertLocationToTarget(
-            static_cast<aura::Window*>(nullptr), dst_root_);
-      }
-      auto ptr = weak_ptr_factory_.GetWeakPtr();
-      std::ignore =
-          dst_root_->GetHost()->GetEventSink()->OnEventFromSource(event);
-      if (!ptr)
-        return nullptr;
-
-      // Reset the source host.
-      delegate_->SetCurrentEventTargeterSourceHost(nullptr);
-
-      return nullptr;
+      return root;
     } else {
       NOTREACHED() << "event type:" << event->type();
       return aura::WindowTargeter::FindTargetForEvent(root, event);
     }
   }
+  ui::EventSink* GetNewEventSinkForEvent(const ui::EventTarget* current_root,
+                                         ui::EventTarget* target,
+                                         ui::Event* in_out_event) override {
+    if (current_root == src_root_ && !in_out_event->target()) {
+      delegate_->SetCurrentEventTargeterSourceHost(src_root_->GetHost());
+      if (in_out_event->IsLocatedEvent()) {
+        ui::LocatedEvent* located_event = in_out_event->AsLocatedEvent();
+        located_event->ConvertLocationToTarget(
+            static_cast<aura::Window*>(nullptr), dst_root_);
+      }
+      return dst_root_->GetHost()->GetEventSink();
+    }
+    return nullptr;
+  }
 
  private:
   aura::Window* src_root_;
   aura::Window* dst_root_;
   AshWindowTreeHostDelegate* delegate_;  // Not owned.
-  base::WeakPtrFactory<UnifiedEventTargeter> weak_ptr_factory_{this};
 };
 
 AshWindowTreeHostUnified::AshWindowTreeHostUnified(
diff --git a/ash/public/cpp/app_list/app_list_client.h b/ash/public/cpp/app_list/app_list_client.h
index e20babb..6c16af6 100644
--- a/ash/public/cpp/app_list/app_list_client.h
+++ b/ash/public/cpp/app_list/app_list_client.h
@@ -117,6 +117,16 @@
   // implementation, this can return nullptr.
   virtual AppListNotifier* GetNotifier() = 0;
 
+  // Queries whether launcher search IPH should be shown and update
+  // SearchBoxModel.
+  virtual void QueryWouldTriggerLauncherSearchIph() = 0;
+
+  // `feature_engagement::Tracker` needs to be initialized before this method
+  // gets called. Call `WouldTriggerLauncherSearchIph` to initialize it. This
+  // returns false if the tracker is not initialized yet.
+  virtual std::unique_ptr<ScopedIphSession>
+  CreateLauncherSearchIphSession() = 0;
+
   // Invoked to load an icon of the app identified by `app_id`.
   virtual void LoadIcon(int profile_id, const std::string& app_id) = 0;
 
diff --git a/ash/public/cpp/app_list/app_list_types.h b/ash/public/cpp/app_list/app_list_types.h
index 234d79f..25d47a1 100644
--- a/ash/public/cpp/app_list/app_list_types.h
+++ b/ash/public/cpp/app_list/app_list_types.h
@@ -748,6 +748,18 @@
   int position_index;
 };
 
+// `ScopedIphSession` manages an IPH session. A UI must show an IPH once an
+// IPH session gets created. Also the UI must destroy
+// `ScopedIphSession` when it has stopped showing an IPH.
+class ASH_PUBLIC_EXPORT ScopedIphSession {
+ public:
+  ScopedIphSession() = default;
+  virtual ~ScopedIphSession() = default;
+
+  ScopedIphSession(const ScopedIphSession&) = delete;
+  ScopedIphSession& operator=(const ScopedIphSession&) = delete;
+};
+
 using SearchResultIdWithPositionIndices =
     std::vector<SearchResultIdWithPositionIndex>;
 
diff --git a/ash/search_box/search_box_view_base.cc b/ash/search_box/search_box_view_base.cc
index 7bcc3085..15a1db27 100644
--- a/ash/search_box/search_box_view_base.cc
+++ b/ash/search_box/search_box_view_base.cc
@@ -36,6 +36,7 @@
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/textfield/textfield.h"
+#include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/box_layout_view.h"
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/layout/layout_provider.h"
@@ -346,7 +347,11 @@
   const int between_child_spacing =
       kInnerPadding - views::LayoutProvider::Get()->GetDistanceMetric(
                           views::DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING);
-  content_container_ = AddChildView(std::make_unique<views::BoxLayoutView>());
+  iph_container_ = AddChildView(std::make_unique<views::BoxLayoutView>());
+  iph_container_->SetOrientation(views::BoxLayout::Orientation::kVertical);
+
+  content_container_ =
+      iph_container_->AddChildView(std::make_unique<views::BoxLayoutView>());
   content_container_->SetCrossAxisAlignment(
       views::BoxLayout::CrossAxisAlignment::kCenter);
   content_container_->SetMinimumCrossAxisSize(kSearchBoxPreferredHeight);
@@ -497,6 +502,20 @@
   return search_icon_;
 }
 
+void SearchBoxViewBase::SetIphView(std::unique_ptr<views::View> view) {
+  if (iph_view()) {
+    DCHECK(false) << "SetIphView gets called with an IPH view being shown.";
+
+    DeleteIphView();
+  }
+
+  iph_view_tracker_.SetView(iph_container_->AddChildView(std::move(view)));
+}
+
+void SearchBoxViewBase::DeleteIphView() {
+  iph_container_->RemoveChildViewT(iph_view());
+}
+
 void SearchBoxViewBase::MaybeSetAutocompleteGhostText(
     const std::u16string& title,
     const std::u16string& category) {
diff --git a/ash/search_box/search_box_view_base.h b/ash/search_box/search_box_view_base.h
index fe0436c..8cb5fb8 100644
--- a/ash/search_box/search_box_view_base.h
+++ b/ash/search_box/search_box_view_base.h
@@ -17,6 +17,7 @@
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/textfield/textfield_controller.h"
 #include "ui/views/view.h"
+#include "ui/views/view_tracker.h"
 
 namespace gfx {
 class ImageSkia;
@@ -85,6 +86,10 @@
   views::ImageView* search_icon();
   views::Textfield* search_box() { return search_box_; }
 
+  void SetIphView(std::unique_ptr<views::View> iph_view);
+  void DeleteIphView();
+  raw_ptr<views::View> iph_view() { return iph_view_tracker_.view(); }
+
   // Called when the query in the search box textfield changes. The search box
   // implementation is expected to handle the new query.
   // `query` the new search box query.
@@ -218,6 +223,7 @@
   void OnEnabledChanged();
 
   // Owned by views hierarchy.
+  raw_ptr<views::BoxLayoutView> iph_container_;
   views::BoxLayoutView* content_container_;
   SearchIconImageView* search_icon_ = nullptr;
   SearchBoxImageButton* assistant_button_ = nullptr;
@@ -233,6 +239,8 @@
 
   views::View* search_box_button_container_ = nullptr;
 
+  views::ViewTracker iph_view_tracker_;
+
   // Whether the search box is active.
   bool is_search_box_active_ = false;
   // Whether to show close button if the search box is active and empty.
diff --git a/ash/shell.cc b/ash/shell.cc
index 4c55e8a..5c95da6 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -116,6 +116,7 @@
 #include "ash/style/ash_color_mixer.h"
 #include "ash/style/ash_color_provider.h"
 #include "ash/style/dark_light_mode_controller_impl.h"
+#include "ash/style/style_util.h"
 #include "ash/system/audio/audio_effects_controller.h"
 #include "ash/system/audio/display_speaker_controller.h"
 #include "ash/system/bluetooth/bluetooth_device_status_ui_handler.h"
@@ -180,6 +181,7 @@
 #include "ash/wm/cursor_manager_chromeos.h"
 #include "ash/wm/desks/desks_controller.h"
 #include "ash/wm/desks/persistent_desks_bar/persistent_desks_bar_controller.h"
+#include "ash/wm/desks/templates/saved_desk_controller.h"
 #include "ash/wm/event_client_impl.h"
 #include "ash/wm/float/float_controller.h"
 #include "ash/wm/gestures/back_gesture/back_gesture_event_handler.h"
@@ -690,6 +692,7 @@
 
   ash_dbus_services_.reset();
 
+  saved_desk_controller_.reset();
   saved_desk_delegate_.reset();
   desks_controller_->Shutdown();
 
@@ -1302,6 +1305,10 @@
   // controller.
   desks_controller_ = std::make_unique<DesksController>();
   saved_desk_delegate_ = shell_delegate_->CreateSavedDeskDelegate();
+  // Initialized here since it depends on desks.
+  if (base::FeatureList::IsEnabled(features::kAppLaunchAutomation)) {
+    saved_desk_controller_ = std::make_unique<SavedDeskController>();
+  }
 
   Shell::SetRootWindowForNewWindows(GetPrimaryRootWindow());
 
@@ -1465,7 +1472,9 @@
   video_detector_ = std::make_unique<VideoDetector>();
 
   tooltip_controller_ = std::make_unique<views::corewm::TooltipController>(
-      std::make_unique<views::corewm::TooltipAura>(), activation_client());
+      std::make_unique<views::corewm::TooltipAura>(
+          base::BindRepeating(&StyleUtil::CreateAshStyleTooltipView)),
+      activation_client());
   AddPreTargetHandler(tooltip_controller_.get());
 
   modality_filter_ = std::make_unique<SystemModalContainerEventFilter>(this);
diff --git a/ash/shell.h b/ash/shell.h
index cb47181..a465f060 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -202,6 +202,7 @@
 class ResizeShadowController;
 class ResolutionNotificationController;
 class RootWindowController;
+class SavedDeskController;
 class SavedDeskDelegate;
 class ScreenLayoutObserver;
 class ScreenOrientationController;
@@ -441,6 +442,9 @@
   PersistentDesksBarController* persistent_desks_bar_controller() {
     return persistent_desks_bar_controller_.get();
   }
+  SavedDeskController* saved_desk_controller() {
+    return saved_desk_controller_.get();
+  }
   SavedDeskDelegate* saved_desk_delegate() {
     return saved_desk_delegate_.get();
   }
@@ -909,6 +913,7 @@
       security_curtain_controller_;
   std::unique_ptr<DarkLightModeControllerImpl> dark_light_mode_controller_;
   std::unique_ptr<DesksController> desks_controller_;
+  std::unique_ptr<SavedDeskController> saved_desk_controller_;
   std::unique_ptr<SavedDeskDelegate> saved_desk_delegate_;
   std::unique_ptr<DetachableBaseHandler> detachable_base_handler_;
   std::unique_ptr<DetachableBaseNotificationController>
diff --git a/ash/style/ash_color_mixer.cc b/ash/style/ash_color_mixer.cc
index 2241eb21..72b0bb8 100644
--- a/ash/style/ash_color_mixer.cc
+++ b/ash/style/ash_color_mixer.cc
@@ -616,6 +616,9 @@
   mixer[ui::kColorToggleButtonTrackOffDisabled] =
       ui::SetAlpha({ui::kColorToggleButtonTrackOff}, kDisabledColorOpacity);
   mixer[ui::kColorToggleButtonHover] = {cros_tokens::kCrosSysHoverOnProminent};
+
+  mixer[ui::kColorTooltipBackground] = {cros_tokens::kCrosSysOnSurface};
+  mixer[ui::kColorTooltipForeground] = {cros_tokens::kCrosSysInverseOnSurface};
 }
 
 }  // namespace ash
diff --git a/ash/style/style_util.cc b/ash/style/style_util.cc
index f07b6b4e..73d8854c 100644
--- a/ash/style/style_util.cc
+++ b/ash/style/style_util.cc
@@ -9,6 +9,7 @@
 #include "ash/style/dark_light_mode_controller_impl.h"
 #include "ui/color/color_id.h"
 #include "ui/gfx/canvas.h"
+#include "ui/gfx/font_list.h"
 #include "ui/views/animation/flood_fill_ink_drop_ripple.h"
 #include "ui/views/animation/ink_drop.h"
 #include "ui/views/animation/ink_drop_highlight.h"
@@ -16,11 +17,16 @@
 #include "ui/views/background.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/focus_ring.h"
+#include "ui/views/corewm/tooltip_view_aura.h"
 
 namespace ash {
 
 namespace {
 
+constexpr int kTooltipRoundedCornerRadius = 6;
+constexpr gfx::Insets kTooltipBorderInset = gfx::Insets::VH(5, 8);
+constexpr int kTooltipMinLineHeight = 18;
+
 // A themed fully rounded rect background whose corner radius equals to the half
 // of the minimum dimension of its view's local bounds.
 class ThemedFullyRoundedRectBackground : public views::Background {
@@ -169,4 +175,19 @@
   return std::make_unique<ThemedFullyRoundedRectBackground>(color_id);
 }
 
+// static
+std::unique_ptr<views::corewm::TooltipViewAura>
+StyleUtil::CreateAshStyleTooltipView() {
+  auto tooltip_view = std::make_unique<views::corewm::TooltipViewAura>();
+  // Apply ash style background, border, and font.
+  tooltip_view->SetBackground(views::CreateThemedRoundedRectBackground(
+      ui::kColorTooltipBackground, kTooltipRoundedCornerRadius));
+  tooltip_view->SetBorder(views::CreateEmptyBorder(kTooltipBorderInset));
+  tooltip_view->SetFontList(gfx::FontList({"Google Sans, Roboto", "Noto Sans"},
+                                          gfx::Font::NORMAL, 12,
+                                          gfx::Font::Weight::NORMAL));
+  tooltip_view->SetMinLineHeight(kTooltipMinLineHeight);
+  return tooltip_view;
+}
+
 }  // namespace ash
diff --git a/ash/style/style_util.h b/ash/style/style_util.h
index faa45fd..330cd33ad 100644
--- a/ash/style/style_util.h
+++ b/ash/style/style_util.h
@@ -19,6 +19,11 @@
 class InkDropHighlight;
 class InkDropRipple;
 class View;
+
+namespace corewm {
+class TooltipViewAura;
+}  // namespace corewm
+
 }  // namespace views
 
 namespace ash {
@@ -96,6 +101,9 @@
   static std::unique_ptr<views::Background>
   CreateThemedFullyRoundedRectBackground(ui::ColorId color_id);
 
+  static std::unique_ptr<views::corewm::TooltipViewAura>
+  CreateAshStyleTooltipView();
+
  private:
   StyleUtil() = default;
   StyleUtil(const StyleUtil&) = delete;
diff --git a/ash/system/audio/mic_gain_slider_controller_unittest.cc b/ash/system/audio/mic_gain_slider_controller_unittest.cc
index 3d2f6a1..4161677 100644
--- a/ash/system/audio/mic_gain_slider_controller_unittest.cc
+++ b/ash/system/audio/mic_gain_slider_controller_unittest.cc
@@ -4,9 +4,12 @@
 
 #include "ash/system/audio/mic_gain_slider_controller.h"
 
+#include "ash/constants/ash_features.h"
 #include "ash/shell.h"
+#include "ash/system/audio/mic_gain_slider_view.h"
 #include "ash/test/ash_test_base.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
 #include "chromeos/ash/components/audio/cras_audio_handler.h"
@@ -14,10 +17,17 @@
 
 namespace ash {
 
-class MicGainSliderControllerTest : public AshTestBase {
+class MicGainSliderControllerTest : public AshTestBase,
+                                    public testing::WithParamInterface<bool> {
  public:
   MicGainSliderControllerTest()
-      : AshTestBase(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
+      : AshTestBase(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
+    if (IsQsRevampEnabled()) {
+      feature_list_.InitAndEnableFeature(features::kQsRevamp);
+    } else {
+      feature_list_.InitAndDisableFeature(features::kQsRevamp);
+    }
+  }
 
   MicGainSliderControllerTest(const MicGainSliderControllerTest&) = delete;
   MicGainSliderControllerTest& operator=(const MicGainSliderControllerTest&) =
@@ -25,6 +35,12 @@
 
   ~MicGainSliderControllerTest() override = default;
 
+  bool IsQsRevampEnabled() const { return GetParam(); }
+
+  views::View* GetMuteToastView() {
+    return mic_gain_slider_controller_.CreateView();
+  }
+
  protected:
   void UpdateSliderValue(float new_value) {
     mic_gain_slider_controller_.SliderValueChanged(
@@ -35,11 +51,16 @@
   base::HistogramTester histogram_tester_;
 
  private:
+  base::test::ScopedFeatureList feature_list_;
   MicGainSliderController mic_gain_slider_controller_;
 };
 
+INSTANTIATE_TEST_SUITE_P(QsRevamp,
+                         MicGainSliderControllerTest,
+                         testing::Bool());
+
 // Verify moving the slider and changing the gain is recorded to metrics.
-TEST_F(MicGainSliderControllerTest, RecordInputGainChangedSource) {
+TEST_P(MicGainSliderControllerTest, RecordInputGainChangedSource) {
   // Move the slider 3 times. Move the slider at half of the delay interval
   // time so each change shouldn't be recorded.
   UpdateSliderValue(/*new_value=*/10);
@@ -76,4 +97,20 @@
       CrasAudioHandler::AudioSettingsChangeSource::kSystemTray, 2);
 }
 
+TEST_P(MicGainSliderControllerTest, CreateMuteToastView) {
+  MicGainSliderView* toast_view =
+      static_cast<MicGainSliderView*>(GetMuteToastView());
+  if (IsQsRevampEnabled()) {
+    // Hide the slider icon and show the mic button in the mute toast view.
+    EXPECT_FALSE(toast_view->children()[0]->GetVisible());
+    EXPECT_EQ(
+        u"Toggle Mic. Mic is on, toggling will mute input.",
+        static_cast<IconButton*>(toast_view->children()[1])->GetTooltipText());
+  } else {
+    EXPECT_EQ(
+        u"Toggle Mic. Mic is on, toggling will mute input.",
+        static_cast<IconButton*>(toast_view->children()[0])->GetTooltipText());
+  }
+}
+
 }  // namespace ash
diff --git a/ash/system/audio/mic_gain_slider_view.cc b/ash/system/audio/mic_gain_slider_view.cc
index 8e2f743..7fd2b0d 100644
--- a/ash/system/audio/mic_gain_slider_view.cc
+++ b/ash/system/audio/mic_gain_slider_view.cc
@@ -28,10 +28,12 @@
 // the microphone toggle button tooltip.
 int GetMuteStateTooltipTextResourceId(bool is_muted,
                                       bool is_muted_by_mute_switch) {
-  if (is_muted_by_mute_switch)
+  if (is_muted_by_mute_switch) {
     return IDS_ASH_STATUS_TRAY_MIC_STATE_MUTED_BY_HW_SWITCH;
-  if (is_muted)
+  }
+  if (is_muted) {
     return IDS_ASH_STATUS_TRAY_MIC_STATE_MUTED;
+  }
   return IDS_ASH_STATUS_TRAY_MIC_STATE_ON;
 }
 
@@ -175,13 +177,7 @@
                                            : IDS_ASH_STATUS_AREA_TOAST_MIC_ON));
   }
 
-  if (!features::IsQsRevampEnabled()) {
-    // To indicate that the volume is muted, set the volume slider to the
-    // minimal visual style.
-    slider()->SetRenderingStyle(
-        is_muted ? views::Slider::RenderingStyle::kMinimalStyle
-                 : views::Slider::RenderingStyle::kDefaultStyle);
-
+  if (button()) {
     // The button should be gray when muted and colored otherwise.
     button()->SetToggled(!is_muted);
     button()->SetEnabled(!is_muted_by_mute_switch);
@@ -191,6 +187,14 @@
         GetMuteStateTooltipTextResourceId(is_muted, is_muted_by_mute_switch));
     button()->SetTooltipText(l10n_util::GetStringFUTF16(
         IDS_ASH_STATUS_TRAY_MIC_GAIN, state_tooltip_text));
+  }
+
+  if (!features::IsQsRevampEnabled()) {
+    // To indicate that the volume is muted, set the volume slider to the
+    // minimal visual style.
+    slider()->SetRenderingStyle(
+        is_muted ? views::Slider::RenderingStyle::kMinimalStyle
+                 : views::Slider::RenderingStyle::kDefaultStyle);
   } else {
     // For active internal mic stub, `show_internal_stub` indicates whether it's
     // showing and `device_id_` doesn't match with `active_device_id`.
diff --git a/ash/system/bluetooth/bluetooth_notification_controller.cc b/ash/system/bluetooth/bluetooth_notification_controller.cc
index f639563..af7eece7 100644
--- a/ash/system/bluetooth/bluetooth_notification_controller.cc
+++ b/ash/system/bluetooth/bluetooth_notification_controller.cc
@@ -167,30 +167,32 @@
 
 void BluetoothNotificationController::DeviceAdded(BluetoothAdapter* adapter,
                                                   BluetoothDevice* device) {
-  // Add the new device to the list of currently paired devices; it doesn't
+  // Add the new device to the list of currently bonded devices; it doesn't
   // receive a notification since it's assumed it was previously notified.
-  if (device->IsPaired())
-    paired_devices_.insert(device->GetAddress());
+  if (device->IsBonded()) {
+    bonded_devices_.insert(device->GetAddress());
+  }
 }
 
 void BluetoothNotificationController::DeviceChanged(BluetoothAdapter* adapter,
                                                     BluetoothDevice* device) {
-  // If the device is already in the list of paired devices, then don't
+  // If the device is already in the list of bonded devices, then don't
   // notify.
-  if (paired_devices_.find(device->GetAddress()) != paired_devices_.end())
+  if (bonded_devices_.find(device->GetAddress()) != bonded_devices_.end()) {
     return;
+  }
 
-  // Otherwise if it's marked as paired then it must be newly paired, so
+  // Otherwise if it's marked as bonded then it must be newly bonded, so
   // notify the user about that.
-  if (device->IsPaired()) {
-    paired_devices_.insert(device->GetAddress());
-    NotifyPairedDevice(device);
+  if (device->IsBonded()) {
+    bonded_devices_.insert(device->GetAddress());
+    NotifyBondedDevice(device);
   }
 }
 
 void BluetoothNotificationController::DeviceRemoved(BluetoothAdapter* adapter,
                                                     BluetoothDevice* device) {
-  paired_devices_.erase(device->GetAddress());
+  bonded_devices_.erase(device->GetAddress());
 }
 
 void BluetoothNotificationController::RequestPinCode(BluetoothDevice* device) {
@@ -263,14 +265,15 @@
   if (adapter_->IsDiscoverable())
     NotifyAdapterDiscoverable();
 
-  // Build a list of the currently paired devices; these don't receive
+  // Build a list of the currently bonded devices; these don't receive
   // notifications since it's assumed they were previously notified.
   BluetoothAdapter::DeviceList devices = adapter_->GetDevices();
   for (BluetoothAdapter::DeviceList::const_iterator iter = devices.begin();
        iter != devices.end(); ++iter) {
     const BluetoothDevice* device = *iter;
-    if (device->IsPaired())
-      paired_devices_.insert(device->GetAddress());
+    if (device->IsBonded()) {
+      bonded_devices_.insert(device->GetAddress());
+    }
   }
 }
 
@@ -325,11 +328,11 @@
   message_center_->AddNotification(std::move(notification));
 }
 
-void BluetoothNotificationController::NotifyPairedDevice(
+void BluetoothNotificationController::NotifyBondedDevice(
     BluetoothDevice* device) {
   // Remove the currently presented pairing notification; since only one
   // pairing request is queued at a time, this is guaranteed to be the device
-  // that just became paired. The notification will be handled by
+  // that just became bonded. The notification will be handled by
   // BluetoothDeviceStatusUiHandler.
   if (message_center_->FindVisibleNotificationById(
           kBluetoothDevicePairingNotificationId)) {
diff --git a/ash/system/bluetooth/bluetooth_notification_controller.h b/ash/system/bluetooth/bluetooth_notification_controller.h
index 36d97f0f..57dd3eba 100644
--- a/ash/system/bluetooth/bluetooth_notification_controller.h
+++ b/ash/system/bluetooth/bluetooth_notification_controller.h
@@ -24,7 +24,7 @@
 
 // The BluetoothNotificationController receives incoming pairing requests from
 // the BluetoothAdapter, and notifications of changes to the adapter state and
-// set of paired devices. It presents incoming pairing requests in the form of
+// set of bonded devices. It presents incoming pairing requests in the form of
 // rich notifications that the user can interact with to approve the request.
 class ASH_EXPORT BluetoothNotificationController
     : public device::BluetoothAdapter::Observer,
@@ -64,7 +64,6 @@
 
  private:
   friend class BluetoothNotificationControllerTest;
-  class BluetoothPairedNotificationDelegate;
 
   static const char kBluetoothDeviceDiscoverableToastId[];
   // Identifier for the pairing notification; the Bluetooth code ensures we
@@ -90,8 +89,8 @@
                      const std::u16string& message,
                      bool with_buttons);
 
-  // Clears any shown pairing notification now that the device has been paired.
-  void NotifyPairedDevice(device::BluetoothDevice* device);
+  // Clears any shown pairing notification now that the device has been bonded.
+  void NotifyBondedDevice(device::BluetoothDevice* device);
 
   message_center::MessageCenter* const message_center_;
 
@@ -99,9 +98,9 @@
   // ensures we stay around as the pairing delegate for that adapter.
   scoped_refptr<device::BluetoothAdapter> adapter_;
 
-  // Set of currently paired devices, stored by Bluetooth address, used to
-  // filter out property changes for devices that were previously paired.
-  std::set<std::string> paired_devices_;
+  // Set of currently bonded devices, stored by Bluetooth address, used to
+  // filter out property changes for devices that were previously bonded.
+  std::set<std::string> bonded_devices_;
 
   // Note: This should remain the last member so it'll be destroyed and
   // invalidate its weak pointers before any other members are destroyed.
diff --git a/ash/system/bluetooth/bluetooth_notification_controller_unittest.cc b/ash/system/bluetooth/bluetooth_notification_controller_unittest.cc
index db857c8..44a1a32 100644
--- a/ash/system/bluetooth/bluetooth_notification_controller_unittest.cc
+++ b/ash/system/bluetooth/bluetooth_notification_controller_unittest.cc
@@ -104,12 +104,39 @@
     }
   }
 
+  void VerifyPairingNotificationVisibility(bool visible) {
+    EXPECT_EQ(test_message_center_.FindVisibleNotificationById(
+                  BluetoothNotificationController::
+                      kBluetoothDevicePairingNotificationId) != nullptr,
+              visible);
+  }
+
   // Run the notification controller to simulate showing a toast.
   void ShowDiscoverableToast(
       BluetoothNotificationController* notification_controller) {
     notification_controller->NotifyAdapterDiscoverable();
   }
 
+  void ShowPairingNotification(
+      BluetoothNotificationController* notification_controller,
+      device::MockBluetoothDevice* mock_device) {
+    notification_controller->AuthorizePairing(mock_device);
+  }
+
+  void SimulateDevicePaired(
+      BluetoothNotificationController* notification_controller,
+      device::MockBluetoothDevice* mock_device) {
+    ON_CALL(*mock_device, IsPaired()).WillByDefault(Return(true));
+    notification_controller->DeviceChanged(mock_adapter_.get(), mock_device);
+  }
+
+  void SimulateDeviceBonded(
+      BluetoothNotificationController* notification_controller,
+      device::MockBluetoothDevice* mock_device) {
+    ON_CALL(*mock_device, IsBonded()).WillByDefault(Return(true));
+    notification_controller->DeviceChanged(mock_adapter_.get(), mock_device);
+  }
+
   ToastOverlay* GetCurrentOverlay() {
     return toast_manager_->GetCurrentOverlayForTesting();
   }
@@ -157,4 +184,24 @@
   VerifyDiscoverableToastVisibility(/*visible=*/false);
 }
 
+TEST_F(BluetoothNotificationControllerTest, PairingNotification) {
+  VerifyPairingNotificationVisibility(/*visible=*/false);
+
+  ShowPairingNotification(notification_controller_.get(),
+                          bluetooth_device_1_.get());
+  VerifyPairingNotificationVisibility(/*visible=*/true);
+
+  // Simulate the device being paired. This should not remove the pairing
+  // notification.
+  SimulateDevicePaired(notification_controller_.get(),
+                       bluetooth_device_1_.get());
+  VerifyPairingNotificationVisibility(/*visible=*/true);
+
+  // Simulate the device being bonded. This should remove the pairing
+  // notification.
+  SimulateDeviceBonded(notification_controller_.get(),
+                       bluetooth_device_1_.get());
+  VerifyPairingNotificationVisibility(/*visible=*/false);
+}
+
 }  // namespace ash
diff --git a/ash/system/input_device_settings/input_device_settings_defaults.h b/ash/system/input_device_settings/input_device_settings_defaults.h
index 19d1a3dd0..5b304de 100644
--- a/ash/system/input_device_settings/input_device_settings_defaults.h
+++ b/ash/system/input_device_settings/input_device_settings_defaults.h
@@ -18,6 +18,7 @@
 constexpr bool kDefaultAutoRepeatEnabled = true;
 constexpr bool kDefaultSuppressMetaFKeyRewrites = false;
 constexpr bool kDefaultTopRowAreFKeys = false;
+constexpr bool kDefaultTopRowAreFKeysExternal = true;
 
 // Default settings for all pointers, defined in
 // chrome/browser/ash/preferences.cc.
diff --git a/ash/system/input_device_settings/input_device_settings_metrics_manager.cc b/ash/system/input_device_settings/input_device_settings_metrics_manager.cc
new file mode 100644
index 0000000..7381e92
--- /dev/null
+++ b/ash/system/input_device_settings/input_device_settings_metrics_manager.cc
@@ -0,0 +1,14 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/input_device_settings/input_device_settings_metrics_manager.h"
+
+namespace ash {
+
+InputDeviceSettingsMetricsManager::InputDeviceSettingsMetricsManager() =
+    default;
+InputDeviceSettingsMetricsManager::~InputDeviceSettingsMetricsManager() =
+    default;
+
+}  // namespace ash
\ No newline at end of file
diff --git a/ash/system/input_device_settings/input_device_settings_metrics_manager.h b/ash/system/input_device_settings/input_device_settings_metrics_manager.h
new file mode 100644
index 0000000..8ce62beb
--- /dev/null
+++ b/ash/system/input_device_settings/input_device_settings_metrics_manager.h
@@ -0,0 +1,24 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_SYSTEM_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_SETTINGS_METRICS_MANAGER_H_
+#define ASH_SYSTEM_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_SETTINGS_METRICS_MANAGER_H_
+
+#include "ash/ash_export.h"
+
+namespace ash {
+
+class ASH_EXPORT InputDeviceSettingsMetricsManager {
+ public:
+  InputDeviceSettingsMetricsManager();
+  InputDeviceSettingsMetricsManager(const InputDeviceSettingsMetricsManager&) =
+      delete;
+  InputDeviceSettingsMetricsManager& operator=(
+      const InputDeviceSettingsMetricsManager&) = delete;
+  ~InputDeviceSettingsMetricsManager();
+};
+
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_SETTINGS_METRICS_MANAGER_H_
diff --git a/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc b/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc
new file mode 100644
index 0000000..c5fac89
--- /dev/null
+++ b/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc
@@ -0,0 +1,39 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/input_device_settings/input_device_settings_metrics_manager.h"
+
+#include "ash/test/ash_test_base.h"
+
+namespace ash {
+
+class InputDeviceSettingsMetricsManagerTest : public AshTestBase {
+ public:
+  InputDeviceSettingsMetricsManagerTest() = default;
+  InputDeviceSettingsMetricsManagerTest(
+      const InputDeviceSettingsMetricsManagerTest&) = delete;
+  InputDeviceSettingsMetricsManagerTest& operator=(
+      const InputDeviceSettingsMetricsManagerTest&) = delete;
+  ~InputDeviceSettingsMetricsManagerTest() override = default;
+
+  // testing::Test:
+  void SetUp() override {
+    AshTestBase::SetUp();
+    manager_ = std::make_unique<InputDeviceSettingsMetricsManager>();
+  }
+
+  void TearDown() override {
+    manager_.reset();
+    AshTestBase::TearDown();
+  }
+
+ protected:
+  std::unique_ptr<InputDeviceSettingsMetricsManager> manager_;
+};
+
+TEST_F(InputDeviceSettingsMetricsManagerTest, InitializationTest) {
+  EXPECT_NE(manager_.get(), nullptr);
+}
+
+}  // namespace ash
\ No newline at end of file
diff --git a/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.cc b/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.cc
index 26242a2..fd806c0 100644
--- a/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.cc
+++ b/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.cc
@@ -15,6 +15,7 @@
 #include "base/containers/fixed_flat_map.h"
 #include "base/containers/flat_map.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/string_piece_forward.h"
 #include "base/time/time.h"
 #include "components/prefs/pref_service.h"
 #include "ui/chromeos/events/mojom/modifier_key.mojom-shared.h"
@@ -23,6 +24,18 @@
 
 namespace ash {
 namespace {
+
+// Whether or not settings taken during the transition period should be
+// persisted to the prefs. Values should only ever be true if the original
+// setting was a user-configured value.
+
+// Modifier remappings are not included here as it is only ever persisted if it
+// is non-default.
+struct ForceKeyboardSettingPersistence {
+  bool top_row_are_fkeys = false;
+  bool suppress_meta_fkey_rewrites = false;
+};
+
 static constexpr auto kKeyboardModifierMappings =
     base::MakeFixedFlatMap<ui::mojom::ModifierKey, const char*>(
         {{ui::mojom::ModifierKey::kAlt, ::prefs::kLanguageRemapAltKeyTo},
@@ -45,13 +58,15 @@
          {mojom::MetaKey::kCommand,
           ::prefs::kLanguageRemapExternalCommandKeyTo}});
 
-mojom::KeyboardSettingsPtr GetDefaultKeyboardSettings() {
+mojom::KeyboardSettingsPtr GetDefaultKeyboardSettings(bool is_external) {
   mojom::KeyboardSettingsPtr settings = mojom::KeyboardSettings::New();
   settings->auto_repeat_delay = kDefaultAutoRepeatDelay;
   settings->auto_repeat_interval = kDefaultAutoRepeatInterval;
   settings->auto_repeat_enabled = kDefaultAutoRepeatEnabled;
   settings->suppress_meta_fkey_rewrites = kDefaultSuppressMetaFKeyRewrites;
-  settings->top_row_are_fkeys = kDefaultTopRowAreFKeys;
+  // This setting should be enabled by default for external keyboards.
+  settings->top_row_are_fkeys =
+      is_external ? kDefaultTopRowAreFKeysExternal : kDefaultTopRowAreFKeys;
   return settings;
 }
 
@@ -83,7 +98,8 @@
 
 mojom::KeyboardSettingsPtr GetKeyboardSettingsFromGlobalPrefs(
     PrefService* prefs,
-    const mojom::Keyboard& keyboard) {
+    const mojom::Keyboard& keyboard,
+    ForceKeyboardSettingPersistence& force_persistence) {
   mojom::KeyboardSettingsPtr settings = mojom::KeyboardSettings::New();
   settings->auto_repeat_delay =
       base::Milliseconds(prefs->GetInteger(prefs::kXkbAutoRepeatDelay));
@@ -91,40 +107,32 @@
       base::Milliseconds(prefs->GetInteger(prefs::kXkbAutoRepeatInterval));
   settings->auto_repeat_enabled =
       prefs->GetBoolean(prefs::kXkbAutoRepeatEnabled);
-  settings->top_row_are_fkeys = prefs->GetBoolean(prefs::kSendFunctionKeys);
+
+  const auto* top_row_are_fkeys_preference =
+      prefs->GetUserPrefValue(prefs::kSendFunctionKeys);
+  settings->top_row_are_fkeys = top_row_are_fkeys_preference
+                                    ? top_row_are_fkeys_preference->GetBool()
+                                    : kDefaultTopRowAreFKeys;
+  force_persistence.top_row_are_fkeys = top_row_are_fkeys_preference != nullptr;
+
   settings->suppress_meta_fkey_rewrites = kDefaultSuppressMetaFKeyRewrites;
+  // Do not persist as default should not be persisted.
+  force_persistence.suppress_meta_fkey_rewrites = false;
+
   settings->modifier_remappings = GetModifierRemappings(prefs, keyboard);
   return settings;
 }
 
-}  // namespace
-
-KeyboardPrefHandlerImpl::KeyboardPrefHandlerImpl() = default;
-KeyboardPrefHandlerImpl::~KeyboardPrefHandlerImpl() = default;
-
-void KeyboardPrefHandlerImpl::InitializeKeyboardSettings(
-    PrefService* pref_service,
-    mojom::Keyboard* keyboard) {
-  if (!pref_service) {
-    keyboard->settings = GetDefaultKeyboardSettings();
-    return;
+bool ExistingSettingsHasValue(base::StringPiece setting_key,
+                              const base::Value::Dict* existing_settings_dict) {
+  if (!existing_settings_dict) {
+    return false;
   }
 
-  const auto& devices_dict =
-      pref_service->GetDict(prefs::kKeyboardDeviceSettingsDictPref);
-  const auto* settings_dict = devices_dict.FindDict(keyboard->device_key);
-  if (!settings_dict) {
-    keyboard->settings = GetNewKeyboardSettings(pref_service, *keyboard);
-  } else {
-    keyboard->settings =
-        RetrieveKeyboardSettings(pref_service, *keyboard, *settings_dict);
-  }
-  DCHECK(keyboard->settings);
-
-  UpdateKeyboardSettings(pref_service, *keyboard);
+  return existing_settings_dict->Find(setting_key) != nullptr;
 }
 
-mojom::KeyboardSettingsPtr KeyboardPrefHandlerImpl::RetrieveKeyboardSettings(
+mojom::KeyboardSettingsPtr RetrieveKeyboardSettings(
     PrefService* pref_service,
     const mojom::Keyboard& keyboard,
     const base::Value::Dict& settings_dict) {
@@ -143,7 +151,8 @@
           .value_or(kDefaultSuppressMetaFKeyRewrites);
   settings->top_row_are_fkeys =
       settings_dict.FindBool(prefs::kKeyboardSettingTopRowAreFKeys)
-          .value_or(kDefaultTopRowAreFKeys);
+          .value_or(keyboard.is_external ? kDefaultTopRowAreFKeysExternal
+                                         : kDefaultTopRowAreFKeys);
 
   const auto* modifier_remappings_dict =
       settings_dict.FindDict(prefs::kKeyboardSettingModifierRemappings);
@@ -179,23 +188,16 @@
   return settings;
 }
 
-mojom::KeyboardSettingsPtr KeyboardPrefHandlerImpl::GetNewKeyboardSettings(
-    PrefService* prefs,
-    const mojom::Keyboard& keyboard) {
-  // TODO(michaelcheco): Remove once transitioned to per-device settings.
-  if (Shell::Get()->input_device_tracker()->WasDevicePreviouslyConnected(
-          InputDeviceTracker::InputDeviceCategory::kKeyboard,
-          keyboard.device_key)) {
-    return GetKeyboardSettingsFromGlobalPrefs(prefs, keyboard);
-  }
-
-  return GetDefaultKeyboardSettings();
-}
-
-void KeyboardPrefHandlerImpl::UpdateKeyboardSettings(
+void UpdateKeyboardSettingsImpl(
     PrefService* pref_service,
-    const mojom::Keyboard& keyboard) {
+    const mojom::Keyboard& keyboard,
+    const ForceKeyboardSettingPersistence& force_persistence) {
   DCHECK(keyboard.settings);
+
+  base::Value::Dict devices_dict =
+      pref_service->GetDict(prefs::kKeyboardDeviceSettingsDictPref).Clone();
+  base::Value::Dict* existing_settings_dict =
+      devices_dict.FindDict(keyboard.device_key);
   const mojom::KeyboardSettings& settings = *keyboard.settings;
 
   // Populate `settings_dict` with all settings in `settings`.
@@ -208,10 +210,33 @@
       static_cast<int>(settings.auto_repeat_interval.InMilliseconds()));
   settings_dict.Set(prefs::kKeyboardSettingAutoRepeatEnabled,
                     settings.auto_repeat_enabled);
-  settings_dict.Set(prefs::kKeyboardSettingSuppressMetaFKeyRewrites,
-                    settings.suppress_meta_fkey_rewrites);
-  settings_dict.Set(prefs::kKeyboardSettingTopRowAreFKeys,
-                    settings.top_row_are_fkeys);
+
+  // Settings should only be persisted if one or more of the following is true:
+  // - Setting was previously persisted to storage
+  // - `force_persistence` requires the setting to be persisted, this means this
+  //   device is being transitioned from the old global settings to per-device
+  //   settings and the user specified the specific value for this setting.
+  // - Setting is different than the default, which means the user manually
+  //   changed the value.
+
+  if (ExistingSettingsHasValue(prefs::kKeyboardSettingSuppressMetaFKeyRewrites,
+                               existing_settings_dict) ||
+      force_persistence.suppress_meta_fkey_rewrites ||
+      settings.suppress_meta_fkey_rewrites !=
+          kDefaultSuppressMetaFKeyRewrites) {
+    settings_dict.Set(prefs::kKeyboardSettingSuppressMetaFKeyRewrites,
+                      settings.suppress_meta_fkey_rewrites);
+  }
+
+  if (ExistingSettingsHasValue(prefs::kKeyboardSettingTopRowAreFKeys,
+                               existing_settings_dict) ||
+              force_persistence.top_row_are_fkeys ||
+              settings.top_row_are_fkeys != keyboard.is_external
+          ? kDefaultTopRowAreFKeysExternal
+          : kDefaultTopRowAreFKeys) {
+    settings_dict.Set(prefs::kKeyboardSettingTopRowAreFKeys,
+                      settings.top_row_are_fkeys);
+  }
 
   // Modifier remappings get stored in a dict by casting the
   // `ui::mojom::ModifierKey` enum to ints. Since `base::Value::Dict` only
@@ -224,17 +249,11 @@
   settings_dict.Set(prefs::kKeyboardSettingModifierRemappings,
                     std::move(modifier_remappings));
 
-  // Retrieve old settings and merge with the new ones.
-  base::Value::Dict devices_dict =
-      pref_service->GetDict(prefs::kKeyboardDeviceSettingsDictPref).Clone();
-
   // If an old settings dict already exists for the device, merge the updated
   // settings into the old settings. Otherwise, insert the dict at
   // `keyboard.device_key`.
-  base::Value::Dict* old_settings_dict =
-      devices_dict.FindDict(keyboard.device_key);
-  if (old_settings_dict) {
-    old_settings_dict->Merge(std::move(settings_dict));
+  if (existing_settings_dict) {
+    existing_settings_dict->Merge(std::move(settings_dict));
   } else {
     devices_dict.Set(keyboard.device_key, std::move(settings_dict));
   }
@@ -243,4 +262,44 @@
                         std::move(devices_dict));
 }
 
+}  // namespace
+
+KeyboardPrefHandlerImpl::KeyboardPrefHandlerImpl() = default;
+KeyboardPrefHandlerImpl::~KeyboardPrefHandlerImpl() = default;
+
+void KeyboardPrefHandlerImpl::InitializeKeyboardSettings(
+    PrefService* pref_service,
+    mojom::Keyboard* keyboard) {
+  if (!pref_service) {
+    keyboard->settings = GetDefaultKeyboardSettings(keyboard->is_external);
+    return;
+  }
+
+  const auto& devices_dict =
+      pref_service->GetDict(prefs::kKeyboardDeviceSettingsDictPref);
+  const auto* settings_dict = devices_dict.FindDict(keyboard->device_key);
+  ForceKeyboardSettingPersistence force_persistence;
+
+  if (settings_dict) {
+    keyboard->settings =
+        RetrieveKeyboardSettings(pref_service, *keyboard, *settings_dict);
+  } else if (Shell::Get()->input_device_tracker()->WasDevicePreviouslyConnected(
+                 InputDeviceTracker::InputDeviceCategory::kKeyboard,
+                 keyboard->device_key)) {
+    keyboard->settings = GetKeyboardSettingsFromGlobalPrefs(
+        pref_service, *keyboard, force_persistence);
+  } else {
+    keyboard->settings = GetDefaultKeyboardSettings(keyboard->is_external);
+  }
+  DCHECK(keyboard->settings);
+
+  UpdateKeyboardSettingsImpl(pref_service, *keyboard, force_persistence);
+}
+
+void KeyboardPrefHandlerImpl::UpdateKeyboardSettings(
+    PrefService* pref_service,
+    const mojom::Keyboard& keyboard) {
+  UpdateKeyboardSettingsImpl(pref_service, keyboard, /*force_persistence=*/{});
+}
+
 }  // namespace ash
diff --git a/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.h b/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.h
index e3c55a8..fe1875a 100644
--- a/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.h
+++ b/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.h
@@ -25,15 +25,6 @@
                                   mojom::Keyboard* keyboard) override;
   void UpdateKeyboardSettings(PrefService* pref_service,
                               const mojom::Keyboard& keyboard) override;
-
- private:
-  mojom::KeyboardSettingsPtr GetNewKeyboardSettings(
-      PrefService* prefs,
-      const mojom::Keyboard& keyboard);
-  mojom::KeyboardSettingsPtr RetrieveKeyboardSettings(
-      PrefService* prefs,
-      const mojom::Keyboard& keyboard,
-      const base::Value::Dict& settings_dict);
 };
 
 }  // namespace ash
diff --git a/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_unittest.cc b/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_unittest.cc
index dc7438a..d5a608d 100644
--- a/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_unittest.cc
+++ b/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_unittest.cc
@@ -44,6 +44,14 @@
     /*auto_repeat_delay=*/kDefaultAutoRepeatDelay,
     /*auto_repeat_interval=*/kDefaultAutoRepeatInterval);
 
+const mojom::KeyboardSettings kKeyboardSettingsNotDefault(
+    /*modifier_remappings=*/{},
+    /*top_row_are_fkeys=*/!kDefaultTopRowAreFKeys,
+    /*suppress_meta_fkey_rewrites=*/!kDefaultSuppressMetaFKeyRewrites,
+    /*auto_repeat_enabled=*/kDefaultAutoRepeatEnabled,
+    /*auto_repeat_delay=*/kDefaultAutoRepeatDelay,
+    /*auto_repeat_interval=*/kDefaultAutoRepeatInterval);
+
 const mojom::KeyboardSettings kKeyboardSettings1(
     /*modifier_remappings=*/{},
     /*top_row_are_fkeys=*/false,
@@ -164,14 +172,21 @@
 
     auto suppress_meta_fkey_rewrites =
         settings_dict.FindBool(prefs::kKeyboardSettingSuppressMetaFKeyRewrites);
-    ASSERT_TRUE(suppress_meta_fkey_rewrites.has_value());
-    EXPECT_EQ(settings.suppress_meta_fkey_rewrites,
-              suppress_meta_fkey_rewrites);
+    if (suppress_meta_fkey_rewrites.has_value()) {
+      EXPECT_EQ(settings.suppress_meta_fkey_rewrites,
+                suppress_meta_fkey_rewrites);
+    } else {
+      EXPECT_EQ(settings.suppress_meta_fkey_rewrites,
+                kDefaultSuppressMetaFKeyRewrites);
+    }
 
     auto top_row_are_fkeys =
         settings_dict.FindBool(prefs::kKeyboardSettingTopRowAreFKeys);
-    ASSERT_TRUE(top_row_are_fkeys.has_value());
-    EXPECT_EQ(settings.top_row_are_fkeys, top_row_are_fkeys);
+    if (top_row_are_fkeys.has_value()) {
+      EXPECT_EQ(settings.top_row_are_fkeys, top_row_are_fkeys);
+    } else {
+      EXPECT_EQ(settings.top_row_are_fkeys, kDefaultTopRowAreFKeys);
+    }
 
     auto* modifier_remappings_dict =
         settings_dict.FindDict(prefs::kKeyboardSettingModifierRemappings);
@@ -212,6 +227,17 @@
     return std::move(keyboard_ptr->settings);
   }
 
+  const base::Value::Dict* GetSettingsDictForDeviceKey(
+      const std::string& device_key) {
+    const auto& devices_dict =
+        pref_service_->GetDict(prefs::kKeyboardDeviceSettingsDictPref);
+    EXPECT_EQ(1u, devices_dict.size());
+    const auto* settings_dict = devices_dict.FindDict(device_key);
+    EXPECT_NE(nullptr, settings_dict);
+
+    return settings_dict;
+  }
+
  protected:
   std::unique_ptr<KeyboardPrefHandlerImpl> pref_handler_;
   std::unique_ptr<TestingPrefServiceSimple> pref_service_;
@@ -378,6 +404,23 @@
                                        *settings_dict);
 }
 
+TEST_F(KeyboardPrefHandlerTest,
+       TopRowAreFKeysEnabledByDefaultForExternalKeyboard) {
+  mojom::Keyboard keyboard;
+  keyboard.device_key = kKeyboardKey1;
+  keyboard.is_external = kDefaultTopRowAreFKeysExternal;
+  mojom::KeyboardSettingsPtr settings =
+      CallInitializeKeyboardSettings(keyboard);
+  EXPECT_TRUE(settings->top_row_are_fkeys);
+
+  mojom::Keyboard keyboard2;
+  keyboard.device_key = kKeyboardKey2;
+  mojom::KeyboardSettingsPtr settings2 =
+      CallInitializeKeyboardSettings(keyboard2);
+  // `top_row_are_fkeys` defaults to false for internal keyboards.
+  EXPECT_FALSE(settings2->top_row_are_fkeys);
+}
+
 TEST_F(KeyboardPrefHandlerTest, InvalidModifierRemappings) {
   CallUpdateKeyboardSettings(kKeyboardKey1, kKeyboardSettings1);
   auto devices_dict =
@@ -478,6 +521,37 @@
             ui::mojom::ModifierKey::kEscape);
 }
 
+TEST_F(KeyboardPrefHandlerTest, DefaultNotPersistedUntilUpdated) {
+  CallUpdateKeyboardSettings(kKeyboardKey1, kKeyboardSettingsDefault);
+
+  // Default settings are not persisted to storage.
+  const auto* settings_dict = GetSettingsDictForDeviceKey(kKeyboardKey1);
+  EXPECT_FALSE(settings_dict->contains(prefs::kKeyboardSettingTopRowAreFKeys));
+  EXPECT_FALSE(
+      settings_dict->contains(prefs::kKeyboardSettingSuppressMetaFKeyRewrites));
+  CheckKeyboardSettingsAndDictAreEqual(kKeyboardSettingsDefault,
+                                       *settings_dict);
+
+  // When the settings are updated, their values should be persisted.
+  CallUpdateKeyboardSettings(kKeyboardKey1, kKeyboardSettingsNotDefault);
+  settings_dict = GetSettingsDictForDeviceKey(kKeyboardKey1);
+  EXPECT_TRUE(settings_dict->contains(prefs::kKeyboardSettingTopRowAreFKeys));
+  EXPECT_TRUE(
+      settings_dict->contains(prefs::kKeyboardSettingSuppressMetaFKeyRewrites));
+  CheckKeyboardSettingsAndDictAreEqual(kKeyboardSettingsNotDefault,
+                                       *settings_dict);
+
+  // When the settings are set back to the default, values should be persisted
+  // as they are now "user chosen".
+  CallUpdateKeyboardSettings(kKeyboardKey1, kKeyboardSettingsDefault);
+  settings_dict = GetSettingsDictForDeviceKey(kKeyboardKey1);
+  EXPECT_TRUE(settings_dict->contains(prefs::kKeyboardSettingTopRowAreFKeys));
+  EXPECT_TRUE(
+      settings_dict->contains(prefs::kKeyboardSettingSuppressMetaFKeyRewrites));
+  CheckKeyboardSettingsAndDictAreEqual(kKeyboardSettingsDefault,
+                                       *settings_dict);
+}
+
 class KeyboardSettingsPrefConversionTest
     : public KeyboardPrefHandlerTest,
       public testing::WithParamInterface<
@@ -514,24 +588,14 @@
 TEST_P(KeyboardSettingsPrefConversionTest, CheckConversion) {
   CallUpdateKeyboardSettings(device_key_, settings_);
 
-  const auto& devices_dict =
-      pref_service_->GetDict(prefs::kKeyboardDeviceSettingsDictPref);
-  ASSERT_EQ(1u, devices_dict.size());
-  auto* settings_dict = devices_dict.FindDict(device_key_);
-  ASSERT_NE(nullptr, settings_dict);
-
+  const auto* settings_dict = GetSettingsDictForDeviceKey(device_key_);
   CheckKeyboardSettingsAndDictAreEqual(settings_, *settings_dict);
 }
 
 TEST_P(KeyboardSettingsPrefConversionTest, CheckRoundtripConversion) {
   CallUpdateKeyboardSettings(device_key_, settings_);
 
-  const auto& devices_dict =
-      pref_service_->GetDict(prefs::kKeyboardDeviceSettingsDictPref);
-  ASSERT_EQ(1u, devices_dict.size());
-  auto* settings_dict = devices_dict.FindDict(device_key_);
-  ASSERT_NE(nullptr, settings_dict);
-
+  const auto* settings_dict = GetSettingsDictForDeviceKey(device_key_);
   CheckKeyboardSettingsAndDictAreEqual(settings_, *settings_dict);
 
   mojom::KeyboardSettingsPtr settings =
diff --git a/ash/system/message_center/ash_notification_drag_controller.cc b/ash/system/message_center/ash_notification_drag_controller.cc
index 11a3f5de..9a5422e9 100644
--- a/ash/system/message_center/ash_notification_drag_controller.cc
+++ b/ash/system/message_center/ash_notification_drag_controller.cc
@@ -19,6 +19,7 @@
 #include "ui/base/dragdrop/os_exchange_data_provider.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/vector2d.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/public/cpp/notification.h"
@@ -35,14 +36,14 @@
     // A drag-and-drop session could start before an async drop finishes. In
     // this case, neither `OnDropCompleted()` nor `OnDragCancelled()` is called.
     // Therefore, clean up the active notification drag handling.
-    CleanUp();
+    CleanUp(DragEndState::kInterruptedByNewDrag);
   } else {
     drag_in_progress_ = true;
   }
 }
 
 void AshNotificationDragController::OnDragCancelled() {
-  CleanUp();
+  CleanUp(DragEndState::kCancelled);
 }
 
 void AshNotificationDragController::OnDropCompleted(
@@ -50,29 +51,32 @@
   // Remove the dragged notification from the message center if drag-and-drop
   // ends with copy. `MessageCenter::RemoveNotification()` guarantees that only
   // unpinned notifications are removable to users.
+  DragEndState state = DragEndState::kCompletedWithoutDrop;
   if (drag_operation == ui::mojom::DragOperation::kCopy) {
     message_center::MessageCenter::Get()->RemoveNotification(
         *dragged_notification_id_, /*by_user=*/true);
+    state = DragEndState::kCompletedWithDrop;
   }
 
-  CleanUp();
+  CleanUp(state);
 }
 
 void AshNotificationDragController::WriteDragDataForView(
     views::View* sender,
     const gfx::Point& press_pt,
     ui::OSExchangeData* data) {
+  // Sets the image to show during drag.
   AshNotificationView* notification_view =
       static_cast<AshNotificationView*>(sender);
-  const absl::optional<gfx::Rect> drag_area =
-      notification_view->GetDragAreaBounds();
-  DCHECK(drag_area);
-
-  // Set the image to show during drag.
   const absl::optional<gfx::ImageSkia> drag_image =
       notification_view->GetDragImage();
   DCHECK(drag_image);
-  data->provider().SetDragImage(*drag_image, press_pt - drag_area->origin());
+
+  // The drag point is at the top left corner, or top right corner under RTL.
+  data->provider().SetDragImage(
+      *drag_image, base::i18n::IsRTL()
+                       ? gfx::Vector2d(drag_image->size().width(), /*y=*/0)
+                       : gfx::Vector2d());
 
   notification_view->AttachDropData(data);
 }
@@ -116,7 +120,7 @@
     // this case, neither `OnDropCompleted()` nor `OnDragCancelled()` is called.
     // Therefore, clean up the active notification drag handling.
     if (drag_in_progress_) {
-      CleanUp();
+      CleanUp(DragEndState::kInterruptedByNewDrag);
     }
   }
 
@@ -188,11 +192,14 @@
       /*mark_notification_as_read=*/true);
 }
 
-void AshNotificationDragController::CleanUp() {
+void AshNotificationDragController::CleanUp(DragEndState state) {
   DCHECK(drag_in_progress_);
   drag_in_progress_ = false;
   dragged_notification_id_.reset();
   drag_drop_client_observer_.Reset();
+
+  base::UmaHistogramEnumeration("Ash.NotificationView.ImageDrag.EndState",
+                                state);
 }
 
 }  // namespace ash
diff --git a/ash/system/message_center/ash_notification_drag_controller.h b/ash/system/message_center/ash_notification_drag_controller.h
index ba5f3ad..c6141101 100644
--- a/ash/system/message_center/ash_notification_drag_controller.h
+++ b/ash/system/message_center/ash_notification_drag_controller.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "base/gtest_prod_util.h"
 #include "base/scoped_observation.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/aura/client/drag_drop_client_observer.h"
@@ -43,6 +44,28 @@
   ~AshNotificationDragController() override;
 
  private:
+  FRIEND_TEST_ALL_PREFIXES(AshNotificationViewDragTest, Basics);
+
+  // Lists notification drag end states.
+  // NOTE: used by metrics. Therefore, current values should not be renumbered
+  // or removed. This should be kept in sync with the enum in
+  // tools/metrics/histograms/enums.xml.
+  enum class DragEndState {
+    // Interrupted by a new drag session before the current one finishes.
+    kInterruptedByNewDrag = 0,
+
+    // Cancelled by users.
+    kCancelled = 1,
+
+    // Drag completes and the notification image is dropped to the target.
+    kCompletedWithDrop = 2,
+
+    // Drag completes and the notification image is NOT dropped to the target.
+    kCompletedWithoutDrop = 3,
+
+    kMaxValue = kCompletedWithoutDrop,
+  };
+
   // aura::client::DragDropClientObserver:
   void OnDragStarted() override;
   void OnDragCancelled() override;
@@ -67,7 +90,7 @@
   // 2. Drop is completed; or
   // 3. A new drag-and-drop session starts without waiting for the current
   // async drop to finish.
-  void CleanUp();
+  void CleanUp(DragEndState state);
 
   // True if there is a notification drag being handled.
   bool drag_in_progress_ = false;
diff --git a/ash/system/message_center/ash_notification_view_unittest.cc b/ash/system/message_center/ash_notification_view_unittest.cc
index acbb6b9..d057415 100644
--- a/ash/system/message_center/ash_notification_view_unittest.cc
+++ b/ash/system/message_center/ash_notification_view_unittest.cc
@@ -16,6 +16,7 @@
 #include "ash/public/cpp/test/shell_test_api.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/icon_button.h"
+#include "ash/system/message_center/ash_notification_drag_controller.h"
 #include "ash/system/message_center/ash_notification_expand_button.h"
 #include "ash/system/message_center/ash_notification_input_container.h"
 #include "ash/system/message_center/message_center_style.h"
@@ -1521,7 +1522,13 @@
 
   // Check the notification catalog name.
   tester.ExpectBucketCount("Ash.NotificationView.ImageDrag.Start",
-                           ash::NotificationCatalogName::kNone, 1);
+                           NotificationCatalogName::kNone, 1);
+  tester.ExpectBucketCount(
+      "Ash.NotificationView.ImageDrag.EndState",
+      DroppedToWidget()
+          ? AshNotificationDragController::DragEndState::kCompletedWithDrop
+          : AshNotificationDragController::DragEndState::kCompletedWithoutDrop,
+      1);
 
   // The the message center bubble is closed and the popup notification is
   // dismissed when drag ends.
diff --git a/ash/system/phonehub/app_stream_connection_error_dialog.cc b/ash/system/phonehub/app_stream_connection_error_dialog.cc
index ab5a81e..cbf978f 100644
--- a/ash/system/phonehub/app_stream_connection_error_dialog.cc
+++ b/ash/system/phonehub/app_stream_connection_error_dialog.cc
@@ -8,11 +8,14 @@
 #include <utility>
 
 #include "ash/constants/ash_features.h"
+#include "ash/public/cpp/new_window_delegate.h"
 #include "ash/public/cpp/view_shadow.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/strings/grit/ash_strings.h"
+#include "ash/style/ash_color_id.h"
 #include "ash/style/ash_color_provider.h"
 #include "ash/style/pill_button.h"
+#include "chromeos/ash/components/phonehub/url_constants.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/models/image_model.h"
 #include "ui/compositor/layer.h"
@@ -20,10 +23,12 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/transform.h"
+#include "ui/gfx/text_constants.h"
 #include "ui/strings/grit/ui_strings.h"
 #include "ui/views/background.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/label.h"
+#include "ui/views/controls/styled_label.h"
 #include "ui/views/highlight_border.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/flex_layout.h"
@@ -98,17 +103,44 @@
     title_->layer()->SetFillsBoundsOpaquely(false);
 
     // Add dialog body.
-    // TODO(b/273822975): change Learn More to link.
-    body_ =
-        AddChildView(std::make_unique<views::Label>(l10n_util::GetStringUTF16(
-            IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_MAIN_TEXT)));
+    const std::u16string learn_more_link =
+        l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE);
+    size_t offset;
+    const std::u16string body_text = l10n_util::GetStringFUTF16(
+        IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_MAIN_TEXT, learn_more_link,
+        &offset);
+
+    body_ = AddChildView(std::make_unique<views::StyledLabel>());
+    body_->SetText(body_text);
+
+    views::StyledLabel::RangeStyleInfo style;
+    style.override_color = AshColorProvider::Get()->GetContentLayerColor(
+        AshColorProvider::ContentLayerType::kTextColorPrimary);
+    body_->AddStyleRange(gfx::Range(0, offset), style);
+
+    // TODO(b/273822975): Change Learn More link to a different page than the
+    // default Phone Hub help page.
+    views::StyledLabel::RangeStyleInfo link_style =
+        views::StyledLabel::RangeStyleInfo::CreateForLink(base::BindRepeating(
+            &ConnectionErrorDialogDelegateView::LearnMoreLinkPressed,
+            base::Unretained(this),
+            base::BindRepeating(
+                &NewWindowDelegate::OpenUrl,
+                base::Unretained(NewWindowDelegate::GetPrimary()),
+                GURL(phonehub::kPhoneHubLearnMoreLink),
+                NewWindowDelegate::OpenUrlFrom::kUserInteraction,
+                NewWindowDelegate::Disposition::kNewForegroundTab)));
+    const SkColor link_color = AshColorProvider::Get()->GetContentLayerColor(
+        AshColorProvider::ContentLayerType::kButtonLabelColorBlue);
+    link_style.override_color = link_color;
+    body_->AddStyleRange(gfx::Range(offset, offset + learn_more_link.length()),
+                         link_style);
+
     body_->SetProperty(views::kMarginsKey,
                        gfx::Insets::TLBR(kMarginBetweenTitleAndBody, 0,
                                          kMarginBetweenBodyAndButtons, 0));
     body_->SetTextContext(views::style::CONTEXT_DIALOG_BODY_TEXT);
     body_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-    body_->SetMultiLine(true);
-    body_->SetAllowCharacterBreak(true);
     body_->SetAutoColorReadabilityEnabled(false);
 
     body_->SetPaintToLayer();
@@ -133,7 +165,7 @@
             &ConnectionErrorDialogDelegateView::OnStartTetheringClicked,
             base::Unretained(this))),
         l10n_util::GetStringUTF16(
-            IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_TURN_ON_HOTSPOT),
+            IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_OK_TEXT),
         PillButton::Type::kPrimaryWithoutIcon, nullptr));
   }
 
@@ -166,8 +198,6 @@
         /*use_light_colors=*/false));
     title_->SetEnabledColor(AshColorProvider::Get()->GetContentLayerColor(
         AshColorProvider::ContentLayerType::kTextColorPrimary));
-    body_->SetEnabledColor(AshColorProvider::Get()->GetContentLayerColor(
-        AshColorProvider::ContentLayerType::kTextColorPrimary));
   }
 
   void OnStartTetheringClicked() {
@@ -184,13 +214,17 @@
         views::Widget::ClosedReason::kCancelButtonClicked);
   }
 
+  void LearnMoreLinkPressed(base::RepeatingClosure callback) {
+    std::move(callback).Run();
+  }
+
  private:
   StartTetheringCallback start_tethering_callback_;
   std::unique_ptr<ViewShadow> view_shadow_;
 
   views::ImageView* icon_ = nullptr;
   views::Label* title_ = nullptr;
-  views::Label* body_ = nullptr;
+  views::StyledLabel* body_ = nullptr;
   views::Button* cancel_button_ = nullptr;
   views::Button* accept_button_ = nullptr;
 };
diff --git a/ash/system/phonehub/phone_hub_app_loading_icon.cc b/ash/system/phonehub/phone_hub_app_loading_icon.cc
index 0086ef8..7b3c7583 100644
--- a/ash/system/phonehub/phone_hub_app_loading_icon.cc
+++ b/ash/system/phonehub/phone_hub_app_loading_icon.cc
@@ -8,6 +8,7 @@
 #include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/image/canvas_image_source.h"
+#include "ui/views/animation/animation_builder.h"
 
 namespace ash {
 
@@ -63,13 +64,13 @@
   }
 
   views::AnimationBuilder builder;
+  animation_abort_handle_ = builder.GetAbortHandle();
   builder.Repeatedly()
       .SetDuration(base::Milliseconds(kAnimationFadeDownDurationInMs))
       .SetOpacity(this, kAnimationOpacityLow, gfx::Tween::ACCEL_30_DECEL_20_85)
       .Then()
       .SetDuration(base::Milliseconds(kAnimationFadeUpDurationInMs))
       .SetOpacity(this, kAnimationOpacityHigh, gfx::Tween::LINEAR);
-  animation_abort_handle_ = builder.GetAbortHandle();
 }
 
 void AppLoadingIcon::StopLoadingAnimation() {
diff --git a/ash/system/phonehub/phone_hub_more_apps_button.cc b/ash/system/phonehub/phone_hub_more_apps_button.cc
index 65a7676f..42191d3 100644
--- a/ash/system/phonehub/phone_hub_more_apps_button.cc
+++ b/ash/system/phonehub/phone_hub_more_apps_button.cc
@@ -18,7 +18,6 @@
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/size.h"
-#include "ui/views/animation/animation_builder.h"
 #include "ui/views/background.h"
 #include "ui/views/layout/table_layout.h"
 
diff --git a/ash/system/phonehub/phone_hub_recent_apps_view.cc b/ash/system/phonehub/phone_hub_recent_apps_view.cc
index 761ae52d..0c4b3c9 100644
--- a/ash/system/phonehub/phone_hub_recent_apps_view.cc
+++ b/ash/system/phonehub/phone_hub_recent_apps_view.cc
@@ -26,14 +26,17 @@
 #include "chromeos/ash/components/phonehub/notification.h"
 #include "chromeos/ash/components/phonehub/phone_hub_manager.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/image/image_skia_operations.h"
 #include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/animation/animation_builder.h"
 #include "ui/views/background.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/fill_layout.h"
 
 namespace ash {
 
@@ -72,6 +75,10 @@
 // to make the appearance of a ripple.
 constexpr int kAnimationLoadingIconStaggerDelayInMs = 100;
 
+// When the recent apps view is swapped in for the loading view, the opacities
+// of the two views are animated to give the appearance of a fade-in.
+constexpr int kLoadingViewFadeOutDurationInMs = 200;
+
 void LayoutAppButtonsView(views::View* buttons_view) {
   const gfx::Rect child_area = buttons_view->GetContentsBounds();
   views::View::Views visible_children;
@@ -195,12 +202,21 @@
   header_view_ = AddChildView(std::make_unique<HeaderView>(
       base::BindRepeating(&PhoneHubRecentAppsView::ShowConnectionErrorDialog,
                           base::Unretained(this))));
-  recent_app_buttons_view_ =
-      AddChildView(std::make_unique<RecentAppButtonsView>());
-  placeholder_view_ = AddChildView(std::make_unique<PlaceholderView>());
+
+  // Group the non-header views under a view with FillLayout so that they stack
+  // on top of each other when multiple are visible. This is important for
+  // animating the transitions between views.
+  auto* recent_apps_content = AddChildView(std::make_unique<views::View>());
+  recent_apps_content->SetLayoutManager(std::make_unique<views::FillLayout>());
+
+  recent_app_buttons_view_ = recent_apps_content->AddChildView(
+      std::make_unique<RecentAppButtonsView>());
+  placeholder_view_ =
+      recent_apps_content->AddChildView(std::make_unique<PlaceholderView>());
 
   if (features::IsEcheNetworkConnectionStateEnabled()) {
-    loading_view_ = AddChildView(std::make_unique<LoadingView>());
+    loading_view_ =
+        recent_apps_content->AddChildView(std::make_unique<LoadingView>());
   }
 
   Update();
@@ -216,6 +232,9 @@
 }
 
 PhoneHubRecentAppsView::RecentAppButtonsView::RecentAppButtonsView() {
+  SetPaintToLayer();
+  layer()->SetFillsBoundsOpaquely(false);
+  layer()->SetFillsBoundsCompletely(false);
   if (features::IsEcheLauncherIconsInMoreAppsButtonEnabled()) {
     views::BoxLayout* box_layout =
         SetLayoutManager(std::make_unique<views::BoxLayout>(
@@ -271,6 +290,9 @@
 }
 
 PhoneHubRecentAppsView::LoadingView::LoadingView() {
+  SetPaintToLayer();
+  layer()->SetFillsBoundsOpaquely(false);
+  layer()->SetFillsBoundsCompletely(false);
   SetOrientation(views::BoxLayout::Orientation::kHorizontal);
   SetDefaultFlex(1);
   SetMainAxisAlignment(views::BoxLayout::MainAxisAlignment::kCenter);
@@ -367,12 +389,6 @@
       SetVisible(true);
       break;
     case RecentAppsUiState::ITEMS_VISIBLE:
-      if (features::IsEcheNetworkConnectionStateEnabled()) {
-        // TODO(b/271478560): Include 200ms fade-in animation for the app icons.
-        loading_view_->SetVisible(false);
-        header_view_->SetErrorButtonVisible(false);
-      }
-
       std::vector<phonehub::Notification::AppMetadata> recent_apps_list =
           recent_apps_interaction_handler_->FetchRecentAppMetadataList();
 
@@ -397,8 +413,9 @@
 
       recent_app_buttons_view_->SetVisible(true);
       placeholder_view_->SetVisible(false);
-      if (loading_view_) {
-        loading_view_->SetVisible(false);
+      if (features::IsEcheNetworkConnectionStateEnabled()) {
+        header_view_->SetErrorButtonVisible(false);
+        FadeOutLoadingView();
       }
       SetVisible(true);
       break;
@@ -406,6 +423,25 @@
   PreferredSizeChanged();
 }
 
+void PhoneHubRecentAppsView::FadeOutLoadingView() {
+  if (features::IsEcheNetworkConnectionStateEnabled() &&
+      loading_view_->GetVisible()) {
+    loading_view_->StopLoadingAnimation();
+    recent_app_buttons_view_->SetVisible(true);
+
+    views::AnimationBuilder()
+        .OnEnded(base::BindOnce(&LoadingView::SetVisible,
+                                base::Unretained(loading_view_), false))
+        .Once()
+        .SetOpacity(loading_view_, 1.0f)
+        .SetOpacity(recent_app_buttons_view_, 0.0f)
+        .Then()
+        .SetDuration(base::Milliseconds(kLoadingViewFadeOutDurationInMs))
+        .SetOpacity(loading_view_, 0.0f, gfx::Tween::LINEAR)
+        .SetOpacity(recent_app_buttons_view_, 1.0f, gfx::Tween::LINEAR);
+  }
+}
+
 void PhoneHubRecentAppsView::SwitchToFullAppsList() {
   if (!features::IsEcheLauncherEnabled()) {
     return;
diff --git a/ash/system/phonehub/phone_hub_recent_apps_view.h b/ash/system/phonehub/phone_hub_recent_apps_view.h
index 4c58e40..7774e8da 100644
--- a/ash/system/phonehub/phone_hub_recent_apps_view.h
+++ b/ash/system/phonehub/phone_hub_recent_apps_view.h
@@ -128,6 +128,10 @@
 
   void ShowConnectionErrorDialog();
 
+  // Apply an opacity animation when swapping out the loading view for the
+  // RecentAppButtonsView.
+  void FadeOutLoadingView();
+
   // Generate more apps button.
   std::unique_ptr<views::View> GenerateMoreAppsButton();
 
diff --git a/ash/system/privacy_hub/microphone_privacy_switch_controller.cc b/ash/system/privacy_hub/microphone_privacy_switch_controller.cc
index 117ebc7..be06b7a 100644
--- a/ash/system/privacy_hub/microphone_privacy_switch_controller.cc
+++ b/ash/system/privacy_hub/microphone_privacy_switch_controller.cc
@@ -191,8 +191,10 @@
 
   if (visible) {
     if (mic_muted_by_mute_switch_) {
-      privacy_hub_notification_controller->ShowHardwareSwitchNotification(
-          SensorDisabledNotificationDelegate::Sensor::kMicrophone);
+      if (!features::IsPrivacyIndicatorsEnabled()) {
+        privacy_hub_notification_controller->ShowHardwareSwitchNotification(
+            SensorDisabledNotificationDelegate::Sensor::kMicrophone);
+      }
     } else {
       privacy_hub_notification_controller->ShowSoftwareSwitchNotification(
           SensorDisabledNotificationDelegate::Sensor::kMicrophone);
@@ -216,8 +218,10 @@
       Shell::Get()->system_notification_controller()->privacy_hub();
 
   if (mic_muted_by_mute_switch_) {
-    privacy_hub_notification_controller->UpdateHardwareSwitchNotification(
-        SensorDisabledNotificationDelegate::Sensor::kMicrophone);
+    if (!features::IsPrivacyIndicatorsEnabled()) {
+      privacy_hub_notification_controller->UpdateHardwareSwitchNotification(
+          SensorDisabledNotificationDelegate::Sensor::kMicrophone);
+    }
   } else {
     privacy_hub_notification_controller->UpdateSoftwareSwitchNotification(
         SensorDisabledNotificationDelegate::Sensor::kMicrophone);
diff --git a/ash/system/privacy_hub/microphone_privacy_switch_controller_unittest.cc b/ash/system/privacy_hub/microphone_privacy_switch_controller_unittest.cc
index 244612d..af5d061 100644
--- a/ash/system/privacy_hub/microphone_privacy_switch_controller_unittest.cc
+++ b/ash/system/privacy_hub/microphone_privacy_switch_controller_unittest.cc
@@ -490,7 +490,7 @@
   EXPECT_FALSE(GetSWSwitchNotification());
   message_center::Notification* notification = GetHWSwitchNotification();
 
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(notification);
     return;
   }
@@ -518,7 +518,7 @@
 
   message_center::Notification* notification = GetHWSwitchNotification();
 
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(notification);
     return;
   }
@@ -552,6 +552,13 @@
                   IDS_MICROPHONE_MUTED_NOTIFICATION_ACTION_BUTTON),
               notification->buttons()[0].title);
   }
+
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
+    // The rest of the test tests interaction between the hardware and software
+    // notifications, and the hardware notification is not shown when Video
+    // Conference or Privacy Indicator is enabled.
+    return;
+  }
   // Toggle microphone mute switch and verify that new notification appears
   // with a "Learn more" button.
   SetMicrophoneMuteSwitchState(/*muted=*/true);
@@ -559,7 +566,7 @@
   EXPECT_FALSE(GetSWSwitchNotification());
 
   notification = GetHWSwitchNotification();
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(notification);
   } else {
     ASSERT_TRUE(notification);
@@ -589,20 +596,23 @@
     EXPECT_TRUE(GetSWSwitchPopupNotification());
   }
 
-  // Toggle microphone mute switch and verify that toggling mute switch creates
-  // new hardware switch pop up notification and the software switch
+  // Toggle microphone mute hardware switch and verify that toggling mute switch
+  // creates new hardware switch pop up notification and the software switch
   // notification is removed.
   SetMicrophoneMuteSwitchState(/*muted=*/true);
 
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(GetHWSwitchNotification());
     EXPECT_FALSE(GetHWSwitchNotification());
-  } else {
-    // Verify the notification popup is shown.
-    EXPECT_TRUE(GetHWSwitchNotification());
-    EXPECT_TRUE(GetHWSwitchNotification());
+    // The rest of the test is not relevant as the hardware switch notification
+    // is not shown.
+    return;
   }
 
+  // Verify the notification popup is shown.
+  EXPECT_TRUE(GetHWSwitchNotification());
+  EXPECT_TRUE(GetHWSwitchNotification());
+
   // The software switch notification is instantly hidden.
   EXPECT_FALSE(GetSWSwitchNotification());
 
@@ -621,7 +631,7 @@
   SetMicrophoneMuteSwitchState(/*muted=*/true);
   LaunchApp(u"junior");
 
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(GetHWSwitchNotification());
     EXPECT_FALSE(GetHWSwitchNotification());
   } else {
@@ -653,7 +663,7 @@
   // Add another audio input stream, and verify the notification popup shows.
   LaunchApp(u"junior1");
 
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(GetHWSwitchNotification());
     EXPECT_FALSE(GetHWSwitchPopupNotification());
   } else {
@@ -670,7 +680,7 @@
   CloseApp(u"junior1");
 
   // Verify that notification popup is not reshown.
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(GetHWSwitchNotification());
   } else {
     EXPECT_TRUE(GetHWSwitchNotification());
@@ -679,7 +689,7 @@
 
   // Adding another stream shows a popup again.
   LaunchApp(u"rose");
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(GetHWSwitchNotification());
     EXPECT_FALSE(GetHWSwitchPopupNotification());
   } else {
@@ -773,7 +783,7 @@
 
   // Toggle the hw switch.
   SetMicrophoneMuteSwitchState(/*muted=*/true);
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(GetHWSwitchNotification());
     EXPECT_FALSE(GetHWSwitchPopupNotification());
   } else {
@@ -852,7 +862,7 @@
   LaunchApp(app1);
 
   notification_ptr = GetHWSwitchNotification();
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(notification_ptr);
   } else {
     ASSERT_TRUE(notification_ptr);
@@ -867,7 +877,7 @@
   CloseApp(app2);
 
   notification_ptr = GetHWSwitchNotification();
-  if (IsVideoConferenceEnabled()) {
+  if (IsVideoConferenceEnabled() || IsPrivacyIndicatorsEnabled()) {
     EXPECT_FALSE(notification_ptr);
   } else {
     ASSERT_TRUE(notification_ptr);
diff --git a/ash/system/privacy_hub/privacy_hub_notification_controller.cc b/ash/system/privacy_hub/privacy_hub_notification_controller.cc
index aef3655..9e79543 100644
--- a/ash/system/privacy_hub/privacy_hub_notification_controller.cc
+++ b/ash/system/privacy_hub/privacy_hub_notification_controller.cc
@@ -172,6 +172,11 @@
 
 void PrivacyHubNotificationController::ShowHardwareSwitchNotification(
     const Sensor sensor) {
+  if (features::IsPrivacyIndicatorsEnabled() ||
+      features::IsVideoConferenceEnabled()) {
+    return;
+  }
+
   switch (sensor) {
     case Sensor::kMicrophone: {
       RemoveSensor(sensor);
@@ -208,6 +213,10 @@
 
 void PrivacyHubNotificationController::UpdateHardwareSwitchNotification(
     const Sensor sensor) {
+  if (features::IsPrivacyIndicatorsEnabled() ||
+      features::IsVideoConferenceEnabled()) {
+    return;
+  }
   switch (sensor) {
     case Sensor::kMicrophone: {
       microphone_hw_switch_notification_->Update();
diff --git a/ash/system/unified/unified_slider_view.cc b/ash/system/unified/unified_slider_view.cc
index fa2e7762..1d3cbd4 100644
--- a/ash/system/unified/unified_slider_view.cc
+++ b/ash/system/unified/unified_slider_view.cc
@@ -67,7 +67,10 @@
                                      const gfx::VectorIcon& icon,
                                      int accessible_name_id,
                                      bool read_only,
-                                     QuickSettingsSlider::Style slider_style) {
+                                     QuickSettingsSlider::Style slider_style)
+    : icon_(&icon),
+      accessible_name_id_(accessible_name_id),
+      callback_(callback) {
   if (!features::IsQsRevampEnabled()) {
     button_ = AddChildView(std::make_unique<IconButton>(
         std::move(callback), IconButton::Type::kMedium, &icon,
@@ -137,7 +140,8 @@
   auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kHorizontal, kQsSliderRowPadding,
       kQsSliderViewSpacing));
-  layout->SetFlexForView(AddChildView(std::move(container)), /*flex=*/1);
+  container_ = AddChildView(std::move(container));
+  layout->SetFlexForView(container_, /*flex=*/1);
   layout->set_cross_axis_alignment(
       views::BoxLayout::CrossAxisAlignment::kCenter);
 
@@ -153,17 +157,27 @@
   // It should allow the case GetWidget() returning null, so that initial
   // position can be properly set by controllers before the view is attached to
   // a widget.
-  if (GetWidget() && GetWidget()->IsClosed())
+  if (GetWidget() && GetWidget()->IsClosed()) {
     return;
+  }
 
   slider_->SetValue(value);
-  if (by_user)
+  if (by_user) {
     slider_->SetEnableAccessibilityEvents(true);
+  }
 }
 
 UnifiedSliderView::~UnifiedSliderView() = default;
 
 void UnifiedSliderView::CreateToastLabel() {
+  if (features::IsQsRevampEnabled()) {
+    button_ = AddChildView(std::make_unique<IconButton>(
+        std::move(callback_), IconButton::Type::kMedium, icon_,
+        accessible_name_id_,
+        /*is_togglable=*/true,
+        /*has_border=*/true));
+    container_->SetVisible(false);
+  }
   toast_label_ = AddChildView(std::make_unique<views::Label>());
   TrayPopupUtils::SetLabelFontList(toast_label_,
                                    TrayPopupUtils::FontStyle::kPodMenuHeader);
diff --git a/ash/system/unified/unified_slider_view.h b/ash/system/unified/unified_slider_view.h
index 9fbf8592..178a7274 100644
--- a/ash/system/unified/unified_slider_view.h
+++ b/ash/system/unified/unified_slider_view.h
@@ -9,6 +9,7 @@
 #include "ash/style/icon_button.h"
 #include "quick_settings_slider.h"
 #include "ui/base/metadata/metadata_header_macros.h"
+#include "ui/gfx/vector_icon_types.h"
 #include "ui/views/controls/image_view.h"
 
 namespace gfx {
@@ -86,11 +87,16 @@
   void CreateToastLabel();
 
  private:
+  const gfx::VectorIcon* icon_;
+  int accessible_name_id_;
+  views::Button::PressedCallback callback_;
+
   // Unowned. Owned by views hierarchy.
   IconButton* button_ = nullptr;
   views::Slider* slider_ = nullptr;
   views::Label* toast_label_ = nullptr;
   views::ImageView* slider_icon_ = nullptr;
+  views::View* container_;
 };
 
 }  // namespace ash
diff --git a/ash/webui/diagnostics_ui/backend/input/input_data_provider_unittest.cc b/ash/webui/diagnostics_ui/backend/input/input_data_provider_unittest.cc
index f018e91..8ae70d73 100644
--- a/ash/webui/diagnostics_ui/backend/input/input_data_provider_unittest.cc
+++ b/ash/webui/diagnostics_ui/backend/input/input_data_provider_unittest.cc
@@ -47,6 +47,7 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/chromeos/events/event_rewriter_chromeos.h"
 #include "ui/chromeos/events/keyboard_capability.h"
@@ -576,11 +577,15 @@
   }
 
   // Not used, only to satisfy interface.
-  bool RewriteMetaTopRowKeyComboEvents() const override { return true; }
+  bool RewriteMetaTopRowKeyComboEvents(int device_id) const override {
+    return true;
+  }
   void SuppressMetaTopRowKeyComboRewrites(bool should_suppress) override {}
-  bool GetKeyboardRemappedPrefValue(const std::string& pref_name,
-                                    int* result) const override {
-    return false;
+  absl::optional<ui::mojom::ModifierKey> GetKeyboardRemappedModifierValue(
+      int device_id,
+      ui::mojom::ModifierKey modifier_key,
+      const std::string& pref_name) const override {
+    return absl::nullopt;
   }
   bool TopRowKeysAreFunctionKeys(int device_id) const override { return false; }
   bool IsExtensionCommandRegistered(ui::KeyboardCode key_code,
diff --git a/ash/webui/eche_app_ui/BUILD.gn b/ash/webui/eche_app_ui/BUILD.gn
index 905d4f5d..1012c034 100644
--- a/ash/webui/eche_app_ui/BUILD.gn
+++ b/ash/webui/eche_app_ui/BUILD.gn
@@ -24,8 +24,8 @@
 
 static_library("eche_connection_status") {
   sources = [
-    "eche_connection_status_observer.cc",
-    "eche_connection_status_observer.h",
+    "eche_connection_status_handler.cc",
+    "eche_connection_status_handler.h",
   ]
 
   deps = [
@@ -159,7 +159,7 @@
     "eche_alert_generator_unittest.cc",
     "eche_app_manager_unittest.cc",
     "eche_connection_scheduler_impl_unittest.cc",
-    "eche_connection_status_observer_unittest.cc",
+    "eche_connection_status_handler_unittest.cc",
     "eche_connector_impl_unittest.cc",
     "eche_feature_status_provider_unittest.cc",
     "eche_message_receiver_impl_unittest.cc",
diff --git a/ash/webui/eche_app_ui/eche_app_manager.cc b/ash/webui/eche_app_ui/eche_app_manager.cc
index e4a47ee..0dab695 100644
--- a/ash/webui/eche_app_ui/eche_app_manager.cc
+++ b/ash/webui/eche_app_ui/eche_app_manager.cc
@@ -12,7 +12,7 @@
 #include "ash/webui/eche_app_ui/eche_alert_generator.h"
 #include "ash/webui/eche_app_ui/eche_connection_metrics_recorder.h"
 #include "ash/webui/eche_app_ui/eche_connection_scheduler_impl.h"
-#include "ash/webui/eche_app_ui/eche_connection_status_observer.h"
+#include "ash/webui/eche_app_ui/eche_connection_status_handler.h"
 #include "ash/webui/eche_app_ui/eche_connector_impl.h"
 #include "ash/webui/eche_app_ui/eche_message_receiver_impl.h"
 #include "ash/webui/eche_app_ui/eche_presence_manager.h"
@@ -112,8 +112,8 @@
               feature_status_provider_.get())),
       eche_stream_orientation_observer_(
           std::make_unique<EcheStreamOrientationObserver>()),
-      eche_connection_status_observer_(
-          std::make_unique<EcheConnectionStatusObserver>()) {
+      eche_connection_status_handler_(
+          std::make_unique<EcheConnectionStatusHandler>()) {
   ash::GetNetworkConfigService(
       remote_cros_network_config_.BindNewPipeAndPassReceiver());
   system_info_provider_ = std::make_unique<SystemInfoProvider>(
@@ -123,7 +123,7 @@
 
   if (features::IsEcheNetworkConnectionStateEnabled()) {
     phone_hub_manager->GetRecentAppsInteractionHandler()
-        ->SetConnectionStatusObserver(eche_connection_status_observer_.get());
+        ->SetConnectionStatusHandler(eche_connection_status_handler_.get());
   }
 }
 
@@ -161,7 +161,7 @@
 
 void EcheAppManager::BindConnectionStatusObserverInterface(
     mojo::PendingReceiver<mojom::ConnectionStatusObserver> receiver) {
-  eche_connection_status_observer_->Bind(std::move(receiver));
+  eche_connection_status_handler_->Bind(std::move(receiver));
 }
 
 AppsAccessManager* EcheAppManager::GetAppsAccessManager() {
@@ -179,7 +179,7 @@
 // NOTE: These should be destroyed in the opposite order of how these objects
 // are initialized in the constructor.
 void EcheAppManager::Shutdown() {
-  eche_connection_status_observer_.reset();
+  eche_connection_status_handler_.reset();
   eche_stream_orientation_observer_.reset();
   system_info_provider_.reset();
   eche_tray_stream_status_observer_.reset();
diff --git a/ash/webui/eche_app_ui/eche_app_manager.h b/ash/webui/eche_app_ui/eche_app_manager.h
index f2ff794..2f08051 100644
--- a/ash/webui/eche_app_ui/eche_app_manager.h
+++ b/ash/webui/eche_app_ui/eche_app_manager.h
@@ -55,7 +55,7 @@
 class EcheTrayStreamStatusObserver;
 class EcheConnectionScheduler;
 class EcheStreamOrientationObserver;
-class EcheConnectionStatusObserver;
+class EcheConnectionStatusHandler;
 
 // Implements the core logic of the EcheApp and exposes interfaces via its
 // public API. Implemented as a KeyedService since it depends on other
@@ -133,8 +133,7 @@
       eche_tray_stream_status_observer_;
   std::unique_ptr<EcheStreamOrientationObserver>
       eche_stream_orientation_observer_;
-  std::unique_ptr<EcheConnectionStatusObserver>
-      eche_connection_status_observer_;
+  std::unique_ptr<EcheConnectionStatusHandler> eche_connection_status_handler_;
 };
 
 }  // namespace eche_app
diff --git a/ash/webui/eche_app_ui/eche_app_manager_unittest.cc b/ash/webui/eche_app_ui/eche_app_manager_unittest.cc
index bdb7ba6..4655649 100644
--- a/ash/webui/eche_app_ui/eche_app_manager_unittest.cc
+++ b/ash/webui/eche_app_ui/eche_app_manager_unittest.cc
@@ -6,7 +6,7 @@
 
 #include <vector>
 
-#include "ash/webui/eche_app_ui/eche_connection_status_observer.h"
+#include "ash/webui/eche_app_ui/eche_connection_status_handler.h"
 #include "ash/webui/eche_app_ui/eche_stream_orientation_observer.h"
 #include "ash/webui/eche_app_ui/eche_stream_status_change_handler.h"
 #include "ash/webui/eche_app_ui/launch_app_helper.h"
diff --git a/ash/webui/eche_app_ui/eche_connection_status_observer.cc b/ash/webui/eche_app_ui/eche_connection_status_handler.cc
similarity index 62%
rename from ash/webui/eche_app_ui/eche_connection_status_observer.cc
rename to ash/webui/eche_app_ui/eche_connection_status_handler.cc
index 662c8f6..cded692 100644
--- a/ash/webui/eche_app_ui/eche_connection_status_observer.cc
+++ b/ash/webui/eche_app_ui/eche_connection_status_handler.cc
@@ -2,41 +2,41 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/webui/eche_app_ui/eche_connection_status_observer.h"
+#include "ash/webui/eche_app_ui/eche_connection_status_handler.h"
 
 #include "ash/constants/ash_features.h"
 #include "chromeos/ash/components/multidevice/logging/logging.h"
 
 namespace ash::eche_app {
 
-EcheConnectionStatusObserver::EcheConnectionStatusObserver() = default;
+EcheConnectionStatusHandler::EcheConnectionStatusHandler() = default;
 
-EcheConnectionStatusObserver::~EcheConnectionStatusObserver() = default;
+EcheConnectionStatusHandler::~EcheConnectionStatusHandler() = default;
 
-void EcheConnectionStatusObserver::OnConnectionStatusChanged(
+void EcheConnectionStatusHandler::OnConnectionStatusChanged(
     mojom::ConnectionStatus connection_status) {
   if (features::IsEcheNetworkConnectionStateEnabled()) {
-    PA_LOG(INFO) << "echeapi EcheConnectionStatusObserver "
+    PA_LOG(INFO) << "echeapi EcheConnectionStatusHandler "
                  << " OnConnectionStatusChanged " << connection_status;
     NotifyConnectionStatusChanged(connection_status);
   }
 }
 
-void EcheConnectionStatusObserver::AddObserver(Observer* observer) {
+void EcheConnectionStatusHandler::AddObserver(Observer* observer) {
   observer_list_.AddObserver(observer);
 }
 
-void EcheConnectionStatusObserver::RemoveObserver(Observer* observer) {
+void EcheConnectionStatusHandler::RemoveObserver(Observer* observer) {
   observer_list_.RemoveObserver(observer);
 }
 
-void EcheConnectionStatusObserver::Bind(
+void EcheConnectionStatusHandler::Bind(
     mojo::PendingReceiver<mojom::ConnectionStatusObserver> receiver) {
   connection_status_receiver_.reset();
   connection_status_receiver_.Bind(std::move(receiver));
 }
 
-void EcheConnectionStatusObserver::NotifyConnectionStatusChanged(
+void EcheConnectionStatusHandler::NotifyConnectionStatusChanged(
     mojom::ConnectionStatus connection_status) {
   for (auto& observer : observer_list_) {
     observer.OnConnectionStatusChanged(connection_status);
diff --git a/ash/webui/eche_app_ui/eche_connection_status_observer.h b/ash/webui/eche_app_ui/eche_connection_status_handler.h
similarity index 72%
rename from ash/webui/eche_app_ui/eche_connection_status_observer.h
rename to ash/webui/eche_app_ui/eche_connection_status_handler.h
index 6d10ff1..08c0764 100644
--- a/ash/webui/eche_app_ui/eche_connection_status_observer.h
+++ b/ash/webui/eche_app_ui/eche_connection_status_handler.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_WEBUI_ECHE_APP_UI_ECHE_CONNECTION_STATUS_OBSERVER_H_
-#define ASH_WEBUI_ECHE_APP_UI_ECHE_CONNECTION_STATUS_OBSERVER_H_
+#ifndef ASH_WEBUI_ECHE_APP_UI_ECHE_CONNECTION_STATUS_HANDLER_H_
+#define ASH_WEBUI_ECHE_APP_UI_ECHE_CONNECTION_STATUS_HANDLER_H_
 
 #include "ash/webui/eche_app_ui/mojom/eche_app.mojom.h"
 #include "base/observer_list.h"
@@ -15,7 +15,7 @@
 
 // Implements the ConnectionStatusObserver interface to receive the connection
 // status when attempting to bootstrap the connection to the phone.
-class EcheConnectionStatusObserver : public mojom::ConnectionStatusObserver {
+class EcheConnectionStatusHandler : public mojom::ConnectionStatusObserver {
  public:
   class Observer : public base::CheckedObserver {
    public:
@@ -25,11 +25,11 @@
         mojom::ConnectionStatus connection_status) = 0;
   };
 
-  EcheConnectionStatusObserver();
-  ~EcheConnectionStatusObserver() override;
+  EcheConnectionStatusHandler();
+  ~EcheConnectionStatusHandler() override;
 
-  EcheConnectionStatusObserver(const EcheConnectionStatusObserver&) = delete;
-  EcheConnectionStatusObserver& operator=(const EcheConnectionStatusObserver&) =
+  EcheConnectionStatusHandler(const EcheConnectionStatusHandler&) = delete;
+  EcheConnectionStatusHandler& operator=(const EcheConnectionStatusHandler&) =
       delete;
 
   // mojom::ConnectionStatusObserver:
@@ -52,4 +52,4 @@
 
 }  // namespace ash::eche_app
 
-#endif  // ASH_WEBUI_ECHE_APP_UI_ECHE_CONNECTION_STATUS_OBSERVER_H_
+#endif  // ASH_WEBUI_ECHE_APP_UI_ECHE_CONNECTION_STATUS_HANDLER_H_
diff --git a/ash/webui/eche_app_ui/eche_connection_status_observer_unittest.cc b/ash/webui/eche_app_ui/eche_connection_status_handler_unittest.cc
similarity index 84%
rename from ash/webui/eche_app_ui/eche_connection_status_observer_unittest.cc
rename to ash/webui/eche_app_ui/eche_connection_status_handler_unittest.cc
index fef0034..937b9cc0 100644
--- a/ash/webui/eche_app_ui/eche_connection_status_observer_unittest.cc
+++ b/ash/webui/eche_app_ui/eche_connection_status_handler_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/webui/eche_app_ui/eche_connection_status_observer.h"
+#include "ash/webui/eche_app_ui/eche_connection_status_handler.h"
 
 #include "ash/constants/ash_features.h"
 #include "base/test/scoped_feature_list.h"
@@ -13,7 +13,7 @@
 
 namespace {
 
-class FakeObserver : public EcheConnectionStatusObserver::Observer {
+class FakeObserver : public EcheConnectionStatusHandler::Observer {
  public:
   FakeObserver() = default;
   ~FakeObserver() override = default;
@@ -26,7 +26,7 @@
     return last_connection_changed_status_;
   }
 
-  // EcheConnectionStatusObserver::Observer:
+  // EcheConnectionStatusHandler::Observer:
   void OnConnectionStatusChanged(
       mojom::ConnectionStatus connection_status) override {
     ++num_connection_status_changed_calls_;
@@ -41,14 +41,14 @@
 
 }  // namespace
 
-class EcheConnectionStatusObserverTest : public testing::Test {
+class EcheConnectionStatusHandlerTest : public testing::Test {
  public:
-  EcheConnectionStatusObserverTest() = default;
-  EcheConnectionStatusObserverTest(const EcheConnectionStatusObserverTest&) =
+  EcheConnectionStatusHandlerTest() = default;
+  EcheConnectionStatusHandlerTest(const EcheConnectionStatusHandlerTest&) =
       delete;
-  EcheConnectionStatusObserverTest& operator=(
-      const EcheConnectionStatusObserverTest&) = delete;
-  ~EcheConnectionStatusObserverTest() override = default;
+  EcheConnectionStatusHandlerTest& operator=(
+      const EcheConnectionStatusHandlerTest&) = delete;
+  ~EcheConnectionStatusHandlerTest() override = default;
 
   // testing::Test:
   void SetUp() override {
@@ -57,7 +57,7 @@
                               features::kEcheNetworkConnectionState},
         /*disabled_features=*/{});
 
-    observer_ = std::make_unique<EcheConnectionStatusObserver>();
+    observer_ = std::make_unique<EcheConnectionStatusHandler>();
     observer_->AddObserver(&fake_observer_);
   }
 
@@ -83,10 +83,10 @@
 
  private:
   FakeObserver fake_observer_;
-  std::unique_ptr<EcheConnectionStatusObserver> observer_;
+  std::unique_ptr<EcheConnectionStatusHandler> observer_;
 };
 
-TEST_F(EcheConnectionStatusObserverTest, OnConnectionStatusChanged) {
+TEST_F(EcheConnectionStatusHandlerTest, OnConnectionStatusChanged) {
   EXPECT_EQ(GetLastConnectionChangedStatus(),
             mojom::ConnectionStatus::kConnectionStatusDisconnected);
   EXPECT_EQ(GetNumConnectionStatusChangedCalls(), 0u);
@@ -120,8 +120,7 @@
   EXPECT_EQ(GetNumConnectionStatusChangedCalls(), 4u);
 }
 
-TEST_F(EcheConnectionStatusObserverTest,
-       OnConnectionStatusChangedFlagDisabled) {
+TEST_F(EcheConnectionStatusHandlerTest, OnConnectionStatusChangedFlagDisabled) {
   scoped_feature_list_.Reset();
   scoped_feature_list_.InitWithFeatures(
       /*enabled_features=*/{features::kEcheSWA},
diff --git a/ash/webui/eche_app_ui/mojom/eche_app.mojom b/ash/webui/eche_app_ui/mojom/eche_app.mojom
index b32d098..6f8dab51 100644
--- a/ash/webui/eche_app_ui/mojom/eche_app.mojom
+++ b/ash/webui/eche_app_ui/mojom/eche_app.mojom
@@ -169,4 +169,8 @@
   APPS_LIST = 0,    // App stream was launched from the full apps list.
   NOTIFICATION = 1, // App stream was launched from a notification.
   RECENT_APPS = 2,  // App stream was launched from the recent apps.
+  // The initial value set before app streaming started. Should never be
+  // recorded histogram since by the time we start app streaming, a proper
+  // value should have been set.
+  UNKNOWN = 3,
 };
diff --git a/ash/webui/personalization_app/personalization_app_ui.cc b/ash/webui/personalization_app/personalization_app_ui.cc
index 642b36e..8fb7a171 100644
--- a/ash/webui/personalization_app/personalization_app_ui.cc
+++ b/ash/webui/personalization_app/personalization_app_ui.cc
@@ -283,7 +283,17 @@
       {"googlePhotosZeroStateMessage",
        IDS_PERSONALIZATION_APP_GOOGLE_PHOTOS_ZERO_STATE_MESSAGE},
       {"googlePhotosAlbumZeroStateMessage",
-       IDS_PERSONALIZATION_APP_GOOGLE_PHOTOS_ALBUM_ZERO_STATE_MESSAGE}};
+       IDS_PERSONALIZATION_APP_GOOGLE_PHOTOS_ALBUM_ZERO_STATE_MESSAGE},
+
+      //  Time of day Wallpaper/Screen saver strings
+      {"timeOfDayWallpaperDialogTitle",
+       IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_TITLE},
+      {"timeOfDayWallpaperDialogContent",
+       IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONTENT},
+      {"timeOfDayWallpaperDialogBackButton",
+       IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_BACK_BUTTON},
+      {"timeOfDayWallpaperDialogConfirmButton",
+       IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONFIRM_BUTTON}};
 
   source->AddLocalizedStrings(kLocalizedStrings);
 
diff --git a/ash/webui/personalization_app/resources/BUILD.gn b/ash/webui/personalization_app/resources/BUILD.gn
index 72a14b0..9fc3bfb 100644
--- a/ash/webui/personalization_app/resources/BUILD.gn
+++ b/ash/webui/personalization_app/resources/BUILD.gn
@@ -76,6 +76,7 @@
     "js/wallpaper/google_photos_zero_state_element.ts",
     "js/wallpaper/info_svg_element.ts",
     "js/wallpaper/local_images_element.ts",
+    "js/wallpaper/time_of_day_wallpaper_dialog_element.ts",
     "js/wallpaper/wallpaper_collections_element.ts",
     "js/wallpaper/wallpaper_error_element.ts",
     "js/wallpaper/wallpaper_fullscreen_element.ts",
@@ -115,6 +116,7 @@
     "js/theme/theme_observer.ts",
     "js/theme/theme_reducers.ts",
     "js/theme/theme_state.ts",
+    "js/theme/utils.ts",
     "js/user/user_actions.ts",
     "js/user/user_controller.ts",
     "js/user/user_image_observer.ts",
diff --git a/ash/webui/personalization_app/resources/js/ambient/albums_subpage_element.html b/ash/webui/personalization_app/resources/js/ambient/albums_subpage_element.html
index 97613cb..fa94899f 100644
--- a/ash/webui/personalization_app/resources/js/ambient/albums_subpage_element.html
+++ b/ash/webui/personalization_app/resources/js/ambient/albums_subpage_element.html
@@ -9,6 +9,10 @@
     min-height: 32px;
   }
 
+  #noAlbumText {
+    display: inline;
+  }
+
   #descriptionPlaceholder {
     height: 20px;
     width: 50%;
@@ -56,7 +60,7 @@
 
     <!-- Only Google Photos may not have albums -->
     <template is="dom-if" if="[[showNoGoogleAlbums_(topicSource, albums)]]">
-      <localized-link class="cr-row first"
+      <localized-link id="noAlbumText" class="cr-row first"
           localized-string=
               "[[i18nAdvanced('ambientModeAlbumsSubpageGooglePhotosNoAlbum')]]">
       </localized-link>
diff --git a/ash/webui/personalization_app/resources/js/personalization_app.ts b/ash/webui/personalization_app/resources/js/personalization_app.ts
index 50f9bda..7a88ba9 100644
--- a/ash/webui/personalization_app/resources/js/personalization_app.ts
+++ b/ash/webui/personalization_app/resources/js/personalization_app.ts
@@ -108,6 +108,7 @@
 export {GooglePhotosSharedAlbumDialog, AcceptEvent} from './wallpaper/google_photos_shared_album_dialog_element.js';
 export {GooglePhotosZeroState} from './wallpaper/google_photos_zero_state_element.js';
 export {LocalImages} from './wallpaper/local_images_element.js';
+export {TimeOfDayAcceptEvent, TimeOfDayWallpaperDialog} from './wallpaper/time_of_day_wallpaper_dialog_element.js';
 export {isDefaultImage, isFilePath, isGooglePhotosPhoto, isWallpaperImage} from './wallpaper/utils.js';
 export * from './wallpaper/wallpaper_actions.js';
 export {WallpaperCollections} from './wallpaper/wallpaper_collections_element.js';
diff --git a/ash/webui/personalization_app/resources/js/theme/dynamic_color_element.ts b/ash/webui/personalization_app/resources/js/theme/dynamic_color_element.ts
index af7b4f3..2bfd8b5 100644
--- a/ash/webui/personalization_app/resources/js/theme/dynamic_color_element.ts
+++ b/ash/webui/personalization_app/resources/js/theme/dynamic_color_element.ts
@@ -27,6 +27,7 @@
 import {initializeDynamicColorData, setColorSchemePref, setStaticColorPref} from './theme_controller.js';
 import {getThemeProvider} from './theme_interface_provider.js';
 import {ThemeObserver} from './theme_observer.js';
+import {DEFAULT_COLOR_SCHEME, DEFAULT_STATIC_COLOR, isAutomaticSeedColorEnabled} from './utils.js';
 
 export interface DynamicColorElement {
   $: {
@@ -37,9 +38,6 @@
   };
 }
 
-const DEFAULT_STATIC_COLOR = hexColorToSkColor('#4285f4');
-const DEFAULT_COLOR_SCHEME = ColorScheme.kTonalSpot;
-
 export class DynamicColorElement extends WithPersonalizationStore {
   static get is() {
     return 'dynamic-color';
@@ -144,7 +142,7 @@
   }
 
   private isAutomaticSeedColorEnabled_(colorScheme: ColorScheme|null) {
-    return colorScheme === null || colorScheme !== ColorScheme.kStatic;
+    return isAutomaticSeedColorEnabled(colorScheme);
   }
 
   private getColorSchemeAriaChecked_(
diff --git a/ash/webui/personalization_app/resources/js/theme/utils.ts b/ash/webui/personalization_app/resources/js/theme/utils.ts
new file mode 100644
index 0000000..731a7e79
--- /dev/null
+++ b/ash/webui/personalization_app/resources/js/theme/utils.ts
@@ -0,0 +1,17 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Utility functions to be used for theme related components.
+ */
+import {hexColorToSkColor} from 'chrome://resources/js/color_utils.js';
+
+import {ColorScheme} from '../../personalization_app.mojom-webui.js';
+
+export function isAutomaticSeedColorEnabled(colorScheme: ColorScheme|null) {
+  return colorScheme === null || colorScheme !== ColorScheme.kStatic;
+}
+
+export const DEFAULT_STATIC_COLOR = hexColorToSkColor('#4285f4');
+export const DEFAULT_COLOR_SCHEME = ColorScheme.kTonalSpot;
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_shared_album_dialog_element.html b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_shared_album_dialog_element.html
index 3cf332c3..a82c876 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_shared_album_dialog_element.html
+++ b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_shared_album_dialog_element.html
@@ -4,13 +4,20 @@
     width: 288px;
   }
 
+  h3,
+  p {
+    margin: 0;
+  }
+
   cr-button + cr-button {
     margin-inline-start: 8px;
   }
 </style>
 <cr-dialog id="dialog" show-on-attach>
-  <div slot="title">$i18n{googlePhotosSharedAlbumDialogTitle}</div>
-  <div slot="body">$i18n{googlePhotosSharedAlbumDialogContent}</div>
+  <h3 slot="title">$i18n{googlePhotosSharedAlbumDialogTitle}</h3>
+  <div slot="body">
+    <p>$i18n{googlePhotosSharedAlbumDialogContent}</p>
+  </div>
   <div slot="button-container">
     <cr-button id="close" on-click="onClickClose_" class="secondary">
       <span>$i18n{googlePhotosSharedAlbumDialogCloseButton}</span>
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/index.ts b/ash/webui/personalization_app/resources/js/wallpaper/index.ts
index 024dcf4..f5e5503 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/index.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/index.ts
@@ -8,6 +8,7 @@
 import './google_photos_photos_element.js';
 import './google_photos_zero_state_element.js';
 import './local_images_element.js';
+import './time_of_day_wallpaper_dialog_element.js';
 import './wallpaper_grid_item_element.js';
 import './wallpaper_collections_element.js';
 import './wallpaper_error_element.js';
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/time_of_day_wallpaper_dialog_element.html b/ash/webui/personalization_app/resources/js/wallpaper/time_of_day_wallpaper_dialog_element.html
new file mode 100644
index 0000000..ad2977c
--- /dev/null
+++ b/ash/webui/personalization_app/resources/js/wallpaper/time_of_day_wallpaper_dialog_element.html
@@ -0,0 +1,24 @@
+<style include="common cros-button-style">
+  h3,
+  p {
+    margin: 0;
+  }
+
+  cr-button + cr-button {
+    margin-inline-start: 8px;
+  }
+</style>
+<cr-dialog id="dialog" show-on-attach>
+  <h3 slot="title">$i18n{timeOfDayWallpaperDialogTitle}</h3>
+  <div slot="body">
+    <p>$i18n{timeOfDayWallpaperDialogContent}</p>
+  </div>
+  <div slot="button-container">
+    <cr-button id="close" on-click="onClickClose_" class="secondary">
+      <span>$i18n{timeOfDayWallpaperDialogBackButton}</span>
+    </cr-button>
+    <cr-button id="accept" on-click="onClickAccept_" class="primary">
+      <span>$i18n{timeOfDayWallpaperDialogConfirmButton}</span>
+    </cr-button>
+  </div>
+</cr-dialog>
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/time_of_day_wallpaper_dialog_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/time_of_day_wallpaper_dialog_element.ts
new file mode 100644
index 0000000..9840a18
--- /dev/null
+++ b/ash/webui/personalization_app/resources/js/wallpaper/time_of_day_wallpaper_dialog_element.ts
@@ -0,0 +1,65 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Displays a dialog informing the user that selecting a Time of
+ * Day wallpaper will override some of settings such as dark/light mode and
+ * dynamic color.
+ */
+
+import '../../css/cros_button_style.css.js';
+
+import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {getTemplate} from './time_of_day_wallpaper_dialog_element.html.js';
+
+export class TimeOfDayAcceptEvent extends CustomEvent<null> {
+  static readonly EVENT_NAME = 'time-of-day-wallpaper-dialog-accept';
+
+  constructor() {
+    super(
+        TimeOfDayAcceptEvent.EVENT_NAME,
+        {
+          bubbles: true,
+          composed: true,
+          detail: null,
+        },
+    );
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'time-of-day-wallpaper-dialog': TimeOfDayWallpaperDialog;
+  }
+}
+
+export interface TimeOfDayWallpaperDialog {
+  $: {dialog: CrDialogElement};
+}
+
+export class TimeOfDayWallpaperDialog extends PolymerElement {
+  static get is() {
+    return 'time-of-day-wallpaper-dialog';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {};
+  }
+
+  private onClickAccept_() {
+    this.dispatchEvent(new TimeOfDayAcceptEvent());
+  }
+
+  private onClickClose_() {
+    this.$.dialog.cancel();
+  }
+}
+
+customElements.define(TimeOfDayWallpaperDialog.is, TimeOfDayWallpaperDialog);
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.html b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.html
index caa6c42..556b33c 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.html
+++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.html
@@ -27,4 +27,10 @@
       </template>
     </iron-list>
   </template>
+  <template is="dom-if" if="[[pendingTimeOfDayWallpaper_]]" restamp>
+    <time-of-day-wallpaper-dialog
+        on-time-of-day-wallpaper-dialog-accept="onConfirmTimeOfDayDialog_"
+        on-cancel="closeTimeOfDayWallpaperDialog_">
+    </time-of-day-wallpaper-dialog>
+  </template>
 </main>
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.ts
index d57b11b..1e4d714 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_images_element.ts
@@ -14,9 +14,13 @@
 
 import {assert} from 'chrome://resources/js/assert_ts.js';
 
-import {CurrentWallpaper, OnlineImageType, WallpaperCollection, WallpaperImage, WallpaperType} from '../../personalization_app.mojom-webui.js';
+import {ColorScheme, CurrentWallpaper, OnlineImageType, WallpaperCollection, WallpaperImage, WallpaperType} from '../../personalization_app.mojom-webui.js';
 import {PersonalizationRouter} from '../personalization_router_element.js';
 import {WithPersonalizationStore} from '../personalization_store.js';
+import {setColorModeAutoSchedule, setColorSchemePref} from '../theme/theme_controller.js';
+import {getThemeProvider} from '../theme/theme_interface_provider.js';
+import {ThemeObserver} from '../theme/theme_observer.js';
+import {DEFAULT_COLOR_SCHEME, isAutomaticSeedColorEnabled} from '../theme/utils.js';
 import {isNonEmptyArray} from '../utils.js';
 
 import {ImageTile} from './constants.js';
@@ -159,6 +163,11 @@
             'computeTiles_(images_, imagesLoading_, collectionId, isDarkModeActive)',
       },
 
+      pendingTimeOfDayWallpaper_: Object,
+
+      colorModeAutoScheduleEnabled_: Boolean,
+
+      colorSchemeSelected_: Object,
     };
   }
 
@@ -172,9 +181,13 @@
   private pendingSelectedAssetId_: bigint|null;
   private hasError_: boolean;
   private tiles_: ImageTile[];
+  private pendingTimeOfDayWallpaper_: WallpaperImage|null;
+  private colorModeAutoScheduleEnabled_: boolean|null;
+  private colorSchemeSelected_: ColorScheme|null;
 
   override connectedCallback() {
     super.connectedCallback();
+    ThemeObserver.initThemeObserverIfNeeded();
     this.watch<WallpaperImages['images_']>(
         'images_', state => state.wallpaper.backdrop.images);
     this.watch<WallpaperImages['imagesLoading_']>(
@@ -191,6 +204,11 @@
         state => isWallpaperImage(state.wallpaper.pendingSelected) ?
             state.wallpaper.pendingSelected.assetId :
             null);
+    this.watch<WallpaperImages['colorModeAutoScheduleEnabled_']>(
+        'colorModeAutoScheduleEnabled_',
+        state => state.theme.colorModeAutoScheduleEnabled);
+    this.watch<WallpaperImages['colorSchemeSelected_']>(
+        'colorSchemeSelected_', state => state.theme.colorSchemeSelected);
     this.updateFromStore();
   }
 
@@ -302,9 +320,41 @@
     assert(isNonEmptyArray(images));
     const selectedImage = images.find(choice => choice.assetId === assetId);
     assert(selectedImage, 'could not find selected image');
+    if (this.shouldShowTimeOfDayWallpaperDialog_(e.model.item)) {
+      this.pendingTimeOfDayWallpaper_ = selectedImage;
+      return;
+    }
     selectWallpaper(selectedImage, getWallpaperProvider(), this.getStore());
   }
 
+  private shouldShowTimeOfDayWallpaperDialog_(tile: ImageTile): boolean {
+    if (!this.isTimeOfDayWallpaper_(tile)) {
+      return false;
+    }
+    if (!isAutomaticSeedColorEnabled(this.colorSchemeSelected_)) {
+      return true;
+    }
+    return !this.colorModeAutoScheduleEnabled_;
+  }
+
+  private closeTimeOfDayWallpaperDialog_() {
+    this.pendingTimeOfDayWallpaper_ = null;
+  }
+
+  private onConfirmTimeOfDayDialog_() {
+    assert(
+        this.pendingTimeOfDayWallpaper_,
+        'could not find the time of day wallpaper');
+    setColorSchemePref(
+        DEFAULT_COLOR_SCHEME, getThemeProvider(), this.getStore());
+    setColorModeAutoSchedule(
+        /*enabled=*/ true, getThemeProvider(), this.getStore());
+    selectWallpaper(
+        this.pendingTimeOfDayWallpaper_, getWallpaperProvider(),
+        this.getStore());
+    this.closeTimeOfDayWallpaperDialog_();
+  }
+
   private getAriaLabel_(tile: number|ImageTile): string {
     if (this.isLoadingTile_(tile)) {
       return this.i18n('ariaLabelLoading');
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
index 0913ed4..6b9e0f7 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
@@ -1037,7 +1037,7 @@
   base::RunLoop().RunUntilIdle();
 }
 
-TEST_F(AcceleratorConfigurationProviderTest, RemoveAndResoreAllDefaults) {
+TEST_F(AcceleratorConfigurationProviderTest, RemoveAndRestoreAllDefaults) {
   FakeAcceleratorsUpdatedMojoObserver observer;
   SetUpObserver(&observer);
 
@@ -1049,6 +1049,7 @@
   AshAcceleratorConfiguration* config =
       Shell::Get()->ash_accelerator_configuration();
   config->Initialize(test_data);
+  config->InitializeDeprecatedAccelerators({}, {});
   base::RunLoop().RunUntilIdle();
 
   // Verify accelerators are populated.
@@ -1087,6 +1088,7 @@
   ash::shortcut_customization::mojom::
       AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
           .RestoreAllDefaults(&result);
+  EXPECT_EQ(mojom::AcceleratorConfigResult::kSuccess, result->result);
 
   base::RunLoop().RunUntilIdle();
 
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc
index 18958be..afafc2fc2 100644
--- a/ash/wm/desks/desks_unittests.cc
+++ b/ash/wm/desks/desks_unittests.cc
@@ -4863,11 +4863,15 @@
   // ui::EventRewriterChromeOS::Delegate:
   bool RewriteModifierKeys() override { return true; }
   void SuppressModifierKeyRewrites(bool should_supress) override {}
-  bool RewriteMetaTopRowKeyComboEvents() const override { return true; }
+  bool RewriteMetaTopRowKeyComboEvents(int device_id) const override {
+    return true;
+  }
   void SuppressMetaTopRowKeyComboRewrites(bool should_suppress) override {}
-  bool GetKeyboardRemappedPrefValue(const std::string& pref_name,
-                                    int* result) const override {
-    return false;
+  absl::optional<ui::mojom::ModifierKey> GetKeyboardRemappedModifierValue(
+      int device_id,
+      ui::mojom::ModifierKey modifier_key,
+      const std::string& pref_name) const override {
+    return absl::nullopt;
   }
   bool TopRowKeysAreFunctionKeys(int device_id) const override { return false; }
   bool IsExtensionCommandRegistered(ui::KeyboardCode key_code,
diff --git a/ash/wm/desks/templates/saved_desk_controller.cc b/ash/wm/desks/templates/saved_desk_controller.cc
new file mode 100644
index 0000000..aede3b4
--- /dev/null
+++ b/ash/wm/desks/templates/saved_desk_controller.cc
@@ -0,0 +1,22 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/wm/desks/templates/saved_desk_controller.h"
+
+namespace ash {
+
+SavedDeskController::SavedDeskController() = default;
+
+SavedDeskController::~SavedDeskController() = default;
+
+std::vector<AdminTemplateMetadata>
+SavedDeskController::GetAdminTemplateMetadata() const {
+  return {};
+}
+
+bool SavedDeskController::LaunchAdminTemplate(const base::GUID& template_uuid) {
+  return false;
+}
+
+}  // namespace ash
diff --git a/ash/wm/desks/templates/saved_desk_controller.h b/ash/wm/desks/templates/saved_desk_controller.h
new file mode 100644
index 0000000..ce082022
--- /dev/null
+++ b/ash/wm/desks/templates/saved_desk_controller.h
@@ -0,0 +1,43 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_WM_DESKS_TEMPLATES_SAVED_DESK_CONTROLLER_H_
+#define ASH_WM_DESKS_TEMPLATES_SAVED_DESK_CONTROLLER_H_
+
+#include <string>
+#include <vector>
+
+#include "ash/ash_export.h"
+#include "base/guid.h"
+
+namespace ash {
+
+struct AdminTemplateMetadata {
+  // Uniquely identifies the template.
+  base::GUID uuid;
+
+  // Name of the admin template, as it appears to the user.
+  std::string name;
+};
+
+// The saved desk controller has functionality for listing and launching saved
+// desks. Primarily geared towards admin templates. It is owned by ash::Shell.
+class ASH_EXPORT SavedDeskController {
+ public:
+  SavedDeskController();
+  SavedDeskController(const SavedDeskController&) = delete;
+  SavedDeskController& operator=(const SavedDeskController&) = delete;
+  ~SavedDeskController();
+
+  // Returns metadata for all currently available admin templates.
+  std::vector<AdminTemplateMetadata> GetAdminTemplateMetadata() const;
+
+  // Launch the template identified by `template_uuid`. Returns false if the
+  // template doesn't exist.
+  bool LaunchAdminTemplate(const base::GUID& template_uuid);
+};
+
+}  // namespace ash
+
+#endif
diff --git a/ash/wm/snap_group/snap_group_unittest.cc b/ash/wm/snap_group/snap_group_unittest.cc
index b8192bd..26e17d3f 100644
--- a/ash/wm/snap_group/snap_group_unittest.cc
+++ b/ash/wm/snap_group/snap_group_unittest.cc
@@ -57,7 +57,7 @@
       /*is_dragging=*/false);
 }
 
-gfx::Rect work_area_bounds() {
+const gfx::Rect work_area_bounds() {
   return display::Screen::GetScreen()->GetPrimaryDisplay().work_area();
 }
 
@@ -308,26 +308,53 @@
 // with the split view divider.
 TEST_F(SnapGroupEntryPointArm1Test,
        ResizeWithSplitViewDividerBasicFunctionalities) {
-  const gfx::Rect work_area_bounds =
-      display::Screen::GetScreen()->GetPrimaryDisplay().work_area();
   std::unique_ptr<aura::Window> w1(CreateTestWindow());
   std::unique_ptr<aura::Window> w2(CreateTestWindow());
   SnapTwoTestWindowsInArm1(w1.get(), w2.get());
 
-  auto* event_generator = GetEventGenerator();
-  wm::ActivateWindow(w1.get());
-
   const gfx::Point hover_location =
       split_view_divider_bounds_in_screen().CenterPoint();
-  const int distance_delta = work_area_bounds.width() / 4;
-  event_generator->MoveMouseTo(hover_location);
-  event_generator->PressLeftButton();
-  event_generator->MoveMouseTo(hover_location.x() - distance_delta,
-                               hover_location.y());
-  event_generator->ReleaseLeftButton();
+  const int distance_delta = -work_area_bounds().width() / 6;
+  split_view_controller()->StartResizeWithDivider(hover_location);
+  const auto end_point =
+      gfx::Point(hover_location.x() + distance_delta, hover_location.y());
+  split_view_controller()->ResizeWithDivider(end_point);
+  split_view_controller()->EndResizeWithDivider(end_point);
   EXPECT_TRUE(split_view_controller()->InSplitViewMode());
-  EXPECT_EQ(0.25f, WindowState::Get(w1.get())->snap_ratio());
-  EXPECT_EQ(0.75f, WindowState::Get(w2.get())->snap_ratio());
+  EXPECT_NEAR(0.33f, WindowState::Get(w1.get())->snap_ratio().value(),
+              /*abs_error=*/0.1);
+  EXPECT_NEAR(0.67f, WindowState::Get(w2.get())->snap_ratio().value(),
+              /*abs_error=*/0.1);
+}
+
+// Tests that the windows in a snap group can be resized to an arbitrary
+// location with the split view divider.
+TEST_F(SnapGroupEntryPointArm1Test,
+       ResizeWithSplitViewDividerToArbitraryLocations) {
+  std::unique_ptr<aura::Window> w1(CreateTestWindow());
+  std::unique_ptr<aura::Window> w2(CreateTestWindow());
+  SnapTwoTestWindowsInArm1(w1.get(), w2.get());
+  for (const int distance_delta : {-10, 6, -15}) {
+    const auto w1_cached_bounds = w1.get()->GetBoundsInScreen();
+    const auto w2_cached_bounds = w2.get()->GetBoundsInScreen();
+
+    const gfx::Point hover_location =
+        split_view_divider_bounds_in_screen().CenterPoint();
+    split_view_controller()->StartResizeWithDivider(hover_location);
+    const auto end_location =
+        gfx::Point(hover_location.x() + distance_delta, hover_location.y());
+    split_view_controller()->ResizeWithDivider(end_location);
+    EXPECT_TRUE(split_view_controller()->InSplitViewMode());
+
+    EXPECT_EQ(w1_cached_bounds.width() + distance_delta,
+              w1.get()->GetBoundsInScreen().width());
+    EXPECT_EQ(w2_cached_bounds.width() - distance_delta,
+              w2.get()->GetBoundsInScreen().width());
+    EXPECT_EQ(w1.get()->GetBoundsInScreen().width() +
+                  w2.get()->GetBoundsInScreen().width() +
+                  kSplitviewDividerShortSideLength,
+              work_area_bounds().width());
+  }
 }
 
 // Tests that when snapping a snapped window to the same snapped state, the
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc
index 6a22b92..1989bf85 100644
--- a/ash/wm/splitview/split_view_controller.cc
+++ b/ash/wm/splitview/split_view_controller.cc
@@ -1255,8 +1255,10 @@
   int next_divider_position = snap_position == SnapPosition::kPrimary
                                   ? snap_width
                                   : divider_end_position - snap_width;
-  if (split_view_type_ == SplitViewType::kTabletType)
+  if (split_view_type_ == SplitViewType::kTabletType ||
+      ShouldAutomaticallyGroupOnWindowsSnappedInClamshell()) {
     next_divider_position -= kSplitviewDividerShortSideLength / 2;
+  }
   return next_divider_position;
 }
 
@@ -1405,7 +1407,8 @@
   NotifyWindowResized();
 
   const int target_divider_position = GetClosestFixedDividerPosition();
-  if (divider_position_ == target_divider_position) {
+  if (divider_position_ == target_divider_position ||
+      ShouldAutomaticallyGroupOnWindowsSnappedInClamshell()) {
     EndResizeWithDividerImpl();
     EndSplitViewAfterResizingAtEdgeIfAppropriate();
   } else {
@@ -2489,10 +2492,11 @@
   divider_closest_ratio_ = FindClosestPositionRatio(
       divider_position_ + kSplitviewDividerShortSideLength / 2,
       divider_end_position);
-  int fix_position = divider_end_position * divider_closest_ratio_;
-  if (divider_closest_ratio_ > 0.f && divider_closest_ratio_ < 1.f)
-    fix_position -= kSplitviewDividerShortSideLength / 2;
-  return fix_position;
+  int fixed_position = divider_end_position * divider_closest_ratio_;
+  if (divider_closest_ratio_ > 0.f && divider_closest_ratio_ < 1.f) {
+    fixed_position -= kSplitviewDividerShortSideLength / 2;
+  }
+  return fixed_position;
 }
 
 void SplitViewController::StopAndShoveAnimatedDivider() {
@@ -2722,13 +2726,13 @@
 
 float SplitViewController::FindClosestPositionRatio(float distance,
                                                     float length) {
-  float current_ratio = distance / length;
+  const float current_ratio = distance / length;
   float closest_ratio = 0.f;
   std::vector<float> position_ratios(
       kFixedPositionRatios,
       kFixedPositionRatios + sizeof(kFixedPositionRatios) / sizeof(float));
   ModifyPositionRatios(&position_ratios);
-  for (float ratio : position_ratios) {
+  for (const float ratio : position_ratios) {
     if (std::abs(current_ratio - ratio) <
         std::abs(current_ratio - closest_ratio)) {
       closest_ratio = ratio;
@@ -3092,7 +3096,7 @@
                                                                       : p.y());
 }
 
-bool SplitViewController::ShouldShowDividerWidgetInClamshell() {
+bool SplitViewController::ShouldShowDividerWidgetInClamshell() const {
   DCHECK(primary_window_);
   DCHECK(secondary_window_);
   return InClamshellSplitViewMode() &&
diff --git a/ash/wm/splitview/split_view_controller.h b/ash/wm/splitview/split_view_controller.h
index ca7cf90..d8173cd2 100644
--- a/ash/wm/splitview/split_view_controller.h
+++ b/ash/wm/splitview/split_view_controller.h
@@ -469,7 +469,7 @@
   // resizing.
   void UpdateDividerPosition(const gfx::Point& location_in_screen);
 
-  // Returns the closest fix location for |divider_position_|.
+  // Returns the closest fixed location for `divider_position_`.
   int GetClosestFixedDividerPosition();
 
   // While the divider is animating to somewhere, stop it and shove it there.
@@ -593,7 +593,7 @@
   // Returns true if the `split_view_divider_` should show in clamshell mode on
   // two windows snapped when the feature flag `kSnapGroup` is enabled and the
   // feature param `kAutomaticallyLockGroup` is true.
-  bool ShouldShowDividerWidgetInClamshell();
+  bool ShouldShowDividerWidgetInClamshell() const;
 
   // Root window the split view is in.
   aura::Window* root_window_;
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 070a183..e3518fb 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1255,6 +1255,7 @@
       "android/task_scheduler/post_task_android.h",
       "android/task_scheduler/task_runner_android.cc",
       "android/task_scheduler/task_runner_android.h",
+      "android/task_scheduler/task_traits_android.h",
       "android/thread_instruction_count.cc",
       "android/thread_instruction_count.h",
       "android/timezone_utils.cc",
@@ -1412,6 +1413,7 @@
       "files/memory_mapped_file_posix.cc",
       "fuchsia/default_job.cc",
       "fuchsia/default_job.h",
+      "fuchsia/fidl_event_handler.h",
       "fuchsia/file_utils.cc",
       "fuchsia/file_utils.h",
       "fuchsia/filtered_service_directory.cc",
@@ -3890,6 +3892,7 @@
     sources += [
       "files/dir_reader_posix_unittest.cc",
       "files/file_descriptor_watcher_posix_unittest.cc",
+      "fuchsia/fidl_event_handler_unittest.cc",
       "fuchsia/file_utils_unittest.cc",
       "fuchsia/filtered_service_directory_unittest.cc",
       "fuchsia/fuchsia_logging_unittest.cc",
@@ -4339,7 +4342,6 @@
       "android/java/src/org/chromium/base/task/BackgroundOnlyAsyncTask.java",
       "android/java/src/org/chromium/base/task/ChainedTasks.java",
       "android/java/src/org/chromium/base/task/ChromeThreadPoolExecutor.java",
-      "android/java/src/org/chromium/base/task/DefaultTaskExecutor.java",
       "android/java/src/org/chromium/base/task/PostTask.java",
       "android/java/src/org/chromium/base/task/SequencedTaskRunner.java",
       "android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java",
@@ -4349,8 +4351,8 @@
       "android/java/src/org/chromium/base/task/TaskExecutor.java",
       "android/java/src/org/chromium/base/task/TaskRunner.java",
       "android/java/src/org/chromium/base/task/TaskRunnerImpl.java",
-      "android/java/src/org/chromium/base/task/TaskTraits.java",
-      "android/java/src/org/chromium/base/task/TaskTraitsExtensionDescriptor.java",
+      "android/java/src/org/chromium/base/task/ThreadPoolTaskExecutor.java",
+      "android/java/src/org/chromium/base/task/UiThreadTaskExecutor.java",
     ]
 
     if (!is_cronet_build) {
@@ -4640,7 +4642,6 @@
       "android/junit/src/org/chromium/base/supplier/UnownedUserDataSupplierTest.java",
       "android/junit/src/org/chromium/base/task/AsyncTaskThreadTest.java",
       "android/junit/src/org/chromium/base/task/SequencedTaskRunnerTaskMigrationTest.java",
-      "android/junit/src/org/chromium/base/task/TaskTraitsTest.java",
       "android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilsUnitTest.java",
       "test/android/junit/src/org/chromium/base/test/SetUpStatementTest.java",
       "test/android/junit/src/org/chromium/base/test/TestListInstrumentationRunListenerTest.java",
@@ -4679,6 +4680,7 @@
       "android/library_loader/library_loader_hooks.h",
       "android/linker/linker_jni.h",
       "android/task_scheduler/task_runner_android.h",
+      "android/task_scheduler/task_traits_android.h",
       "memory/memory_pressure_listener.h",
       "metrics/histogram_base.h",
       "task/task_traits.h",
diff --git a/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h b/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h
index f95f8cd..77ec1fe 100644
--- a/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h
+++ b/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h
@@ -7,19 +7,6 @@
 
 #include "build/build_config.h"
 
-// This is a wrapper around `__has_cpp_attribute`, which can be used to test for
-// the presence of an attribute. In case the compiler does not support this
-// macro it will simply evaluate to 0.
-//
-// References:
-// https://wg21.link/sd6#testing-for-the-presence-of-an-attribute-__has_cpp_attribute
-// https://wg21.link/cpp.cond#:__has_cpp_attribute
-#if defined(__has_cpp_attribute)
-#define PA_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
-#else
-#define PA_HAS_CPP_ATTRIBUTE(x) 0
-#endif
-
 // A wrapper around `__has_attribute`, similar to HAS_CPP_ATTRIBUTE.
 #if defined(__has_attribute)
 #define PA_HAS_ATTRIBUTE(x) __has_attribute(x)
@@ -90,20 +77,6 @@
 #define PA_ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment)))
 #endif
 
-// In case the compiler supports it NO_UNIQUE_ADDRESS evaluates to the C++20
-// attribute [[no_unique_address]]. This allows annotating data members so that
-// they need not have an address distinct from all other non-static data members
-// of its class.
-//
-// References:
-// * https://en.cppreference.com/w/cpp/language/attributes/no_unique_address
-// * https://wg21.link/dcl.attr.nouniqueaddr
-#if PA_HAS_CPP_ATTRIBUTE(no_unique_address)
-#define PA_NO_UNIQUE_ADDRESS [[no_unique_address]]
-#else
-#define PA_NO_UNIQUE_ADDRESS
-#endif
-
 // Tells the compiler a function is using a printf-style format string.
 // |format_param| is the one-based index of the format string parameter;
 // |dots_param| is the one-based index of the "..." parameter.
@@ -117,13 +90,6 @@
 #define PA_PRINTF_FORMAT(format_param, dots_param)
 #endif
 
-// WPRINTF_FORMAT is the same, but for wide format strings.
-// This doesn't appear to yet be implemented in any compiler.
-// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38308 .
-#define PA_WPRINTF_FORMAT(format_param, dots_param)
-// If available, it would look like:
-//   __attribute__((format(wprintf, format_param, dots_param)))
-
 // Sanitizers annotations.
 #if PA_HAS_ATTRIBUTE(no_sanitize)
 #define PA_NO_SANITIZE(what) __attribute__((no_sanitize(what)))
@@ -140,27 +106,10 @@
 // Use this to annotate code that deliberately reads uninitialized data, for
 // example a GC scavenging root set pointers from the stack.
 #define PA_MSAN_UNPOISON(p, size) __msan_unpoison(p, size)
-
-// Check a memory region for initializedness, as if it was being used here.
-// If any bits are uninitialized, crash with an MSan report.
-// Use this to sanitize data which MSan won't be able to track, e.g. before
-// passing data to another process via shared memory.
-#define PA_MSAN_CHECK_MEM_IS_INITIALIZED(p, size) \
-  __msan_check_mem_is_initialized(p, size)
 #else  // MEMORY_SANITIZER
 #define PA_MSAN_UNPOISON(p, size)
-#define PA_MSAN_CHECK_MEM_IS_INITIALIZED(p, size)
 #endif  // MEMORY_SANITIZER
 
-// Macro useful for writing cross-platform function pointers.
-#if !defined(PA_CDECL)
-#if BUILDFLAG(IS_WIN)
-#define PA_CDECL __cdecl
-#else  // BUILDFLAG(IS_WIN)
-#define PA_CDECL
-#endif  // BUILDFLAG(IS_WIN)
-#endif  // !defined(PA_CDECL)
-
 // Macro for hinting that an expression is likely to be false.
 #if !defined(PA_UNLIKELY)
 #if defined(COMPILER_GCC) || defined(__clang__)
@@ -178,23 +127,6 @@
 #endif  // defined(COMPILER_GCC)
 #endif  // !defined(PA_LIKELY)
 
-// Compiler feature-detection.
-// clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension
-#if defined(__has_feature)
-#define PA_HAS_FEATURE(FEATURE) __has_feature(FEATURE)
-#else
-#define PA_HAS_FEATURE(FEATURE) 0
-#endif
-
-#if defined(COMPILER_GCC)
-#define PA_PRETTY_FUNCTION __PRETTY_FUNCTION__
-#elif defined(COMPILER_MSVC)
-#define PA_PRETTY_FUNCTION __FUNCSIG__
-#else
-// See https://en.cppreference.com/w/c/language/function_definition#func
-#define PA_PRETTY_FUNCTION __func__
-#endif
-
 #if !defined(PA_CPU_ARM_NEON)
 #if defined(__arm__)
 #if !defined(__ARMEB__) && !defined(__ARM_EABI__) && !defined(__EABI__) && \
@@ -213,63 +145,6 @@
 #endif
 #endif
 
-#if defined(__clang__) && PA_HAS_ATTRIBUTE(uninitialized)
-// Attribute "uninitialized" disables -ftrivial-auto-var-init=pattern for
-// the specified variable.
-// Library-wide alternative is
-// 'configs -= [ "//build/config/compiler:default_init_stack_vars" ]' in .gn
-// file.
-//
-// See "init_stack_vars" in build/config/compiler/BUILD.gn and
-// http://crbug.com/977230
-// "init_stack_vars" is enabled for non-official builds and we hope to enable it
-// in official build in 2020 as well. The flag writes fixed pattern into
-// uninitialized parts of all local variables. In rare cases such initialization
-// is undesirable and attribute can be used:
-//   1. Degraded performance
-// In most cases compiler is able to remove additional stores. E.g. if memory is
-// never accessed or properly initialized later. Preserved stores mostly will
-// not affect program performance. However if compiler failed on some
-// performance critical code we can get a visible regression in a benchmark.
-//   2. memset, memcpy calls
-// Compiler may replaces some memory writes with memset or memcpy calls. This is
-// not -ftrivial-auto-var-init specific, but it can happen more likely with the
-// flag. It can be a problem if code is not linked with C run-time library.
-//
-// Note: The flag is security risk mitigation feature. So in future the
-// attribute uses should be avoided when possible. However to enable this
-// mitigation on the most of the code we need to be less strict now and minimize
-// number of exceptions later. So if in doubt feel free to use attribute, but
-// please document the problem for someone who is going to cleanup it later.
-// E.g. platform, bot, benchmark or test name in patch description or next to
-// the attribute.
-#define PA_STACK_UNINITIALIZED [[clang::uninitialized]]
-#else
-#define PA_STACK_UNINITIALIZED
-#endif
-
-// Attribute "no_stack_protector" disables -fstack-protector for the specified
-// function.
-//
-// "stack_protector" is enabled on most POSIX builds. The flag adds a canary
-// to each stack frame, which on function return is checked against a reference
-// canary. If the canaries do not match, it's likely that a stack buffer
-// overflow has occurred, so immediately crashing will prevent exploitation in
-// many cases.
-//
-// In some cases it's desirable to remove this, e.g. on hot functions, or if
-// we have purposely changed the reference canary.
-#if defined(COMPILER_GCC) || defined(__clang__)
-#if PA_HAS_ATTRIBUTE(__no_stack_protector__)
-#define PA_NO_STACK_PROTECTOR __attribute__((__no_stack_protector__))
-#else
-#define PA_NO_STACK_PROTECTOR \
-  __attribute__((__optimize__("-fno-stack-protector")))
-#endif
-#else
-#define PA_NO_STACK_PROTECTOR
-#endif
-
 // The ANALYZER_ASSUME_TRUE(bool arg) macro adds compiler-specific hints
 // to Clang which control what code paths are statically analyzed,
 // and is meant to be used in conjunction with assert & assert-like functions.
@@ -339,15 +214,6 @@
 #define PA_TRIVIAL_ABI
 #endif
 
-// Marks a member function as reinitializing a moved-from variable.
-// See also
-// https://clang.llvm.org/extra/clang-tidy/checks/bugprone-use-after-move.html#reinitialization
-#if defined(__clang__) && PA_HAS_ATTRIBUTE(reinitializes)
-#define PA_REINITIALIZES_AFTER_MOVE [[clang::reinitializes]]
-#else
-#define PA_REINITIALIZES_AFTER_MOVE
-#endif
-
 // Requires constant initialization. See constinit in C++20. Allows to rely on a
 // variable being initialized before execution, and not requiring a global
 // constructor.
@@ -359,10 +225,8 @@
 #endif
 
 #if defined(__clang__)
-#define PA_GSL_OWNER [[gsl::Owner]]
 #define PA_GSL_POINTER [[gsl::Pointer]]
 #else
-#define PA_GSL_OWNER
 #define PA_GSL_POINTER
 #endif
 
diff --git a/base/allocator/partition_allocator/starscan/pcscan_unittest.cc b/base/allocator/partition_allocator/starscan/pcscan_unittest.cc
index 543d3d1..390d613 100644
--- a/base/allocator/partition_allocator/starscan/pcscan_unittest.cc
+++ b/base/allocator/partition_allocator/starscan/pcscan_unittest.cc
@@ -683,7 +683,9 @@
 // static
 void* PartitionAllocPCScanStackScanningTest::dangling_reference_ = nullptr;
 
-TEST_F(PartitionAllocPCScanStackScanningTest, StackScanning) {
+// The test currently fails on some platform due to the stack dangling reference
+// not being found.
+TEST_F(PartitionAllocPCScanStackScanningTest, DISABLED_StackScanning) {
   PCScan::EnableStackScanning();
 
   // Set to nullptr if the test is retried.
diff --git a/base/android/java/src/org/chromium/base/ThreadUtils.java b/base/android/java/src/org/chromium/base/ThreadUtils.java
index 10c389a..39a604dd 100644
--- a/base/android/java/src/org/chromium/base/ThreadUtils.java
+++ b/base/android/java/src/org/chromium/base/ThreadUtils.java
@@ -8,7 +8,10 @@
 import android.os.Looper;
 import android.os.Process;
 
+import androidx.annotation.VisibleForTesting;
+
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.task.PostTask;
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
@@ -78,13 +81,18 @@
         }
     }
 
+    @VisibleForTesting
+    public static void clearUiThreadForTesting() {
+        synchronized (sLock) {
+            sUiThreadHandler = null;
+            sWillOverride = false;
+            PostTask.resetUiThreadForTesting(); // IN-TEST
+        }
+    }
+
     public static void setUiThread(Looper looper) {
         synchronized (sLock) {
-            if (looper == null) {
-                // Used to reset the looper after tests.
-                sUiThreadHandler = null;
-                return;
-            }
+            assert looper != null;
             if (sUiThreadHandler != null && sUiThreadHandler.getLooper() != looper) {
                 throw new RuntimeException("UI thread looper is already set to "
                         + sUiThreadHandler.getLooper() + " (Main thread looper is "
@@ -92,6 +100,7 @@
             } else {
                 sUiThreadHandler = new Handler(looper);
             }
+            PostTask.onUiThreadReady();
         }
         TraceEvent.onUiThreadReady();
     }
@@ -104,6 +113,7 @@
                     throw new RuntimeException("Did not yet override the UI thread");
                 }
                 sUiThreadHandler = new Handler(Looper.getMainLooper());
+                PostTask.onUiThreadReady();
                 createdHandler = true;
             }
         }
diff --git a/base/android/java/src/org/chromium/base/task/AsyncTask.java b/base/android/java/src/org/chromium/base/task/AsyncTask.java
index d418290..5f92d6ec 100644
--- a/base/android/java/src/org/chromium/base/task/AsyncTask.java
+++ b/base/android/java/src/org/chromium/base/task/AsyncTask.java
@@ -442,7 +442,7 @@
      * @return This instance of AsyncTask.
      */
     @MainThread
-    public final AsyncTask<Result> executeWithTaskTraits(TaskTraits taskTraits) {
+    public final AsyncTask<Result> executeWithTaskTraits(@TaskTraits int taskTraits) {
         executionPreamble();
         PostTask.postTask(taskTraits, mFuture);
         return this;
diff --git a/base/android/java/src/org/chromium/base/task/ChainedTasks.java b/base/android/java/src/org/chromium/base/task/ChainedTasks.java
index 0824f485..24ac55b45 100644
--- a/base/android/java/src/org/chromium/base/task/ChainedTasks.java
+++ b/base/android/java/src/org/chromium/base/task/ChainedTasks.java
@@ -27,7 +27,7 @@
  *   must run on the same thread.
  */
 public class ChainedTasks {
-    private final LinkedList<Pair<TaskTraits, Runnable>> mTasks = new LinkedList<>();
+    private final LinkedList<Pair<Integer, Runnable>> mTasks = new LinkedList<>();
     @GuardedBy("mTasks")
     private boolean mFinalized;
     private volatile boolean mCanceled;
@@ -42,7 +42,7 @@
             }
             if (mCanceled) return;
 
-            Pair<TaskTraits, Runnable> pair = mTasks.pop();
+            Pair<Integer, Runnable> pair = mTasks.pop();
             try (TraceEvent e = TraceEvent.scoped(
                          "ChainedTask.run: " + pair.second.getClass().getName())) {
                 pair.second.run();
@@ -55,7 +55,7 @@
      * Adds a task to the list of tasks to run. Cannot be called once {@link start()} has been
      * called.
      */
-    public void add(TaskTraits traits, Runnable task) {
+    public void add(@TaskTraits int traits, Runnable task) {
         assert mIterationIdForTesting == PostTask.sTestIterationForTesting;
 
         synchronized (mTasks) {
@@ -87,9 +87,10 @@
         }
         if (mTasks.isEmpty()) return;
         if (coalesceTasks) {
-            TaskTraits traits = mTasks.peek().first;
+            @TaskTraits
+            int traits = mTasks.peek().first;
             PostTask.runOrPostTask(traits, () -> {
-                for (Pair<TaskTraits, Runnable> pair : mTasks) {
+                for (Pair<Integer, Runnable> pair : mTasks) {
                     assert PostTask.canRunTaskImmediately(pair.first);
                     pair.second.run();
                     if (mCanceled) return;
diff --git a/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java b/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java
deleted file mode 100644
index 2c379a50..0000000
--- a/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.task;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * The default {@link TaskExecutor}.
- * TODO(crbug.com/1026641): Provide direct Java APIs for ThreadPool vs UI thread
- * task posting instead of sharding based on {@link TaskTraits}.
- */
-class DefaultTaskExecutor implements TaskExecutor {
-    private final Map<TaskTraits, TaskRunner> mTraitsToRunnerMap = new HashMap<>();
-
-    @Override
-    public TaskRunner createTaskRunner(TaskTraits taskTraits) {
-        return new TaskRunnerImpl(taskTraits);
-    }
-
-    @Override
-    public SequencedTaskRunner createSequencedTaskRunner(TaskTraits taskTraits) {
-        return new SequencedTaskRunnerImpl(taskTraits);
-    }
-
-    /**
-     * If CurrentThread is not specified, or we are being called from within a threadpool task
-     * this maps to a single thread within the native thread pool. If so we can't run tasks
-     * posted on it until native has started.
-     */
-    @Override
-    public SingleThreadTaskRunner createSingleThreadTaskRunner(TaskTraits taskTraits) {
-        // Tasks posted via this API will not execute until after native has started.
-        return new SingleThreadTaskRunnerImpl(null, taskTraits);
-    }
-
-    @Override
-    public synchronized void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
-        if (taskTraits.hasExtension()) {
-            createTaskRunner(taskTraits).postDelayedTask(task, delay);
-        } else {
-            // Caching TaskRunners only for common TaskTraits.
-            TaskRunner runner = mTraitsToRunnerMap.get(taskTraits);
-            if (runner == null) {
-                runner = createTaskRunner(taskTraits);
-                mTraitsToRunnerMap.put(taskTraits, runner);
-            }
-            runner.postDelayedTask(task, delay);
-        }
-    }
-
-    @Override
-    public boolean canRunTaskImmediately(TaskTraits traits) {
-        return false;
-    }
-
-    // Git doesn't want to detect this file as moved, so I'm adding some arbitrary
-    // comment lines to get the similarity detection up.
-    //
-    // Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
-    // labore et dolore magna aliqua. Purus in mollis nunc sed id semper risus in hendrerit. Aliquam
-    // id diam maecenas ultricies mi eget mauris. In eu mi bibendum neque egestas. Habitant morbi
-    // tristique senectus et netus et malesuada fames ac. Non blandit massa enim nec dui nunc
-    // mattis. Ut tristique et egestas quis ipsum. Mauris rhoncus aenean vel elit scelerisque.
-    // Ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Sed arcu non odio euismod.
-    // Vulputate mi sit amet mauris commodo quis. Lobortis scelerisque fermentum dui faucibus. Urna
-    // cursus eget nunc scelerisque viverra. Tempus quam pellentesque nec nam aliquam sem et tortor
-    // consequat. Iaculis eu non diam phasellus vestibulum. Lectus quam id leo in vitae turpis.
-    // Lacinia quis vel eros donec ac odio tempor.
-}
diff --git a/base/android/java/src/org/chromium/base/task/PostTask.java b/base/android/java/src/org/chromium/base/task/PostTask.java
index d8722f7..e04bf7e6 100644
--- a/base/android/java/src/org/chromium/base/task/PostTask.java
+++ b/base/android/java/src/org/chromium/base/task/PostTask.java
@@ -5,6 +5,7 @@
 package org.chromium.base.task;
 
 import org.chromium.base.Log;
+import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 
@@ -14,7 +15,6 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.FutureTask;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReferenceArray;
 
 import javax.annotation.concurrent.GuardedBy;
 
@@ -38,25 +38,20 @@
             new ChromeThreadPoolExecutor();
     private static volatile Executor sPrenativeThreadPoolExecutorOverride;
 
-    // We really only need volatile here, but volatile semantics can't be applied to members of an
-    // array. AtomicReferenceArray #get and #set are equivalent to volatile read/writes.
-    private static AtomicReferenceArray<TaskExecutor> sTaskExecutors = getInitialTaskExecutors();
+    private static final ThreadPoolTaskExecutor sThreadPoolTaskExecutor =
+            new ThreadPoolTaskExecutor();
+    // Initialized on demand or when the UI thread is initialized to allow embedders (eg WebView) to
+    // override the UI thread.
+    private static UiThreadTaskExecutor sUiThreadTaskExecutor;
 
     // Used by AsyncTask / ChainedTask to auto-cancel tasks from prior tests.
     static int sTestIterationForTesting;
 
-    private static AtomicReferenceArray<TaskExecutor> getInitialTaskExecutors() {
-        AtomicReferenceArray<TaskExecutor> taskExecutors =
-                new AtomicReferenceArray<>(TaskTraits.MAX_EXTENSION_ID + 1);
-        taskExecutors.set(0, new DefaultTaskExecutor());
-        return taskExecutors;
-    }
-
     /**
      * @param traits The TaskTraits that describe the desired TaskRunner.
      * @return The TaskRunner for the specified TaskTraits.
      */
-    public static TaskRunner createTaskRunner(TaskTraits taskTraits) {
+    public static TaskRunner createTaskRunner(@TaskTraits int taskTraits) {
         return getTaskExecutorForTraits(taskTraits).createTaskRunner(taskTraits);
     }
 
@@ -66,7 +61,7 @@
      * @param traits The TaskTraits that describe the desired TaskRunner.
      * @return The TaskRunner for the specified TaskTraits.
      */
-    public static SequencedTaskRunner createSequencedTaskRunner(TaskTraits taskTraits) {
+    public static SequencedTaskRunner createSequencedTaskRunner(@TaskTraits int taskTraits) {
         return getTaskExecutorForTraits(taskTraits).createSequencedTaskRunner(taskTraits);
     }
 
@@ -75,7 +70,7 @@
      * @param traits The TaskTraits that describe the desired TaskRunner.
      * @return The TaskRunner for the specified TaskTraits.
      */
-    public static SingleThreadTaskRunner createSingleThreadTaskRunner(TaskTraits taskTraits) {
+    public static SingleThreadTaskRunner createSingleThreadTaskRunner(@TaskTraits int taskTraits) {
         return getTaskExecutorForTraits(taskTraits).createSingleThreadTaskRunner(taskTraits);
     }
 
@@ -83,7 +78,7 @@
      * @param taskTraits The TaskTraits that describe the desired TaskRunner.
      * @param task The task to be run with the specified traits.
      */
-    public static void postTask(TaskTraits taskTraits, Runnable task) {
+    public static void postTask(@TaskTraits int taskTraits, Runnable task) {
         postDelayedTask(taskTraits, task, 0);
     }
 
@@ -92,7 +87,7 @@
      * @param task The task to be run with the specified traits.
      * @param delay The delay in milliseconds before the task can be run.
      */
-    public static void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+    public static void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
         getTaskExecutorForTraits(taskTraits).postDelayedTask(taskTraits, task, delay);
     }
 
@@ -109,7 +104,7 @@
      * @param taskTraits The TaskTraits that describe the desired TaskRunner.
      * @param task The task to be run with the specified traits.
      */
-    public static void runOrPostTask(TaskTraits taskTraits, Runnable task) {
+    public static void runOrPostTask(@TaskTraits int taskTraits, Runnable task) {
         if (getTaskExecutorForTraits(taskTraits).canRunTaskImmediately(taskTraits)) {
             task.run();
         } else {
@@ -121,7 +116,7 @@
      * Returns true if the task can be executed immediately (i.e. the current thread is the same as
      * the one corresponding to the SingleThreadTaskRunner)
      */
-    public static boolean canRunTaskImmediately(TaskTraits taskTraits) {
+    public static boolean canRunTaskImmediately(@TaskTraits int taskTraits) {
         return getTaskExecutorForTraits(taskTraits).canRunTaskImmediately(taskTraits);
     }
 
@@ -145,7 +140,7 @@
      * @return The result of the callable
      */
     @Deprecated
-    public static <T> T runSynchronously(TaskTraits taskTraits, Callable<T> c) {
+    public static <T> T runSynchronously(@TaskTraits int taskTraits, Callable<T> c) {
         return runSynchronouslyInternal(taskTraits, new FutureTask<T>(c));
     }
 
@@ -168,11 +163,11 @@
      * @param task The task to be run with the specified traits.
      */
     @Deprecated
-    public static void runSynchronously(TaskTraits taskTraits, Runnable r) {
+    public static void runSynchronously(@TaskTraits int taskTraits, Runnable r) {
         runSynchronouslyInternal(taskTraits, new FutureTask<Void>(r, null));
     }
 
-    private static <T> T runSynchronouslyInternal(TaskTraits taskTraits, FutureTask<T> task) {
+    private static <T> T runSynchronouslyInternal(@TaskTraits int taskTraits, FutureTask<T> task) {
         runOrPostTask(taskTraits, task);
         try {
             return task.get();
@@ -182,19 +177,6 @@
     }
 
     /**
-     * Registers a TaskExecutor, this must be called before any other usages of this API.
-     *
-     * @param extensionId The id associated with the TaskExecutor.
-     * @param taskExecutor The TaskExecutor to be registered. Must not equal zero.
-     */
-    public static void registerTaskExecutor(int extensionId, TaskExecutor taskExecutor) {
-        assert extensionId != 0;
-        assert extensionId <= TaskTraits.MAX_EXTENSION_ID;
-        assert sTaskExecutors.get(extensionId) == null;
-        sTaskExecutors.set(extensionId, taskExecutor);
-    }
-
-    /**
      * Lets a test override the pre-native thread pool executor.
      *
      * @param executor The Executor to use for pre-native thread pool tasks.
@@ -236,8 +218,13 @@
         }
     }
 
-    private static TaskExecutor getTaskExecutorForTraits(TaskTraits traits) {
-        return sTaskExecutors.get(traits.mExtensionId);
+    private static TaskExecutor getTaskExecutorForTraits(@TaskTraits int traits) {
+        if (traits >= TaskTraits.UI_TRAITS_START) {
+            // UI thread may be posted to before initialized, so trigger the initialization.
+            if (sUiThreadTaskExecutor == null) ThreadUtils.getUiThreadHandler();
+            return sUiThreadTaskExecutor;
+        }
+        return sThreadPoolTaskExecutor;
     }
 
     @CalledByNative
@@ -284,4 +271,14 @@
             Log.w(TAG, "%d background task(s) existed after test finished.", taskCount);
         }
     }
+
+    /** Called once when the UI thread has been initialized */
+    public static void onUiThreadReady() {
+        assert sUiThreadTaskExecutor == null;
+        sUiThreadTaskExecutor = new UiThreadTaskExecutor();
+    }
+
+    public static void resetUiThreadForTesting() {
+        sUiThreadTaskExecutor = null;
+    }
 }
diff --git a/base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java b/base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java
index 788227f..ce5fede 100644
--- a/base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java
+++ b/base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java
@@ -18,7 +18,7 @@
     /**
      * @param traits The TaskTraits associated with this SequencedTaskRunnerImpl.
      */
-    SequencedTaskRunnerImpl(TaskTraits traits) {
+    SequencedTaskRunnerImpl(@TaskTraits int traits) {
         super(traits, "SequencedTaskRunnerImpl", TaskRunnerType.SEQUENCED);
     }
 
diff --git a/base/android/java/src/org/chromium/base/task/SingleThreadTaskRunnerImpl.java b/base/android/java/src/org/chromium/base/task/SingleThreadTaskRunnerImpl.java
index ebf3873bc..2f349d85 100644
--- a/base/android/java/src/org/chromium/base/task/SingleThreadTaskRunnerImpl.java
+++ b/base/android/java/src/org/chromium/base/task/SingleThreadTaskRunnerImpl.java
@@ -27,7 +27,7 @@
      *                               initialized.
      * @param traits                 The TaskTraits associated with this SingleThreadTaskRunnerImpl.
      */
-    public SingleThreadTaskRunnerImpl(Handler handler, TaskTraits traits) {
+    public SingleThreadTaskRunnerImpl(Handler handler, @TaskTraits int traits) {
         super(traits, "SingleThreadTaskRunnerImpl", TaskRunnerType.SINGLE_THREAD);
         mHandler = handler;
     }
diff --git a/base/android/java/src/org/chromium/base/task/TaskExecutor.java b/base/android/java/src/org/chromium/base/task/TaskExecutor.java
index ca4e8d47..ec23e1d 100644
--- a/base/android/java/src/org/chromium/base/task/TaskExecutor.java
+++ b/base/android/java/src/org/chromium/base/task/TaskExecutor.java
@@ -15,29 +15,29 @@
      * @param task The task to be run with the specified traits.
      * @param delay The delay in milliseconds before the task can be run.
      */
-    public void postDelayedTask(TaskTraits traits, Runnable task, long delay);
+    public void postDelayedTask(@TaskTraits int traits, Runnable task, long delay);
 
     /**
      * @param traits The TaskTraits that describe the desired TaskRunner.
      * @return The TaskRunner for the specified TaskTraits.
      */
-    public TaskRunner createTaskRunner(TaskTraits traits);
+    public TaskRunner createTaskRunner(@TaskTraits int traits);
 
     /**
      * @param traits The TaskTraits that describe the desired TaskRunner.
      * @return The TaskRunner for the specified TaskTraits.
      */
-    public SequencedTaskRunner createSequencedTaskRunner(TaskTraits traits);
+    public SequencedTaskRunner createSequencedTaskRunner(@TaskTraits int traits);
 
     /**
      * @param traits The TaskTraits that describe the desired TaskRunner.
      * @return The TaskRunner for the specified TaskTraits.
      */
-    public SingleThreadTaskRunner createSingleThreadTaskRunner(TaskTraits traits);
+    public SingleThreadTaskRunner createSingleThreadTaskRunner(@TaskTraits int traits);
 
     /**
      * @return true iff the executor for these traits is backed by a SingleThreadTaskRunner
      * associated with the current thread.
      */
-    public boolean canRunTaskImmediately(TaskTraits traits);
+    public boolean canRunTaskImmediately(@TaskTraits int traits);
 }
diff --git a/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java b/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java
index 1467419..21fd7fe 100644
--- a/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java
+++ b/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java
@@ -37,7 +37,7 @@
     @GuardedBy("sCleaners")
     private static final Set<TaskRunnerCleaner> sCleaners = new HashSet<>();
 
-    private final TaskTraits mTaskTraits;
+    private final @TaskTraits int mTaskTraits;
     private final String mTraceEvent;
     private final @TaskRunnerType int mTaskRunnerType;
     // Volatile is sufficient for synchronization here since we never need to read-write and
@@ -116,7 +116,7 @@
     /**
      * @param traits The TaskTraits associated with this TaskRunnerImpl.
      */
-    TaskRunnerImpl(TaskTraits traits) {
+    TaskRunnerImpl(@TaskTraits int traits) {
         this(traits, "TaskRunnerImpl", TaskRunnerType.BASE);
         destroyGarbageCollectedTaskRunners();
     }
@@ -128,7 +128,7 @@
      *         native scheduler.
      */
     protected TaskRunnerImpl(
-            TaskTraits traits, String traceCategory, @TaskRunnerType int taskRunnerType) {
+            @TaskTraits int traits, String traceCategory, @TaskRunnerType int taskRunnerType) {
         mTaskTraits = traits;
         mTraceEvent = traceCategory + ".PreNativeTask.run";
         mTaskRunnerType = taskRunnerType;
@@ -212,19 +212,28 @@
                 if (mPreNativeTasks == null) return;
                 task = mPreNativeTasks.poll();
             }
-            // We don't want to set the Thread Priority of the UI Thread.
-            if (mTaskTraits.mUseThreadPool) {
-                switch (mTaskTraits.mPriority) {
-                    case TaskPriority.USER_VISIBLE:
-                        Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
-                        break;
-                    case TaskPriority.HIGHEST:
-                        Process.setThreadPriority(Process.THREAD_PRIORITY_MORE_FAVORABLE);
-                        break;
-                    default:
-                        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-                        break;
-                }
+            switch (mTaskTraits) {
+                case TaskTraits.BEST_EFFORT:
+                case TaskTraits.BEST_EFFORT_MAY_BLOCK:
+                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+                    break;
+                case TaskTraits.USER_VISIBLE:
+                case TaskTraits.USER_VISIBLE_MAY_BLOCK:
+                    Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
+                    break;
+                case TaskTraits.USER_BLOCKING:
+                case TaskTraits.USER_BLOCKING_MAY_BLOCK:
+                    Process.setThreadPriority(Process.THREAD_PRIORITY_MORE_FAVORABLE);
+                    break;
+                // We don't want to lower the Thread Priority of the UI Thread, especially
+                // pre-native, as the Thread is oversubscribed, highly latency sensitive, and
+                // there's only a single task queue so low priority tasks can run ahead of high
+                // priority tasks.
+                case TaskTraits.UI_BEST_EFFORT: // Fall-through.
+                case TaskTraits.UI_USER_VISIBLE: // Fall-through.
+                case TaskTraits.UI_USER_BLOCKING: // Fall-through.
+                    break;
+                // lint ensures all cases are checked.
             }
             task.run();
         }
@@ -235,9 +244,7 @@
      * it.
      */
     /* package */ void initNativeTaskRunner() {
-        long nativeTaskRunnerAndroid = TaskRunnerImplJni.get().init(mTaskRunnerType,
-                mTaskTraits.mPriority, mTaskTraits.mMayBlock, mTaskTraits.mUseThreadPool,
-                mTaskTraits.mExtensionId, mTaskTraits.mExtensionData);
+        long nativeTaskRunnerAndroid = TaskRunnerImplJni.get().init(mTaskRunnerType, mTaskTraits);
         synchronized (mPreNativeTaskLock) {
             if (mPreNativeTasks != null) {
                 for (Runnable task : mPreNativeTasks) {
@@ -269,13 +276,9 @@
         destroyGarbageCollectedTaskRunners();
     }
 
-
     @NativeMethods
     interface Natives {
-        // NB due to Proguard obfuscation it's easiest to pass the traits via arguments.
-        long init(@TaskRunnerType int taskRunnerType, int priority, boolean mayBlock,
-                boolean useThreadPool, byte extensionId, byte[] extensionData);
-
+        long init(@TaskRunnerType int taskRunnerType, @TaskTraits int taskTraits);
         void destroy(long nativeTaskRunnerAndroid);
         void postDelayedTask(
                 long nativeTaskRunnerAndroid, Runnable task, long delay, String runnableClassName);
diff --git a/base/android/java/src/org/chromium/base/task/TaskTraits.java b/base/android/java/src/org/chromium/base/task/TaskTraits.java
deleted file mode 100644
index ff53ac9..0000000
--- a/base/android/java/src/org/chromium/base/task/TaskTraits.java
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.task;
-
-import androidx.annotation.Nullable;
-
-import java.util.Arrays;
-
-/**
- * TaskTraits are metadata that influence how the TaskSecheduler deals with that task.
- * E.g. the trait can directly or indirectly control task prioritization.
- */
-public class TaskTraits {
-    // Keep in sync with base::TaskTraitsExtensionStorage:: kInvalidExtensionId
-    public static final byte INVALID_EXTENSION_ID = 0;
-
-    // Keep in sync with base::TaskTraitsExtensionStorage::kMaxExtensionId
-    public static final int MAX_EXTENSION_ID = 4;
-
-    // Keep in sync with base::TaskTraitsExtensionStorage::kStorageSize
-    public static final int EXTENSION_STORAGE_SIZE = 8;
-
-    // Convenience variables explicitly specifying common priorities.
-    // These also imply THREAD_POOL unless explicitly overwritten.
-    // TODO(1026641): Make destination explicit in Java too.
-
-    // This task will only be scheduled when machine resources are available. Once
-    // running, it may be descheduled if higher priority work arrives (in this
-    // process or another) and its running on a non-critical thread. This is the
-    // lowest possible priority.
-    public static final TaskTraits BEST_EFFORT = new TaskTraits(TaskPriority.BEST_EFFORT, false);
-
-    // This is a lowest-priority task which may block, for example non-urgent
-    // logging or deletion of temporary files as clean-up.
-    public static final TaskTraits BEST_EFFORT_MAY_BLOCK =
-            new TaskTraits(TaskPriority.BEST_EFFORT, true);
-
-    // This task affects UI or responsiveness of future user interactions. It is
-    // not an immediate response to a user interaction. Most tasks are likely to
-    // have this priority.
-    // Examples:
-    // - Updating the UI to reflect progress on a long task.
-    // - Loading data that might be shown in the UI after a future user
-    //   interaction.
-    public static final TaskTraits USER_VISIBLE = new TaskTraits(TaskPriority.USER_VISIBLE, false);
-
-    // USER_VISIBLE + may block.
-    public static final TaskTraits USER_VISIBLE_MAY_BLOCK =
-            new TaskTraits(TaskPriority.USER_VISIBLE, true);
-
-    // This task affects UI immediately after a user interaction.
-    // Example: Generating data shown in the UI immediately after a click.
-    public static final TaskTraits USER_BLOCKING =
-            new TaskTraits(TaskPriority.USER_BLOCKING, false);
-
-    // USER_BLOCKING + may block.
-    public static final TaskTraits USER_BLOCKING_MAY_BLOCK =
-            new TaskTraits(TaskPriority.USER_BLOCKING, true);
-
-    // For convenience of the JNI code, we use primitive types only.
-    // Note shutdown behavior is not supported on android.
-    final int mPriority;
-    final boolean mMayBlock;
-    final boolean mUseThreadPool;
-    final byte mExtensionId;
-    final byte mExtensionData[];
-
-    // For ThreadPool TaskTraits
-    private TaskTraits(int priority, boolean mayBlock) {
-        mPriority = priority;
-        mMayBlock = mayBlock;
-        mUseThreadPool = true;
-        mExtensionId = INVALID_EXTENSION_ID;
-        mExtensionData = null;
-    }
-
-    // For Extensions. MayBlock and ThreadPool are currently unused.
-    private TaskTraits(int priority, byte extensionId, byte extensionData[]) {
-        mPriority = priority;
-        mMayBlock = false;
-        mUseThreadPool = false;
-        mExtensionId = extensionId;
-        mExtensionData = extensionData;
-    }
-
-    public static <Extension> TaskTraits forExtension(int priority,
-            TaskTraitsExtensionDescriptor<Extension> descriptor, Extension extension) {
-        int id = descriptor.getId();
-        byte[] data = descriptor.toSerializedData(extension);
-        assert id > INVALID_EXTENSION_ID && id <= MAX_EXTENSION_ID;
-        assert data.length <= EXTENSION_STORAGE_SIZE;
-
-        return new TaskTraits(priority, (byte) id, data);
-    }
-
-    /**
-     * @return true if this task is using some TaskTraits extension.
-     */
-    public boolean hasExtension() {
-        return mExtensionId != INVALID_EXTENSION_ID;
-    }
-
-    /**
-     * Tries to extract the extension for the given descriptor from this traits.
-     *
-     * @return Extension instance or null if the traits do not contain the requested extension
-     */
-    public <Extension> Extension getExtension(TaskTraitsExtensionDescriptor<Extension> descriptor) {
-        if (mExtensionId == descriptor.getId()) {
-            return descriptor.fromSerializedData(mExtensionData);
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public boolean equals(@Nullable Object object) {
-        if (object == this) {
-            return true;
-        } else if (object instanceof TaskTraits) {
-            TaskTraits other = (TaskTraits) object;
-            return mPriority == other.mPriority && mMayBlock == other.mMayBlock
-                    && mUseThreadPool == other.mUseThreadPool && mExtensionId == other.mExtensionId
-                    && Arrays.equals(mExtensionData, other.mExtensionData);
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = 31;
-        hash = 37 * hash + mPriority;
-        hash = 37 * hash + (mMayBlock ? 0 : 1);
-        hash = 37 * hash + (mUseThreadPool ? 0 : 1);
-        hash = 37 * hash + (int) mExtensionId;
-        hash = 37 * hash + Arrays.hashCode(mExtensionData);
-        return hash;
-    }
-}
diff --git a/base/android/java/src/org/chromium/base/task/TaskTraitsExtensionDescriptor.java b/base/android/java/src/org/chromium/base/task/TaskTraitsExtensionDescriptor.java
deleted file mode 100644
index 0c048add..0000000
--- a/base/android/java/src/org/chromium/base/task/TaskTraitsExtensionDescriptor.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.task;
-
-/**
- * Interface to deserialize an extension from the data contained in a {@link TaskTraits} instance by
- * passing it to the {@link TaskTraits#getExtension} method.
- *
- * @param <Extension>
- * @see TaskTraits#getExtension
- */
-public interface TaskTraitsExtensionDescriptor<Extension> {
-    /**
-     * Used by {@link TaskTraits} to make sure that extension data can be deserialized with this
-     * descriptor.
-     *
-     * @return The id for the extension that can be deserialized by this class.
-     */
-    int getId();
-
-    /**
-     * Deserializes an extension for the data contained in {@link TaskTraits}. Caller must make sure
-     * that the data is for this extension by matching the extension id contained in the
-     * {@link TaskTraits} by comparing it to the one returned by {@link #getId}
-     *
-     * @param data serialized extension data
-     * @return Extension instance
-     */
-    Extension fromSerializedData(byte[] data);
-
-    /**
-     * Serializes an extension as data contained in {@link TaskTraits}.
-     *
-     * @param extension Extension instance
-     * @return serialized extension data
-     */
-    byte[] toSerializedData(Extension extension);
-}
diff --git a/base/android/java/src/org/chromium/base/task/ThreadPoolTaskExecutor.java b/base/android/java/src/org/chromium/base/task/ThreadPoolTaskExecutor.java
new file mode 100644
index 0000000..0c5a017e
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/task/ThreadPoolTaskExecutor.java
@@ -0,0 +1,54 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.task;
+
+/**
+ * The {@link TaskExecutor} for ThreadPool tasks.
+ * TODO(crbug.com/1026641): Provide direct Java APIs for ThreadPool vs UI thread
+ * task posting instead of sharding based on {@link TaskTraits}.
+ */
+class ThreadPoolTaskExecutor implements TaskExecutor {
+    private static final int TRAITS_COUNT =
+            TaskTraits.THREAD_POOL_TRAITS_END - TaskTraits.THREAD_POOL_TRAITS_START + 1;
+    private final TaskRunner mTraitsToRunnerMap[] = new TaskRunner[TRAITS_COUNT];
+
+    public ThreadPoolTaskExecutor() {
+        for (int i = 0; i < TRAITS_COUNT; i++) {
+            mTraitsToRunnerMap[i] = createTaskRunner(TaskTraits.THREAD_POOL_TRAITS_START + i);
+        }
+    }
+
+    @Override
+    public TaskRunner createTaskRunner(@TaskTraits int taskTraits) {
+        return new TaskRunnerImpl(taskTraits);
+    }
+
+    @Override
+    public SequencedTaskRunner createSequencedTaskRunner(@TaskTraits int taskTraits) {
+        return new SequencedTaskRunnerImpl(taskTraits);
+    }
+
+    /**
+     * If CurrentThread is not specified, or we are being called from within a threadpool task
+     * this maps to a single thread within the native thread pool. If so we can't run tasks
+     * posted on it until native has started.
+     */
+    @Override
+    public SingleThreadTaskRunner createSingleThreadTaskRunner(@TaskTraits int taskTraits) {
+        // Tasks posted via this API will not execute until after native has started.
+        return new SingleThreadTaskRunnerImpl(null, taskTraits);
+    }
+
+    @Override
+    public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
+        int index = taskTraits - TaskTraits.THREAD_POOL_TRAITS_START;
+        mTraitsToRunnerMap[index].postDelayedTask(task, delay);
+    }
+
+    @Override
+    public boolean canRunTaskImmediately(@TaskTraits int traits) {
+        return false;
+    }
+}
diff --git a/base/android/java/src/org/chromium/base/task/UiThreadTaskExecutor.java b/base/android/java/src/org/chromium/base/task/UiThreadTaskExecutor.java
new file mode 100644
index 0000000..7422531
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/task/UiThreadTaskExecutor.java
@@ -0,0 +1,68 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.task;
+
+import android.os.Handler;
+
+import org.chromium.base.ThreadUtils;
+
+/**
+ * This {@link TaskExecutor} is for tasks posted with {@link UiThreadTaskTraits}. It maps to
+ * content::BrowserTaskExecutor in C++, except that in Java the UI thread is a base/ concept and
+ * only UI thread posting is supported.
+ *
+ * NB if you wish to post to the thread pool then use {@link TaskTraits} instead of {@link
+ * UiThreadTaskTraits}.
+ */
+public class UiThreadTaskExecutor implements TaskExecutor {
+    private static boolean sRegistered;
+
+    private final SingleThreadTaskRunner mBestEffortTaskRunner;
+    private final SingleThreadTaskRunner mUserVisibleTaskRunner;
+    private final SingleThreadTaskRunner mUserBlockingTaskRunner;
+
+    public UiThreadTaskExecutor() {
+        Handler handler = ThreadUtils.getUiThreadHandler();
+        mBestEffortTaskRunner = new SingleThreadTaskRunnerImpl(handler, TaskTraits.UI_BEST_EFFORT);
+        mUserVisibleTaskRunner =
+                new SingleThreadTaskRunnerImpl(handler, TaskTraits.UI_USER_VISIBLE);
+        mUserBlockingTaskRunner =
+                new SingleThreadTaskRunnerImpl(handler, TaskTraits.UI_USER_BLOCKING);
+    }
+
+    @Override
+    public TaskRunner createTaskRunner(@TaskTraits int taskTraits) {
+        return createSingleThreadTaskRunner(taskTraits);
+    }
+
+    @Override
+    public SequencedTaskRunner createSequencedTaskRunner(@TaskTraits int taskTraits) {
+        return createSingleThreadTaskRunner(taskTraits);
+    }
+
+    @Override
+    public SingleThreadTaskRunner createSingleThreadTaskRunner(@TaskTraits int taskTraits) {
+        if (TaskTraits.UI_BEST_EFFORT == taskTraits) {
+            return mBestEffortTaskRunner;
+        } else if (TaskTraits.UI_USER_VISIBLE == taskTraits) {
+            return mUserVisibleTaskRunner;
+        } else if (TaskTraits.UI_USER_BLOCKING == taskTraits) {
+            return mUserBlockingTaskRunner;
+        } else {
+            // Add support for additional TaskTraits here if encountering this exception.
+            throw new RuntimeException();
+        }
+    }
+
+    @Override
+    public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
+        createSingleThreadTaskRunner(taskTraits).postDelayedTask(task, delay);
+    }
+
+    @Override
+    public boolean canRunTaskImmediately(@TaskTraits int traits) {
+        return createSingleThreadTaskRunner(traits).belongsToCurrentThread();
+    }
+}
diff --git a/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java b/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java
index ce9d095..20fa05cf6 100644
--- a/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java
+++ b/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java
@@ -9,6 +9,7 @@
 
 import androidx.test.filters.SmallTest;
 
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -92,6 +93,11 @@
         mMonitor.setCurrentPressureSupplierForTesting(null);
     }
 
+    @After
+    public void tearDown() {
+        ThreadUtils.clearUiThreadForTesting();
+    }
+
     /**
      * Runs all UiThread tasks posted |delayMs| in the future.
      * @param delayMs
diff --git a/base/android/junit/src/org/chromium/base/task/SequencedTaskRunnerTaskMigrationTest.java b/base/android/junit/src/org/chromium/base/task/SequencedTaskRunnerTaskMigrationTest.java
index af4e0d77..79b29f2 100644
--- a/base/android/junit/src/org/chromium/base/task/SequencedTaskRunnerTaskMigrationTest.java
+++ b/base/android/junit/src/org/chromium/base/task/SequencedTaskRunnerTaskMigrationTest.java
@@ -174,8 +174,7 @@
         }
 
         @Override
-        public long init(int taskRunnerType, int priority, boolean mayBlock, boolean useThreadPool,
-                byte extensionId, byte[] extensionData) {
+        public long init(int taskRunnerType, int taskTraits) {
             return 1;
         }
 
diff --git a/base/android/junit/src/org/chromium/base/task/TaskTraitsTest.java b/base/android/junit/src/org/chromium/base/task/TaskTraitsTest.java
deleted file mode 100644
index 24d508b01..0000000
--- a/base/android/junit/src/org/chromium/base/task/TaskTraitsTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.task;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-import org.chromium.base.test.BaseRobolectricTestRunner;
-
-/**
- * Tests for {@link TaskTraits}
- */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class TaskTraitsTest {
-    private static class FakeTaskTraitsExtensionDescriptor
-            implements TaskTraitsExtensionDescriptor<String> {
-        public static final byte ID = 1;
-
-        @Override
-        public int getId() {
-            return ID;
-        }
-
-        @Override
-        public String fromSerializedData(byte[] data) {
-            return new String(data);
-        }
-
-        @Override
-        public byte[] toSerializedData(String extension) {
-            return extension.getBytes();
-        }
-    }
-
-    private static class OtherTaskTraitsExtensionDescriptor
-            extends FakeTaskTraitsExtensionDescriptor {
-        @Override
-        public int getId() {
-            return super.getId() + 1;
-        }
-    }
-
-    private static final FakeTaskTraitsExtensionDescriptor DESC =
-            new FakeTaskTraitsExtensionDescriptor();
-
-    private static final OtherTaskTraitsExtensionDescriptor DESC2 =
-            new OtherTaskTraitsExtensionDescriptor();
-
-    @Test
-    @SmallTest
-    public void testExtensionPresent() {
-        String input = "Blub";
-        TaskTraits traits = TaskTraits.forExtension(TaskPriority.USER_VISIBLE, DESC, input);
-        String extension = traits.getExtension(DESC);
-        assertEquals(input, extension);
-    }
-
-    @Test
-    @SmallTest
-    public void testExtensionNotPresent() {
-        String input = "Blub";
-        TaskTraits traits = TaskTraits.forExtension(TaskPriority.USER_VISIBLE, DESC, input);
-        String extension = traits.getExtension(DESC2);
-        assertNull(extension);
-    }
-}
diff --git a/base/android/task_scheduler/task_runner_android.cc b/base/android/task_scheduler/task_runner_android.cc
index 304b8af..6f6b265 100644
--- a/base/android/task_scheduler/task_runner_android.cc
+++ b/base/android/task_scheduler/task_runner_android.cc
@@ -9,12 +9,14 @@
 #include <utility>
 
 #include "base/android/jni_string.h"
+#include "base/android/task_scheduler/task_traits_android.h"
 #include "base/android_runtime_jni_headers/Runnable_jni.h"
 #include "base/base_jni_headers/TaskRunnerImpl_jni.h"
 #include "base/check.h"
 #include "base/functional/bind.h"
 #include "base/strings/strcat.h"
 #include "base/task/task_executor.h"
+#include "base/task/task_traits.h"
 #include "base/task/thread_pool/thread_pool_impl.h"
 #include "base/task/thread_pool/thread_pool_instance.h"
 #include "base/time/time.h"
@@ -22,45 +24,10 @@
 
 namespace base {
 
-// As a class so it can be friend'ed.
-class AndroidTaskTraits {
- public:
-  AndroidTaskTraits() = delete;
-
-  static TaskTraits Create(
-      JNIEnv* env,
-      jint priority,
-      jboolean may_block,
-      jbyte extension_id,
-      const base::android::JavaParamRef<jbyteArray>& extension_data) {
-    return TaskTraits(
-        static_cast<TaskPriority>(priority), may_block,
-        TaskTraitsExtensionStorage(static_cast<uint8_t>(extension_id),
-                                   GetExtensionData(env, extension_data)));
-  }
-
- private:
-  static std::array<uint8_t, TaskTraitsExtensionStorage::kStorageSize>
-  GetExtensionData(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jbyteArray>& array_object) {
-    if (env->IsSameObject(array_object, nullptr))
-      return std::array<uint8_t, TaskTraitsExtensionStorage::kStorageSize>();
-
-    jbyteArray array = static_cast<jbyteArray>(array_object);
-    DCHECK_EQ(env->GetArrayLength(array),
-              static_cast<jsize>(TaskTraitsExtensionStorage::kStorageSize));
-
-    std::array<uint8_t, TaskTraitsExtensionStorage::kStorageSize> result;
-    jbyte* src_bytes = env->GetByteArrayElements(array, nullptr);
-    memcpy(&result[0], src_bytes, TaskTraitsExtensionStorage::kStorageSize);
-    env->ReleaseByteArrayElements(array, src_bytes, JNI_ABORT);
-    return result;
-  }
-};
-
 namespace {
 
+static TaskTraitsExtensionStorage g_ui_thread_extension;
+
 // TODO(1026641): Make destination explicit (separate APIs) on Java side too and
 // get rid of the need for TaskTraitsExtension/etc to reach the UI thread.
 TaskExecutor* GetTaskExecutor(bool use_thread_pool, const TaskTraits& traits) {
@@ -100,18 +67,21 @@
 
 }  // namespace
 
-jlong JNI_TaskRunnerImpl_Init(
-    JNIEnv* env,
-    jint task_runner_type,
-    jint priority,
-    jboolean may_block,
-    jboolean use_thread_pool,
-    jbyte extension_id,
-    const base::android::JavaParamRef<jbyteArray>& extension_data) {
+// As a class so it can be friend'ed.
+class AndroidTaskTraits {
+ public:
+  AndroidTaskTraits() = delete;
+
+  static TaskTraits CreateForUi(base::TaskPriority priority) {
+    return TaskTraits(priority, false, g_ui_thread_extension);
+  }
+};
+
+jlong JNI_TaskRunnerImpl_Init(JNIEnv* env,
+                              jint task_runner_type,
+                              jint task_traits) {
   TaskRunnerAndroid* task_runner =
-      TaskRunnerAndroid::Create(env, task_runner_type, priority, may_block,
-                                use_thread_pool, extension_id, extension_data)
-          .release();
+      TaskRunnerAndroid::Create(task_runner_type, task_traits).release();
   return reinterpret_cast<intptr_t>(task_runner);
 }
 
@@ -152,15 +122,42 @@
 
 // static
 std::unique_ptr<TaskRunnerAndroid> TaskRunnerAndroid::Create(
-    JNIEnv* env,
     jint task_runner_type,
-    jint priority,
-    jboolean may_block,
-    jboolean use_thread_pool,
-    jbyte extension_id,
-    const base::android::JavaParamRef<jbyteArray>& extension_data) {
-  const TaskTraits task_traits = AndroidTaskTraits::Create(
-      env, priority, may_block, extension_id, extension_data);
+    jint j_task_traits) {
+  TaskTraits task_traits;
+  bool use_thread_pool = true;
+  switch (j_task_traits) {
+    case ::TaskTraits::BEST_EFFORT:
+      task_traits = {TaskPriority::BEST_EFFORT};
+      break;
+    case ::TaskTraits::BEST_EFFORT_MAY_BLOCK:
+      task_traits = {base::MayBlock(), TaskPriority::BEST_EFFORT};
+      break;
+    case ::TaskTraits::USER_VISIBLE:
+      task_traits = {TaskPriority::USER_VISIBLE};
+      break;
+    case ::TaskTraits::USER_VISIBLE_MAY_BLOCK:
+      task_traits = {base::MayBlock(), TaskPriority::USER_VISIBLE};
+      break;
+    case ::TaskTraits::USER_BLOCKING:
+      task_traits = {TaskPriority::USER_BLOCKING};
+      break;
+    case ::TaskTraits::USER_BLOCKING_MAY_BLOCK:
+      task_traits = {base::MayBlock(), TaskPriority::USER_BLOCKING};
+      break;
+    case ::TaskTraits::UI_BEST_EFFORT:
+      use_thread_pool = false;
+      task_traits = AndroidTaskTraits::CreateForUi(TaskPriority::BEST_EFFORT);
+      break;
+    case ::TaskTraits::UI_USER_VISIBLE:
+      use_thread_pool = false;
+      task_traits = AndroidTaskTraits::CreateForUi(TaskPriority::USER_VISIBLE);
+      break;
+    case ::TaskTraits::UI_USER_BLOCKING:
+      use_thread_pool = false;
+      task_traits = AndroidTaskTraits::CreateForUi(TaskPriority::USER_BLOCKING);
+      break;
+  }
   TaskExecutor* const task_executor =
       GetTaskExecutor(use_thread_pool, task_traits);
   scoped_refptr<TaskRunner> task_runner;
@@ -180,4 +177,10 @@
       task_runner, static_cast<TaskRunnerType>(task_runner_type));
 }
 
+// static
+void TaskRunnerAndroid::SetUiThreadExtension(
+    TaskTraitsExtensionStorage extension) {
+  g_ui_thread_extension = extension;
+}
+
 }  // namespace base
diff --git a/base/android/task_scheduler/task_runner_android.h b/base/android/task_scheduler/task_runner_android.h
index bb439c9..1a4334d5 100644
--- a/base/android/task_scheduler/task_runner_android.h
+++ b/base/android/task_scheduler/task_runner_android.h
@@ -8,7 +8,9 @@
 #include <memory>
 
 #include "base/android/jni_weak_ref.h"
+#include "base/base_export.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/task/task_traits_extension.h"
 
 namespace base {
 
@@ -17,7 +19,7 @@
 
 // Native implementation backing TaskRunnerImpl.java which posts java tasks onto
 // a C++ TaskRunner.
-class TaskRunnerAndroid {
+class BASE_EXPORT TaskRunnerAndroid {
  public:
   explicit TaskRunnerAndroid(scoped_refptr<TaskRunner> task_runner,
                              TaskRunnerType type);
@@ -36,14 +38,10 @@
 
   bool BelongsToCurrentThread(JNIEnv* env);
 
-  static std::unique_ptr<TaskRunnerAndroid> Create(
-      JNIEnv* env,
-      jint task_runner_type,
-      jint priority,
-      jboolean may_block,
-      jboolean use_thread_pool,
-      jbyte extension_id,
-      const base::android::JavaParamRef<jbyteArray>& extension_data);
+  static std::unique_ptr<TaskRunnerAndroid> Create(jint task_runner_type,
+                                                   jint j_task_traits);
+
+  static void SetUiThreadExtension(TaskTraitsExtensionStorage extension);
 
  private:
   const scoped_refptr<TaskRunner> task_runner_;
diff --git a/base/android/task_scheduler/task_traits_android.h b/base/android/task_scheduler/task_traits_android.h
new file mode 100644
index 0000000..589de24
--- /dev/null
+++ b/base/android/task_scheduler/task_traits_android.h
@@ -0,0 +1,46 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_TASK_SCHEDULER_TASK_TRAITS_ANDROID_H_
+#define BASE_ANDROID_TASK_SCHEDULER_TASK_TRAITS_ANDROID_H_
+
+// Enum for the TaskTraits types exposed to Java.
+//
+// A Java counterpart will be generated for this enum.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base.task
+enum TaskTraits {
+  THREAD_POOL_TRAITS_START = 0,
+  // This task will only be scheduled when machine resources are available. Once
+  // running, it may be descheduled if higher priority work arrives (in this
+  // process or another) and its running on a non-critical thread. This is the
+  // lowest possible priority.
+  BEST_EFFORT = THREAD_POOL_TRAITS_START,
+  // This is a lowest-priority task which may block, for example non-urgent
+  // logging or deletion of temporary files as clean-up.
+  BEST_EFFORT_MAY_BLOCK = THREAD_POOL_TRAITS_START + 1,
+  // This task affects UI or responsiveness of future user interactions. It is
+  // not an immediate response to a user interaction. Most tasks are likely to
+  // have this priority.
+  // Examples:
+  // - Updating the UI to reflect progress on a long task.
+  // - Loading data that might be shown in the UI after a future user
+  //   interaction.
+  USER_VISIBLE = THREAD_POOL_TRAITS_START + 2,
+  // USER_VISIBLE + may block.
+  USER_VISIBLE_MAY_BLOCK = THREAD_POOL_TRAITS_START + 3,
+  // This task affects UI immediately after a user interaction.
+  // Example: Generating data shown in the UI immediately after a click.
+  USER_BLOCKING = THREAD_POOL_TRAITS_START + 4,
+  // USER_BLOCKING + may block.
+  USER_BLOCKING_MAY_BLOCK = THREAD_POOL_TRAITS_START + 5,
+  THREAD_POOL_TRAITS_END = USER_BLOCKING_MAY_BLOCK,
+  UI_TRAITS_START = THREAD_POOL_TRAITS_END + 1,
+  UI_BEST_EFFORT = UI_TRAITS_START,
+  UI_USER_VISIBLE = UI_TRAITS_START + 1,
+  UI_USER_BLOCKING = UI_TRAITS_START + 2,
+  UI_DEFAULT = UI_USER_VISIBLE,
+  UI_TRAITS_END = UI_USER_BLOCKING
+};
+
+#endif  // BASE_ANDROID_TASK_SCHEDULER_TASK_TRAITS_ANDROID_H_
diff --git a/base/containers/id_map.h b/base/containers/id_map.h
index 20fc9f7..042a218 100644
--- a/base/containers/id_map.h
+++ b/base/containers/id_map.h
@@ -9,6 +9,7 @@
 #include <stdint.h>
 
 #include <iterator>
+#include <memory>
 #include <ostream>
 #include <type_traits>
 #include <unordered_map>
@@ -18,7 +19,6 @@
 #include "base/check_op.h"
 #include "base/containers/flat_set.h"
 #include "base/memory/raw_ptr.h"
-#include "base/notreached.h"
 #include "base/sequence_checker.h"
 
 namespace base {
@@ -31,15 +31,16 @@
 // Items can be inserted into the container with arbitrary ID, but the caller
 // must ensure they are unique. Inserting IDs and relying on automatically
 // generated ones is not allowed because they can collide.
-
+//
 // The map's value type (the V param) can be any dereferenceable type, such as a
-// raw pointer or smart pointer
+// raw pointer or smart pointer, and must be comparable with nullptr.
 template <typename V, typename K = int32_t>
 class IDMap final {
  public:
   using KeyType = K;
 
  private:
+  // The value type `V` must be pointer-like and support operator*.
   using T = typename std::remove_reference<decltype(*V())>::type;
 
   using HashTable = std::unordered_map<KeyType, V>;
@@ -68,6 +69,10 @@
   void set_check_on_null_data(bool value) { check_on_null_data_ = value; }
 
   // Adds a view with an automatically generated unique ID. See AddWithID.
+  //
+  // The generated key comes from the template type `K`, with each key being
+  // generated by incrementing `K`. The key type should not generate duplicate
+  // keys or this function can CHECK-fail.
   KeyType Add(V data) { return AddInternal(std::move(data)); }
 
   // Adds a new data member with the specified ID. The ID must not be in
@@ -76,11 +81,13 @@
   // two methods may not be mixed, or duplicate IDs may be generated.
   void AddWithID(V data, KeyType id) { AddWithIDInternal(std::move(data), id); }
 
+  // Removes the `id` from the map.
+  //
+  // Does nothing if the `id` is not in the map.
   void Remove(KeyType id) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     typename HashTable::iterator i = data_.find(id);
     if (i == data_.end() || IsRemoved(id)) {
-      NOTREACHED() << "Attempting to remove an item not in the list";
       return;
     }
 
@@ -91,14 +98,18 @@
     }
   }
 
-  // Replaces the value for |id| with |new_data| and returns the existing value.
-  // Should only be called with an already added id.
+  // Replaces the value for `id` with `new_data` and returns the existing value.
+  //
+  // May only be called with an id that is in the map, and will CHECK()
+  // otherwise. It is up to the caller to keep track whether the `id` is in the
+  // map, as Lookup() can return null for ids that are in the map but have an
+  // empty value.
   V Replace(KeyType id, V new_data) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     DCHECK(!check_on_null_data_ || new_data);
     typename HashTable::iterator i = data_.find(id);
-    DCHECK(i != data_.end());
-    DCHECK(!IsRemoved(id));
+    CHECK(i != data_.end());
+    CHECK(!IsRemoved(id));
 
     using std::swap;
     swap(i->second, new_data);
@@ -120,12 +131,27 @@
     return size() == 0u;
   }
 
+  // Returns a pointer to raw value associated with `id` if the `id` is in the
+  // map and is not empty.
+  //
+  // The raw value is obtained by dereferencing the stored value type `V`.
+  //
+  // If the `id` is not in the map, or the value type compares as equal to
+  // nullptr, this function will return null.
   T* Lookup(KeyType id) const {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     typename HashTable::const_iterator i = data_.find(id);
-    if (i == data_.end() || !i->second || IsRemoved(id))
+    if (i == data_.end() || IsRemoved(id)) {
       return nullptr;
-    return &*i->second;
+    }
+    // The IDMap contains a pointer or pointer-like object. We don't want to
+    // dereference null, so this acts as an extension point for
+    // IDMap, where if the value object compares as equal to nullptr, it its
+    // dereference type will not be returned from the map.
+    if (i->second == nullptr) {
+      return nullptr;
+    }
+    return std::addressof(*i->second);
   }
 
   size_t size() const {
@@ -134,23 +160,19 @@
   }
 
 #if defined(UNIT_TEST)
-  int iteration_depth() const {
-    return iteration_depth_;
-  }
+  int iteration_depth() const { return iteration_depth_; }
 #endif  // defined(UNIT_TEST)
 
   // It is safe to remove elements from the map during iteration. All iterators
   // will remain valid.
-  template<class ReturnType>
+  template <class ReturnType>
   class Iterator {
    public:
     Iterator(IDMap<V, K>* map) : map_(map), iter_(map_->data_.begin()) {
       Init();
     }
 
-    Iterator(const Iterator& iter)
-        : map_(iter.map_),
-          iter_(iter.iter_) {
+    Iterator(const Iterator& iter) : map_(iter.map_), iter_(iter.iter_) {
       Init();
     }
 
@@ -164,12 +186,14 @@
     ~Iterator() {
       DCHECK_CALLED_ON_VALID_SEQUENCE(map_->sequence_checker_);
 
-      // We're going to decrement iteration depth. Make sure it's greater than
-      // zero so that it doesn't become negative.
-      DCHECK_LT(0, map_->iteration_depth_);
-
-      if (--map_->iteration_depth_ == 0)
+      if (--map_->iteration_depth_ == 0) {
         map_->Compact();
+      } else {
+        // The iteration depth should not become negative, it would mean there
+        // was an untracked iterator which is now being destroyed, and the
+        // Compact() call would have happened while an iterator was live.
+        CHECK_GT(map_->iteration_depth_, 0);
+      }
     }
 
     bool IsAtEnd() const {
@@ -184,8 +208,9 @@
 
     ReturnType* GetCurrentValue() const {
       DCHECK_CALLED_ON_VALID_SEQUENCE(map_->sequence_checker_);
-      if (!iter_->second || map_->IsRemoved(iter_->first))
+      if (!iter_->second || map_->IsRemoved(iter_->first)) {
         return nullptr;
+      }
       return &*iter_->second;
     }
 
@@ -198,13 +223,16 @@
    private:
     void Init() {
       DCHECK_CALLED_ON_VALID_SEQUENCE(map_->sequence_checker_);
+      // Guard signed integer overflow.
+      CHECK(map_->iteration_depth_ < std::numeric_limits<int>::max());
       ++map_->iteration_depth_;
       SkipRemovedEntries();
     }
 
     void SkipRemovedEntries() {
-      while (iter_ != map_->data_.end() && map_->IsRemoved(iter_->first))
+      while (iter_ != map_->data_.end() && map_->IsRemoved(iter_->first)) {
         ++iter_;
+      }
     }
 
     raw_ptr<IDMap<V, K>> map_;
@@ -246,9 +274,15 @@
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     DCHECK(!check_on_null_data_ || data);
     KeyType this_id = next_id_;
-    DCHECK(data_.find(this_id) == data_.end()) << "Inserting duplicate item";
-    data_[this_id] = std::move(data);
+
+    AddWithIDInternal(std::move(data), this_id);
+
+    if constexpr (std::is_integral_v<K>) {
+      // Guard signed integer overflow, and duplicate unsigned keys.
+      CHECK(next_id_ < std::numeric_limits<K>::max());
+    }
     next_id_++;
+
     return this_id;
   }
 
@@ -257,10 +291,11 @@
     DCHECK(!check_on_null_data_ || data);
     if (IsRemoved(id)) {
       removed_ids_.erase(id);
+      data_[id] = std::move(data);
     } else {
-      DCHECK(data_.find(id) == data_.end()) << "Inserting duplicate item";
+      auto [_, inserted] = data_.emplace(id, std::move(data));
+      CHECK(inserted) << "Inserting duplicate item";
     }
-    data_[id] = std::move(data);
   }
 
   bool IsRemoved(KeyType key) const {
@@ -269,8 +304,9 @@
 
   void Compact() {
     DCHECK_EQ(0, iteration_depth_);
-    for (const auto& i : removed_ids_)
+    for (const auto& i : removed_ids_) {
       data_.erase(i);
+    }
     removed_ids_.clear();
   }
 
diff --git a/base/containers/id_map_unittest.cc b/base/containers/id_map_unittest.cc
index e1401dd4..78b8662 100644
--- a/base/containers/id_map_unittest.cc
+++ b/base/containers/id_map_unittest.cc
@@ -6,18 +6,44 @@
 
 #include <stdint.h>
 
+#include <functional>
 #include <memory>
 
 #include "base/memory/raw_ptr.h"
 #include "base/test/gtest_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+namespace base::test::id_map {
+struct RepeatingKeyType {
+  explicit RepeatingKeyType(int i) : i(i) {}
+
+  constexpr void operator++() {}
+  constexpr RepeatingKeyType& operator++(int) { return *this; }
+
+  constexpr bool operator==(const RepeatingKeyType& o) const {
+    return i == o.i;
+  }
+  constexpr bool operator<(const RepeatingKeyType& o) const { return i < o.i; }
+
+  int i = 0;
+};
+}  // namespace base::test::id_map
+
+namespace std {
+template <>
+struct hash<::base::test::id_map::RepeatingKeyType> {
+  constexpr size_t operator()(
+      const ::base::test::id_map::RepeatingKeyType& k) const noexcept {
+    return std::hash<int>()(k.i);
+  }
+};
+}  // namespace std
+
 namespace base {
 
 namespace {
 
-class TestObject {
-};
+class TestObject {};
 
 class DestructorCounter {
  public:
@@ -108,8 +134,9 @@
   const int kCount = 5;
   TestObject obj[kCount];
 
-  for (auto& i : obj)
+  for (auto& i : obj) {
     map.Add(&i);
+  }
 
   // IDMap has no predictable iteration order.
   int32_t ids_in_iteration_order[kCount];
@@ -217,8 +244,9 @@
   const int kCount = 5;
   TestObject obj[kCount];
 
-  for (auto& i : obj)
+  for (auto& i : obj) {
     map.Add(&i);
+  }
 
   // IDMap has no predictable iteration order.
   int32_t ids_in_iteration_order[kCount];
@@ -379,20 +407,44 @@
 
 TEST(IDMapTest, RemovedValueHandling) {
   TestObject obj;
-  IDMap<TestObject*> map;
-  int key = map.Add(&obj);
+  {
+    IDMap<TestObject*> map;
+    int key = map.Add(&obj);
 
-  IDMap<TestObject*>::iterator itr(&map);
-  map.Clear();
-  EXPECT_DCHECK_DEATH(map.Remove(key));
-  EXPECT_DCHECK_DEATH(map.Replace(key, &obj));
-  EXPECT_FALSE(map.Lookup(key));
-  EXPECT_FALSE(itr.IsAtEnd());
-  EXPECT_FALSE(itr.GetCurrentValue());
+    IDMap<TestObject*>::iterator itr(&map);
+    // Queues the `key` for removal.
+    map.Clear();
+    // Removes nothing, already queued.
+    map.Remove(key);
+    // Can not replace a key that is not present. If it's queued for removal
+    // it's not present.
+    EXPECT_CHECK_DEATH(map.Replace(key, &obj));
+    EXPECT_FALSE(map.Lookup(key));
+    EXPECT_FALSE(itr.IsAtEnd());
+    EXPECT_FALSE(itr.GetCurrentValue());
 
-  EXPECT_TRUE(map.IsEmpty());
-  map.AddWithID(&obj, key);
-  EXPECT_EQ(1u, map.size());
+    EXPECT_TRUE(map.IsEmpty());
+    // Replaces the element that's queued for removal when `itr` is destroyed.
+    map.AddWithID(&obj, key);
+    EXPECT_EQ(1u, map.size());
+  }
+
+  {
+    using base::test::id_map::RepeatingKeyType;
+
+    IDMap<TestObject*, RepeatingKeyType> map;
+    RepeatingKeyType key = map.Add(&obj);
+    IDMap<TestObject*, RepeatingKeyType>::iterator itr(&map);
+    map.Remove(key);  // Queues it for removal.
+
+    // The RepeatingKeyType's operator++ does not always return a unique id. The
+    // Add() method does not make extra assumptions about this, and can replace
+    // a queued-for-removal item just like AddWithID().
+
+    // Replaces the element that's queued for removal when `itr` is destroyed.
+    RepeatingKeyType key2 = map.Add(&obj);
+    EXPECT_EQ(key, key2);
+  }
 }
 
 }  // namespace base
diff --git a/base/fuchsia/fidl_event_handler.h b/base/fuchsia/fidl_event_handler.h
new file mode 100644
index 0000000..01cdefdf
--- /dev/null
+++ b/base/fuchsia/fidl_event_handler.h
@@ -0,0 +1,87 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_FUCHSIA_FIDL_EVENT_HANDLER_H_
+#define BASE_FUCHSIA_FIDL_EVENT_HANDLER_H_
+
+#include <lib/fidl/cpp/wire/client_base.h>
+#include <lib/fidl/cpp/wire/status.h>
+
+#include <string>
+
+#include "base/fuchsia/fuchsia_logging.h"
+#include "base/functional/callback.h"
+#include "base/location.h"
+#include "base/strings/string_piece.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace fidl {
+template <typename Protocol>
+class AsyncEventHandler;
+}
+
+namespace base {
+
+// An implementation of `fidl::AsyncEventhandler` that simply LOGs an ERROR
+// when `on_fidl_error` is called. The lifetime of an instance of this class
+// needs to match the lifetime of the `fidl::Client` that it is used with.
+template <typename Protocol>
+class FidlErrorEventLogger : public fidl::AsyncEventHandler<Protocol> {
+ public:
+  explicit FidlErrorEventLogger(
+      std::string protocol_name = fidl::DiscoverableProtocolName<Protocol>)
+      : protocol_name_(std::move(protocol_name)) {}
+
+  void on_fidl_error(fidl::UnbindInfo error) override {
+    LOG(ERROR) << protocol_name_ << " was disconnected with "
+               << error.status_string() << ".";
+  }
+
+ private:
+  std::string protocol_name_;
+};
+
+// An implementation of `fidl::AsyncEventhandler` that LOGs an ERROR and
+// exits the process when `on_fidl_error` is called. The lifetime of an instance
+// of this class needs to match the lifetime of the `fidl::Client` that it is
+// used with.
+template <typename Protocol>
+class FidlErrorEventProcessExiter : public fidl::AsyncEventHandler<Protocol> {
+ public:
+  explicit FidlErrorEventProcessExiter(
+      std::string protocol_name = fidl::DiscoverableProtocolName<Protocol>)
+      : protocol_name_(std::move(protocol_name)) {}
+
+  void on_fidl_error(fidl::UnbindInfo error) override {
+    base::LogFidlErrorAndExitProcess(FROM_HERE, protocol_name_)(error.status());
+  }
+
+ private:
+  std::string protocol_name_;
+};
+
+// An implementation of `fidl::AsyncEventHandler` that invokes the
+// caller-supplied callback when `on_fidl_error` is called. The lifetime of an
+// instance of this class needs to match the lifetime of the `fidl::Client` that
+// it is used with.
+template <typename Protocol>
+class FidlErrorEventHandler : public fidl::AsyncEventHandler<Protocol> {
+ public:
+  using OnFidlErrorCallback = base::RepeatingCallback<void(fidl::UnbindInfo)>;
+
+  FidlErrorEventHandler() = delete;
+  explicit FidlErrorEventHandler(OnFidlErrorCallback on_fidl_error_callback)
+      : on_fidl_error_callback_(std::move(on_fidl_error_callback)) {}
+
+  void on_fidl_error(fidl::UnbindInfo error) override {
+    on_fidl_error_callback_.Run(error);
+  }
+
+ private:
+  OnFidlErrorCallback on_fidl_error_callback_;
+};
+
+}  // namespace base
+
+#endif  // BASE_FUCHSIA_FIDL_EVENT_HANDLER_H_
diff --git a/base/fuchsia/fidl_event_handler_unittest.cc b/base/fuchsia/fidl_event_handler_unittest.cc
new file mode 100644
index 0000000..8f194da
--- /dev/null
+++ b/base/fuchsia/fidl_event_handler_unittest.cc
@@ -0,0 +1,212 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/fuchsia/fidl_event_handler.h"
+
+#include <fidl/base.testfidl/cpp/fidl.h>
+#include <fidl/fuchsia.logger/cpp/fidl.h>
+#include <lib/async/default.h>
+#include <lib/sys/cpp/component_context.h>
+
+#include "base/fuchsia/fuchsia_component_connect.h"
+#include "base/fuchsia/process_context.h"
+#include "base/fuchsia/scoped_service_binding.h"
+#include "base/fuchsia/test_component_context_for_process.h"
+#include "base/fuchsia/test_interface_natural_impl.h"
+#include "base/fuchsia/test_log_listener_safe.h"
+#include "base/task/thread_pool.h"
+#include "base/test/bind.h"
+#include "base/test/scoped_logging_settings.h"
+#include "base/test/task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+constexpr char kBaseUnittestsExec[] = "base_unittests__exec";
+
+}  // namespace
+
+namespace base {
+
+class FidlEventHandlerTest : public testing::Test {
+ public:
+  FidlEventHandlerTest() {
+    test_context_.AddService(
+        fidl::DiscoverableProtocolName<fuchsia_logger::Log>);
+    ListenFilteredByCurrentProcessId(listener_);
+    // Initialize logging in the `scoped_logging_settings_`.
+    CHECK(logging::InitLogging({.logging_dest = logging::LOG_DEFAULT}));
+  }
+  FidlEventHandlerTest(const FidlEventHandlerTest&) = delete;
+  FidlEventHandlerTest& operator=(const FidlEventHandlerTest&) = delete;
+  ~FidlEventHandlerTest() override = default;
+
+ protected:
+  test::SingleThreadTaskEnvironment task_environment_{
+      test::SingleThreadTaskEnvironment::MainThreadType::IO};
+  SimpleTestLogListener listener_;
+
+  // Ensure that logging is directed to the system debug log.
+  logging::ScopedLoggingSettings scoped_logging_settings_;
+  TestComponentContextForProcess test_context_;
+  TestInterfaceNaturalImpl test_service_;
+};
+
+TEST_F(FidlEventHandlerTest, FidlErrorEventLogger) {
+  FidlErrorEventLogger<base_testfidl::TestInterface> event_handler;
+
+  event_handler.on_fidl_error(fidl::UnbindInfo::PeerClosed(ZX_ERR_PEER_CLOSED));
+
+  constexpr char kLogMessage[] =
+      "base.testfidl.TestInterface was disconnected with ZX_ERR_PEER_CLOSED";
+  absl::optional<fuchsia_logger::LogMessage> logged_message =
+      listener_.RunUntilMessageReceived(kLogMessage);
+
+  ASSERT_TRUE(logged_message.has_value());
+  EXPECT_EQ(logged_message->severity(),
+            static_cast<int32_t>(fuchsia_logger::LogLevelFilter::kError));
+  ASSERT_EQ(logged_message->tags().size(), 1u);
+  EXPECT_EQ(logged_message->tags()[0], kBaseUnittestsExec);
+}
+
+TEST_F(FidlEventHandlerTest, FidlErrorEventLogger_CustomProtocolName) {
+  FidlErrorEventLogger<base_testfidl::TestInterface> event_handler(
+      "test_protocol_name");
+
+  event_handler.on_fidl_error(fidl::UnbindInfo::PeerClosed(ZX_ERR_PEER_CLOSED));
+
+  constexpr char kLogMessage[] =
+      "test_protocol_name was disconnected with ZX_ERR_PEER_CLOSED";
+  absl::optional<fuchsia_logger::LogMessage> logged_message =
+      listener_.RunUntilMessageReceived(kLogMessage);
+
+  ASSERT_TRUE(logged_message.has_value());
+  EXPECT_EQ(logged_message->severity(),
+            static_cast<int32_t>(fuchsia_logger::LogLevelFilter::kError));
+  ASSERT_EQ(logged_message->tags().size(), 1u);
+  EXPECT_EQ(logged_message->tags()[0], kBaseUnittestsExec);
+}
+
+TEST_F(FidlEventHandlerTest, FidlErrorEventLogger_LogsOnServiceClosure) {
+  FidlErrorEventLogger<base_testfidl::TestInterface> event_handler;
+  auto client_end = fuchsia_component::ConnectAt<base_testfidl::TestInterface>(
+      test_context_.published_services_natural());
+  EXPECT_TRUE(client_end.is_ok());
+  fidl::Client client(std::move(*client_end), async_get_default_dispatcher(),
+                      &event_handler);
+
+  {
+    ScopedNaturalServiceBinding<base_testfidl::TestInterface> binding(
+        ComponentContextForProcess()->outgoing().get(), &test_service_,
+        async_get_default_dispatcher());
+
+    ASSERT_EQ(ZX_OK, VerifyTestInterface(client));
+  };
+
+  constexpr char kLogMessage[] =
+      "base.testfidl.TestInterface was disconnected with ZX_ERR_PEER_CLOSED";
+  absl::optional<fuchsia_logger::LogMessage> logged_message =
+      listener_.RunUntilMessageReceived(kLogMessage);
+
+  ASSERT_TRUE(logged_message.has_value());
+  EXPECT_EQ(logged_message->severity(),
+            static_cast<int32_t>(fuchsia_logger::LogLevelFilter::kError));
+  ASSERT_EQ(logged_message->tags().size(), 1u);
+  EXPECT_EQ(logged_message->tags()[0], kBaseUnittestsExec);
+}
+
+TEST(FidlEventHandlerDeathTest, FidlErrorEventProcessExiter) {
+  FidlErrorEventProcessExiter<base_testfidl::TestInterface> event_handler;
+
+  EXPECT_DEATH(
+      event_handler.on_fidl_error(
+          fidl::UnbindInfo::PeerClosed(ZX_ERR_PEER_CLOSED)),
+      testing::HasSubstr("base.testfidl.TestInterface disconnected "
+                         "unexpectedly, exiting: ZX_ERR_PEER_CLOSED (-24)"));
+}
+
+TEST(FidlEventHandlerDeathTest,
+     FidlErrorEventProcessExiter_CustomProtocolName) {
+  FidlErrorEventProcessExiter<base_testfidl::TestInterface> event_handler(
+      "test_protocol_name");
+
+  EXPECT_DEATH(
+      event_handler.on_fidl_error(
+          fidl::UnbindInfo::PeerClosed(ZX_ERR_PEER_CLOSED)),
+      testing::HasSubstr("test_protocol_name disconnected unexpectedly, "
+                         "exiting: ZX_ERR_PEER_CLOSED (-24)"));
+}
+
+TEST(FidlEventHandlerDeathTest,
+     FidlErrorEventProcessExiter_LogsOnServiceClosure) {
+  test::SingleThreadTaskEnvironment task_environment_{
+      test::SingleThreadTaskEnvironment::MainThreadType::IO};
+  TestComponentContextForProcess test_context;
+  FidlErrorEventProcessExiter<base_testfidl::TestInterface> event_handler;
+  auto client_end = fuchsia_component::ConnectAt<base_testfidl::TestInterface>(
+      test_context.published_services_natural());
+  EXPECT_TRUE(client_end.is_ok());
+  fidl::Client client(std::move(*client_end), async_get_default_dispatcher(),
+                      &event_handler);
+
+  auto bind_and_close_service = [&]() {
+    {
+      TestInterfaceNaturalImpl test_service;
+      ScopedNaturalServiceBinding<base_testfidl::TestInterface> binding(
+          ComponentContextForProcess()->outgoing().get(), &test_service,
+          async_get_default_dispatcher());
+
+      ASSERT_EQ(ZX_OK, VerifyTestInterface(client));
+    }
+    base::RunLoop().RunUntilIdle();
+  };
+
+  EXPECT_DEATH(
+      bind_and_close_service(),
+      testing::HasSubstr("base.testfidl.TestInterface disconnected "
+                         "unexpectedly, exiting: ZX_ERR_PEER_CLOSED (-24)"));
+}
+
+TEST_F(FidlEventHandlerTest, FidlErrorEventHandler) {
+  RunLoop loop;
+  FidlErrorEventHandler<base_testfidl::TestInterface> event_handler(
+      base::BindLambdaForTesting(
+          [quit_closure = loop.QuitClosure()](fidl::UnbindInfo error) {
+            ASSERT_TRUE(error.is_peer_closed());
+            quit_closure.Run();
+          }));
+
+  event_handler.on_fidl_error(fidl::UnbindInfo::PeerClosed(ZX_ERR_PEER_CLOSED));
+
+  loop.Run();
+}
+
+TEST_F(FidlEventHandlerTest, FidlErrorEventHandler_FiresOnServiceClosure) {
+  RunLoop loop;
+  FidlErrorEventHandler<base_testfidl::TestInterface> event_handler(
+      base::BindLambdaForTesting(
+          [quit_closure = loop.QuitClosure()](fidl::UnbindInfo error) {
+            ASSERT_TRUE(error.is_peer_closed());
+            quit_closure.Run();
+          }));
+
+  auto client_end = fuchsia_component::ConnectAt<base_testfidl::TestInterface>(
+      test_context_.published_services_natural());
+  EXPECT_TRUE(client_end.is_ok());
+  fidl::Client client(std::move(*client_end), async_get_default_dispatcher(),
+                      &event_handler);
+
+  {
+    ScopedNaturalServiceBinding<base_testfidl::TestInterface> binding(
+        ComponentContextForProcess()->outgoing().get(), &test_service_,
+        async_get_default_dispatcher());
+
+    ASSERT_EQ(ZX_OK, VerifyTestInterface(client));
+  };
+
+  loop.Run();
+}
+
+}  // namespace base
diff --git a/base/fuchsia/fuchsia_logging.h b/base/fuchsia/fuchsia_logging.h
index a31c490..f449c9b 100644
--- a/base/fuchsia/fuchsia_logging.h
+++ b/base/fuchsia/fuchsia_logging.h
@@ -14,6 +14,7 @@
 #include <string>
 
 #include "base/base_export.h"
+#include "base/check.h"
 #include "base/logging.h"
 #include "base/strings/string_piece_forward.h"
 #include "base/strings/stringprintf.h"
diff --git a/base/fuchsia/fuchsia_logging_unittest.cc b/base/fuchsia/fuchsia_logging_unittest.cc
index d028c6f..d89daffb 100644
--- a/base/fuchsia/fuchsia_logging_unittest.cc
+++ b/base/fuchsia/fuchsia_logging_unittest.cc
@@ -14,7 +14,6 @@
 #include "base/fuchsia/fuchsia_logging.h"
 #include "base/fuchsia/test_log_listener_safe.h"
 #include "base/logging.h"
-#include "base/process/process.h"
 #include "base/test/scoped_logging_settings.h"
 #include "base/test/task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -29,23 +28,6 @@
   MOCK_METHOD0(Log, const char*());
 };
 
-// Configures `listener` to listen for messages from the current process.
-void ListenFilteredByPid(SimpleTestLogListener& listener) {
-  // Connect the test LogListenerSafe to the Log.
-  auto log_client_end = fuchsia_component::Connect<fuchsia_logger::Log>();
-  EXPECT_TRUE(log_client_end.is_ok())
-      << FidlConnectionErrorMessage(log_client_end);
-  fidl::Client log_client(std::move(log_client_end.value()),
-                          async_get_default_dispatcher());
-  listener.ListenToLog(
-      log_client,
-      std::make_unique<fuchsia_logger::LogFilterOptions>(
-          fuchsia_logger::LogFilterOptions{
-              {.filter_by_pid = true,
-               .pid = Process::Current().Pid(),
-               .min_severity = fuchsia_logger::LogLevelFilter::kInfo}}));
-}
-
 }  // namespace
 
 // Verifies that calling the log macro goes to the Fuchsia system logs, by
@@ -56,7 +38,7 @@
   test::SingleThreadTaskEnvironment task_environment_{
       test::SingleThreadTaskEnvironment::MainThreadType::IO};
   SimpleTestLogListener listener;
-  ListenFilteredByPid(listener);
+  ListenFilteredByCurrentProcessId(listener);
 
   // Ensure that logging is directed to the system debug log.
   logging::ScopedLoggingSettings scoped_logging_settings;
@@ -86,7 +68,7 @@
   test::SingleThreadTaskEnvironment task_environment_{
       test::SingleThreadTaskEnvironment::MainThreadType::IO};
   SimpleTestLogListener listener;
-  ListenFilteredByPid(listener);
+  ListenFilteredByCurrentProcessId(listener);
 
   // Connect the test LogListenerSafe to the Log.
   auto log_sink_client_end =
diff --git a/base/fuchsia/test_log_listener_safe.cc b/base/fuchsia/test_log_listener_safe.cc
index 11cde7028..b51bcea 100644
--- a/base/fuchsia/test_log_listener_safe.cc
+++ b/base/fuchsia/test_log_listener_safe.cc
@@ -8,8 +8,10 @@
 #include <lib/fidl/cpp/box.h>
 #include <lib/zx/clock.h>
 
+#include "base/fuchsia/fuchsia_component_connect.h"
 #include "base/fuchsia/fuchsia_logging.h"
 #include "base/functional/callback_helpers.h"
+#include "base/process/process.h"
 #include "base/run_loop.h"
 #include "base/strings/string_piece.h"
 #include "base/test/bind.h"
@@ -125,4 +127,20 @@
   }
 }
 
+void ListenFilteredByCurrentProcessId(SimpleTestLogListener& listener) {
+  // Connect the test LogListenerSafe to the Log.
+  auto log_client_end = fuchsia_component::Connect<fuchsia_logger::Log>();
+  ASSERT_TRUE(log_client_end.is_ok())
+      << FidlConnectionErrorMessage(log_client_end);
+  fidl::Client log_client(std::move(log_client_end.value()),
+                          async_get_default_dispatcher());
+  listener.ListenToLog(
+      log_client,
+      std::make_unique<fuchsia_logger::LogFilterOptions>(
+          fuchsia_logger::LogFilterOptions{
+              {.filter_by_pid = true,
+               .pid = Process::Current().Pid(),
+               .min_severity = fuchsia_logger::LogLevelFilter::kInfo}}));
+}
+
 }  // namespace base
diff --git a/base/fuchsia/test_log_listener_safe.h b/base/fuchsia/test_log_listener_safe.h
index f3de736..8364dd7 100644
--- a/base/fuchsia/test_log_listener_safe.h
+++ b/base/fuchsia/test_log_listener_safe.h
@@ -7,8 +7,10 @@
 
 #include <fidl/fuchsia.logger/cpp/fidl.h>
 
+#include <lib/async/default.h>
 #include <lib/fidl/cpp/binding.h>
 #include <lib/zx/time.h>
+
 #include <memory>
 #include <string>
 #include <vector>
@@ -87,6 +89,9 @@
   TestLogListenerSafe::OnLogMessageCallback on_log_message_;
 };
 
+// Configures `listener` to listen for messages from the current process.
+void ListenFilteredByCurrentProcessId(SimpleTestLogListener& listener);
+
 }  // namespace base
 
 #endif  // BASE_FUCHSIA_TEST_LOG_LISTENER_SAFE_H_
diff --git a/base/memory/madv_free_discardable_memory_posix.cc b/base/memory/madv_free_discardable_memory_posix.cc
index ffb6676d..a19747e0 100644
--- a/base/memory/madv_free_discardable_memory_posix.cc
+++ b/base/memory/madv_free_discardable_memory_posix.cc
@@ -323,8 +323,7 @@
     ASAN_UNPOISON_MEMORY_REGION(data_, allocated_pages_ * base::GetPageSize());
 #endif  // defined(ADDRESS_SANITIZER)
 
-    int retval = munmap(data_.ExtractAsDangling(),
-                        allocated_pages_ * base::GetPageSize());
+    int retval = munmap(data_, allocated_pages_ * base::GetPageSize());
     PCHECK(!retval);
     data_ = nullptr;
     (*allocator_byte_count_) -= size_in_bytes_;
diff --git a/base/memory/madv_free_discardable_memory_posix.h b/base/memory/madv_free_discardable_memory_posix.h
index bdee8b8..70ef71cc 100644
--- a/base/memory/madv_free_discardable_memory_posix.h
+++ b/base/memory/madv_free_discardable_memory_posix.h
@@ -112,7 +112,8 @@
   // destruction.
   raw_ptr<std::atomic<size_t>> allocator_byte_count_;
 
-  raw_ptr<void> data_;
+  // Data comes from mmap() and we manage its poisioning.
+  RAW_PTR_EXCLUSION void* data_;
   bool is_locked_ = true;
 
   // If true, MADV_FREE will not be set on Unlock().
diff --git a/base/message_loop/message_pump_kqueue.cc b/base/message_loop/message_pump_kqueue.cc
index ebe0db7..2d257326d 100644
--- a/base/message_loop/message_pump_kqueue.cc
+++ b/base/message_loop/message_pump_kqueue.cc
@@ -14,6 +14,7 @@
 #include "base/mac/mac_util.h"
 #include "base/mac/mach_logging.h"
 #include "base/mac/scoped_nsautorelease_pool.h"
+#include "base/notreached.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/time/time_override.h"
 
diff --git a/base/metrics/histogram_base.cc b/base/metrics/histogram_base.cc
index 31930d4..3ec332af 100644
--- a/base/metrics/histogram_base.cc
+++ b/base/metrics/histogram_base.cc
@@ -103,6 +103,12 @@
   flags_.fetch_and(~flags, std::memory_order_relaxed);
 }
 
+bool HistogramBase::HasFlags(int32_t flags) const {
+  // Check this->flags() is a superset of |flags|, i.e. every flag in |flags| is
+  // included.
+  return (this->flags() & flags) == flags;
+}
+
 void HistogramBase::AddScaled(Sample value, int count, int scale) {
   DCHECK_GT(scale, 0);
 
@@ -181,8 +187,9 @@
 
   // We check the flag first since it is very cheap and we can avoid the
   // function call and lock overhead of FindAndRunHistogramCallbacks().
-  if ((flags() & kCallbackExists) == 0)
+  if (!HasFlags(kCallbackExists)) {
     return;
+  }
 
   StatisticsRecorder::FindAndRunHistogramCallbacks(
       base::PassKey<HistogramBase>(), histogram_name(), name_hash(), sample);
diff --git a/base/metrics/histogram_base.h b/base/metrics/histogram_base.h
index f912526..9663846 100644
--- a/base/metrics/histogram_base.h
+++ b/base/metrics/histogram_base.h
@@ -166,6 +166,7 @@
   int32_t flags() const { return flags_.load(std::memory_order_relaxed); }
   void SetFlags(int32_t flags);
   void ClearFlags(int32_t flags);
+  bool HasFlags(int32_t flags) const;
 
   virtual HistogramType GetHistogramType() const = 0;
 
diff --git a/base/metrics/histogram_delta_serialization.cc b/base/metrics/histogram_delta_serialization.cc
index def2196d..c7512104 100644
--- a/base/metrics/histogram_delta_serialization.cc
+++ b/base/metrics/histogram_delta_serialization.cc
@@ -23,7 +23,7 @@
   if (!histogram)
     return;
 
-  if (histogram->flags() & HistogramBase::kIPCSerializationSourceFlag) {
+  if (histogram->HasFlags(HistogramBase::kIPCSerializationSourceFlag)) {
     DVLOG(1) << "Single process mode, histogram observed and not copied: "
              << histogram->histogram_name();
     return;
diff --git a/base/metrics/histogram_samples.cc b/base/metrics/histogram_samples.cc
index 81dc94a..cc8f9ee 100644
--- a/base/metrics/histogram_samples.cc
+++ b/base/metrics/histogram_samples.cc
@@ -399,12 +399,9 @@
                                int64_t* max,
                                HistogramBase::Count* count) {
   DCHECK(!Done());
-  if (min != nullptr)
-    *min = min_;
-  if (max != nullptr)
-    *max = max_;
-  if (count != nullptr)
-    *count = count_;
+  *min = min_;
+  *max = max_;
+  *count = count_;
 }
 
 bool SingleSampleIterator::GetBucketIndex(size_t* index) const {
diff --git a/base/metrics/histogram_samples.h b/base/metrics/histogram_samples.h
index 6475d91..28e669e 100644
--- a/base/metrics/histogram_samples.h
+++ b/base/metrics/histogram_samples.h
@@ -250,7 +250,6 @@
   virtual void Next() = 0;
 
   // Get the sample and count at current position.
-  // |min| |max| and |count| can be NULL if the value is not of interest.
   // Note: |max| is int64_t because histograms support logged values in the
   // full int32_t range and bucket max is exclusive, so it needs to support
   // values up to MAXINT32+1.
diff --git a/base/metrics/histogram_snapshot_manager.cc b/base/metrics/histogram_snapshot_manager.cc
index ed256c5..40e9c78 100644
--- a/base/metrics/histogram_snapshot_manager.cc
+++ b/base/metrics/histogram_snapshot_manager.cc
@@ -28,8 +28,9 @@
     HistogramBase::Flags required_flags) {
   for (HistogramBase* const histogram : histograms) {
     histogram->SetFlags(flags_to_set);
-    if ((histogram->flags() & required_flags) == required_flags)
+    if (histogram->HasFlags(required_flags)) {
       PrepareDelta(histogram);
+    }
   }
 }
 
@@ -39,7 +40,7 @@
   DCHECK(!unlogged_samples_snapshot_taken_);
   unlogged_samples_snapshot_taken_ = true;
   for (HistogramBase* const histogram : histograms) {
-    if ((histogram->flags() & required_flags) == required_flags) {
+    if (histogram->HasFlags(required_flags)) {
       const HistogramSnapshotPair& histogram_snapshot_pair =
           histograms_and_snapshots_.emplace_back(
               histogram, histogram->SnapshotUnloggedSamples());
diff --git a/base/metrics/persistent_histogram_allocator.cc b/base/metrics/persistent_histogram_allocator.cc
index e0528e3..c0e4bc4 100644
--- a/base/metrics/persistent_histogram_allocator.cc
+++ b/base/metrics/persistent_histogram_allocator.cc
@@ -658,7 +658,7 @@
     return nullptr;
 
   // Make sure there is no "serialization" flag set.
-  DCHECK_EQ(0, existing->flags() & HistogramBase::kIPCSerializationSourceFlag);
+  DCHECK(!existing->HasFlags(HistogramBase::kIPCSerializationSourceFlag));
   // Record the newly created histogram in the SR.
   return StatisticsRecorder::RegisterOrDeleteDuplicate(existing);
 }
diff --git a/base/metrics/persistent_sample_map.cc b/base/metrics/persistent_sample_map.cc
index 47dc3e0..012007d 100644
--- a/base/metrics/persistent_sample_map.cc
+++ b/base/metrics/persistent_sample_map.cc
@@ -64,12 +64,9 @@
 
 void PersistentSampleMapIterator::Get(Sample* min, int64_t* max, Count* count) {
   DCHECK(!Done());
-  if (min)
-    *min = iter_->first;
-  if (max)
-    *max = strict_cast<int64_t>(iter_->first) + 1;
-  if (count)
-    *count = *iter_->second;
+  *min = iter_->first;
+  *max = strict_cast<int64_t>(iter_->first) + 1;
+  *count = *iter_->second;
 }
 
 void PersistentSampleMapIterator::SkipEmptyBuckets() {
diff --git a/base/metrics/sample_map.cc b/base/metrics/sample_map.cc
index 62d90a03..49201c5 100644
--- a/base/metrics/sample_map.cc
+++ b/base/metrics/sample_map.cc
@@ -59,12 +59,9 @@
 
 void SampleMapIterator::Get(Sample* min, int64_t* max, Count* count) {
   DCHECK(!Done());
-  if (min)
-    *min = iter_->first;
-  if (max)
-    *max = strict_cast<int64_t>(iter_->first) + 1;
-  if (count)
-    *count = iter_->second;
+  *min = iter_->first;
+  *max = strict_cast<int64_t>(iter_->first) + 1;
+  *count = iter_->second;
 }
 
 void SampleMapIterator::SkipEmptyBuckets() {
diff --git a/base/metrics/sample_vector.cc b/base/metrics/sample_vector.cc
index 69dcc11..47177e0 100644
--- a/base/metrics/sample_vector.cc
+++ b/base/metrics/sample_vector.cc
@@ -523,12 +523,9 @@
                                int64_t* max,
                                HistogramBase::Count* count) {
   DCHECK(!Done());
-  if (min != nullptr)
-    *min = bucket_ranges_->range(index_);
-  if (max != nullptr)
-    *max = strict_cast<int64_t>(bucket_ranges_->range(index_ + 1));
-  if (count != nullptr)
-    *count = subtle::NoBarrier_Load(&counts_[index_]);
+  *min = bucket_ranges_->range(index_);
+  *max = strict_cast<int64_t>(bucket_ranges_->range(index_ + 1));
+  *count = subtle::NoBarrier_Load(&counts_[index_]);
 }
 
 bool SampleVectorIterator::GetBucketIndex(size_t* index) const {
diff --git a/base/metrics/statistics_recorder.cc b/base/metrics/statistics_recorder.cc
index d8c5e49b..002c1dc9 100644
--- a/base/metrics/statistics_recorder.cc
+++ b/base/metrics/statistics_recorder.cc
@@ -414,8 +414,7 @@
 
   out.reserve(top_->histograms_.size());
   for (const auto& entry : top_->histograms_) {
-    bool is_persistent =
-        (entry.second->flags() & HistogramBase::kIsPersistent) != 0;
+    bool is_persistent = entry.second->HasFlags(HistogramBase::kIsPersistent);
     if (!include_persistent && is_persistent)
       continue;
     out.push_back(entry.second);
diff --git a/base/metrics/statistics_recorder_unittest.cc b/base/metrics/statistics_recorder_unittest.cc
index 93810acb..d2bbc97 100644
--- a/base/metrics/statistics_recorder_unittest.cc
+++ b/base/metrics/statistics_recorder_unittest.cc
@@ -461,8 +461,7 @@
   EXPECT_EQ(StatisticsRecorder::RegisterOrDeleteDuplicate(histogram),
             histogram);
 
-  EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists,
-            base::HistogramBase::kCallbackExists);
+  EXPECT_TRUE(histogram->HasFlags(base::HistogramBase::kCallbackExists));
   EXPECT_TRUE(base::StatisticsRecorder::have_active_callbacks());
 }
 
@@ -497,7 +496,7 @@
   EXPECT_EQ(StatisticsRecorder::RegisterOrDeleteDuplicate(histogram),
             histogram);
 
-  EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, 0);
+  EXPECT_FALSE(histogram->HasFlags(base::HistogramBase::kCallbackExists));
   EXPECT_FALSE(base::StatisticsRecorder::have_active_callbacks());
 }
 
@@ -517,8 +516,7 @@
           base::BindRepeating(&CallbackCheckWrapper::OnHistogramChanged,
                               base::Unretained(&callback_wrapper1)));
 
-  EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists,
-            base::HistogramBase::kCallbackExists);
+  EXPECT_TRUE(histogram->HasFlags(base::HistogramBase::kCallbackExists));
   EXPECT_TRUE(base::StatisticsRecorder::have_active_callbacks());
 
   auto callback2 =
@@ -527,8 +525,7 @@
           base::BindRepeating(&CallbackCheckWrapper::OnHistogramChanged,
                               base::Unretained(&callback_wrapper2)));
 
-  EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists,
-            base::HistogramBase::kCallbackExists);
+  EXPECT_TRUE(histogram->HasFlags(base::HistogramBase::kCallbackExists));
   EXPECT_TRUE(base::StatisticsRecorder::have_active_callbacks());
 
   histogram->Add(1);
@@ -560,12 +557,11 @@
                               base::Unretained(&callback_wrapper2)));
 
   callback1.reset();
-  EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists,
-            base::HistogramBase::kCallbackExists);
+  EXPECT_TRUE(histogram->HasFlags(base::HistogramBase::kCallbackExists));
   EXPECT_TRUE(base::StatisticsRecorder::have_active_callbacks());
 
   callback2.reset();
-  EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, 0);
+  EXPECT_FALSE(histogram->HasFlags(base::HistogramBase::kCallbackExists));
   EXPECT_FALSE(base::StatisticsRecorder::have_active_callbacks());
 
   histogram->Add(1);
diff --git a/base/test/android/junit/src/org/chromium/base/task/test/ShadowPostTask.java b/base/test/android/junit/src/org/chromium/base/task/test/ShadowPostTask.java
index 484d531..56043bea 100644
--- a/base/test/android/junit/src/org/chromium/base/task/test/ShadowPostTask.java
+++ b/base/test/android/junit/src/org/chromium/base/task/test/ShadowPostTask.java
@@ -30,13 +30,13 @@
     }
 
     @Implementation
-    public static void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+    public static void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
         sTestImpl.postDelayedTask(taskTraits, task, delay);
     }
 
     /** Default implementation for tests. Override methods or add new ones as necessary. */
     public static class TestImpl {
-        public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+        public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
             Robolectric.getForegroundThreadScheduler().postDelayed(task, delay);
         }
     }
diff --git a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
index cfd51603..2d63c583 100644
--- a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
+++ b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
@@ -70,6 +70,7 @@
                     ContextUtils.clearApplicationContextForTests();
                     PathUtils.resetForTesting();
                     ThreadUtils.setThreadAssertsDisabledForTesting(false);
+                    ThreadUtils.clearUiThreadForTesting();
                     super.afterTest(method);
                 }
             }
diff --git a/base/test/metrics/histogram_tester.cc b/base/test/metrics/histogram_tester.cc
index a876dcf..186e352 100644
--- a/base/test/metrics/histogram_tester.cc
+++ b/base/test/metrics/histogram_tester.cc
@@ -142,9 +142,10 @@
   if (snapshot) {
     for (auto it = snapshot->Iterator(); !it->Done(); it->Next()) {
       HistogramBase::Sample sample;
+      int64_t max;
       HistogramBase::Count count;
-      it->Get(&sample, nullptr, &count);
-      samples.push_back(Bucket(sample, count));
+      it->Get(&sample, &max, &count);
+      samples.emplace_back(sample, count);
     }
   }
   return samples;
diff --git a/build/android/gyp/apkbuilder.py b/build/android/gyp/apkbuilder.py
index 1ab3385..4e1b373 100755
--- a/build/android/gyp/apkbuilder.py
+++ b/build/android/gyp/apkbuilder.py
@@ -35,7 +35,6 @@
   parser = argparse.ArgumentParser()
   build_utils.AddDepfileOption(parser)
   parser.add_argument('--assets',
-                      action='append',
                       help='GYP-list of files to add as assets in the form '
                       '"srcPath:zipPath", where ":zipPath" is optional.')
   parser.add_argument(
diff --git a/build/android/gyp/binary_baseline_profile.py b/build/android/gyp/binary_baseline_profile.py
deleted file mode 100755
index 4aa530c..0000000
--- a/build/android/gyp/binary_baseline_profile.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env python3
-# Copyright 2023 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Creates a binary profile from an HRF + dex + mapping."""
-
-import argparse
-import sys
-
-from util import build_utils
-
-
-def main(args):
-  parser = argparse.ArgumentParser(description=__doc__)
-  build_utils.AddDepfileOption(parser)
-  parser.add_argument('--output-profile',
-                      required=True,
-                      help='Path to output binary profile.')
-  parser.add_argument('--output-metadata',
-                      required=True,
-                      help='Path to output binary profile metadata.')
-  parser.add_argument('--profgen',
-                      required=True,
-                      help='Path to profgen binary.')
-  parser.add_argument('--dex',
-                      required=True,
-                      help='Path to a zip containing release dex files.')
-  parser.add_argument('--proguard-mapping',
-                      required=True,
-                      help='Path to proguard mapping for release dex.')
-  parser.add_argument('--input-profile-path',
-                      required=True,
-                      help='Path to HRF baseline profile to apply.')
-  options = parser.parse_args(build_utils.ExpandFileArgs(args))
-
-  cmd = [
-      options.profgen,
-      'bin',
-      options.input_profile_path,
-      '-o',
-      options.output_profile,
-      '-om',
-      options.output_metadata,
-      '-a',
-      options.dex,
-      '-m',
-      options.proguard_mapping,
-  ]
-  build_utils.CheckOutput(cmd, env={'JAVA_HOME': build_utils.JAVA_HOME})
-  build_utils.WriteDepfile(options.depfile,
-                           options.output_profile,
-                           inputs=[options.dex])
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/build/android/gyp/binary_baseline_profile.pydeps b/build/android/gyp/binary_baseline_profile.pydeps
deleted file mode 100644
index 40d4b1c..0000000
--- a/build/android/gyp/binary_baseline_profile.pydeps
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by running:
-#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/binary_baseline_profile.pydeps build/android/gyp/binary_baseline_profile.py
-../../gn_helpers.py
-binary_baseline_profile.py
-util/__init__.py
-util/build_utils.py
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index 8013a5a..b60b6fb 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -246,10 +246,6 @@
     # resources.arsc.
     enable_unused_resource_stripping = true
 
-    # Controls whether |baseline_profile_path| is respected. Useful to disable
-    # baseline profiles on some bots.
-    enable_baseline_profiles = true
-
     # The target to use as the system WebView implementation.
     if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
       system_webview_apk_target = "//android_webview:system_webview_64_apk"
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 4520835..4643970 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -2632,43 +2632,6 @@
     }
   }
 
-  template("create_binary_profile") {
-    action_with_pydeps(target_name) {
-      forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
-      forward_variables_from(invoker, [ "deps" ])
-      script = "//build/android/gyp/binary_baseline_profile.py"
-      depfile = "$target_gen_dir/$target_name.d"
-      outputs = [
-        invoker.binary_baseline_profile_path,
-        invoker.binary_baseline_profile_metadata_path,
-      ]
-      _profgen_path = "$android_sdk_root/cmdline-tools/latest/bin/profgen"
-      _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)
-      inputs = [
-        invoker.build_config,
-        invoker.proguard_mapping_path,
-        invoker.input_profile_path,
-        _profgen_path,
-      ]
-      args = [
-        "--profgen",
-        rebase_path(_profgen_path, root_build_dir),
-        "--output-profile",
-        rebase_path(invoker.binary_baseline_profile_path, root_build_dir),
-        "--output-metadata",
-        rebase_path(invoker.binary_baseline_profile_metadata_path,
-                    root_build_dir),
-        "--dex=@FileArg($_rebased_build_config:final_dex:path)",
-        "--proguard-mapping",
-        rebase_path(invoker.proguard_mapping_path, root_build_dir),
-        "--input-profile-path",
-        rebase_path(invoker.input_profile_path, root_build_dir),
-        "--depfile",
-        rebase_path(depfile, root_build_dir),
-      ]
-    }
-  }
-
   # Creates a signed and aligned .apk.
   #
   # Variables
@@ -2742,9 +2705,6 @@
         _args += [ "--java-resources=@FileArg($_rebased_build_config:java_resources_jars)" ]
       }
     }
-    if (defined(invoker.extra_assets)) {
-      _args += [ "--assets=${invoker.extra_assets}" ]
-    }
     if (!_is_robolectric_apk) {
       _apksigner = "$android_sdk_build_tools/lib/apksigner.jar"
       _zipalign = "$android_sdk_build_tools/zipalign"
@@ -4338,9 +4298,6 @@
   if (defined(invoker.uncompress_dex) && invoker.uncompress_dex) {
     _args += [ "--uncompress-dex" ]
   }
-  if (defined(invoker.extra_assets)) {
-    _args += [ "--assets=${invoker.extra_assets}" ]
-  }
 
   # Use either provided dex path or build config path based on type of module.
   if (defined(invoker.dex_path)) {
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index e195975..f044ea6f 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -3210,34 +3210,6 @@
       }
 
       _final_dex_target_dep = ":$_final_dex_target_name"
-
-      _use_baseline_profile =
-          _proguard_enabled && defined(invoker.baseline_profile_path) &&
-          enable_baseline_profiles
-      if (_use_baseline_profile) {
-        _binary_profile_target = "${_template_name}__binary_baseline_profile"
-        _binary_baseline_profile_path =
-            "$target_out_dir/$_template_name.baseline.prof"
-        _binary_baseline_profile_metadata_path =
-            _binary_baseline_profile_path + "m"
-        create_binary_profile(_binary_profile_target) {
-          forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
-          binary_baseline_profile_path = _binary_baseline_profile_path
-          binary_baseline_profile_metadata_path =
-              _binary_baseline_profile_metadata_path
-          proguard_mapping_path = _proguard_mapping_path
-          build_config = _build_config
-          input_profile_path = invoker.baseline_profile_path
-          deps = [
-            ":$_build_config_target",
-            _final_dex_target_dep,
-          ]
-        }
-      }
-    }
-
-    if (!defined(_use_baseline_profile) || !_use_baseline_profile) {
-      not_needed(invoker, [ "baseline_profile_path" ])
     }
 
     _all_native_libs_deps = _native_libs_deps + _secondary_abi_native_libs_deps
@@ -3349,16 +3321,6 @@
           if (defined(_final_dex_path)) {
             dex_path = _final_dex_path
             deps += [ _final_dex_target_dep ]
-            if (_use_baseline_profile) {
-              # extra_assets is a list of ["{src_path}:{dst_path}"]
-              extra_assets = [
-                rebase_path(_binary_baseline_profile_path, root_build_dir) +
-                    ":dexopt/baseline.prof",
-                rebase_path(_binary_baseline_profile_metadata_path,
-                            root_build_dir) + ":dexopt/baseline.profm",
-              ]
-              deps += [ ":$_binary_profile_target" ]
-            }
           }
 
           output_apk_path = _final_apk_path
@@ -3582,7 +3544,6 @@
             "apk_under_test",
             "app_as_shared_lib",
             "assert_no_deps",
-            "baseline_profile_path",
             "build_config_include_product_version_resource",
             "bundles_supported",
             "chromium_code",
@@ -5117,9 +5078,9 @@
       _module_target = _module.module_target
       _module_build_config = _module.build_config
       _module_build_config_target = _module.build_config_target
-      _module_target_name = get_label_info(_module_target, "name")
 
       if (!_proguard_enabled) {
+        _module_target_name = get_label_info(_module_target, "name")
         _dex_target = "${_module_target_name}__final_dex"
         _dex_path = "$target_out_dir/$_module_target_name/$_module_target_name.mergeddex.jar"
         dex(_dex_target) {
@@ -5140,32 +5101,6 @@
       }
       _dex_target_for_module = ":$_dex_target"
 
-      _use_baseline_profile =
-          _proguard_enabled && defined(invoker.baseline_profile_path) &&
-          enable_baseline_profiles
-      if (_use_baseline_profile) {
-        _binary_profile_target =
-            "${_module_target_name}__binary_baseline_profile"
-        _binary_baseline_profile_path = "$target_out_dir/$_module_target_name/$_module_target_name.baseline.prof"
-        _binary_baseline_profile_metadata_path =
-            _binary_baseline_profile_path + "m"
-        create_binary_profile(_binary_profile_target) {
-          forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
-          binary_baseline_profile_path = _binary_baseline_profile_path
-          binary_baseline_profile_metadata_path =
-              _binary_baseline_profile_metadata_path
-          proguard_mapping_path = _proguard_mapping_path
-          build_config = _module_build_config
-          input_profile_path = invoker.baseline_profile_path
-          deps = [
-            _dex_target_for_module,
-            _module_build_config_target,
-          ]
-        }
-      } else {
-        not_needed(invoker, [ "baseline_profile_path" ])
-      }
-
       # Generate one module .zip file per bundle module.
       #
       # Important: the bundle tool uses the module's zip filename as
@@ -5217,17 +5152,6 @@
               _secondary_abi_native_libraries_config
           deps += [ ":$_secondary_abi_native_libraries_config_target" ]
         }
-
-        if (_use_baseline_profile) {
-          # extra_assets is a list of ["{src_path}:{dst_path}"]
-          extra_assets = [
-            rebase_path(_binary_baseline_profile_path, root_build_dir) +
-                ":dexopt/baseline.prof",
-            rebase_path(_binary_baseline_profile_metadata_path,
-                        root_build_dir) + ":dexopt/baseline.profm",
-          ]
-          deps += [ ":$_binary_profile_target" ]
-        }
       }
 
       _all_create_module_targets += [
diff --git a/build/config/fuchsia/build_cmx_from_fragment.py b/build/config/fuchsia/build_cmx_from_fragment.py
deleted file mode 100644
index 4f9afad..0000000
--- a/build/config/fuchsia/build_cmx_from_fragment.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2020 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Creates a complete CMX (v1) component manifest, from a program name and
-   manifest fragment file."""
-
-import argparse
-import json
-import sys
-
-
-def BuildCmxFromFragment(output_file, fragment_file, program_binary):
-  """Reads a CMX fragment specifying e.g. features & sandbox, and a program
-     binary's filename, and writes out the full CMX.
-
-     output_file: Build-relative filename at which to write the full CMX.
-     fragment_file: Build-relative filename of the CMX fragment to read from.
-     program_binary: Package-relative filename of the program binary.
-  """
-
-  with open(output_file, 'w') as component_manifest_file:
-    component_manifest = json.load(open(fragment_file, 'r'))
-    component_manifest.update({
-        'program': {
-            'binary': program_binary
-        },
-    })
-    json.dump(component_manifest, component_manifest_file)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--cmx-fragment',
-                      required=True,
-                      help='Path to the CMX fragment to read from')
-  parser.add_argument('--cmx',
-                      required=True,
-                      help='Path to write the complete CMX file to')
-  parser.add_argument('--program',
-                      required=True,
-                      help='Package-relative path to the program binary')
-  args = parser.parse_args()
-
-  return BuildCmxFromFragment(args.cmx, args.cmx_fragment, args.program)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/build/config/fuchsia/test/context_provider.shard.test-cml b/build/config/fuchsia/test/context_provider.shard.test-cml
index ddd96e2..a8afd69e 100644
--- a/build/config/fuchsia/test/context_provider.shard.test-cml
+++ b/build/config/fuchsia/test/context_provider.shard.test-cml
@@ -22,7 +22,6 @@
             protocol: [
                 "fuchsia.feedback.ComponentDataRegister",
                 "fuchsia.feedback.CrashReportingProductRegister",
-                "fuchsia.sys.Environment",
                 "fuchsia.sys.Loader",
             ],
             from: "parent",
diff --git a/build/config/fuchsia/test/system_test_minimum.shard.test-cml b/build/config/fuchsia/test/system_test_minimum.shard.test-cml
index 7c77bf3a..cd4b682 100644
--- a/build/config/fuchsia/test/system_test_minimum.shard.test-cml
+++ b/build/config/fuchsia/test/system_test_minimum.shard.test-cml
@@ -30,8 +30,8 @@
     {
       protocol: [
         "fuchsia.buildinfo.Provider",
-        "fuchsia.intl.PropertyProvider",
         "fuchsia.hwinfo.Product",
+        "fuchsia.intl.PropertyProvider",
         "fuchsia.media.ProfileProvider",
         "fuchsia.process.Launcher",
         "fuchsia.sys.Loader",
diff --git a/build/fuchsia/binary_size_differ.py b/build/fuchsia/binary_size_differ.py
index defa231..190a173 100755
--- a/build/fuchsia/binary_size_differ.py
+++ b/build/fuchsia/binary_size_differ.py
@@ -60,6 +60,8 @@
                    ' {} bytes).<br>').format(
                        package_name, growth['compressed'][package_name],
                        growth['uncompressed'][package_name]))
+      summary += ('Note that this bot compares growth against trunk, and is '
+                  'not aware of CL chaining.<br>')
 
   # Allow rollers to pass even with size increases. See crbug.com/1355914.
   if author and '-autoroll' in author and status_code == SIZE_FAILURE:
diff --git a/build/private_code_test/private_code_test.py b/build/private_code_test/private_code_test.py
index 5991ea5..5d8f0b4 100755
--- a/build/private_code_test/private_code_test.py
+++ b/build/private_code_test/private_code_test.py
@@ -82,9 +82,6 @@
   parser.add_argument('--expect-failure',
                       action='store_true',
                       help='Invert exit code.')
-  parser.add_argument('--use-persistent-shell',
-                      action='store_true',
-                      help='Unused')
   args = parser.parse_args()
 
   private_paths = pathlib.Path(args.private_paths_file).read_text().splitlines()
diff --git a/build/rust/clanglibs/BUILD.gn b/build/rust/clanglibs/BUILD.gn
index a80b29c..79b6aaa 100644
--- a/build/rust/clanglibs/BUILD.gn
+++ b/build/rust/clanglibs/BUILD.gn
@@ -9,7 +9,7 @@
 
 import("//build/rust/rust_static_library.gni")
 
-_clang_libs_dir = "//third_party/llvm-build/Release+Asserts/lib"
+_clang_libs_dir = "//third_party/rust-toolchain/lib/llvmlib/lib"
 
 if (toolchain_has_rust) {
   # This requires you to configure your .gclient file with
diff --git a/build/rust/rust_target.gni b/build/rust/rust_target.gni
index 0ca9be0..5561d0d7 100644
--- a/build/rust/rust_target.gni
+++ b/build/rust/rust_target.gni
@@ -118,6 +118,7 @@
                              "//build/rust:edition_",
                              _edition,
                            ]) ]
+  _test_configs = []
   if (invoker.target_type == "executable") {
     if (defined(invoker.executable_configs)) {
       _configs += invoker.executable_configs
@@ -125,6 +126,7 @@
   } else if (invoker.target_type == "rust_proc_macro") {
     if (defined(invoker.proc_macro_configs)) {
       _configs += invoker.proc_macro_configs
+      _test_configs += [ "//build/rust:proc_macro_extern" ]
     }
   } else {
     if (defined(invoker.library_configs)) {
@@ -385,7 +387,10 @@
         if (defined(invoker.executable_configs)) {
           configs = []
           configs = invoker.executable_configs
+        } else if (!defined(configs)) {
+          configs = []
         }
+        configs += _test_configs
         rustenv = _rustenv
 
         if (!_allow_unsafe) {
@@ -397,6 +402,7 @@
                    "_crate_root",
                    "_crate_name",
                    "_metadata",
+                   "_test_configs",
                  ])
     }
   }
diff --git a/build/rust/std/gnrt_config.toml b/build/rust/std/gnrt_config.toml
index 40fb850..94f0d26 100644
--- a/build/rust/std/gnrt_config.toml
+++ b/build/rust/std/gnrt_config.toml
@@ -2,7 +2,15 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-[libc]
+# Provides per-crate and overall configuration options to gnrt.
+
+[all]
+# force-unstable-if-unmarked prevents normal crates from inadvertently using
+# symbols from std-internal dependencies in the sysroot. This is normally passed
+# during an x.py build, but we have to do it manually.
+rustflags = ['-Zforce-unstable-if-unmarked']
+
+[crate.libc]
 # Requires:
 # * cfg(libc_align) for new enough rustc, which is normally provided by build.rs
 #   but we don't run build scripts for std crates.
@@ -12,7 +20,7 @@
 # See https://github.com/rust-lang/libc/blob/master/build.rs
 cfg = ['libc_align', 'libc_priv_mod_use', 'libc_core_cvoid']
 
-[std]
+[crate.std]
 # Requires:
 # * cfg(backtrace_in_libstd) because it directly includes .rs files from the
 #   backtrace code rather than including it as a dependency. backtrace's
@@ -25,7 +33,7 @@
 cfg = ['backtrace_in_libstd']
 env = ['STD_ENV_ARCH=$rust_target_arch']
 
-[test]
+[crate.test]
 # Requires:
 # * CFG_DISABLE_UNSTABLE_FEATURES=0 to match how it's built by x.py.
 env = ['CFG_DISABLE_UNSTABLE_FEATURES=0']
diff --git a/build/rust/std/rules/BUILD.gn b/build/rust/std/rules/BUILD.gn
index 8ac1b7de..3f9f0c56a 100644
--- a/build/rust/std/rules/BUILD.gn
+++ b/build/rust/std/rules/BUILD.gn
@@ -37,6 +37,7 @@
     "core",
     "rustc-dep-of-std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("adler") {
   crate_type = "rlib"
@@ -68,6 +69,7 @@
     "core",
     "rustc-dep-of-std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("alloc") {
   crate_type = "rlib"
@@ -89,6 +91,7 @@
     ":compiler_builtins",
     ":core",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("cc") {
   crate_type = "rlib"
@@ -102,11 +105,12 @@
   cargo_pkg_version = "1.0.78"
   cargo_pkg_authors = "Alex Crichton <alex@alexcrichton.com>"
   cargo_pkg_name = "cc"
-  cargo_pkg_description = "A build-time dependency for Cargo build scripts to assist in invoking the nativeC compiler to compile native C code into a static archive to be linked into Rustcode."
+  cargo_pkg_description = "A build-time dependency for Cargo build scripts to assist in invoking the native C compiler to compile native C code into a static archive to be linked into Rust code."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("cfg_if") {
   crate_type = "rlib"
@@ -120,7 +124,7 @@
   cargo_pkg_version = "1.0.0"
   cargo_pkg_authors = "Alex Crichton <alex@alexcrichton.com>"
   cargo_pkg_name = "cfg-if"
-  cargo_pkg_description = "A macro to ergonomically define an item depending on a large number of #[cfg]parameters. Structured like an if-else chain, the first matching branch is theitem that gets emitted."
+  cargo_pkg_description = "A macro to ergonomically define an item depending on a large number of #[cfg] parameters. Structured like an if-else chain, the first matching branch is the item that gets emitted."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
@@ -137,6 +141,7 @@
     "core",
     "rustc-dep-of-std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("compiler_builtins") {
   crate_type = "rlib"
@@ -150,7 +155,7 @@
   cargo_pkg_version = "0.1.87"
   cargo_pkg_authors = "Jorge Aparicio <japaricious@gmail.com>"
   cargo_pkg_name = "compiler_builtins"
-  cargo_pkg_description = "Compiler intrinsics used by the Rust compiler. Also available for other targetsif necessary!"
+  cargo_pkg_description = "Compiler intrinsics used by the Rust compiler. Also available for other targets if necessary!"
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
@@ -164,6 +169,7 @@
     "core",
     "rustc-dep-of-std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("core") {
   crate_type = "rlib"
@@ -183,6 +189,7 @@
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("getopts") {
   crate_type = "rlib"
@@ -215,6 +222,7 @@
     "rustc-dep-of-std",
     "std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("gimli") {
   crate_type = "rlib"
@@ -250,6 +258,7 @@
     "read-core",
     "rustc-dep-of-std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("hashbrown") {
   crate_type = "rlib"
@@ -285,6 +294,7 @@
     "rustc-dep-of-std",
     "rustc-internal-api",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("libc") {
   crate_type = "rlib"
@@ -313,6 +323,7 @@
     "--cfg=libc_align",
     "--cfg=libc_priv_mod_use",
     "--cfg=libc_core_cvoid",
+    "-Zforce-unstable-if-unmarked",
   ]
 }
 cargo_crate("memchr") {
@@ -344,6 +355,7 @@
     "core",
     "rustc-dep-of-std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("miniz_oxide") {
   crate_type = "rlib"
@@ -378,6 +390,7 @@
     "core",
     "rustc-dep-of-std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("object") {
   crate_type = "rlib"
@@ -419,6 +432,7 @@
     "rustc-dep-of-std",
     "unaligned",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("panic_abort") {
   crate_type = "rlib"
@@ -443,6 +457,7 @@
     ":core",
     ":libc",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("panic_unwind") {
   crate_type = "rlib"
@@ -468,6 +483,7 @@
     ":libc",
     ":unwind",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("proc_macro") {
   crate_type = "rlib"
@@ -488,6 +504,7 @@
     ":core",
     ":std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("profiler_builtins") {
   crate_type = "rlib"
@@ -509,6 +526,7 @@
     ":core",
   ]
   build_deps = [ ":cc" ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("rustc_demangle") {
   crate_type = "rlib"
@@ -539,6 +557,7 @@
     "core",
     "rustc-dep-of-std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("rustc_std_workspace_alloc") {
   crate_type = "rlib"
@@ -557,6 +576,7 @@
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
   deps = [ ":alloc" ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("rustc_std_workspace_core") {
   crate_type = "rlib"
@@ -575,6 +595,7 @@
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
   deps = [ ":core" ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("rustc_std_workspace_std") {
   crate_type = "rlib"
@@ -593,6 +614,7 @@
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
   executable_configs += [ "//build/config/compiler:no_chromium_code" ]
   deps = [ ":std" ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("std") {
   crate_type = "rlib"
@@ -642,8 +664,11 @@
     "std_detect_dlsym_getauxval",
     "std_detect_file_io",
   ]
-  rustflags = [ "--cfg=backtrace_in_libstd" ]
   rustenv = [ "STD_ENV_ARCH=$rust_target_arch" ]
+  rustflags = [
+    "--cfg=backtrace_in_libstd",
+    "-Zforce-unstable-if-unmarked",
+  ]
 }
 cargo_crate("std_detect") {
   crate_type = "rlib"
@@ -683,6 +708,7 @@
     "std_detect_dlsym_getauxval",
     "std_detect_file_io",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("test") {
   crate_type = "rlib"
@@ -709,8 +735,8 @@
     ":proc_macro",
     ":std",
   ]
-
   rustenv = [ "CFG_DISABLE_UNSTABLE_FEATURES=0" ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("unicode_width") {
   crate_type = "rlib"
@@ -725,7 +751,7 @@
   cargo_pkg_authors =
       "kwantam <kwantam@gmail.com>, Manish Goregaokar <manishsmail@gmail.com>"
   cargo_pkg_name = "unicode-width"
-  cargo_pkg_description = "Determine displayed width of `char` and `str` typesaccording to Unicode Standard Annex #11 rules."
+  cargo_pkg_description = "Determine displayed width of `char` and `str` types according to Unicode Standard Annex #11 rules."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
@@ -745,6 +771,7 @@
     "rustc-dep-of-std",
     "std",
   ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
 cargo_crate("unwind") {
   crate_type = "rlib"
@@ -768,4 +795,5 @@
     ":libc",
   ]
   build_deps = [ ":cc" ]
+  rustflags = [ "-Zforce-unstable-if-unmarked" ]
 }
diff --git a/build/rust/tests/BUILD.gn b/build/rust/tests/BUILD.gn
index 3b05205..fc43bb8 100644
--- a/build/rust/tests/BUILD.gn
+++ b/build/rust/tests/BUILD.gn
@@ -61,6 +61,7 @@
       deps += [
         "test_aliased_deps:test_aliased_deps_unittests",
         "test_cpp_including_rust:test_cpp_including_rust_unittests",
+        "test_proc_macro_crate:test_proc_macro_crate_v0_2_unittests",
         "test_rlib_crate:target1_test_rlib_crate_v0_2_unittests",
         "test_rlib_crate:target2_test_rlib_crate_v0_2_unittests",
         "test_rust_exe:test_rust_exe_unittests",
diff --git a/buildtools/clang_format/README.chromium b/buildtools/clang_format/README.chromium
index e9af3248..e2ef79d 100644
--- a/buildtools/clang_format/README.chromium
+++ b/buildtools/clang_format/README.chromium
@@ -1,9 +1,9 @@
 Name: clang-format
 Short Name: clang-format
 URL: https://github.com/llvm/llvm-project/tree/main/clang/tools/clang-format
-Version: llvmorg-16-init-13328-g110fe4f4
-Date: 7 December 2022
-Revision: llvmorg-16-init-13328-g110fe4f4
+Version: llvmorg-17-init-4759-g547e3456
+Date: 21 March 2023
+Revision: llvmorg-17-init-4759-g547e3456
 License: Apache 2.0 / University of Illinois/NCSA Open Source License
 License File: NOT_SHIPPED
 Security Critical: No
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index fb47b86..16d8d0c 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision vars in //DEPS.
-  libcxx_revision = "6f04403d621df9152d72185b75dd7fadfda72ef8"
+  libcxx_revision = "af83f5d2fada265d8b5adc0a23a29e060907b3e7"
 }
diff --git a/buildtools/linux64/clang-format.sha1 b/buildtools/linux64/clang-format.sha1
index d5a08f9..cf50217 100644
--- a/buildtools/linux64/clang-format.sha1
+++ b/buildtools/linux64/clang-format.sha1
@@ -1 +1 @@
-6ef2183a178a53e47e4448dbe192b1d8d5290222
\ No newline at end of file
+1facab3101fc6da6b9467543f27f0622b966bc19
\ No newline at end of file
diff --git a/buildtools/mac/clang-format.arm64.sha1 b/buildtools/mac/clang-format.arm64.sha1
index a0731b4..d36c108 100644
--- a/buildtools/mac/clang-format.arm64.sha1
+++ b/buildtools/mac/clang-format.arm64.sha1
@@ -1 +1 @@
-bdf8a3bc22be76030ea34a14a6d6082d01fa04cf
\ No newline at end of file
+5553d7a3d912b7d49381ad68c9a56740601a57a0
\ No newline at end of file
diff --git a/buildtools/mac/clang-format.x64.sha1 b/buildtools/mac/clang-format.x64.sha1
index 4fa8deb..332cf678 100644
--- a/buildtools/mac/clang-format.x64.sha1
+++ b/buildtools/mac/clang-format.x64.sha1
@@ -1 +1 @@
-1c125f1d882babd1a930fcd5b4fd80bba3f5321e
\ No newline at end of file
+87d69aeff220c916b85b5d6d162fa5668aa9d64f
\ No newline at end of file
diff --git a/buildtools/win/clang-format.exe.sha1 b/buildtools/win/clang-format.exe.sha1
index a8e999e..a9e4bdd 100644
--- a/buildtools/win/clang-format.exe.sha1
+++ b/buildtools/win/clang-format.exe.sha1
@@ -1 +1 @@
-d88796ff22d70c7d5ede62636daa220ccd238f06
\ No newline at end of file
+2e569921b9884daf157021d6ae9e21991cd6cf81
\ No newline at end of file
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 9abf119..c080ac8d 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -2400,7 +2400,6 @@
                                "add_view_trace_events",
                                "apk_name",
                                "bundle_target",
-                               "baseline_profile_path",
                                "is_base_module",
                                "target_type",
                                "enable_lint",
@@ -2428,7 +2427,6 @@
     target_type = "android_apk"
     apk_name = "ChromePublic"
     enable_multidex = is_java_debug
-    baseline_profile_path = "//chrome/android/baseline_profiles/profile.txt"
   }
 
   android_library("monochrome_java") {
@@ -3179,7 +3177,6 @@
       forward_variables_from(invoker,
                              [
                                "add_view_trace_events",
-                               "baseline_profile_path",
                                "enable_lint",
                                "include_32_bit_webview",
                                "include_64_bit_webview",
@@ -3276,7 +3273,6 @@
       is_trichrome = true
       static_library_provider = ":trichrome_library_apk"
       add_view_trace_events = true
-      baseline_profile_path = "//chrome/android/baseline_profiles/profile.txt"
       if (android_64bit_target_cpu) {
         is_64_bit_browser = false
         include_64_bit_webview = true
diff --git a/chrome/android/baseline_profiles/OWNERS b/chrome/android/baseline_profiles/OWNERS
deleted file mode 100644
index 828b487..0000000
--- a/chrome/android/baseline_profiles/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-mheikal@chromium.org
-agrieve@chromium.org
diff --git a/chrome/android/baseline_profiles/README.md b/chrome/android/baseline_profiles/README.md
deleted file mode 100644
index 4f2c8a2a..0000000
--- a/chrome/android/baseline_profiles/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Baseline Profiles
-
-This directory contains Human Readable Format (HRF) baseline profiles. Googlers:
-see go/baseline-profiles-in-chrome for more details about how this is going to
-be used.
-
-## What are baseline profiles?
-
-These are basically the successor/sibling of android cloud profiles where a list
-of classes and methods are marked as (startup, hot, etc.) hinting at the ART to
-precompile certain parts of the dex rather than JIT for performance reasons. See
-https://developer.android.com/topic/performance/baselineprofiles/overview for
-more details.
-
-## What are HRF profiles?
-
-HRF or Human Readable Format profiles is a text file containing methods and
-classes of your app alongside flags (startup, hot, etc). This is fairly stable
-across small code changes and thus can be committed to the repo/cipd. Using the
-macrobenchmark library you can get an HRF profile for your app. The ART can't
-use this though and it must be converted to a binary profile which is then
-shipped with your apk/bundle.
diff --git a/chrome/android/baseline_profiles/profile.txt b/chrome/android/baseline_profiles/profile.txt
deleted file mode 100644
index b220380..0000000
--- a/chrome/android/baseline_profiles/profile.txt
+++ /dev/null
@@ -1,9794 +0,0 @@
-LJ/N;
-Landroid/support/v4/media/MediaMetadataCompat$Builder$$ExternalSyntheticOutline0;
-HSPLandroid/support/v4/media/MediaMetadataCompat$Builder$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroidx/activity/Cancellable;
-Landroidx/activity/ComponentActivity;
-HSPLandroidx/activity/ComponentActivity;-><init>()V
-HSPLandroidx/activity/ComponentActivity;->addOnContextAvailableListener(Landroidx/activity/contextaware/OnContextAvailableListener;)V
-HSPLandroidx/activity/ComponentActivity;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/MutableCreationExtras;
-HSPLandroidx/activity/ComponentActivity;->getLifecycle()Landroidx/lifecycle/LifecycleRegistry;
-HSPLandroidx/activity/ComponentActivity;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry;
-HSPLandroidx/activity/ComponentActivity;->getViewModelStore()Landroidx/lifecycle/ViewModelStore;
-HSPLandroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V
-Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;
-HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;)V
-HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->run()V
-Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;
-HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;-><init>(Landroidx/fragment/app/FragmentActivity;)V
-Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;
-HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;-><init>(Landroidx/fragment/app/FragmentActivity;)V
-Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda3;
-HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda3;-><init>(Landroidx/fragment/app/FragmentActivity;)V
-HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda3;->onContextAvailable()V
-Landroidx/activity/ComponentActivity$1;
-HSPLandroidx/activity/ComponentActivity$1;-><init>(Landroidx/fragment/app/FragmentActivity;)V
-Landroidx/activity/ComponentActivity$2;
-HSPLandroidx/activity/ComponentActivity$2;-><init>(Landroidx/fragment/app/FragmentActivity;)V
-Landroidx/activity/ComponentActivity$2$$ExternalSyntheticOutline0;
-HSPLandroidx/activity/ComponentActivity$2$$ExternalSyntheticOutline0;->m(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroidx/activity/ComponentActivity$3;
-HSPLandroidx/activity/ComponentActivity$3;-><init>(Landroidx/fragment/app/FragmentActivity;I)V
-HSPLandroidx/activity/ComponentActivity$3;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
-Landroidx/activity/ComponentActivity$NonConfigurationInstances;
-Landroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;
-HSPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;-><init>(Landroidx/fragment/app/FragmentActivity;)V
-Landroidx/activity/FullyDrawnReporter;
-HSPLandroidx/activity/FullyDrawnReporter;-><init>(Landroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;)V
-Landroidx/activity/OnBackPressedCallback;
-HSPLandroidx/activity/OnBackPressedCallback;-><init>(Z)V
-HSPLandroidx/activity/OnBackPressedCallback;->setEnabled(Z)V
-Landroidx/activity/OnBackPressedDispatcher;
-HSPLandroidx/activity/OnBackPressedDispatcher;-><init>(Ljava/lang/Runnable;)V
-HSPLandroidx/activity/OnBackPressedDispatcher;->addCallback(Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/OnBackPressedCallback;)V
-HSPLandroidx/activity/OnBackPressedDispatcher;->addCancellableCallback$activity_release(Landroidx/activity/OnBackPressedCallback;)Landroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;
-Landroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;
-HSPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;-><init>(Landroidx/activity/OnBackPressedDispatcher;Landroidx/lifecycle/Lifecycle;Landroidx/activity/OnBackPressedCallback;)V
-HSPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->cancel()V
-HSPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
-Landroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;
-HSPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;-><init>(Landroidx/activity/OnBackPressedDispatcher;Landroidx/activity/OnBackPressedCallback;)V
-HSPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->cancel()V
-Landroidx/activity/OnBackPressedDispatcherOwner;
-Landroidx/activity/ViewTreeOnBackPressedDispatcherOwner;
-HSPLandroidx/activity/ViewTreeOnBackPressedDispatcherOwner;->set(Landroid/view/View;Landroidx/activity/OnBackPressedDispatcherOwner;)V
-Landroidx/activity/contextaware/ContextAwareHelper;
-HSPLandroidx/activity/contextaware/ContextAwareHelper;-><init>()V
-Landroidx/activity/contextaware/OnContextAvailableListener;
-Landroidx/activity/result/ActivityResult;
-Landroidx/activity/result/ActivityResultCallback;
-Landroidx/activity/result/ActivityResultRegistry;
-HSPLandroidx/activity/result/ActivityResultRegistry;-><init>()V
-HSPLandroidx/activity/result/ActivityResultRegistry;->register(Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/fragment/app/FragmentManager$8;)Landroidx/activity/result/ActivityResultRegistry$3;
-Landroidx/activity/result/ActivityResultRegistry$$ExternalSyntheticThrowCCEIfNotNull0;
-HSPLandroidx/activity/result/ActivityResultRegistry$$ExternalSyntheticThrowCCEIfNotNull0;->m(Ljava/lang/Object;)V
-Landroidx/activity/result/ActivityResultRegistry$3;
-HSPLandroidx/activity/result/ActivityResultRegistry$3;-><init>(Landroidx/activity/result/ActivityResultRegistry;Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;)V
-HSPLandroidx/activity/result/ActivityResultRegistry$3;->unregister()V
-Landroidx/activity/result/ActivityResultRegistry$CallbackAndContract;
-HSPLandroidx/activity/result/ActivityResultRegistry$CallbackAndContract;-><init>(Landroidx/fragment/app/FragmentManager$8;Landroidx/activity/result/contract/ActivityResultContract;)V
-Landroidx/activity/result/ActivityResultRegistryOwner;
-Landroidx/activity/result/contract/ActivityResultContract;
-HSPLandroidx/activity/result/contract/ActivityResultContract;-><init>()V
-Landroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions;
-HSPLandroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions;-><init>()V
-Landroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult;
-HSPLandroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult;-><init>()V
-Landroidx/appcompat/app/AppCompatActivity;
-HSPLandroidx/appcompat/app/AppCompatActivity;-><init>()V
-HSPLandroidx/appcompat/app/AppCompatActivity;->attachBaseContext(Landroid/content/Context;)V
-HSPLandroidx/appcompat/app/AppCompatActivity;->findViewById(I)Landroid/view/View;
-HSPLandroidx/appcompat/app/AppCompatActivity;->getDelegate()Landroidx/appcompat/app/AppCompatDelegate;
-HSPLandroidx/appcompat/app/AppCompatActivity;->getResources()Landroid/content/res/Resources;
-HSPLandroidx/appcompat/app/AppCompatActivity;->getSupportActionBar()Landroidx/appcompat/app/ActionBar;
-HSPLandroidx/appcompat/app/AppCompatActivity;->initViewTreeOwners()V
-HSPLandroidx/appcompat/app/AppCompatActivity;->invalidateOptionsMenu()V
-HSPLandroidx/appcompat/app/AppCompatActivity;->onContentChanged()V
-HSPLandroidx/appcompat/app/AppCompatActivity;->onDestroy()V
-HSPLandroidx/appcompat/app/AppCompatActivity;->onPostCreate(Landroid/os/Bundle;)V
-HSPLandroidx/appcompat/app/AppCompatActivity;->onPostResume()V
-HSPLandroidx/appcompat/app/AppCompatActivity;->onStart()V
-HSPLandroidx/appcompat/app/AppCompatActivity;->onStop()V
-HSPLandroidx/appcompat/app/AppCompatActivity;->onTitleChanged(Ljava/lang/CharSequence;I)V
-HSPLandroidx/appcompat/app/AppCompatActivity;->setContentView(I)V
-HSPLandroidx/appcompat/app/AppCompatActivity;->setTheme(I)V
-Landroidx/appcompat/app/AppCompatActivity$1;
-HSPLandroidx/appcompat/app/AppCompatActivity$1;-><init>(Landroidx/appcompat/app/AppCompatActivity;)V
-Landroidx/appcompat/app/AppCompatActivity$2;
-HSPLandroidx/appcompat/app/AppCompatActivity$2;-><init>(Landroidx/appcompat/app/AppCompatActivity;)V
-HSPLandroidx/appcompat/app/AppCompatActivity$2;->onContextAvailable()V
-Landroidx/appcompat/app/AppCompatCallback;
-Landroidx/appcompat/app/AppCompatDelegate;
-HSPLandroidx/appcompat/app/AppCompatDelegate;-><init>()V
-HSPLandroidx/appcompat/app/AppCompatDelegate;->isAutoStorageOptedIn(Landroid/content/Context;)Z
-HSPLandroidx/appcompat/app/AppCompatDelegate;->removeDelegateFromActives(Landroidx/appcompat/app/AppCompatDelegate;)V
-HSPLandroidx/appcompat/app/AppCompatDelegate;->setDefaultNightMode(I)V
-Landroidx/appcompat/app/AppCompatDelegateImpl;
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;-><init>(Landroid/content/Context;Landroid/view/Window;Landroidx/appcompat/app/AppCompatCallback;Ljava/lang/Object;)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->applyApplicationSpecificConfig(ZZ)Z
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->attachToWindow(Landroid/view/Window;)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->calculateApplicationLocales(Landroid/content/Context;)Landroidx/core/os/LocaleListCompat;
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->createOverrideAppConfiguration(Landroid/content/Context;ILandroidx/core/os/LocaleListCompat;Landroid/content/res/Configuration;Z)Landroid/content/res/Configuration;
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->doInvalidatePanelMenu(I)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureWindow()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->getConfigurationLocales(Landroid/content/res/Configuration;)Landroidx/core/os/LocaleListCompat;
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->getPanelState(I)Landroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState;
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->initWindowDecorActionBar()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->installViewFactory()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->invalidateOptionsMenu()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->mapNightMode(Landroid/content/Context;I)I
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreate()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onDestroy()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->requestWindowFeature(I)Z
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->setContentView(I)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTitle(Ljava/lang/CharSequence;)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->throwFeatureRequestIfSubDecorInstalled()V
-Landroidx/appcompat/app/AppCompatDelegateImpl$2;
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$2;-><init>(Landroidx/appcompat/app/AppCompatDelegateImpl;I)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->run()V
-Landroidx/appcompat/app/AppCompatDelegateImpl$3;
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$3;-><init>(Landroidx/appcompat/app/AppCompatDelegateImpl;I)V
-Landroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;-><init>(Landroidx/appcompat/app/AppCompatDelegateImpl;Landroid/view/Window$Callback;)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->bypassOnContentChanged(Landroid/view/Window$Callback;)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->dispatchPopulateAccessibilityEvent$androidx$appcompat$view$WindowCallbackWrapper(Landroid/view/accessibility/AccessibilityEvent;)Z
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onAttachedToWindow$androidx$appcompat$view$WindowCallbackWrapper()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onAttachedToWindow()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onContentChanged()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onDetachedFromWindow$androidx$appcompat$view$WindowCallbackWrapper()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onDetachedFromWindow()V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onWindowAttributesChanged$androidx$appcompat$view$WindowCallbackWrapper(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onWindowFocusChanged$androidx$appcompat$view$WindowCallbackWrapper(Z)V
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onWindowFocusChanged(Z)V
-Landroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState;
-HSPLandroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState;-><init>(I)V
-Landroidx/appcompat/app/AppCompatViewInflater;
-HSPLandroidx/appcompat/app/AppCompatViewInflater;-><init>()V
-HSPLandroidx/appcompat/app/AppCompatViewInflater;->createView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-Landroidx/appcompat/app/AppCompatViewInflater$DeclaredOnClickListener;
-Landroidx/appcompat/app/AppLocalesMetadataHolderService;
-Landroidx/appcompat/app/AppLocalesStorageHelper$SerialExecutor;
-HSPLandroidx/appcompat/app/AppLocalesStorageHelper$SerialExecutor;-><init>(Landroidx/appcompat/app/AppLocalesStorageHelper$ThreadPerTaskExecutor;)V
-Landroidx/appcompat/app/AppLocalesStorageHelper$ThreadPerTaskExecutor;
-HSPLandroidx/appcompat/app/AppLocalesStorageHelper$ThreadPerTaskExecutor;-><init>()V
-Landroidx/appcompat/content/res/AppCompatResources;
-HSPLandroidx/appcompat/content/res/AppCompatResources;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;
-Landroidx/appcompat/graphics/drawable/DrawableWrapperCompat;
-Landroidx/appcompat/view/ContextThemeWrapper;
-HSPLandroidx/appcompat/view/ContextThemeWrapper;-><init>(Landroid/content/Context;I)V
-HSPLandroidx/appcompat/view/ContextThemeWrapper;->applyOverrideConfiguration(Landroid/content/res/Configuration;)V
-HSPLandroidx/appcompat/view/ContextThemeWrapper;->getResources()Landroid/content/res/Resources;
-HSPLandroidx/appcompat/view/ContextThemeWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
-HSPLandroidx/appcompat/view/ContextThemeWrapper;->getTheme()Landroid/content/res/Resources$Theme;
-HSPLandroidx/appcompat/view/ContextThemeWrapper;->initializeTheme()V
-Landroidx/appcompat/view/menu/MenuBuilder$Callback;
-Landroidx/appcompat/view/menu/MenuPresenter$Callback;
-Landroidx/appcompat/view/menu/SubMenuBuilder$$ExternalSyntheticOutline0;
-HSPLandroidx/appcompat/view/menu/SubMenuBuilder$$ExternalSyntheticOutline0;->m(Ljava/lang/String;I)Ljava/lang/String;
-Landroidx/appcompat/widget/AppCompatAutoCompleteTextView;
-Landroidx/appcompat/widget/AppCompatBackgroundHelper;
-HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;-><init>(Landroid/view/View;)V
-HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->applySupportBackgroundTint()V
-HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V
-HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundDrawable()V
-HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setInternalBackgroundTint(Landroid/content/res/ColorStateList;)V
-Landroidx/appcompat/widget/AppCompatButton;
-HSPLandroidx/appcompat/widget/AppCompatButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroidx/appcompat/widget/AppCompatButton;->drawableStateChanged()V
-HSPLandroidx/appcompat/widget/AppCompatButton;->onTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroidx/appcompat/widget/AppCompatButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroidx/appcompat/widget/AppCompatButton;->setFilters([Landroid/text/InputFilter;)V
-Landroidx/appcompat/widget/AppCompatCheckBox;
-Landroidx/appcompat/widget/AppCompatCheckedTextView;
-Landroidx/appcompat/widget/AppCompatDrawableManager;
-HSPLandroidx/appcompat/widget/AppCompatDrawableManager;-><init>()V
-HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->get()Landroidx/appcompat/widget/AppCompatDrawableManager;
-HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->preload()V
-Landroidx/appcompat/widget/AppCompatDrawableManager$1;
-HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;-><init>()V
-HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->arrayContains([II)Z
-HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->getTintListForDrawableRes(Landroid/content/Context;I)Landroid/content/res/ColorStateList;
-Landroidx/appcompat/widget/AppCompatEditText;
-HSPLandroidx/appcompat/widget/AppCompatEditText;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroidx/appcompat/widget/AppCompatEditText;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroidx/appcompat/widget/AppCompatEditText;->drawableStateChanged()V
-HSPLandroidx/appcompat/widget/AppCompatEditText;->getText()Landroid/text/Editable;
-HSPLandroidx/appcompat/widget/AppCompatEditText;->getText()Ljava/lang/CharSequence;
-HSPLandroidx/appcompat/widget/AppCompatEditText;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroidx/appcompat/widget/AppCompatEditText;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroidx/appcompat/widget/AppCompatEditText;->setCustomSelectionActionModeCallback(Landroid/view/ActionMode$Callback;)V
-HSPLandroidx/appcompat/widget/AppCompatEditText;->setTextAppearance(Landroid/content/Context;I)V
-HSPLandroidx/appcompat/widget/AppCompatEditText;->setTextClassifier(Landroid/view/textclassifier/TextClassifier;)V
-Landroidx/appcompat/widget/AppCompatEditText$SuperCaller;
-HSPLandroidx/appcompat/widget/AppCompatEditText$SuperCaller;-><init>(Landroidx/appcompat/widget/AppCompatEditText;)V
-Landroidx/appcompat/widget/AppCompatEmojiEditTextHelper;
-HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;-><init>(Landroid/widget/EditText;)V
-HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->getKeyListener(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener;
-HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V
-Landroidx/appcompat/widget/AppCompatEmojiTextHelper;
-HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;-><init>(Landroid/widget/TextView;)V
-HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->getFilters([Landroid/text/InputFilter;)[Landroid/text/InputFilter;
-HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V
-Landroidx/appcompat/widget/AppCompatImageButton;
-HSPLandroidx/appcompat/widget/AppCompatImageButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroidx/appcompat/widget/AppCompatImageButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroidx/appcompat/widget/AppCompatImageButton;->drawableStateChanged()V
-HSPLandroidx/appcompat/widget/AppCompatImageButton;->hasOverlappingRendering()Z
-HSPLandroidx/appcompat/widget/AppCompatImageButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroidx/appcompat/widget/AppCompatImageButton;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V
-Landroidx/appcompat/widget/AppCompatImageHelper;
-HSPLandroidx/appcompat/widget/AppCompatImageHelper;-><init>(Landroid/widget/ImageView;)V
-HSPLandroidx/appcompat/widget/AppCompatImageHelper;->applySupportImageTint()V
-HSPLandroidx/appcompat/widget/AppCompatImageHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V
-HSPLandroidx/appcompat/widget/AppCompatImageHelper;->setImageResource(I)V
-Landroidx/appcompat/widget/AppCompatImageView;
-HSPLandroidx/appcompat/widget/AppCompatImageView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroidx/appcompat/widget/AppCompatImageView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroidx/appcompat/widget/AppCompatImageView;->drawableStateChanged()V
-HSPLandroidx/appcompat/widget/AppCompatImageView;->hasOverlappingRendering()Z
-HSPLandroidx/appcompat/widget/AppCompatImageView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroidx/appcompat/widget/AppCompatImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroidx/appcompat/widget/AppCompatImageView;->setImageResource(I)V
-Landroidx/appcompat/widget/AppCompatMultiAutoCompleteTextView;
-Landroidx/appcompat/widget/AppCompatRadioButton;
-Landroidx/appcompat/widget/AppCompatRatingBar;
-Landroidx/appcompat/widget/AppCompatSeekBar;
-Landroidx/appcompat/widget/AppCompatSpinner;
-Landroidx/appcompat/widget/AppCompatTextClassifierHelper;
-HSPLandroidx/appcompat/widget/AppCompatTextClassifierHelper;-><init>(Landroid/widget/TextView;)V
-Landroidx/appcompat/widget/AppCompatTextHelper;
-HSPLandroidx/appcompat/widget/AppCompatTextHelper;-><init>(Landroid/widget/TextView;)V
-HSPLandroidx/appcompat/widget/AppCompatTextHelper;->applyCompoundDrawablesTints()V
-HSPLandroidx/appcompat/widget/AppCompatTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V
-HSPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetTextAppearance(Landroid/content/Context;I)V
-HSPLandroidx/appcompat/widget/AppCompatTextHelper;->updateTypefaceAndStyle(Landroid/content/Context;Landroidx/appcompat/widget/TintTypedArray;)V
-Landroidx/appcompat/widget/AppCompatTextHelper$1;
-HSPLandroidx/appcompat/widget/AppCompatTextHelper$1;-><init>(Landroidx/appcompat/widget/AppCompatTextHelper;IILjava/lang/ref/WeakReference;)V
-HSPLandroidx/appcompat/widget/AppCompatTextHelper$1;->onFontRetrievalFailed(I)V
-Landroidx/appcompat/widget/AppCompatTextHelper$Api26Impl;
-Landroidx/appcompat/widget/AppCompatTextView;
-HSPLandroidx/appcompat/widget/AppCompatTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroidx/appcompat/widget/AppCompatTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroidx/appcompat/widget/AppCompatTextView;->drawableStateChanged()V
-HSPLandroidx/appcompat/widget/AppCompatTextView;->onTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroidx/appcompat/widget/AppCompatTextView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLandroidx/appcompat/widget/AppCompatTextView;->setFilters([Landroid/text/InputFilter;)V
-HSPLandroidx/appcompat/widget/AppCompatTextView;->setTextAppearance(Landroid/content/Context;I)V
-HSPLandroidx/appcompat/widget/AppCompatTextView;->setTypeface(Landroid/graphics/Typeface;I)V
-Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;
-HSPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;-><init>(Landroid/widget/TextView;)V
-HSPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->supportsAutoSizeText()Z
-Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl;
-HSPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl;-><init>()V
-Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl23;
-HSPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl23;-><init>()V
-Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl29;
-HSPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl29;-><init>()V
-Landroidx/appcompat/widget/AppCompatToggleButton;
-Landroidx/appcompat/widget/ContentFrameLayout;
-HSPLandroidx/appcompat/widget/ContentFrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroidx/appcompat/widget/ContentFrameLayout;->onAttachedToWindow()V
-HSPLandroidx/appcompat/widget/ContentFrameLayout;->onDetachedFromWindow()V
-HSPLandroidx/appcompat/widget/ContentFrameLayout;->onMeasure(II)V
-Landroidx/appcompat/widget/DrawableUtils;
-HSPLandroidx/appcompat/widget/DrawableUtils;->fixDrawable(Landroid/graphics/drawable/Drawable;)V
-Landroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;
-HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/Insets;)I
-HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Insets;)I
-Landroidx/appcompat/widget/FitWindowsFrameLayout;
-HSPLandroidx/appcompat/widget/FitWindowsFrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Landroidx/appcompat/widget/ResourceManagerInternal;
-HSPLandroidx/appcompat/widget/ResourceManagerInternal;-><init>()V
-HSPLandroidx/appcompat/widget/ResourceManagerInternal;->createDrawableIfNeeded(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;
-HSPLandroidx/appcompat/widget/ResourceManagerInternal;->get()Landroidx/appcompat/widget/ResourceManagerInternal;
-HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getCachedDrawable(Landroid/content/Context;J)Landroid/graphics/drawable/Drawable;
-HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(ILandroid/content/Context;Z)Landroid/graphics/drawable/Drawable;
-HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;
-HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList;
-HSPLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawableUsingColorFilter(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z
-Landroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;
-HSPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;-><init>()V
-Landroidx/appcompat/widget/ResourcesWrapper;
-Landroidx/appcompat/widget/ThemeUtils;
-HSPLandroidx/appcompat/widget/ThemeUtils;->checkAppCompatTheme(Landroid/content/Context;Landroid/view/View;)V
-Landroidx/appcompat/widget/TintContextWrapper;
-HSPLandroidx/appcompat/widget/TintContextWrapper;->wrap(Landroid/content/Context;)V
-Landroidx/appcompat/widget/TintResources;
-Landroidx/appcompat/widget/TintTypedArray;
-HSPLandroidx/appcompat/widget/TintTypedArray;-><init>(Landroid/content/Context;Landroid/content/res/TypedArray;)V
-HSPLandroidx/appcompat/widget/TintTypedArray;->getColorStateList(I)Landroid/content/res/ColorStateList;
-HSPLandroidx/appcompat/widget/TintTypedArray;->getDimensionPixelSize(II)I
-HSPLandroidx/appcompat/widget/TintTypedArray;->getFont(IILandroidx/appcompat/widget/AppCompatTextHelper$1;)Landroid/graphics/Typeface;
-HSPLandroidx/appcompat/widget/TintTypedArray;->getInt(II)I
-HSPLandroidx/appcompat/widget/TintTypedArray;->getResourceId(II)I
-HSPLandroidx/appcompat/widget/TintTypedArray;->getString(I)Ljava/lang/String;
-HSPLandroidx/appcompat/widget/TintTypedArray;->hasValue(I)Z
-HSPLandroidx/appcompat/widget/TintTypedArray;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[II)Landroidx/appcompat/widget/TintTypedArray;
-HSPLandroidx/appcompat/widget/TintTypedArray;->recycle()V
-Landroidx/appcompat/widget/VectorEnabledTintResources;
-Landroidx/appcompat/widget/ViewStubCompat;
-HSPLandroidx/appcompat/widget/ViewStubCompat;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroidx/appcompat/widget/ViewStubCompat;->setVisibility(I)V
-Landroidx/appcompat/widget/ViewUtils;
-Landroidx/arch/core/executor/ArchTaskExecutor;
-HSPLandroidx/arch/core/executor/ArchTaskExecutor;-><init>()V
-Landroidx/arch/core/executor/DefaultTaskExecutor;
-HSPLandroidx/arch/core/executor/DefaultTaskExecutor;-><init>()V
-Landroidx/arch/core/executor/DefaultTaskExecutor$1;
-HSPLandroidx/arch/core/executor/DefaultTaskExecutor$1;-><init>()V
-Landroidx/arch/core/executor/TaskExecutor;
-HSPLandroidx/arch/core/executor/TaskExecutor;-><init>()V
-Landroidx/arch/core/internal/FastSafeIterableMap;
-HSPLandroidx/arch/core/internal/FastSafeIterableMap;-><init>()V
-HSPLandroidx/arch/core/internal/FastSafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry;
-HSPLandroidx/arch/core/internal/FastSafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroidx/arch/core/internal/FastSafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-Landroidx/arch/core/internal/SafeIterableMap;
-HSPLandroidx/arch/core/internal/SafeIterableMap;-><init>()V
-HSPLandroidx/arch/core/internal/SafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry;
-HSPLandroidx/arch/core/internal/SafeIterableMap;->iterator()Ljava/util/Iterator;
-HSPLandroidx/arch/core/internal/SafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-Landroidx/arch/core/internal/SafeIterableMap$AscendingIterator;
-HSPLandroidx/arch/core/internal/SafeIterableMap$AscendingIterator;-><init>(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;I)V
-Landroidx/arch/core/internal/SafeIterableMap$Entry;
-HSPLandroidx/arch/core/internal/SafeIterableMap$Entry;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getKey()Ljava/lang/Object;
-HSPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getValue()Ljava/lang/Object;
-Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;
-HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;-><init>(Landroidx/arch/core/internal/SafeIterableMap;)V
-HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->hasNext()Z
-HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->next()Ljava/lang/Object;
-HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V
-Landroidx/arch/core/internal/SafeIterableMap$ListIterator;
-HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;-><init>(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V
-HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->hasNext()Z
-HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->next()Ljava/lang/Object;
-HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->nextNode()Landroidx/arch/core/internal/SafeIterableMap$Entry;
-HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V
-Landroidx/arch/core/internal/SafeIterableMap$SupportRemove;
-HSPLandroidx/arch/core/internal/SafeIterableMap$SupportRemove;-><init>()V
-Landroidx/asynclayoutinflater/view/AsyncLayoutInflater;
-HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater;-><init>(Landroid/content/Context;)V
-Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$1;
-HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater$1;-><init>(Landroidx/asynclayoutinflater/view/AsyncLayoutInflater;)V
-Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$BasicInflater;
-HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater$BasicInflater;-><init>(Landroid/content/Context;)V
-Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$InflateThread;
-HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater$InflateThread;-><init>()V
-HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater$InflateThread;->run()V
-Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$OnInflateFinishedListener;
-Landroidx/browser/customtabs/CustomTabsSessionToken;
-HSPLandroidx/browser/customtabs/CustomTabsSessionToken;->getSessionTokenFromIntent(Landroid/content/Intent;)Landroidx/browser/customtabs/CustomTabsSessionToken;
-Landroidx/collection/ArrayMap;
-HSPLandroidx/collection/ArrayMap;-><init>()V
-Landroidx/collection/ArraySet;
-HSPLandroidx/collection/ArraySet;-><init>(I)V
-HSPLandroidx/collection/ArraySet;->add(Ljava/lang/Object;)Z
-HSPLandroidx/collection/ArraySet;->contains(Ljava/lang/Object;)Z
-HSPLandroidx/collection/ArraySet;->remove(Ljava/lang/Object;)Z
-HSPLandroidx/collection/ArraySet;->removeAt(I)V
-Landroidx/collection/ArraySet$ElementIterator;
-HSPLandroidx/collection/ArraySet$ElementIterator;-><init>(Landroidx/collection/ArraySet;)V
-HSPLandroidx/collection/ArraySet$ElementIterator;->elementAt(I)Ljava/lang/Object;
-HSPLandroidx/collection/ArraySet$ElementIterator;->removeAt(I)V
-Landroidx/collection/ArraySetKt;
-HSPLandroidx/collection/ArraySetKt;->allocArrays(Landroidx/collection/ArraySet;I)V
-HSPLandroidx/collection/ArraySetKt;->indexOf(Landroidx/collection/ArraySet;Ljava/lang/Object;I)I
-Landroidx/collection/IndexBasedArrayIterator;
-HSPLandroidx/collection/IndexBasedArrayIterator;-><init>(I)V
-HSPLandroidx/collection/IndexBasedArrayIterator;->hasNext()Z
-HSPLandroidx/collection/IndexBasedArrayIterator;->next()Ljava/lang/Object;
-HSPLandroidx/collection/IndexBasedArrayIterator;->remove()V
-Landroidx/collection/LongSparseArray;
-HSPLandroidx/collection/LongSparseArray;-><init>()V
-HSPLandroidx/collection/LongSparseArray;->clear()V
-Landroidx/collection/LruCache;
-HSPLandroidx/collection/LruCache;-><init>(I)V
-HSPLandroidx/collection/LruCache;->create(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroidx/collection/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroidx/collection/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroidx/collection/LruCache;->safeSizeOf(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroidx/collection/LruCache;->sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLandroidx/collection/LruCache;->trimToSize(I)V
-Landroidx/collection/SimpleArrayMap;
-HSPLandroidx/collection/SimpleArrayMap;-><init>()V
-HSPLandroidx/collection/SimpleArrayMap;-><init>(I)V
-HSPLandroidx/collection/SimpleArrayMap;->clear()V
-HSPLandroidx/collection/SimpleArrayMap;->containsKey(Ljava/lang/Object;)Z
-HSPLandroidx/collection/SimpleArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroidx/collection/SimpleArrayMap;->indexOf(ILjava/lang/Object;)I
-HSPLandroidx/collection/SimpleArrayMap;->indexOfKey(Ljava/lang/Object;)I
-HSPLandroidx/collection/SimpleArrayMap;->keyAt(I)Ljava/lang/Object;
-HSPLandroidx/collection/SimpleArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroidx/collection/SimpleArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroidx/collection/SimpleArrayMap;->removeAt(I)Ljava/lang/Object;
-HSPLandroidx/collection/SimpleArrayMap;->valueAt(I)Ljava/lang/Object;
-Landroidx/collection/internal/ContainerHelpersKt;
-HSPLandroidx/collection/internal/ContainerHelpersKt;->binarySearch(II[I)I
-Landroidx/collection/internal/Lock;
-HSPLandroidx/collection/internal/Lock;-><init>()V
-Landroidx/collection/internal/LruHashMap;
-HSPLandroidx/collection/internal/LruHashMap;-><init>()V
-HSPLandroidx/collection/internal/LruHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Landroidx/concurrent/futures/AbstractResolvableFuture$$ExternalSyntheticOutline0;
-HSPLandroidx/concurrent/futures/AbstractResolvableFuture$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLandroidx/concurrent/futures/AbstractResolvableFuture$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroidx/constraintlayout/core/widgets/analyzer/DependencyGraph$$ExternalSyntheticOutline0;
-HSPLandroidx/constraintlayout/core/widgets/analyzer/DependencyGraph$$ExternalSyntheticOutline0;->m(FFFF)F
-Landroidx/constraintlayout/widget/ConstraintHelper$$ExternalSyntheticOutline0;
-HSPLandroidx/constraintlayout/widget/ConstraintHelper$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-Landroidx/constraintlayout/widget/ConstraintLayout$$ExternalSyntheticOutline0;
-HSPLandroidx/constraintlayout/widget/ConstraintLayout$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroidx/coordinatorlayout/widget/CoordinatorLayout;
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->acquireTempRect()Landroid/graphics/Rect;
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->constrainChildRect(Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;Landroid/graphics/Rect;II)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->drawableStateChanged()V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getChildRect(Landroid/view/View;Landroid/graphics/Rect;Z)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getDescendantRect(Landroid/graphics/Rect;Landroid/view/View;)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getDesiredAnchoredChildRectWithoutConstraints(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;II)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getResolvedLayoutParams(Landroid/view/View;)Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getSuggestedMinimumHeight()I
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getSuggestedMinimumWidth()I
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onAttachedToWindow()V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onChildViewsChanged(I)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onDetachedFromWindow()V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayout(ZIIII)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayoutChild(Landroid/view/View;I)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasure(II)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->resetTouchBehaviors()V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->setupForInsets()V
-Landroidx/coordinatorlayout/widget/CoordinatorLayout$AttachedBehavior;
-Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;-><init>()V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;-><init>(I)V
-Landroidx/coordinatorlayout/widget/CoordinatorLayout$DefaultBehavior;
-Landroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;-><init>(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;->onChildViewAdded(Landroid/view/View;Landroid/view/View;)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;->onChildViewRemoved(Landroid/view/View;Landroid/view/View;)V
-Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Landroidx/coordinatorlayout/widget/CoordinatorLayout$OnPreDrawListener;
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$OnPreDrawListener;-><init>(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$OnPreDrawListener;->onPreDraw()Z
-Landroidx/coordinatorlayout/widget/CoordinatorLayout$ViewElevationComparator;
-HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$ViewElevationComparator;-><init>()V
-Landroidx/coordinatorlayout/widget/DirectedAcyclicGraph;
-HSPLandroidx/coordinatorlayout/widget/DirectedAcyclicGraph;-><init>()V
-HSPLandroidx/coordinatorlayout/widget/DirectedAcyclicGraph;->dfs(Ljava/lang/Object;Ljava/util/ArrayList;Ljava/util/HashSet;)V
-Landroidx/coordinatorlayout/widget/ViewGroupUtils;
-HSPLandroidx/coordinatorlayout/widget/ViewGroupUtils;->offsetDescendantMatrix(Landroid/view/ViewParent;Landroid/view/View;Landroid/graphics/Matrix;)V
-Landroidx/core/app/ActivityCompat$RequestPermissionsRequestCodeValidator;
-Landroidx/core/app/ComponentActivity;
-HSPLandroidx/core/app/ComponentActivity;-><init>()V
-HSPLandroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V
-Landroidx/core/app/NavUtils;
-HSPLandroidx/core/app/NavUtils;->getParentActivityName(Landroid/content/Context;Landroid/content/ComponentName;)Ljava/lang/String;
-Landroidx/core/app/NotificationManagerCompat;
-HSPLandroidx/core/app/NotificationManagerCompat;-><init>(Landroid/content/Context;)V
-HSPLandroidx/core/app/NotificationManagerCompat;->getNotificationChannel(Ljava/lang/String;)Landroid/app/NotificationChannel;
-Landroidx/core/app/NotificationManagerCompat$Api26Impl;
-HSPLandroidx/core/app/NotificationManagerCompat$Api26Impl;->createNotificationChannel(Landroid/app/NotificationManager;Landroid/app/NotificationChannel;)V
-HSPLandroidx/core/app/NotificationManagerCompat$Api26Impl;->createNotificationChannelGroup(Landroid/app/NotificationManager;Landroid/app/NotificationChannelGroup;)V
-HSPLandroidx/core/app/NotificationManagerCompat$Api26Impl;->deleteNotificationChannel(Landroid/app/NotificationManager;Ljava/lang/String;)V
-HSPLandroidx/core/app/NotificationManagerCompat$Api26Impl;->getNotificationChannel(Landroid/app/NotificationManager;Ljava/lang/String;)Landroid/app/NotificationChannel;
-HSPLandroidx/core/app/NotificationManagerCompat$Api26Impl;->getNotificationChannels(Landroid/app/NotificationManager;)Ljava/util/List;
-Landroidx/core/app/OnMultiWindowModeChangedProvider;
-Landroidx/core/app/OnPictureInPictureModeChangedProvider;
-Landroidx/core/content/ContextCompat;
-HSPLandroidx/core/content/ContextCompat;->getColorStateList(Landroid/content/Context;I)Landroid/content/res/ColorStateList;
-Landroidx/core/content/FileProvider;
-HSPLandroidx/core/content/FileProvider;-><init>()V
-HSPLandroidx/core/content/FileProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V
-HSPLandroidx/core/content/FileProvider;->getPathStrategy(Landroid/content/Context;Ljava/lang/String;)Landroidx/core/content/FileProvider$SimplePathStrategy;
-HSPLandroidx/core/content/FileProvider;->onCreate()Z
-HSPLandroidx/core/content/FileProvider;->parsePathStrategy(Landroid/content/Context;Ljava/lang/String;)Landroidx/core/content/FileProvider$SimplePathStrategy;
-Landroidx/core/content/FileProvider$SimplePathStrategy;
-HSPLandroidx/core/content/FileProvider$SimplePathStrategy;-><init>(Ljava/lang/String;)V
-Landroidx/core/content/OnConfigurationChangedProvider;
-Landroidx/core/content/OnTrimMemoryProvider;
-Landroidx/core/content/res/CamColor;
-Landroidx/core/content/res/CamUtils;
-Landroidx/core/content/res/ColorStateListInflaterCompat;
-HSPLandroidx/core/content/res/ColorStateListInflaterCompat;->createFromXml(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;
-HSPLandroidx/core/content/res/ColorStateListInflaterCompat;->createFromXmlInner(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;
-Landroidx/core/content/res/FontResourcesParserCompat;
-HSPLandroidx/core/content/res/FontResourcesParserCompat;->parse(Landroid/content/res/XmlResourceParser;Landroid/content/res/Resources;)Landroidx/core/content/res/FontResourcesParserCompat$FamilyResourceEntry;
-HSPLandroidx/core/content/res/FontResourcesParserCompat;->readCerts(ILandroid/content/res/Resources;)Ljava/util/List;
-Landroidx/core/content/res/FontResourcesParserCompat$FamilyResourceEntry;
-Landroidx/core/content/res/FontResourcesParserCompat$ProviderResourceEntry;
-HSPLandroidx/core/content/res/FontResourcesParserCompat$ProviderResourceEntry;-><init>(Landroidx/core/provider/FontRequest;IILjava/lang/String;)V
-Landroidx/core/content/res/ResourcesCompat;
-HSPLandroidx/core/content/res/ResourcesCompat;->loadFont(Landroid/content/Context;ILandroid/util/TypedValue;ILandroidx/core/content/res/ResourcesCompat$FontCallback;ZZ)Landroid/graphics/Typeface;
-Landroidx/core/content/res/ResourcesCompat$ColorStateListCacheEntry;
-HSPLandroidx/core/content/res/ResourcesCompat$ColorStateListCacheEntry;-><init>(Landroid/content/res/ColorStateList;Landroid/content/res/Configuration;Landroid/content/res/Resources$Theme;)V
-Landroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey;
-HSPLandroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey;-><init>(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)V
-HSPLandroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey;->equals(Ljava/lang/Object;)Z
-HSPLandroidx/core/content/res/ResourcesCompat$ColorStateListCacheKey;->hashCode()I
-Landroidx/core/content/res/ResourcesCompat$FontCallback;
-HSPLandroidx/core/content/res/ResourcesCompat$FontCallback;-><init>()V
-HSPLandroidx/core/content/res/ResourcesCompat$FontCallback;->callbackFailAsync(I)V
-Landroidx/core/content/res/ResourcesCompat$FontCallback$$ExternalSyntheticLambda1;
-HSPLandroidx/core/content/res/ResourcesCompat$FontCallback$$ExternalSyntheticLambda1;-><init>(Landroidx/core/content/res/ResourcesCompat$FontCallback;I)V
-HSPLandroidx/core/content/res/ResourcesCompat$FontCallback$$ExternalSyntheticLambda1;->run()V
-Landroidx/core/content/res/ViewingConditions;
-Landroidx/core/graphics/ColorUtils;
-HSPLandroidx/core/graphics/ColorUtils;->compositeColors(II)I
-HSPLandroidx/core/graphics/ColorUtils;->setAlphaComponent(II)I
-Landroidx/core/graphics/Insets;
-HSPLandroidx/core/graphics/Insets;-><init>(IIII)V
-HSPLandroidx/core/graphics/Insets;->equals(Ljava/lang/Object;)Z
-HSPLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets;
-Landroidx/core/graphics/TypefaceCompat;
-HSPLandroidx/core/graphics/TypefaceCompat;->createFromResourcesFamilyXml(Landroid/content/Context;Landroidx/core/content/res/FontResourcesParserCompat$FamilyResourceEntry;Landroid/content/res/Resources;ILjava/lang/String;IILandroidx/core/content/res/ResourcesCompat$FontCallback;Z)Landroid/graphics/Typeface;
-HSPLandroidx/core/graphics/TypefaceCompat;->createResourceUid(Landroid/content/res/Resources;ILjava/lang/String;II)Ljava/lang/String;
-Landroidx/core/graphics/TypefaceCompat$ResourcesCallbackAdapter;
-HSPLandroidx/core/graphics/TypefaceCompat$ResourcesCallbackAdapter;-><init>(Landroidx/core/content/res/ResourcesCompat$FontCallback;)V
-HSPLandroidx/core/graphics/TypefaceCompat$ResourcesCallbackAdapter;->onTypefaceRequestFailed(I)V
-HSPLandroidx/core/graphics/TypefaceCompat$ResourcesCallbackAdapter;->onTypefaceRetrieved(Landroid/graphics/Typeface;)V
-Landroidx/core/graphics/TypefaceCompatApi29Impl;
-HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;-><init>()V
-HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->createFromFontInfo(Landroid/content/Context;[Landroidx/core/provider/FontsContractCompat$FontInfo;I)Landroid/graphics/Typeface;
-HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->findBaseFont(Landroid/graphics/fonts/FontFamily;I)Landroid/graphics/fonts/Font;
-HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->getMatchScore(Landroid/graphics/fonts/FontStyle;Landroid/graphics/fonts/FontStyle;)I
-Landroidx/core/graphics/TypefaceCompatBaseImpl;
-HSPLandroidx/core/graphics/TypefaceCompatBaseImpl;-><init>()V
-Landroidx/core/graphics/drawable/RoundedBitmapDrawable;
-HSPLandroidx/core/graphics/drawable/RoundedBitmapDrawable;-><init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;)V
-HSPLandroidx/core/graphics/drawable/RoundedBitmapDrawable;->getIntrinsicHeight()I
-HSPLandroidx/core/graphics/drawable/RoundedBitmapDrawable;->getIntrinsicWidth()I
-HSPLandroidx/core/graphics/drawable/RoundedBitmapDrawable;->getOpacity()I
-HSPLandroidx/core/graphics/drawable/RoundedBitmapDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V
-HSPLandroidx/core/graphics/drawable/RoundedBitmapDrawable;->setCornerRadius(F)V
-Landroidx/core/graphics/drawable/RoundedBitmapDrawable21;
-HSPLandroidx/core/graphics/drawable/RoundedBitmapDrawable21;-><init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;)V
-Landroidx/core/math/MathUtils;
-HSPLandroidx/core/math/MathUtils;->clamp(III)I
-Landroidx/core/os/BuildCompat;
-HSPLandroidx/core/os/BuildCompat;->isAtLeastT()Z
-Landroidx/core/os/LocaleListCompat;
-HSPLandroidx/core/os/LocaleListCompat;-><init>(Landroidx/core/os/LocaleListPlatformWrapper;)V
-HSPLandroidx/core/os/LocaleListCompat;->forLanguageTags(Ljava/lang/String;)Landroidx/core/os/LocaleListCompat;
-Landroidx/core/os/LocaleListCompat$Api21Impl;
-Landroidx/core/os/LocaleListInterface;
-Landroidx/core/os/LocaleListPlatformWrapper;
-HSPLandroidx/core/os/LocaleListPlatformWrapper;-><init>(Ljava/lang/Object;)V
-Landroidx/core/os/TraceCompat;
-Landroidx/core/provider/CallbackWithHandler;
-HSPLandroidx/core/provider/CallbackWithHandler;-><init>(Landroidx/core/graphics/TypefaceCompat$ResourcesCallbackAdapter;Landroid/os/Handler;)V
-HSPLandroidx/core/provider/CallbackWithHandler;->onTypefaceResult(Landroidx/core/provider/FontRequestWorker$TypefaceResult;)V
-Landroidx/core/provider/CallbackWithHandler$1;
-HSPLandroidx/core/provider/CallbackWithHandler$1;-><init>(Landroidx/core/provider/FontsContractCompat$FontRequestCallback;Landroid/graphics/Typeface;)V
-HSPLandroidx/core/provider/CallbackWithHandler$1;->run()V
-Landroidx/core/provider/CallbackWithHandler$2;
-HSPLandroidx/core/provider/CallbackWithHandler$2;-><init>(Landroidx/core/provider/FontsContractCompat$FontRequestCallback;I)V
-HSPLandroidx/core/provider/CallbackWithHandler$2;->run()V
-Landroidx/core/provider/FontProvider;
-HSPLandroidx/core/provider/FontProvider;->getFontFamilyResult(Landroid/content/Context;Landroidx/core/provider/FontRequest;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult;
-Landroidx/core/provider/FontProvider$$ExternalSyntheticLambda0;
-HSPLandroidx/core/provider/FontProvider$$ExternalSyntheticLambda0;-><init>()V
-Landroidx/core/provider/FontRequest;
-HSPLandroidx/core/provider/FontRequest;-><init>(Ljava/lang/String;)V
-HSPLandroidx/core/provider/FontRequest;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V
-Landroidx/core/provider/FontRequest$$ExternalSyntheticOutline0;
-HSPLandroidx/core/provider/FontRequest$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroidx/core/provider/FontRequestWorker;
-HSPLandroidx/core/provider/FontRequestWorker;->getFontSync(Ljava/lang/String;Landroid/content/Context;Landroidx/core/provider/FontRequest;I)Landroidx/core/provider/FontRequestWorker$TypefaceResult;
-HSPLandroidx/core/provider/FontRequestWorker;->requestFontAsync(Landroid/content/Context;Landroidx/core/provider/FontRequest;ILandroidx/core/provider/RequestExecutor$HandlerExecutor;Landroidx/core/provider/CallbackWithHandler;)Landroid/graphics/Typeface;
-Landroidx/core/provider/FontRequestWorker$1;
-HSPLandroidx/core/provider/FontRequestWorker$1;-><init>(Ljava/lang/String;Landroid/content/Context;Landroidx/core/provider/FontRequest;II)V
-HSPLandroidx/core/provider/FontRequestWorker$1;->call()Landroidx/core/provider/FontRequestWorker$TypefaceResult;
-HSPLandroidx/core/provider/FontRequestWorker$1;->call()Ljava/lang/Object;
-Landroidx/core/provider/FontRequestWorker$2;
-HSPLandroidx/core/provider/FontRequestWorker$2;-><init>(ILjava/lang/Object;)V
-HSPLandroidx/core/provider/FontRequestWorker$2;->accept(Landroidx/core/provider/FontRequestWorker$TypefaceResult;)V
-HSPLandroidx/core/provider/FontRequestWorker$2;->accept(Ljava/lang/Object;)V
-Landroidx/core/provider/FontRequestWorker$TypefaceResult;
-HSPLandroidx/core/provider/FontRequestWorker$TypefaceResult;-><init>(I)V
-HSPLandroidx/core/provider/FontRequestWorker$TypefaceResult;-><init>(Landroid/graphics/Typeface;)V
-Landroidx/core/provider/FontsContractCompat$FontFamilyResult;
-HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;-><init>(I[Landroidx/core/provider/FontsContractCompat$FontInfo;)V
-Landroidx/core/provider/FontsContractCompat$FontInfo;
-HSPLandroidx/core/provider/FontsContractCompat$FontInfo;-><init>(Landroid/net/Uri;IIZI)V
-Landroidx/core/provider/FontsContractCompat$FontRequestCallback;
-HSPLandroidx/core/provider/FontsContractCompat$FontRequestCallback;-><init>()V
-Landroidx/core/provider/RequestExecutor$DefaultThreadFactory;
-HSPLandroidx/core/provider/RequestExecutor$DefaultThreadFactory;-><init>()V
-HSPLandroidx/core/provider/RequestExecutor$DefaultThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
-Landroidx/core/provider/RequestExecutor$DefaultThreadFactory$ProcessPriorityThread;
-HSPLandroidx/core/provider/RequestExecutor$DefaultThreadFactory$ProcessPriorityThread;-><init>(Ljava/lang/Runnable;Ljava/lang/String;I)V
-HSPLandroidx/core/provider/RequestExecutor$DefaultThreadFactory$ProcessPriorityThread;->run()V
-Landroidx/core/provider/RequestExecutor$ReplyRunnable;
-HSPLandroidx/core/provider/RequestExecutor$ReplyRunnable;-><init>(Landroid/os/Handler;Landroidx/core/provider/FontRequestWorker$1;Landroidx/core/provider/FontRequestWorker$2;)V
-HSPLandroidx/core/provider/RequestExecutor$ReplyRunnable;-><init>(Landroidx/core/provider/RequestExecutor$ReplyRunnable;Landroidx/core/util/Consumer;Ljava/lang/Object;)V
-HSPLandroidx/core/provider/RequestExecutor$ReplyRunnable;->run()V
-Landroidx/core/text/BidiFormatter;
-HSPLandroidx/core/text/BidiFormatter;-><init>(ZILandroidx/core/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicInternal;)V
-HSPLandroidx/core/text/BidiFormatter;->getInstance()Landroidx/core/text/BidiFormatter;
-Landroidx/core/text/TextDirectionHeuristicsCompat;
-Landroidx/core/text/TextDirectionHeuristicsCompat$FirstStrong;
-HSPLandroidx/core/text/TextDirectionHeuristicsCompat$FirstStrong;-><init>()V
-HSPLandroidx/core/text/TextDirectionHeuristicsCompat$FirstStrong;->checkRtl(Ljava/lang/CharSequence;I)I
-Landroidx/core/text/TextDirectionHeuristicsCompat$TextDirectionAlgorithm;
-Landroidx/core/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicImpl;
-HSPLandroidx/core/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicImpl;-><init>(Landroidx/core/text/TextDirectionHeuristicsCompat$FirstStrong;)V
-HSPLandroidx/core/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicImpl;->isRtl(Ljava/lang/CharSequence;I)Z
-Landroidx/core/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicInternal;
-HSPLandroidx/core/text/TextDirectionHeuristicsCompat$TextDirectionHeuristicInternal;-><init>(Landroidx/core/text/TextDirectionHeuristicsCompat$FirstStrong;Z)V
-Landroidx/core/text/TextUtilsCompat;
-Landroidx/core/util/AtomicFile;
-HSPLandroidx/core/util/AtomicFile;-><init>(Ljava/io/File;)V
-HSPLandroidx/core/util/AtomicFile;->finishWrite(Ljava/io/FileOutputStream;)V
-HSPLandroidx/core/util/AtomicFile;->rename(Ljava/io/File;Ljava/io/File;)V
-HSPLandroidx/core/util/AtomicFile;->startWrite()Ljava/io/FileOutputStream;
-Landroidx/core/util/Consumer;
-Landroidx/core/util/Pools$SimplePool;
-HSPLandroidx/core/util/Pools$SimplePool;-><init>(I)V
-HSPLandroidx/core/util/Pools$SimplePool;->acquire()Ljava/lang/Object;
-HSPLandroidx/core/util/Pools$SimplePool;->release(Ljava/lang/Object;)Z
-Landroidx/core/util/Pools$SynchronizedPool;
-HSPLandroidx/core/util/Pools$SynchronizedPool;-><init>(I)V
-HSPLandroidx/core/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object;
-HSPLandroidx/core/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z
-Landroidx/core/view/AccessibilityDelegateCompat;
-HSPLandroidx/core/view/AccessibilityDelegateCompat;-><init>()V
-HSPLandroidx/core/view/AccessibilityDelegateCompat;-><init>(Landroid/view/View$AccessibilityDelegate;)V
-Landroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;
-HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;-><init>(Landroidx/core/view/AccessibilityDelegateCompat;)V
-Landroidx/core/view/GestureDetectorCompat;
-HSPLandroidx/core/view/GestureDetectorCompat;-><init>(Landroid/content/Context;Landroid/view/GestureDetector$SimpleOnGestureListener;)V
-Landroidx/core/view/GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2;
-HSPLandroidx/core/view/GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2;-><init>(Landroid/content/Context;Landroid/view/GestureDetector$SimpleOnGestureListener;)V
-Landroidx/core/view/KeyEventDispatcher$Component;
-Landroidx/core/view/MenuHost;
-Landroidx/core/view/MenuHostHelper;
-HSPLandroidx/core/view/MenuHostHelper;-><init>(Ljava/lang/Runnable;)V
-Landroidx/core/view/NestedScrollingChild;
-Landroidx/core/view/NestedScrollingChildHelper;
-HSPLandroidx/core/view/NestedScrollingChildHelper;-><init>(Landroid/view/View;)V
-HSPLandroidx/core/view/NestedScrollingChildHelper;->getNestedScrollingParentForType(I)Landroid/view/ViewParent;
-HSPLandroidx/core/view/NestedScrollingChildHelper;->stopNestedScroll(I)V
-Landroidx/core/view/NestedScrollingParent2;
-Landroidx/core/view/NestedScrollingParent3;
-Landroidx/core/view/NestedScrollingParentHelper;
-HSPLandroidx/core/view/NestedScrollingParentHelper;-><init>()V
-Landroidx/core/view/OnApplyWindowInsetsListener;
-Landroidx/core/view/OnReceiveContentViewBehavior;
-Landroidx/core/view/ViewCompat;
-HSPLandroidx/core/view/ViewCompat;->getAccessibilityDelegateInternal(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate;
-HSPLandroidx/core/view/ViewCompat;->notifyViewAccessibilityStateChangedIfNeeded(Landroid/view/View;I)V
-HSPLandroidx/core/view/ViewCompat;->removeActionWithId(Landroid/view/View;I)V
-HSPLandroidx/core/view/ViewCompat;->replaceAccessibilityAction(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;Ljava/lang/String;Landroidx/core/view/accessibility/AccessibilityViewCommand;)V
-HSPLandroidx/core/view/ViewCompat;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V
-HSPLandroidx/core/view/ViewCompat;->setAccessibilityDelegate(Landroid/view/View;Landroidx/core/view/AccessibilityDelegateCompat;)V
-HSPLandroidx/core/view/ViewCompat;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V
-Landroidx/core/view/ViewCompat$$ExternalSyntheticLambda0;
-HSPLandroidx/core/view/ViewCompat$$ExternalSyntheticLambda0;-><init>()V
-Landroidx/core/view/ViewCompat$1;
-HSPLandroidx/core/view/ViewCompat$1;-><init>(IIII)V
-Landroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;
-HSPLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;-><init>()V
-Landroidx/core/view/ViewCompat$AccessibilityViewProperty;
-HSPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;-><init>(ILjava/lang/Class;II)V
-HSPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->get(Landroid/view/View;)Ljava/lang/Object;
-Landroidx/core/view/ViewCompat$Api21Impl$1;
-HSPLandroidx/core/view/ViewCompat$Api21Impl$1;-><init>(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V
-Landroidx/core/view/ViewCompat$Api26Impl;
-HSPLandroidx/core/view/ViewCompat$Api26Impl;->getImportantForAutofill(Landroid/view/View;)I
-HSPLandroidx/core/view/ViewCompat$Api26Impl;->setImportantForAutofill(Landroid/view/View;I)V
-Landroidx/core/view/ViewCompat$Api28Impl;
-HSPLandroidx/core/view/ViewCompat$Api28Impl;->getAccessibilityPaneTitle(Landroid/view/View;)Ljava/lang/CharSequence;
-Landroidx/core/view/ViewCompat$Api29Impl;
-HSPLandroidx/core/view/ViewCompat$Api29Impl;->getAccessibilityDelegate(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate;
-HSPLandroidx/core/view/ViewCompat$Api29Impl;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V
-Landroidx/core/view/ViewConfigurationCompat;
-Landroidx/core/view/ViewConfigurationCompat$Api26Impl;
-HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledHorizontalScrollFactor(Landroid/view/ViewConfiguration;)F
-HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledVerticalScrollFactor(Landroid/view/ViewConfiguration;)F
-Landroidx/core/view/WindowInsetsCompat;
-HSPLandroidx/core/view/WindowInsetsCompat;-><init>()V
-HSPLandroidx/core/view/WindowInsetsCompat;-><init>(Landroid/view/WindowInsets;)V
-HSPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/View;Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat;
-Landroidx/core/view/WindowInsetsCompat$BuilderImpl;
-HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;-><init>()V
-HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;-><init>(Landroidx/core/view/WindowInsetsCompat;)V
-Landroidx/core/view/WindowInsetsCompat$BuilderImpl29;
-HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;-><init>()V
-HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->build()Landroidx/core/view/WindowInsetsCompat;
-Landroidx/core/view/WindowInsetsCompat$Impl;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl;-><init>(Landroidx/core/view/WindowInsetsCompat;)V
-Landroidx/core/view/WindowInsetsCompat$Impl20;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl20;-><init>(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V
-HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->copyRootViewBounds(Landroid/view/View;)V
-HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->getInsets(I)Landroidx/core/graphics/Insets;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->getSystemWindowInsets()Landroidx/core/graphics/Insets;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets()V
-HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V
-Landroidx/core/view/WindowInsetsCompat$Impl21;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl21;-><init>(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V
-HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->getStableInsets()Landroidx/core/graphics/Insets;
-Landroidx/core/view/WindowInsetsCompat$Impl28;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl28;-><init>(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V
-HSPLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat;
-Landroidx/core/view/WindowInsetsCompat$Impl28$$ExternalSyntheticApiModelOutline0;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl28$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/view/DisplayCutout;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl28$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
-Landroidx/core/view/WindowInsetsCompat$Impl29;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl29;-><init>(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V
-Landroidx/core/view/WindowInsetsCompat$Impl29$$ExternalSyntheticApiModelOutline0;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl29$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/WindowInsets$Builder;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl29$$ExternalSyntheticApiModelOutline0;->m()V
-HSPLandroidx/core/view/WindowInsetsCompat$Impl29$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets$Builder;)Landroid/view/WindowInsets;
-HSPLandroidx/core/view/WindowInsetsCompat$Impl29$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/graphics/Insets;
-Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;-><init>(Landroid/view/accessibility/AccessibilityNodeInfo;)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getExtras()Landroid/os/Bundle;
-PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->removeAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setBoundsInParent(Landroid/graphics/Rect;)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/CharSequence;)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setHintText(Ljava/lang/CharSequence;)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScrollable(Z)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setText(Ljava/lang/CharSequence;)V
-Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline0;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V
-Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline1;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline1;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline1;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;
-Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;-><init>(I)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;-><init>(ILjava/lang/Class;)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;-><init>(Ljava/lang/Object;ILjava/lang/String;Landroidx/core/view/accessibility/AccessibilityViewCommand;Ljava/lang/Class;)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->getId()I
-Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline0;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline0;->m$2()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline0;->m$3()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;
-Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat;-><init>()V
-Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi16;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi16;-><init>(Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat;)V
-HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi16;->createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi16;->performAction(IILandroid/os/Bundle;)Z
-Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19;-><init>(Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat;)V
-Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi26;
-HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi26;-><init>(Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat;)V
-Landroidx/core/view/accessibility/AccessibilityViewCommand;
-Landroidx/core/view/accessibility/AccessibilityViewCommand$CommandArguments;
-Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveAtGranularityArguments;
-Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveHtmlArguments;
-Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveWindowArguments;
-Landroidx/core/view/accessibility/AccessibilityViewCommand$ScrollToPositionArguments;
-Landroidx/core/view/accessibility/AccessibilityViewCommand$SetProgressArguments;
-Landroidx/core/view/accessibility/AccessibilityViewCommand$SetSelectionArguments;
-Landroidx/core/view/accessibility/AccessibilityViewCommand$SetTextArguments;
-Landroidx/core/widget/AutoSizeableTextView;
-Landroidx/core/widget/TextViewCompat;
-HSPLandroidx/core/widget/TextViewCompat;->wrapCustomSelectionActionModeCallback(Landroid/view/ActionMode$Callback;Landroid/widget/TextView;)Landroid/view/ActionMode$Callback;
-Landroidx/core/widget/TextViewOnReceiveContentListener;
-HSPLandroidx/core/widget/TextViewOnReceiveContentListener;-><init>()V
-Landroidx/emoji2/text/EmojiCompat;
-Landroidx/emoji2/text/SpannableBuilder;
-HSPLandroidx/emoji2/text/SpannableBuilder;-><init>(Ljava/lang/Class;Ljava/lang/CharSequence;)V
-HSPLandroidx/emoji2/text/SpannableBuilder;->getSpanEnd(Ljava/lang/Object;)I
-HSPLandroidx/emoji2/text/SpannableBuilder;->getSpanFlags(Ljava/lang/Object;)I
-HSPLandroidx/emoji2/text/SpannableBuilder;->getSpanStart(Ljava/lang/Object;)I
-HSPLandroidx/emoji2/text/SpannableBuilder;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;
-HSPLandroidx/emoji2/text/SpannableBuilder;->getWatcherFor(Ljava/lang/Object;)Landroidx/emoji2/text/SpannableBuilder$WatcherWrapper;
-HSPLandroidx/emoji2/text/SpannableBuilder;->isWatcher(Ljava/lang/Object;)Z
-HSPLandroidx/emoji2/text/SpannableBuilder;->nextSpanTransition(IILjava/lang/Class;)I
-HSPLandroidx/emoji2/text/SpannableBuilder;->removeSpan(Ljava/lang/Object;)V
-HSPLandroidx/emoji2/text/SpannableBuilder;->setSpan(Ljava/lang/Object;III)V
-Landroidx/emoji2/text/SpannableBuilder$WatcherWrapper;
-HSPLandroidx/emoji2/text/SpannableBuilder$WatcherWrapper;-><init>(Ljava/lang/Object;)V
-HSPLandroidx/emoji2/text/SpannableBuilder$WatcherWrapper;->onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V
-Landroidx/emoji2/viewsintegration/EmojiEditTextHelper;
-HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;-><init>(Landroid/widget/EditText;)V
-Landroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal;
-HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal;-><init>()V
-Landroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;
-HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;-><init>(Landroid/widget/EditText;)V
-Landroidx/emoji2/viewsintegration/EmojiEditableFactory;
-HSPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;-><init>()V
-HSPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->newEditable(Ljava/lang/CharSequence;)Landroid/text/Editable;
-Landroidx/emoji2/viewsintegration/EmojiInputFilter;
-HSPLandroidx/emoji2/viewsintegration/EmojiInputFilter;-><init>(Landroid/widget/TextView;)V
-Landroidx/emoji2/viewsintegration/EmojiKeyListener;
-HSPLandroidx/emoji2/viewsintegration/EmojiKeyListener;-><init>(Landroid/text/method/KeyListener;)V
-HSPLandroidx/emoji2/viewsintegration/EmojiKeyListener;->getInputType()I
-Landroidx/emoji2/viewsintegration/EmojiKeyListener$EmojiCompatHandleKeyDownHelper;
-HSPLandroidx/emoji2/viewsintegration/EmojiKeyListener$EmojiCompatHandleKeyDownHelper;-><init>()V
-Landroidx/emoji2/viewsintegration/EmojiTextViewHelper;
-HSPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper;-><init>(Landroid/widget/TextView;)V
-Landroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal;
-HSPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal;-><init>()V
-Landroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;
-HSPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$HelperInternal19;-><init>(Landroid/widget/TextView;)V
-Landroidx/emoji2/viewsintegration/EmojiTextViewHelper$SkippingHelper19;
-HSPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$SkippingHelper19;-><init>(Landroid/widget/TextView;)V
-HSPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$SkippingHelper19;->getFilters([Landroid/text/InputFilter;)[Landroid/text/InputFilter;
-HSPLandroidx/emoji2/viewsintegration/EmojiTextViewHelper$SkippingHelper19;->setEnabled(Z)V
-Landroidx/emoji2/viewsintegration/EmojiTextWatcher;
-HSPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;-><init>(Landroid/widget/EditText;)V
-HSPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->afterTextChanged(Landroid/text/Editable;)V
-HSPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->beforeTextChanged(Ljava/lang/CharSequence;III)V
-HSPLandroidx/emoji2/viewsintegration/EmojiTextWatcher;->onTextChanged(Ljava/lang/CharSequence;III)V
-Landroidx/fragment/app/Fragment;
-Landroidx/fragment/app/FragmentActivity;
-HSPLandroidx/fragment/app/FragmentActivity;-><init>()V
-HSPLandroidx/fragment/app/FragmentActivity;->getSupportFragmentManager()Landroidx/fragment/app/FragmentManagerImpl;
-HSPLandroidx/fragment/app/FragmentActivity;->markState(Landroidx/fragment/app/FragmentManagerImpl;)Z
-HSPLandroidx/fragment/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V
-HSPLandroidx/fragment/app/FragmentActivity;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroidx/fragment/app/FragmentActivity;->onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-HSPLandroidx/fragment/app/FragmentActivity;->onDestroy()V
-HSPLandroidx/fragment/app/FragmentActivity;->onPause()V
-HSPLandroidx/fragment/app/FragmentActivity;->onPostResume()V
-HSPLandroidx/fragment/app/FragmentActivity;->onResume()V
-HSPLandroidx/fragment/app/FragmentActivity;->onStart()V
-HSPLandroidx/fragment/app/FragmentActivity;->onStateNotSaved()V
-HSPLandroidx/fragment/app/FragmentActivity;->onStop()V
-Landroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda0;
-HSPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda0;-><init>(Landroidx/fragment/app/FragmentActivity;)V
-Landroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda1;
-HSPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda1;-><init>(Landroidx/fragment/app/FragmentActivity;I)V
-Landroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda2;
-HSPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda2;-><init>(Landroidx/fragment/app/FragmentActivity;)V
-HSPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda2;->onContextAvailable()V
-Landroidx/fragment/app/FragmentActivity$HostCallbacks;
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;-><init>(Landroidx/fragment/app/FragmentActivity;)V
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->addMenuProvider(Landroidx/fragment/app/FragmentManager$2;)V
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->addOnConfigurationChangedListener(Landroidx/core/util/Consumer;)V
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->addOnMultiWindowModeChangedListener(Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;)V
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->addOnPictureInPictureModeChangedListener(Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;)V
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->addOnTrimMemoryListener(Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;)V
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getLifecycle()Landroidx/lifecycle/LifecycleRegistry;
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry;
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getViewModelStore()Landroidx/lifecycle/ViewModelStore;
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->removeMenuProvider(Landroidx/fragment/app/FragmentManager$2;)V
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->removeOnConfigurationChangedListener(Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;)V
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->removeOnMultiWindowModeChangedListener(Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;)V
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->removeOnPictureInPictureModeChangedListener(Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;)V
-HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->removeOnTrimMemoryListener(Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;)V
-Landroidx/fragment/app/FragmentContainer;
-HSPLandroidx/fragment/app/FragmentContainer;-><init>()V
-Landroidx/fragment/app/FragmentContainerView;
-Landroidx/fragment/app/FragmentController;
-HSPLandroidx/fragment/app/FragmentController;-><init>(Landroidx/fragment/app/FragmentActivity$HostCallbacks;)V
-HSPLandroidx/fragment/app/FragmentController;->noteStateNotSaved()V
-Landroidx/fragment/app/FragmentLayoutInflaterFactory;
-HSPLandroidx/fragment/app/FragmentLayoutInflaterFactory;-><init>(Landroidx/fragment/app/FragmentManagerImpl;)V
-HSPLandroidx/fragment/app/FragmentLayoutInflaterFactory;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
-Landroidx/fragment/app/FragmentLayoutInflaterFactory$1;
-Landroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;
-HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;-><init>(Landroidx/fragment/app/FragmentManagerImpl;)V
-Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;
-HSPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;-><init>(Landroidx/fragment/app/FragmentManagerImpl;I)V
-Landroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda1;
-HSPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda1;-><init>(Landroidx/fragment/app/FragmentManagerImpl;)V
-Landroidx/fragment/app/FragmentManager$1;
-HSPLandroidx/fragment/app/FragmentManager$1;-><init>(Landroidx/fragment/app/FragmentManagerImpl;)V
-Landroidx/fragment/app/FragmentManager$2;
-HSPLandroidx/fragment/app/FragmentManager$2;-><init>(Landroidx/fragment/app/FragmentManagerImpl;)V
-Landroidx/fragment/app/FragmentManager$3;
-HSPLandroidx/fragment/app/FragmentManager$3;-><init>(Landroidx/fragment/app/FragmentManagerImpl;)V
-Landroidx/fragment/app/FragmentManager$5;
-HSPLandroidx/fragment/app/FragmentManager$5;-><init>(Landroidx/fragment/app/FragmentManagerImpl;)V
-Landroidx/fragment/app/FragmentManager$8;
-HSPLandroidx/fragment/app/FragmentManager$8;-><init>(Landroidx/fragment/app/FragmentManagerImpl;I)V
-Landroidx/fragment/app/FragmentManager$FragmentIntentSenderContract;
-HSPLandroidx/fragment/app/FragmentManager$FragmentIntentSenderContract;-><init>()V
-Landroidx/fragment/app/FragmentManagerImpl;
-HSPLandroidx/fragment/app/FragmentManagerImpl;-><init>()V
-HSPLandroidx/fragment/app/FragmentManagerImpl;->attachController(Landroidx/fragment/app/FragmentActivity$HostCallbacks;Landroidx/fragment/app/FragmentContainer;Landroidx/fragment/app/Fragment;)V
-HSPLandroidx/fragment/app/FragmentManagerImpl;->collectAllSpecialEffectsController()Ljava/util/HashSet;
-HSPLandroidx/fragment/app/FragmentManagerImpl;->dispatchDestroy()V
-HSPLandroidx/fragment/app/FragmentManagerImpl;->dispatchStateChange(I)V
-HSPLandroidx/fragment/app/FragmentManagerImpl;->doPendingDeferredStart()V
-HSPLandroidx/fragment/app/FragmentManagerImpl;->ensureExecReady(Z)V
-HSPLandroidx/fragment/app/FragmentManagerImpl;->execPendingActions(Z)Z
-HSPLandroidx/fragment/app/FragmentManagerImpl;->isStateSaved()Z
-HSPLandroidx/fragment/app/FragmentManagerImpl;->moveToState(IZ)V
-HSPLandroidx/fragment/app/FragmentManagerImpl;->noteStateNotSaved()V
-HSPLandroidx/fragment/app/FragmentManagerImpl;->startPendingDeferredFragments()V
-HSPLandroidx/fragment/app/FragmentManagerImpl;->updateOnBackPressedCallbackEnabled()V
-Landroidx/fragment/app/FragmentManagerViewModel;
-HSPLandroidx/fragment/app/FragmentManagerViewModel;-><init>(Z)V
-HSPLandroidx/fragment/app/FragmentManagerViewModel;->onCleared()V
-Landroidx/fragment/app/FragmentManagerViewModel$1;
-HSPLandroidx/fragment/app/FragmentManagerViewModel$1;-><init>()V
-HSPLandroidx/fragment/app/FragmentManagerViewModel$1;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel;
-Landroidx/fragment/app/FragmentOnAttachListener;
-Landroidx/fragment/app/FragmentStateManager;
-Landroidx/fragment/app/FragmentStore;
-HSPLandroidx/fragment/app/FragmentStore;-><init>()V
-HSPLandroidx/fragment/app/FragmentStore;->getActiveFragmentStateManagers()Ljava/util/ArrayList;
-HSPLandroidx/fragment/app/FragmentStore;->getFragments()Ljava/util/List;
-Landroidx/fragment/app/strictmode/FragmentStrictMode;
-Landroidx/fragment/app/strictmode/FragmentStrictMode$Flag;
-Landroidx/fragment/app/strictmode/FragmentStrictMode$Policy;
-Landroidx/fragment/app/strictmode/FragmentTagUsageViolation;
-Landroidx/fragment/app/strictmode/Violation;
-Landroidx/interpolator/view/animation/FastOutLinearInInterpolator;
-HSPLandroidx/interpolator/view/animation/FastOutLinearInInterpolator;-><init>()V
-Landroidx/interpolator/view/animation/FastOutSlowInInterpolator;
-HSPLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;-><init>()V
-Landroidx/interpolator/view/animation/LinearOutSlowInInterpolator;
-HSPLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;-><init>()V
-Landroidx/lifecycle/DefaultLifecycleObserver;
-Landroidx/lifecycle/HasDefaultViewModelProviderFactory;
-Landroidx/lifecycle/Lifecycle;
-HSPLandroidx/lifecycle/Lifecycle;-><init>()V
-Landroidx/lifecycle/Lifecycle$Event;
-HSPLandroidx/lifecycle/Lifecycle$Event;-><init>(ILjava/lang/String;)V
-HSPLandroidx/lifecycle/Lifecycle$Event;->getTargetState()Landroidx/lifecycle/Lifecycle$State;
-Landroidx/lifecycle/Lifecycle$State;
-HSPLandroidx/lifecycle/Lifecycle$State;-><init>(ILjava/lang/String;)V
-Landroidx/lifecycle/LifecycleEventObserver;
-Landroidx/lifecycle/LifecycleObserver;
-Landroidx/lifecycle/LifecycleOwner;
-Landroidx/lifecycle/LifecycleRegistry;
-HSPLandroidx/lifecycle/LifecycleRegistry;-><init>(Landroidx/lifecycle/LifecycleOwner;)V
-HSPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V
-HSPLandroidx/lifecycle/LifecycleRegistry;->calculateTargetState(Landroidx/lifecycle/LifecycleObserver;)Landroidx/lifecycle/Lifecycle$State;
-HSPLandroidx/lifecycle/LifecycleRegistry;->enforceMainThreadIfNeeded(Ljava/lang/String;)V
-HSPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V
-HSPLandroidx/lifecycle/LifecycleRegistry;->moveToState(Landroidx/lifecycle/Lifecycle$State;)V
-HSPLandroidx/lifecycle/LifecycleRegistry;->removeObserver(Landroidx/lifecycle/LifecycleObserver;)V
-HSPLandroidx/lifecycle/LifecycleRegistry;->sync()V
-Landroidx/lifecycle/LifecycleRegistry$ObserverWithState;
-HSPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;-><init>(Landroidx/lifecycle/LifecycleObserver;Landroidx/lifecycle/Lifecycle$State;)V
-HSPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->dispatchEvent(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
-Landroidx/lifecycle/Lifecycling;
-Landroidx/lifecycle/ReportFragment;
-HSPLandroidx/lifecycle/ReportFragment;-><init>()V
-HSPLandroidx/lifecycle/ReportFragment;->dispatch(Landroidx/lifecycle/Lifecycle$Event;)V
-HSPLandroidx/lifecycle/ReportFragment;->injectIfNeededIn(Landroid/app/Activity;)V
-HSPLandroidx/lifecycle/ReportFragment;->onActivityCreated(Landroid/os/Bundle;)V
-HSPLandroidx/lifecycle/ReportFragment;->onDestroy()V
-HSPLandroidx/lifecycle/ReportFragment;->onPause()V
-HSPLandroidx/lifecycle/ReportFragment;->onResume()V
-HSPLandroidx/lifecycle/ReportFragment;->onStart()V
-HSPLandroidx/lifecycle/ReportFragment;->onStop()V
-Landroidx/lifecycle/ReportFragment$Companion;
-HSPLandroidx/lifecycle/ReportFragment$Companion;->dispatch$lifecycle_runtime_release(Landroid/app/Activity;Landroidx/lifecycle/Lifecycle$Event;)V
-Landroidx/lifecycle/ReportFragment$LifecycleCallbacks;
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;-><init>()V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostResumed(Landroid/app/Activity;)V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostStarted(Landroid/app/Activity;)V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreDestroyed(Landroid/app/Activity;)V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPrePaused(Landroid/app/Activity;)V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreStopped(Landroid/app/Activity;)V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V
-Landroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion$$ExternalSyntheticApiModelOutline0;
-HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;Landroidx/lifecycle/ReportFragment$LifecycleCallbacks;)V
-Landroidx/lifecycle/SavedStateHandleAttacher;
-HSPLandroidx/lifecycle/SavedStateHandleAttacher;-><init>(Landroidx/lifecycle/SavedStateHandlesProvider;)V
-HSPLandroidx/lifecycle/SavedStateHandleAttacher;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
-Landroidx/lifecycle/SavedStateHandleSupport;
-HSPLandroidx/lifecycle/SavedStateHandleSupport;->enableSavedStateHandles(Landroidx/savedstate/SavedStateRegistryOwner;)V
-Landroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1;
-HSPLandroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1;-><init>()V
-Landroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;
-HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;-><init>()V
-HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
-Landroidx/lifecycle/SavedStateHandlesProvider;
-HSPLandroidx/lifecycle/SavedStateHandlesProvider;-><init>(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/ViewModelStoreOwner;)V
-Landroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;
-HSPLandroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;-><init>(Landroidx/lifecycle/ViewModelStoreOwner;)V
-HSPLandroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;->invoke()Ljava/lang/Object;
-Landroidx/lifecycle/SavedStateHandlesVM;
-HSPLandroidx/lifecycle/SavedStateHandlesVM;-><init>()V
-Landroidx/lifecycle/ViewModel;
-HSPLandroidx/lifecycle/ViewModel;-><init>()V
-HSPLandroidx/lifecycle/ViewModel;->onCleared()V
-Landroidx/lifecycle/ViewModelProvider;
-HSPLandroidx/lifecycle/ViewModelProvider;-><init>(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;)V
-HSPLandroidx/lifecycle/ViewModelProvider;-><init>(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;)V
-HSPLandroidx/lifecycle/ViewModelProvider;->get(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel;
-HSPLandroidx/lifecycle/ViewModelProvider;->get(Ljava/lang/Class;Ljava/lang/String;)Landroidx/lifecycle/ViewModel;
-Landroidx/lifecycle/ViewModelProvider$Factory;
-HSPLandroidx/lifecycle/ViewModelProvider$Factory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel;
-Landroidx/lifecycle/ViewModelProvider$NewInstanceFactory$Companion$ViewModelKeyImpl;
-HSPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory$Companion$ViewModelKeyImpl;-><init>()V
-Landroidx/lifecycle/ViewModelStore;
-HSPLandroidx/lifecycle/ViewModelStore;-><init>()V
-HSPLandroidx/lifecycle/ViewModelStore;->clear()V
-Landroidx/lifecycle/ViewModelStoreOwner;
-Landroidx/lifecycle/ViewTreeLifecycleOwner;
-HSPLandroidx/lifecycle/ViewTreeLifecycleOwner;->set(Landroid/view/View;Landroidx/lifecycle/LifecycleOwner;)V
-Landroidx/lifecycle/viewmodel/CreationExtras;
-HSPLandroidx/lifecycle/viewmodel/CreationExtras;-><init>()V
-Landroidx/lifecycle/viewmodel/CreationExtras$Empty;
-HSPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;-><init>()V
-Landroidx/lifecycle/viewmodel/InitializerViewModelFactory;
-HSPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;-><init>([Landroidx/lifecycle/viewmodel/ViewModelInitializer;)V
-HSPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel;
-Landroidx/lifecycle/viewmodel/MutableCreationExtras;
-HSPLandroidx/lifecycle/viewmodel/MutableCreationExtras;-><init>()V
-HSPLandroidx/lifecycle/viewmodel/MutableCreationExtras;-><init>(Landroidx/lifecycle/viewmodel/CreationExtras;)V
-Landroidx/lifecycle/viewmodel/ViewModelInitializer;
-HSPLandroidx/lifecycle/viewmodel/ViewModelInitializer;-><init>(Ljava/lang/Class;)V
-Landroidx/mediarouter/media/MediaRouter;
-HSPLandroidx/mediarouter/media/MediaRouter;-><init>(Landroid/content/Context;)V
-HSPLandroidx/mediarouter/media/MediaRouter;->checkCallingThread()V
-HSPLandroidx/mediarouter/media/MediaRouter;->getInstance(Landroid/content/Context;)Landroidx/mediarouter/media/MediaRouter;
-Landroidx/mediarouter/media/MediaRouter$GlobalMediaRouter;
-HSPLandroidx/mediarouter/media/MediaRouter$GlobalMediaRouter;-><init>(Landroid/content/Context;)V
-Landroidx/mediarouter/media/MediaRouter$GlobalMediaRouter$3;
-HSPLandroidx/mediarouter/media/MediaRouter$GlobalMediaRouter$3;-><init>(Landroidx/mediarouter/media/MediaRouter$GlobalMediaRouter;I)V
-HSPLandroidx/mediarouter/media/MediaRouter$GlobalMediaRouter$3;-><init>(Ljava/lang/Object;)V
-Landroidx/mediarouter/media/MediaRouter$GlobalMediaRouter$CallbackHandler;
-HSPLandroidx/mediarouter/media/MediaRouter$GlobalMediaRouter$CallbackHandler;-><init>(Landroidx/mediarouter/media/MediaRouter$GlobalMediaRouter;)V
-Landroidx/mediarouter/media/RemoteControlClientCompat$PlaybackInfo;
-HSPLandroidx/mediarouter/media/RemoteControlClientCompat$PlaybackInfo;-><init>()V
-Landroidx/mediarouter/media/SystemMediaRouteProvider$SyncCallback;
-Landroidx/recyclerview/widget/AdapterHelper;
-HSPLandroidx/recyclerview/widget/AdapterHelper;-><init>(Landroidx/recyclerview/widget/RecyclerView$4;)V
-HSPLandroidx/recyclerview/widget/AdapterHelper;->consumePostponedUpdates()V
-HSPLandroidx/recyclerview/widget/AdapterHelper;->consumeUpdatesInOnePass()V
-HSPLandroidx/recyclerview/widget/AdapterHelper;->preProcess()V
-HSPLandroidx/recyclerview/widget/AdapterHelper;->recycleUpdateOpsAndClearList(Ljava/util/ArrayList;)V
-Landroidx/recyclerview/widget/ChildHelper;
-HSPLandroidx/recyclerview/widget/ChildHelper;-><init>(Landroidx/recyclerview/widget/RecyclerView$4;)V
-HSPLandroidx/recyclerview/widget/ChildHelper;->getChildCount()I
-HSPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildCount()I
-Landroidx/recyclerview/widget/ChildHelper$Bucket;
-HSPLandroidx/recyclerview/widget/ChildHelper$Bucket;-><init>()V
-HSPLandroidx/recyclerview/widget/ChildHelper$Bucket;->reset()V
-Landroidx/recyclerview/widget/DefaultItemAnimator;
-HSPLandroidx/recyclerview/widget/DefaultItemAnimator;-><init>()V
-HSPLandroidx/recyclerview/widget/DefaultItemAnimator;->endAnimations()V
-HSPLandroidx/recyclerview/widget/DefaultItemAnimator;->isRunning()Z
-Landroidx/recyclerview/widget/GapWorker;
-HSPLandroidx/recyclerview/widget/GapWorker;-><init>()V
-Landroidx/recyclerview/widget/GapWorker$1;
-HSPLandroidx/recyclerview/widget/GapWorker$1;-><init>()V
-Landroidx/recyclerview/widget/GapWorker$LayoutPrefetchRegistryImpl;
-HSPLandroidx/recyclerview/widget/GapWorker$LayoutPrefetchRegistryImpl;-><init>()V
-Landroidx/recyclerview/widget/GridLayoutManager;
-HSPLandroidx/recyclerview/widget/GridLayoutManager;-><init>(I)V
-HSPLandroidx/recyclerview/widget/GridLayoutManager;->generateLayoutParams(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams;
-HSPLandroidx/recyclerview/widget/GridLayoutManager;->setSpanCount(I)V
-Landroidx/recyclerview/widget/GridLayoutManager$DefaultSpanSizeLookup;
-HSPLandroidx/recyclerview/widget/GridLayoutManager$DefaultSpanSizeLookup;-><init>()V
-Landroidx/recyclerview/widget/GridLayoutManager$LayoutParams;
-HSPLandroidx/recyclerview/widget/GridLayoutManager$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Landroidx/recyclerview/widget/GridLayoutManager$SpanSizeLookup;
-HSPLandroidx/recyclerview/widget/GridLayoutManager$SpanSizeLookup;-><init>()V
-HSPLandroidx/recyclerview/widget/GridLayoutManager$SpanSizeLookup;->invalidateSpanIndexCache()V
-Landroidx/recyclerview/widget/ItemTouchHelper;
-HSPLandroidx/recyclerview/widget/ItemTouchHelper;-><init>(Landroidx/recyclerview/widget/ItemTouchHelper$Callback;)V
-HSPLandroidx/recyclerview/widget/ItemTouchHelper;->attachToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V
-Landroidx/recyclerview/widget/ItemTouchHelper$1;
-HSPLandroidx/recyclerview/widget/ItemTouchHelper$1;-><init>(Landroidx/recyclerview/widget/ItemTouchHelper;)V
-Landroidx/recyclerview/widget/ItemTouchHelper$2;
-HSPLandroidx/recyclerview/widget/ItemTouchHelper$2;-><init>(Landroidx/recyclerview/widget/ItemTouchHelper;)V
-Landroidx/recyclerview/widget/ItemTouchHelper$Callback;
-HSPLandroidx/recyclerview/widget/ItemTouchHelper$Callback;-><init>()V
-Landroidx/recyclerview/widget/ItemTouchHelper$Callback$1;
-HSPLandroidx/recyclerview/widget/ItemTouchHelper$Callback$1;-><init>(I)V
-Landroidx/recyclerview/widget/ItemTouchHelper$ItemTouchHelperGestureListener;
-HSPLandroidx/recyclerview/widget/ItemTouchHelper$ItemTouchHelperGestureListener;-><init>(Landroidx/recyclerview/widget/ItemTouchHelper;)V
-Landroidx/recyclerview/widget/ItemTouchHelper$SimpleCallback;
-HSPLandroidx/recyclerview/widget/ItemTouchHelper$SimpleCallback;-><init>()V
-Landroidx/recyclerview/widget/LinearLayoutManager;
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;-><init>(I)V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->assertNotInLayoutOrScroll(Ljava/lang/String;)V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->calculateExtraLayoutSpace(Landroidx/recyclerview/widget/RecyclerView$State;[I)V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollHorizontally()Z
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->ensureLayoutState()V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->fill(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;Landroidx/recyclerview/widget/RecyclerView$State;Z)I
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->isAutoMeasureEnabled()Z
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->isLayoutRTL()Z
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onAnchorReady(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;I)V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;)V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveShouldLayoutReverse()V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->setOrientation(I)V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->shouldMeasureTwice()Z
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->supportsPredictiveItemAnimations()Z
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillEnd(II)V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillStart(II)V
-Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;
-HSPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;-><init>()V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->assignCoordinateFromPadding()V
-HSPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->reset()V
-Landroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;
-HSPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;-><init>()V
-Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;
-HSPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;-><init>()V
-Landroidx/recyclerview/widget/OpReorderer;
-HSPLandroidx/recyclerview/widget/OpReorderer;-><init>(Landroidx/recyclerview/widget/AdapterHelper;)V
-Landroidx/recyclerview/widget/OrientationHelper;
-HSPLandroidx/recyclerview/widget/OrientationHelper;-><init>(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V
-HSPLandroidx/recyclerview/widget/OrientationHelper;->createOrientationHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)Landroidx/recyclerview/widget/OrientationHelper$1;
-Landroidx/recyclerview/widget/OrientationHelper$1;
-HSPLandroidx/recyclerview/widget/OrientationHelper$1;-><init>(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)V
-HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getEnd()I
-HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndAfterPadding()I
-HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getMode()I
-HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getStartAfterPadding()I
-HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getTotalSpace()I
-Landroidx/recyclerview/widget/RecyclerView;
-HSPLandroidx/recyclerview/widget/RecyclerView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLandroidx/recyclerview/widget/RecyclerView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->addItemDecoration(Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->addOnChildAttachStateChangeListener(Landroidx/recyclerview/widget/RecyclerView$OnChildAttachStateChangeListener;)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->addOnScrollListener(Landroidx/recyclerview/widget/RecyclerView$OnScrollListener;)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->assertNotInLayoutOrScroll(Ljava/lang/String;)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->clearOldPositions()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollOffset()I
-HSPLandroidx/recyclerview/widget/RecyclerView;->defaultOnMeasure(II)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayout()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep1()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep2()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->fillRemainingScrollValues(Landroidx/recyclerview/widget/RecyclerView$State;)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->findMinMaxChildLayoutPositions([I)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
-HSPLandroidx/recyclerview/widget/RecyclerView;->getScrollingChildHelper()Landroidx/core/view/NestedScrollingChildHelper;
-HSPLandroidx/recyclerview/widget/RecyclerView;->isAttachedToWindow()Z
-HSPLandroidx/recyclerview/widget/RecyclerView;->isComputingLayout()Z
-HSPLandroidx/recyclerview/widget/RecyclerView;->markItemDecorInsetsDirty()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->onAttachedToWindow()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->onDetachedFromWindow()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->onEnterLayoutOrScroll()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->onExitLayoutOrScroll(Z)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->onLayout(ZIIII)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->onMeasure(II)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->onSizeChanged(IIII)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->processAdapterUpdatesAndSetAnimationFlags()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->processDataSetCompletelyChanged(Z)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->removeItemDecoration(Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->removeOnScrollListener(Landroidx/recyclerview/widget/RecyclerView$OnScrollListener;)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->requestLayout()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->setAdapter(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->setClipToPadding(Z)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->setLayoutManager(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->setNestedScrollingEnabled(Z)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->setScrollState(I)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->startInterceptRequestLayout()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->stopInterceptRequestLayout(Z)V
-HSPLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll()V
-HSPLandroidx/recyclerview/widget/RecyclerView;->suppressLayout(Z)V
-Landroidx/recyclerview/widget/RecyclerView$1;
-HSPLandroidx/recyclerview/widget/RecyclerView$1;-><init>(ILandroidx/recyclerview/widget/RecyclerView;)V
-Landroidx/recyclerview/widget/RecyclerView$3;
-HSPLandroidx/recyclerview/widget/RecyclerView$3;-><init>()V
-Landroidx/recyclerview/widget/RecyclerView$4;
-HSPLandroidx/recyclerview/widget/RecyclerView$4;-><init>(Landroidx/recyclerview/widget/RecyclerView;)V
-HSPLandroidx/recyclerview/widget/RecyclerView$4;->getChildCount()I
-Landroidx/recyclerview/widget/RecyclerView$Adapter;
-HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;-><init>()V
-HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V
-HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->registerAdapterDataObserver(Landroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;)V
-Landroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;
-HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;-><init>()V
-Landroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;
-HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;-><init>()V
-Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;
-HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;-><init>()V
-Landroidx/recyclerview/widget/RecyclerView$LayoutManager;
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;-><init>()V
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->chooseSize(III)I
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachAndScrapAttachedViews(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildCount()I
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLayoutDirection()I
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingLeft()I
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingRight()I
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleScrapInt(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->requestLayout()V
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setExactMeasureSpecsFrom(Landroidx/recyclerview/widget/RecyclerView;)V
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasureSpecs(II)V
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasuredDimensionFromChildren(II)V
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V
-Landroidx/recyclerview/widget/RecyclerView$LayoutManager$1;
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;-><init>(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)V
-Landroidx/recyclerview/widget/RecyclerView$LayoutParams;
-HSPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Landroidx/recyclerview/widget/RecyclerView$OnChildAttachStateChangeListener;
-Landroidx/recyclerview/widget/RecyclerView$OnItemTouchListener;
-Landroidx/recyclerview/widget/RecyclerView$OnScrollListener;
-HSPLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;-><init>()V
-Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool;
-HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;-><init>()V
-HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->clear()V
-Landroidx/recyclerview/widget/RecyclerView$Recycler;
-HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;-><init>(Landroidx/recyclerview/widget/RecyclerView;)V
-HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getRecycledViewPool()Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool;
-HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->maybeSendPoolingContainerAttach()V
-HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->poolingContainerDetach(Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V
-HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleAndClearCachedViews()V
-HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->updateViewCacheSize()V
-Landroidx/recyclerview/widget/RecyclerView$RecyclerListener;
-Landroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;
-HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;-><init>(Landroidx/recyclerview/widget/RecyclerView;)V
-Landroidx/recyclerview/widget/RecyclerView$SmoothScroller$ScrollVectorProvider;
-Landroidx/recyclerview/widget/RecyclerView$State;
-HSPLandroidx/recyclerview/widget/RecyclerView$State;-><init>()V
-HSPLandroidx/recyclerview/widget/RecyclerView$State;->assertLayoutStep(I)V
-HSPLandroidx/recyclerview/widget/RecyclerView$State;->getItemCount()I
-Landroidx/recyclerview/widget/RecyclerView$StretchEdgeEffectFactory;
-HSPLandroidx/recyclerview/widget/RecyclerView$StretchEdgeEffectFactory;-><init>()V
-Landroidx/recyclerview/widget/RecyclerView$ViewFlinger;
-HSPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;-><init>(Landroidx/recyclerview/widget/RecyclerView;)V
-Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;
-HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;-><init>(Landroidx/recyclerview/widget/RecyclerView;)V
-HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->getItemDelegate()Landroidx/core/view/AccessibilityDelegateCompat;
-Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;
-HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;-><init>(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V
-Landroidx/recyclerview/widget/SimpleItemAnimator;
-HSPLandroidx/recyclerview/widget/SimpleItemAnimator;-><init>()V
-Landroidx/recyclerview/widget/ViewBoundsCheck;
-HSPLandroidx/recyclerview/widget/ViewBoundsCheck;-><init>(Landroidx/recyclerview/widget/RecyclerView$LayoutManager$1;)V
-Landroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;
-HSPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;-><init>()V
-Landroidx/recyclerview/widget/ViewBoundsCheck$Callback;
-Landroidx/recyclerview/widget/ViewInfoStore;
-HSPLandroidx/recyclerview/widget/ViewInfoStore;-><init>()V
-Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord;
-Landroidx/savedstate/Recreator;
-HSPLandroidx/savedstate/Recreator;-><init>(Landroidx/savedstate/SavedStateRegistryOwner;)V
-HSPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
-Landroidx/savedstate/SavedStateRegistry;
-HSPLandroidx/savedstate/SavedStateRegistry;-><init>()V
-HSPLandroidx/savedstate/SavedStateRegistry;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle;
-HSPLandroidx/savedstate/SavedStateRegistry;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V
-Landroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;
-HSPLandroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;-><init>(Landroidx/savedstate/SavedStateRegistry;)V
-HSPLandroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
-Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;
-Landroidx/savedstate/SavedStateRegistryController;
-HSPLandroidx/savedstate/SavedStateRegistryController;-><init>(Landroidx/savedstate/SavedStateRegistryOwner;)V
-HSPLandroidx/savedstate/SavedStateRegistryController;->performAttach()V
-HSPLandroidx/savedstate/SavedStateRegistryController;->performRestore(Landroid/os/Bundle;)V
-Landroidx/savedstate/SavedStateRegistryOwner;
-Landroidx/savedstate/ViewTreeSavedStateRegistryOwner;
-HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner;->set(Landroid/view/View;Landroidx/savedstate/SavedStateRegistryOwner;)V
-Landroidx/vectordrawable/graphics/drawable/VectorDrawableCommon;
-Landroidx/vectordrawable/graphics/drawable/VectorDrawableCompat;
-Landroidx/viewpager/widget/ViewPager$OnPageChangeListener;
-Lcom/google/android/aidl/BaseStub;
-HSPLcom/google/android/aidl/BaseStub;-><init>(Ljava/lang/String;)V
-Lcom/google/android/apps/chrome/appwidget/bookmarks/BookmarkThumbnailWidgetProvider;
-HSPLcom/google/android/apps/chrome/appwidget/bookmarks/BookmarkThumbnailWidgetProvider;-><init>()V
-HSPLcom/google/android/apps/chrome/appwidget/bookmarks/BookmarkThumbnailWidgetProvider;->getBookmarkAppWidgetUpdateAction(Landroid/content/Context;)Ljava/lang/String;
-HSPLcom/google/android/apps/chrome/appwidget/bookmarks/BookmarkThumbnailWidgetProvider;->onReceive$org$chromium$chrome$browser$bookmarkswidget$BookmarkWidgetProvider(Landroid/content/Context;Landroid/content/Intent;)V
-HSPLcom/google/android/apps/chrome/appwidget/bookmarks/BookmarkThumbnailWidgetProvider;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-HSPLcom/google/android/apps/chrome/appwidget/bookmarks/BookmarkThumbnailWidgetProvider;->performUpdate(Landroid/content/Context;Landroid/appwidget/AppWidgetManager;[I)V
-Lcom/google/android/datatransport/runtime/TransportImpl$$ExternalSyntheticLambda0;
-HSPLcom/google/android/datatransport/runtime/TransportImpl$$ExternalSyntheticLambda0;-><init>()V
-Lcom/google/android/gms/auth/GoogleAuthException;
-Lcom/google/android/gms/cast/Cast$Listener;
-HSPLcom/google/android/gms/cast/Cast$Listener;-><init>()V
-Lcom/google/android/gms/cast/framework/SessionManagerListener;
-Lcom/google/android/gms/cast/framework/media/RemoteMediaClient$Callback;
-HSPLcom/google/android/gms/cast/framework/media/RemoteMediaClient$Callback;-><init>()V
-Lcom/google/android/gms/common/GoogleApiAvailability;
-HSPLcom/google/android/gms/common/GoogleApiAvailability;-><init>()V
-HSPLcom/google/android/gms/common/GoogleApiAvailability;->isGooglePlayServicesAvailable(Landroid/content/Context;I)I
-Lcom/google/android/gms/common/GoogleApiAvailability$$ExternalSyntheticApiModelOutline0;
-HSPLcom/google/android/gms/common/GoogleApiAvailability$$ExternalSyntheticApiModelOutline0;->m()V
-Lcom/google/android/gms/common/GoogleApiAvailabilityLight;
-HSPLcom/google/android/gms/common/GoogleApiAvailabilityLight;-><init>()V
-HSPLcom/google/android/gms/common/GoogleApiAvailabilityLight;->isGooglePlayServicesAvailable(Landroid/content/Context;I)I
-Lcom/google/android/gms/common/GoogleCertificates;
-Lcom/google/android/gms/common/GoogleCertificates$1;
-HSPLcom/google/android/gms/common/GoogleCertificates$1;-><init>(I[B)V
-Lcom/google/android/gms/common/GoogleCertificates$CertData;
-HSPLcom/google/android/gms/common/GoogleCertificates$CertData;-><init>([B)V
-HSPLcom/google/android/gms/common/GoogleCertificates$CertData;->equals(Ljava/lang/Object;)Z
-HSPLcom/google/android/gms/common/GoogleCertificates$CertData;->extractBytes(Ljava/lang/String;)[B
-Lcom/google/android/gms/common/GoogleCertificates$FullCertData;
-HSPLcom/google/android/gms/common/GoogleCertificates$FullCertData;-><init>([B)V
-HSPLcom/google/android/gms/common/GoogleCertificates$FullCertData;->getBytes()[B
-Lcom/google/android/gms/common/GoogleCertificates$LazyCertData;
-HSPLcom/google/android/gms/common/GoogleCertificates$LazyCertData;-><init>([B)V
-HSPLcom/google/android/gms/common/GoogleCertificates$LazyCertData;->getBytes()[B
-Lcom/google/android/gms/common/GoogleCertificates$VALID_PUBLIC_SIGNATURES;
-Lcom/google/android/gms/common/GooglePlayServicesUtilLight;
-Lcom/google/android/gms/common/GoogleSignatureVerifier;
-HSPLcom/google/android/gms/common/GoogleSignatureVerifier;-><init>(Landroid/content/Context;)V
-HSPLcom/google/android/gms/common/GoogleSignatureVerifier;->isGooglePublicSignedPackage(Landroid/content/pm/PackageInfo;)Z
-HSPLcom/google/android/gms/common/GoogleSignatureVerifier;->verifySignature(Landroid/content/pm/PackageInfo;[Lcom/google/android/gms/common/GoogleCertificates$CertData;)Lcom/google/android/gms/common/GoogleCertificates$CertData;
-Lcom/google/android/gms/common/api/internal/RegistrationMethods$Builder$$ExternalSyntheticLambda0;
-HSPLcom/google/android/gms/common/api/internal/RegistrationMethods$Builder$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/google/android/gms/common/api/internal/RegistrationMethods$Builder$$ExternalSyntheticLambda0;->run()V
-Lcom/google/android/gms/common/internal/ICertData;
-Lcom/google/android/gms/common/internal/ICertData$Stub;
-HSPLcom/google/android/gms/common/internal/ICertData$Stub;-><init>()V
-Lcom/google/android/gms/common/internal/MetadataValueReader;
-Lcom/google/android/gms/common/util/DeviceProperties;
-HSPLcom/google/android/gms/common/util/DeviceProperties;->isWearableWithoutPlayStore(Landroid/content/Context;)Z
-Lcom/google/android/gms/common/util/ProcessUtils$$ExternalSyntheticApiModelOutline0;
-HSPLcom/google/android/gms/common/util/ProcessUtils$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/String;
-Lcom/google/android/gms/common/wrappers/PackageManagerWrapper;
-HSPLcom/google/android/gms/common/wrappers/PackageManagerWrapper;-><init>(Landroid/content/Context;)V
-HSPLcom/google/android/gms/common/wrappers/PackageManagerWrapper;->getApplicationInfo(ILjava/lang/String;)Landroid/content/pm/ApplicationInfo;
-Lcom/google/android/gms/common/wrappers/Wrappers;
-HSPLcom/google/android/gms/common/wrappers/Wrappers;-><init>()V
-HSPLcom/google/android/gms/common/wrappers/Wrappers;->packageManager(Landroid/content/Context;)Lcom/google/android/gms/common/wrappers/PackageManagerWrapper;
-Lcom/google/android/gms/dynamic/IObjectWrapper;
-Lcom/google/android/gms/dynamic/IObjectWrapper$Stub;
-HSPLcom/google/android/gms/dynamic/IObjectWrapper$Stub;-><init>()V
-Lcom/google/android/gms/dynamic/ObjectWrapper;
-HSPLcom/google/android/gms/dynamic/ObjectWrapper;-><init>(Ljava/lang/Object;)V
-HSPLcom/google/android/gms/dynamic/ObjectWrapper;->unwrap(Lcom/google/android/gms/dynamic/IObjectWrapper;)Ljava/lang/Object;
-Lcom/google/android/material/animation/AnimationUtils;
-Lcom/google/android/material/appbar/AppBarLayout;
-HSPLcom/google/android/material/appbar/AppBarLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLcom/google/android/material/appbar/AppBarLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
-HSPLcom/google/android/material/appbar/AppBarLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;
-HSPLcom/google/android/material/appbar/AppBarLayout;->setOrientation(I)V
-Lcom/google/android/material/appbar/AppBarLayout$$ExternalSyntheticApiModelOutline0;
-HSPLcom/google/android/material/appbar/AppBarLayout$$ExternalSyntheticApiModelOutline0;->m(Lcom/google/android/material/appbar/AppBarLayout;Z)V
-Lcom/google/android/material/appbar/AppBarLayout$$ExternalSyntheticLambda1;
-HSPLcom/google/android/material/appbar/AppBarLayout$$ExternalSyntheticLambda1;-><init>(Lcom/google/android/material/appbar/AppBarLayout;Lcom/google/android/material/shape/MaterialShapeDrawable;I)V
-Lcom/google/android/material/appbar/AppBarLayout$1;
-HSPLcom/google/android/material/appbar/AppBarLayout$1;-><init>(Lcom/google/android/material/appbar/AppBarLayout;)V
-Lcom/google/android/material/appbar/AppBarLayout$BaseOnOffsetChangedListener;
-Lcom/google/android/material/appbar/AppBarLayout$Behavior;
-HSPLcom/google/android/material/appbar/AppBarLayout$Behavior;-><init>()V
-Lcom/google/android/material/appbar/AppBarLayout$Behavior$DragCallback;
-HSPLcom/google/android/material/appbar/AppBarLayout$Behavior$DragCallback;-><init>()V
-Lcom/google/android/material/appbar/AppBarLayout$LayoutParams;
-HSPLcom/google/android/material/appbar/AppBarLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Lcom/google/android/material/appbar/AppBarLayout$OnOffsetChangedListener;
-Lcom/google/android/material/appbar/AppBarLayout$ScrollingViewBehavior;
-HSPLcom/google/android/material/appbar/AppBarLayout$ScrollingViewBehavior;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Lcom/google/android/material/appbar/HeaderBehavior;
-HSPLcom/google/android/material/appbar/HeaderBehavior;-><init>()V
-Lcom/google/android/material/appbar/ViewOffsetBehavior;
-HSPLcom/google/android/material/appbar/ViewOffsetBehavior;-><init>()V
-HSPLcom/google/android/material/appbar/ViewOffsetBehavior;-><init>(I)V
-Lcom/google/android/material/appbar/ViewUtilsLollipop;
-Lcom/google/android/material/color/DynamicColors;
-HSPLcom/google/android/material/color/DynamicColors;->isDynamicColorAvailable()Z
-Lcom/google/android/material/color/DynamicColors$1;
-HSPLcom/google/android/material/color/DynamicColors$1;-><init>()V
-Lcom/google/android/material/color/DynamicColors$2;
-HSPLcom/google/android/material/color/DynamicColors$2;-><init>()V
-Lcom/google/android/material/color/DynamicColors$DeviceSupportCondition;
-Lcom/google/android/material/color/MaterialColors;
-HSPLcom/google/android/material/color/MaterialColors;->getColor(ILandroid/content/Context;Ljava/lang/String;)I
-HSPLcom/google/android/material/color/MaterialColors;->getColor(Landroid/content/Context;II)I
-HSPLcom/google/android/material/color/MaterialColors;->getColor(Landroid/view/View;I)I
-HSPLcom/google/android/material/color/MaterialColors;->layer(FII)I
-Lcom/google/android/material/elevation/ElevationOverlayProvider;
-HSPLcom/google/android/material/elevation/ElevationOverlayProvider;-><init>(Landroid/content/Context;)V
-HSPLcom/google/android/material/elevation/ElevationOverlayProvider;-><init>(ZIIIF)V
-HSPLcom/google/android/material/elevation/ElevationOverlayProvider;->compositeOverlay(IF)I
-HSPLcom/google/android/material/elevation/ElevationOverlayProvider;->compositeOverlayIfNeeded(IF)I
-Lcom/google/android/material/internal/ThemeEnforcement;
-HSPLcom/google/android/material/internal/ThemeEnforcement;->checkCompatibleTheme(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HSPLcom/google/android/material/internal/ThemeEnforcement;->checkTextAppearance(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)V
-HSPLcom/google/android/material/internal/ThemeEnforcement;->checkTheme(Landroid/content/Context;[ILjava/lang/String;)V
-HSPLcom/google/android/material/internal/ThemeEnforcement;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Landroid/content/res/TypedArray;
-Lcom/google/android/material/motion/MotionUtils;
-HSPLcom/google/android/material/motion/MotionUtils;->resolveThemeDuration(Landroid/content/Context;II)I
-HSPLcom/google/android/material/motion/MotionUtils;->resolveThemeInterpolator(Landroid/content/Context;ILandroid/view/animation/Interpolator;)Landroid/animation/TimeInterpolator;
-Lcom/google/android/material/resources/MaterialAttributes;
-HSPLcom/google/android/material/resources/MaterialAttributes;->resolve(Landroid/content/Context;I)Landroid/util/TypedValue;
-HSPLcom/google/android/material/resources/MaterialAttributes;->resolveTypedValueOrThrow(ILandroid/content/Context;Ljava/lang/String;)Landroid/util/TypedValue;
-Lcom/google/android/material/resources/MaterialResources;
-HSPLcom/google/android/material/resources/MaterialResources;->getColorStateList(Landroid/content/Context;Landroid/content/res/TypedArray;I)Landroid/content/res/ColorStateList;
-Lcom/google/android/material/shadow/ShadowRenderer;
-HSPLcom/google/android/material/shadow/ShadowRenderer;-><init>()V
-HSPLcom/google/android/material/shadow/ShadowRenderer;->setShadowColor(I)V
-Lcom/google/android/material/shape/AbsoluteCornerSize;
-HSPLcom/google/android/material/shape/AbsoluteCornerSize;-><init>(F)V
-Lcom/google/android/material/shape/CornerSize;
-Lcom/google/android/material/shape/CornerTreatment;
-HSPLcom/google/android/material/shape/CornerTreatment;-><init>()V
-Lcom/google/android/material/shape/EdgeTreatment;
-HSPLcom/google/android/material/shape/EdgeTreatment;-><init>()V
-Lcom/google/android/material/shape/MaterialShapeDrawable;
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;-><init>()V
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;-><init>(Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;)V
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;-><init>(Lcom/google/android/material/shape/ShapeAppearanceModel;)V
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->calculateTintFilter(Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;Landroid/graphics/Paint;Z)Landroid/graphics/PorterDuffColorFilter;
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->getOpacity()I
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->getPadding(Landroid/graphics/Rect;)Z
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->initializeElevationOverlay(Landroid/content/Context;)V
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->invalidateSelf()V
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->isStateful()Z
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->onStateChange([I)Z
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->setFillColor(Landroid/content/res/ColorStateList;)V
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->updateColorsForState([I)Z
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->updateTintFilter()Z
-HSPLcom/google/android/material/shape/MaterialShapeDrawable;->updateZ()V
-Lcom/google/android/material/shape/MaterialShapeDrawable$1;
-HSPLcom/google/android/material/shape/MaterialShapeDrawable$1;-><init>(Lcom/google/android/material/shape/MaterialShapeDrawable;)V
-Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;
-HSPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;-><init>(Lcom/google/android/material/shape/ShapeAppearanceModel;)V
-Lcom/google/android/material/shape/RoundedCornerTreatment;
-HSPLcom/google/android/material/shape/RoundedCornerTreatment;-><init>()V
-Lcom/google/android/material/shape/ShapeAppearanceModel;
-HSPLcom/google/android/material/shape/ShapeAppearanceModel;-><init>()V
-Lcom/google/android/material/shape/ShapeAppearancePathProvider;
-HSPLcom/google/android/material/shape/ShapeAppearancePathProvider;-><init>()V
-Lcom/google/android/material/shape/ShapeAppearancePathProvider$Lazy;
-Lcom/google/android/material/shape/ShapePath;
-HSPLcom/google/android/material/shape/ShapePath;-><init>()V
-HSPLcom/google/android/material/shape/ShapePath;->reset(FFF)V
-Lcom/google/android/material/shape/ShapePath$ShadowCompatOperation;
-Lcom/google/android/material/tabs/TabLayout$BaseOnTabSelectedListener;
-Lcom/google/android/material/tabs/TabLayout$OnTabSelectedListener;
-Lcom/google/android/material/theme/overlay/MaterialThemeOverlay;
-HSPLcom/google/android/material/theme/overlay/MaterialThemeOverlay;->wrap(Landroid/content/Context;Landroid/util/AttributeSet;II)Landroid/content/Context;
-Lcom/google/common/collect/Hashing;
-HSPLcom/google/common/collect/Hashing;->smear(I)I
-Lcom/google/common/collect/ImmutableCollection;
-Lcom/google/common/collect/ImmutableCollection$Builder;
-HSPLcom/google/common/collect/ImmutableCollection$Builder;->expandedCapacity(II)I
-Lcom/google/common/collect/ImmutableMap;
-HSPLcom/google/common/collect/ImmutableMap;-><init>()V
-Lcom/google/common/collect/ImmutableMap$Builder;
-HSPLcom/google/common/collect/ImmutableMap$Builder;-><init>(I)V
-HSPLcom/google/common/collect/ImmutableMap$Builder;->buildOrThrow()Lcom/google/common/collect/RegularImmutableMap;
-HSPLcom/google/common/collect/ImmutableMap$Builder;->put(Ljava/lang/Object;Ljava/lang/Object;)V
-Lcom/google/common/collect/ImmutableSet;
-HSPLcom/google/common/collect/ImmutableSet;->chooseTableSize(I)I
-Lcom/google/common/collect/RegularImmutableMap;
-HSPLcom/google/common/collect/RegularImmutableMap;-><init>(ILjava/lang/Object;[Ljava/lang/Object;)V
-HSPLcom/google/common/collect/RegularImmutableMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-Lcom/google/protobuf/AbstractMessageLite;
-HSPLcom/google/protobuf/AbstractMessageLite;-><init>()V
-Lcom/google/protobuf/AbstractMessageLite$Builder;
-HSPLcom/google/protobuf/AbstractMessageLite$Builder;-><init>()V
-Lcom/google/protobuf/Android;
-Lcom/google/protobuf/ByteString;
-HSPLcom/google/protobuf/ByteString;-><init>()V
-Lcom/google/protobuf/ByteString$ArraysByteArrayCopier;
-HSPLcom/google/protobuf/ByteString$ArraysByteArrayCopier;-><init>(I)V
-HSPLcom/google/protobuf/ByteString$ArraysByteArrayCopier;-><init>(Ljava/lang/Object;)V
-Lcom/google/protobuf/ByteString$LeafByteString;
-HSPLcom/google/protobuf/ByteString$LeafByteString;-><init>()V
-Lcom/google/protobuf/ByteString$LiteralByteString;
-HSPLcom/google/protobuf/ByteString$LiteralByteString;-><init>([B)V
-Lcom/google/protobuf/CodedInputStream;
-HSPLcom/google/protobuf/CodedInputStream;-><init>()V
-HSPLcom/google/protobuf/CodedInputStream;->newInstance([BIIZ)Lcom/google/protobuf/CodedInputStream$ArrayDecoder;
-Lcom/google/protobuf/CodedInputStream$ArrayDecoder;
-HSPLcom/google/protobuf/CodedInputStream$ArrayDecoder;-><init>([BIIZ)V
-HSPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->pushLimit(I)I
-Lcom/google/protobuf/ExtensionSchemaLite;
-HSPLcom/google/protobuf/ExtensionSchemaLite;-><init>()V
-Lcom/google/protobuf/ExtensionSchemas;
-Lcom/google/protobuf/GeneratedMessageInfoFactory;
-HSPLcom/google/protobuf/GeneratedMessageInfoFactory;-><init>()V
-HSPLcom/google/protobuf/GeneratedMessageInfoFactory;->isSupported(Ljava/lang/Class;)Z
-HSPLcom/google/protobuf/GeneratedMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Lcom/google/protobuf/MessageInfo;
-Lcom/google/protobuf/GeneratedMessageLite;
-HSPLcom/google/protobuf/GeneratedMessageLite;-><init>()V
-HSPLcom/google/protobuf/GeneratedMessageLite;->clearMemoizedHashCode()V
-HSPLcom/google/protobuf/GeneratedMessageLite;->clearMemoizedSerializedSize()V
-HSPLcom/google/protobuf/GeneratedMessageLite;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;)Ljava/lang/Object;
-HSPLcom/google/protobuf/GeneratedMessageLite;->isInitialized(Lcom/google/protobuf/GeneratedMessageLite;Z)Z
-HSPLcom/google/protobuf/GeneratedMessageLite;->isMutable()Z
-HSPLcom/google/protobuf/GeneratedMessageLite;->markImmutable()V
-HSPLcom/google/protobuf/GeneratedMessageLite;->newMutableInstance()Lcom/google/protobuf/GeneratedMessageLite;
-HSPLcom/google/protobuf/GeneratedMessageLite;->registerDefaultInstance(Ljava/lang/Class;Lcom/google/protobuf/GeneratedMessageLite;)V
-Lcom/google/protobuf/GeneratedMessageLite$Builder;
-HSPLcom/google/protobuf/GeneratedMessageLite$Builder;-><init>(Lcom/google/protobuf/GeneratedMessageLite;)V
-HSPLcom/google/protobuf/GeneratedMessageLite$Builder;->build()Lcom/google/protobuf/GeneratedMessageLite;
-HSPLcom/google/protobuf/GeneratedMessageLite$Builder;->buildPartial()Lcom/google/protobuf/GeneratedMessageLite;
-Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;
-HSPLcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;-><init>(ILjava/lang/String;)V
-Lcom/google/protobuf/Internal;
-Lcom/google/protobuf/InvalidProtocolBufferException;
-Lcom/google/protobuf/InvalidProtocolBufferException$InvalidWireTypeException;
-Lcom/google/protobuf/ListFieldSchema;
-HSPLcom/google/protobuf/ListFieldSchema;-><init>()V
-Lcom/google/protobuf/ListFieldSchema$ListFieldSchemaFull;
-HSPLcom/google/protobuf/ListFieldSchema$ListFieldSchemaFull;-><init>()V
-Lcom/google/protobuf/ListFieldSchema$ListFieldSchemaLite;
-HSPLcom/google/protobuf/ListFieldSchema$ListFieldSchemaLite;-><init>()V
-Lcom/google/protobuf/ManifestSchemaFactory;
-HSPLcom/google/protobuf/ManifestSchemaFactory;-><init>()V
-Lcom/google/protobuf/ManifestSchemaFactory$1;
-HSPLcom/google/protobuf/ManifestSchemaFactory$1;-><init>()V
-Lcom/google/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;
-HSPLcom/google/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;-><init>([Lcom/google/protobuf/MessageInfoFactory;)V
-HSPLcom/google/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Lcom/google/protobuf/MessageInfo;
-Lcom/google/protobuf/MapEntryLite;
-HSPLcom/google/protobuf/MapEntryLite;-><init>(Lcom/google/protobuf/WireFormat$FieldType;Ljava/lang/Object;Lcom/google/protobuf/WireFormat$FieldType$3;Lcom/google/protobuf/GeneratedMessageLite;)V
-Lcom/google/protobuf/MapEntryLite$Metadata;
-HSPLcom/google/protobuf/MapEntryLite$Metadata;-><init>(Lcom/google/protobuf/WireFormat$FieldType;Ljava/lang/Object;Lcom/google/protobuf/WireFormat$FieldType$3;Lcom/google/protobuf/GeneratedMessageLite;)V
-Lcom/google/protobuf/MapFieldLite;
-HSPLcom/google/protobuf/MapFieldLite;-><init>()V
-Lcom/google/protobuf/MapFieldSchemaLite;
-HSPLcom/google/protobuf/MapFieldSchemaLite;-><init>()V
-HSPLcom/google/protobuf/MapFieldSchemaLite;->toImmutable(Ljava/lang/Object;)V
-Lcom/google/protobuf/MapFieldSchemas;
-Lcom/google/protobuf/MessageInfo;
-Lcom/google/protobuf/MessageInfoFactory;
-Lcom/google/protobuf/MessageLite;
-Lcom/google/protobuf/MessageSchema;
-HSPLcom/google/protobuf/MessageSchema;-><init>([I[Ljava/lang/Object;IILcom/google/protobuf/MessageLite;Z[IIILcom/google/protobuf/NewInstanceSchemaLite;Lcom/google/protobuf/ListFieldSchema;Lcom/google/protobuf/UnknownFieldSetLiteSchema;Lcom/google/protobuf/ExtensionSchemaLite;Lcom/google/protobuf/MapFieldSchemaLite;)V
-HSPLcom/google/protobuf/MessageSchema;->isMutable(Ljava/lang/Object;)Z
-HSPLcom/google/protobuf/MessageSchema;->makeImmutable(Ljava/lang/Object;)V
-HSPLcom/google/protobuf/MessageSchema;->newSchema(Lcom/google/protobuf/MessageInfo;Lcom/google/protobuf/NewInstanceSchemaLite;Lcom/google/protobuf/ListFieldSchema;Lcom/google/protobuf/UnknownFieldSetLiteSchema;Lcom/google/protobuf/ExtensionSchemaLite;Lcom/google/protobuf/MapFieldSchemaLite;)Lcom/google/protobuf/MessageSchema;
-HSPLcom/google/protobuf/MessageSchema;->newSchemaForRawMessageInfo(Lcom/google/protobuf/RawMessageInfo;Lcom/google/protobuf/NewInstanceSchemaLite;Lcom/google/protobuf/ListFieldSchema;Lcom/google/protobuf/UnknownFieldSetLiteSchema;Lcom/google/protobuf/ExtensionSchemaLite;Lcom/google/protobuf/MapFieldSchemaLite;)Lcom/google/protobuf/MessageSchema;
-HSPLcom/google/protobuf/MessageSchema;->reflectField(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;
-HSPLcom/google/protobuf/MessageSchema;->typeAndOffsetAt(I)I
-Lcom/google/protobuf/NewInstanceSchemaLite;
-HSPLcom/google/protobuf/NewInstanceSchemaLite;-><init>()V
-Lcom/google/protobuf/NewInstanceSchemas;
-Lcom/google/protobuf/Protobuf;
-HSPLcom/google/protobuf/Protobuf;-><init>()V
-HSPLcom/google/protobuf/Protobuf;->schemaFor(Ljava/lang/Class;)Lcom/google/protobuf/Schema;
-Lcom/google/protobuf/RawMessageInfo;
-HSPLcom/google/protobuf/RawMessageInfo;-><init>(Lcom/google/protobuf/MessageLite;Ljava/lang/String;[Ljava/lang/Object;)V
-HSPLcom/google/protobuf/RawMessageInfo;->getDefaultInstance()Lcom/google/protobuf/MessageLite;
-HSPLcom/google/protobuf/RawMessageInfo;->getObjects()[Ljava/lang/Object;
-HSPLcom/google/protobuf/RawMessageInfo;->getStringInfo()Ljava/lang/String;
-HSPLcom/google/protobuf/RawMessageInfo;->getSyntax$enumunboxing$()I
-Lcom/google/protobuf/Schema;
-Lcom/google/protobuf/SchemaUtil;
-HSPLcom/google/protobuf/SchemaUtil;->getUnknownFieldSetSchema(Z)Lcom/google/protobuf/UnknownFieldSetLiteSchema;
-Lcom/google/protobuf/UninitializedMessageException;
-Lcom/google/protobuf/UnknownFieldSetLite;
-HSPLcom/google/protobuf/UnknownFieldSetLite;-><init>(I[I[Ljava/lang/Object;Z)V
-Lcom/google/protobuf/UnknownFieldSetLiteSchema;
-HSPLcom/google/protobuf/UnknownFieldSetLiteSchema;-><init>()V
-HSPLcom/google/protobuf/UnknownFieldSetLiteSchema;->makeImmutable(Ljava/lang/Object;)V
-Lcom/google/protobuf/UnsafeUtil;
-HSPLcom/google/protobuf/UnsafeUtil;->arrayBaseOffset(Ljava/lang/Class;)I
-HSPLcom/google/protobuf/UnsafeUtil;->arrayIndexScale(Ljava/lang/Class;)V
-HSPLcom/google/protobuf/UnsafeUtil;->bufferAddressField()Ljava/lang/reflect/Field;
-HSPLcom/google/protobuf/UnsafeUtil;->determineAndroidSupportByAddressSize(Ljava/lang/Class;)Z
-HSPLcom/google/protobuf/UnsafeUtil;->getUnsafe()Lsun/misc/Unsafe;
-Lcom/google/protobuf/UnsafeUtil$1;
-HSPLcom/google/protobuf/UnsafeUtil$1;-><init>()V
-HSPLcom/google/protobuf/UnsafeUtil$1;->run()Ljava/lang/Object;
-HSPLcom/google/protobuf/UnsafeUtil$1;->run()Lsun/misc/Unsafe;
-Lcom/google/protobuf/UnsafeUtil$Android64MemoryAccessor;
-HSPLcom/google/protobuf/UnsafeUtil$Android64MemoryAccessor;-><init>(Lsun/misc/Unsafe;)V
-HSPLcom/google/protobuf/UnsafeUtil$Android64MemoryAccessor;->supportsUnsafeByteBufferOperations()Z
-Lcom/google/protobuf/UnsafeUtil$MemoryAccessor;
-HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;-><init>(Lsun/misc/Unsafe;)V
-HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->arrayBaseOffset(Ljava/lang/Class;)I
-HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->arrayIndexScale(Ljava/lang/Class;)I
-HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->objectFieldOffset(Ljava/lang/reflect/Field;)J
-HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->supportsUnsafeArrayOperations()Z
-HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->supportsUnsafeByteBufferOperations()Z
-Lcom/google/protobuf/WireFormat$FieldType;
-HSPLcom/google/protobuf/WireFormat$FieldType;-><init>(Ljava/lang/String;ILcom/google/protobuf/WireFormat$JavaType;I)V
-Lcom/google/protobuf/WireFormat$FieldType$1;
-HSPLcom/google/protobuf/WireFormat$FieldType$1;-><init>()V
-Lcom/google/protobuf/WireFormat$FieldType$2;
-HSPLcom/google/protobuf/WireFormat$FieldType$2;-><init>(Lcom/google/protobuf/WireFormat$JavaType;)V
-Lcom/google/protobuf/WireFormat$FieldType$3;
-HSPLcom/google/protobuf/WireFormat$FieldType$3;-><init>(Lcom/google/protobuf/WireFormat$JavaType;)V
-Lcom/google/protobuf/WireFormat$FieldType$4;
-HSPLcom/google/protobuf/WireFormat$FieldType$4;-><init>(Lcom/google/protobuf/WireFormat$JavaType;)V
-Lcom/google/protobuf/WireFormat$JavaType;
-HSPLcom/google/protobuf/WireFormat$JavaType;-><init>(Ljava/io/Serializable;ILjava/lang/String;)V
-Ldagger/Lazy;
-Ldagger/internal/DoubleCheck;
-HSPLdagger/internal/DoubleCheck;-><init>(Ljavax/inject/Provider;)V
-HSPLdagger/internal/DoubleCheck;->get()Ljava/lang/Object;
-HSPLdagger/internal/DoubleCheck;->lazy(Ljavax/inject/Provider;)Ldagger/Lazy;
-HSPLdagger/internal/DoubleCheck;->provider(Ljavax/inject/Provider;)Ljavax/inject/Provider;
-Ldagger/internal/Preconditions;
-HSPLdagger/internal/Preconditions;->checkNotNullFromProvides(Ljava/lang/Object;)V
-Ldagger/internal/SingleCheck;
-HSPLdagger/internal/SingleCheck;-><init>(Ljavax/inject/Provider;)V
-HSPLdagger/internal/SingleCheck;->get()Ljava/lang/Object;
-HSPLdagger/internal/SingleCheck;->provider(Ljavax/inject/Provider;)Ljavax/inject/Provider;
-Lgen/base_module/R$styleable;
-Ljavax/inject/Provider;
-Lkotlin/Pair;
-HSPLkotlin/Pair;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-Lkotlin/SynchronizedLazyImpl;
-HSPLkotlin/SynchronizedLazyImpl;-><init>(Landroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;)V
-HSPLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object;
-Lkotlin/UNINITIALIZED_VALUE;
-HSPLkotlin/UNINITIALIZED_VALUE;-><init>()V
-Lkotlin/collections/AbstractMutableList;
-HSPLkotlin/collections/AbstractMutableList;-><init>()V
-HSPLkotlin/collections/AbstractMutableList;->remove(I)Ljava/lang/Object;
-HSPLkotlin/collections/AbstractMutableList;->size()I
-Lkotlin/collections/ArrayDeque;
-HSPLkotlin/collections/ArrayDeque;-><init>()V
-HSPLkotlin/collections/ArrayDeque;->addLast(Ljava/lang/Object;)V
-HSPLkotlin/collections/ArrayDeque;->ensureCapacity(I)V
-HSPLkotlin/collections/ArrayDeque;->indexOf(Ljava/lang/Object;)I
-HSPLkotlin/collections/ArrayDeque;->isEmpty()Z
-HSPLkotlin/collections/ArrayDeque;->positiveMod(I)I
-HSPLkotlin/collections/ArrayDeque;->remove(Ljava/lang/Object;)Z
-Lkotlin/collections/ArraysKt__ArraysKt;
-Lkotlin/collections/ArraysKt___ArraysKt;
-HSPLkotlin/collections/ArraysKt___ArraysKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;III)V
-HSPLkotlin/collections/ArraysKt___ArraysKt;->copyInto(III[I[I)V
-HSPLkotlin/collections/ArraysKt___ArraysKt;->copyInto(III[Ljava/lang/Object;[Ljava/lang/Object;)V
-Lkotlin/collections/CollectionsKt__CollectionsKt;
-HSPLkotlin/collections/CollectionsKt__CollectionsKt;->getLastIndex(Ljava/util/List;)I
-Lkotlin/collections/EmptyMap;
-HSPLkotlin/collections/EmptyMap;-><init>()V
-Lkotlin/collections/MapsKt__MapsJVMKt;
-HSPLkotlin/collections/MapsKt__MapsJVMKt;->mapCapacity(I)I
-Lkotlin/collections/MapsKt___MapsJvmKt;
-HSPLkotlin/collections/MapsKt___MapsJvmKt;->toMap(Ljava/util/ArrayList;)Ljava/util/Map;
-HSPLkotlin/collections/MapsKt___MapsJvmKt;->toMap(Ljava/util/ArrayList;Ljava/util/LinkedHashMap;)V
-Lkotlin/jvm/functions/Function0;
-Lkotlin/jvm/functions/Function1;
-Lkotlin/jvm/functions/Function10;
-Lkotlin/jvm/functions/Function11;
-Lkotlin/jvm/functions/Function12;
-Lkotlin/jvm/functions/Function13;
-Lkotlin/jvm/functions/Function14;
-Lkotlin/jvm/functions/Function15;
-Lkotlin/jvm/functions/Function16;
-Lkotlin/jvm/functions/Function17;
-Lkotlin/jvm/functions/Function18;
-Lkotlin/jvm/functions/Function19;
-Lkotlin/jvm/functions/Function2;
-Lkotlin/jvm/functions/Function20;
-Lkotlin/jvm/functions/Function21;
-Lkotlin/jvm/functions/Function22;
-Lkotlin/jvm/functions/Function3;
-Lkotlin/jvm/functions/Function4;
-Lkotlin/jvm/functions/Function5;
-Lkotlin/jvm/functions/Function6;
-Lkotlin/jvm/functions/Function7;
-Lkotlin/jvm/functions/Function8;
-Lkotlin/jvm/functions/Function9;
-Lkotlin/jvm/internal/ClassBasedDeclarationContainer;
-Lkotlin/jvm/internal/ClassReference;
-Lkotlin/jvm/internal/FunctionBase;
-Lkotlin/jvm/internal/Intrinsics;
-HSPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;)V
-HSPLkotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V
-HSPLkotlin/jvm/internal/Intrinsics;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V
-Lkotlin/jvm/internal/Lambda;
-HSPLkotlin/jvm/internal/Lambda;-><init>(I)V
-Lkotlin/jvm/internal/Reflection;
-Lkotlin/jvm/internal/ReflectionFactory;
-HSPLkotlin/jvm/internal/ReflectionFactory;-><init>()V
-Lkotlin/reflect/KClass;
-Lkotlin/text/StringsKt__IndentKt;
-Lkotlin/text/StringsKt__RegexExtensionsKt;
-Lkotlin/text/StringsKt__StringBuilderKt;
-Lkotlin/text/StringsKt__StringNumberConversionsKt;
-Lkotlin/text/StringsKt__StringsKt;
-HSPLkotlin/text/StringsKt__StringsKt;->substringAfterLast$default(Ljava/lang/String;)Ljava/lang/String;
-Lorg/chromium/base/ApiCompatibilityUtils;
-HSPLorg/chromium/base/ApiCompatibilityUtils;->checkPermission(IILandroid/content/Context;Ljava/lang/String;)I
-HSPLorg/chromium/base/ApiCompatibilityUtils;->getTargetableDisplayIds(Landroid/app/Activity;)Ljava/util/ArrayList;
-HSPLorg/chromium/base/ApiCompatibilityUtils;->isDemoUser()Z
-HSPLorg/chromium/base/ApiCompatibilityUtils;->setStatusBarIconColor(Landroid/view/View;Z)V
-HSPLorg/chromium/base/ApiCompatibilityUtils;->setTextAppearance(Landroid/widget/TextView;I)V
-Lorg/chromium/base/ApiCompatibilityUtils$ApisNMR1$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/base/ApiCompatibilityUtils$ApisNMR1$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/UserManager;)Z
-Lorg/chromium/base/ApiCompatibilityUtils$ApisO$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/base/ApiCompatibilityUtils$ApisO$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/textclassifier/TextClassifier;
-HSPLorg/chromium/base/ApiCompatibilityUtils$ApisO$$ExternalSyntheticApiModelOutline0;->m(Landroid/widget/TextView;Landroid/view/textclassifier/TextClassifier;)V
-Lorg/chromium/base/ApiCompatibilityUtils$ApisQ$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/base/ApiCompatibilityUtils$ApisQ$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ActivityManager;Landroid/content/Context;ILandroid/content/Intent;)Z
-Lorg/chromium/base/ApkAssets;
-HSPLorg/chromium/base/ApkAssets;->open(Ljava/lang/String;Ljava/lang/String;)[J
-Lorg/chromium/base/ApplicationStatus;
-HSPLorg/chromium/base/ApplicationStatus;->-$$Nest$smonStateChange(Landroid/app/Activity;I)V
-HSPLorg/chromium/base/ApplicationStatus;->getRunningActivities()Ljava/util/ArrayList;
-HSPLorg/chromium/base/ApplicationStatus;->getStateForActivity(Landroid/app/Activity;)I
-HSPLorg/chromium/base/ApplicationStatus;->getStateForApplication()I
-HSPLorg/chromium/base/ApplicationStatus;->hasVisibleActivities()Z
-HSPLorg/chromium/base/ApplicationStatus;->isTaskVisible(I)Z
-HSPLorg/chromium/base/ApplicationStatus;->registerApplicationStateListener(Lorg/chromium/base/ApplicationStatus$ApplicationStateListener;)V
-HSPLorg/chromium/base/ApplicationStatus;->registerStateListenerForActivity(Lorg/chromium/base/ApplicationStatus$ActivityStateListener;Landroid/app/Activity;)V
-HSPLorg/chromium/base/ApplicationStatus;->registerStateListenerForAllActivities(Lorg/chromium/base/ApplicationStatus$ActivityStateListener;)V
-HSPLorg/chromium/base/ApplicationStatus;->registerThreadSafeNativeApplicationStateListener()V
-HSPLorg/chromium/base/ApplicationStatus;->registerWindowFocusChangedListener(Lorg/chromium/base/ApplicationStatus$WindowFocusChangedListener;)V
-HSPLorg/chromium/base/ApplicationStatus;->unregisterActivityStateListener(Lorg/chromium/base/ApplicationStatus$ActivityStateListener;)V
-Lorg/chromium/base/ApplicationStatus$1;
-HSPLorg/chromium/base/ApplicationStatus$1;-><init>()V
-HSPLorg/chromium/base/ApplicationStatus$1;->onWindowFocusChanged(Landroid/app/Activity;Z)V
-Lorg/chromium/base/ApplicationStatus$2;
-HSPLorg/chromium/base/ApplicationStatus$2;-><init>()V
-HSPLorg/chromium/base/ApplicationStatus$2;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
-HSPLorg/chromium/base/ApplicationStatus$2;->onActivityDestroyed(Landroid/app/Activity;)V
-HSPLorg/chromium/base/ApplicationStatus$2;->onActivityPaused(Landroid/app/Activity;)V
-HSPLorg/chromium/base/ApplicationStatus$2;->onActivityResumed(Landroid/app/Activity;)V
-HSPLorg/chromium/base/ApplicationStatus$2;->onActivityStarted(Landroid/app/Activity;)V
-HSPLorg/chromium/base/ApplicationStatus$2;->onActivityStopped(Landroid/app/Activity;)V
-Lorg/chromium/base/ApplicationStatus$3;
-HSPLorg/chromium/base/ApplicationStatus$3;-><init>()V
-HSPLorg/chromium/base/ApplicationStatus$3;->run()V
-Lorg/chromium/base/ApplicationStatus$3$1;
-HSPLorg/chromium/base/ApplicationStatus$3$1;-><init>()V
-HSPLorg/chromium/base/ApplicationStatus$3$1;->onApplicationStateChange(I)V
-Lorg/chromium/base/ApplicationStatus$ActivityInfo;
-HSPLorg/chromium/base/ApplicationStatus$ActivityInfo;-><init>()V
-Lorg/chromium/base/ApplicationStatus$ActivityStateListener;
-Lorg/chromium/base/ApplicationStatus$ApplicationStateListener;
-Lorg/chromium/base/ApplicationStatus$TaskVisibilityListener;
-Lorg/chromium/base/ApplicationStatus$WindowCallbackProxy;
-HSPLorg/chromium/base/ApplicationStatus$WindowCallbackProxy;-><init>(Landroid/app/Activity;Landroid/view/Window$Callback;)V
-HSPLorg/chromium/base/ApplicationStatus$WindowCallbackProxy;->invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
-Lorg/chromium/base/ApplicationStatus$WindowFocusChangedListener;
-Lorg/chromium/base/BuildInfo;
-HSPLorg/chromium/base/BuildInfo;-><init>()V
-HSPLorg/chromium/base/BuildInfo;->getAll()[Ljava/lang/String;
-HSPLorg/chromium/base/BuildInfo;->isDebugAndroid()Z
-HSPLorg/chromium/base/BuildInfo;->packageVersionCode(Landroid/content/pm/PackageInfo;)J
-Lorg/chromium/base/BuildInfo$Holder;
-Lorg/chromium/base/BundleUtils;
-HSPLorg/chromium/base/BundleUtils;->isIsolatedSplitInstalled(Ljava/lang/String;)Z
-HSPLorg/chromium/base/BundleUtils;->newInstance(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/Object;
-Lorg/chromium/base/BundleUtils$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/base/BundleUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ApplicationInfo;)[Ljava/lang/String;
-Lorg/chromium/base/BundleUtils$SplitCompatClassLoader;
-HSPLorg/chromium/base/BundleUtils$SplitCompatClassLoader;-><init>()V
-HSPLorg/chromium/base/BundleUtils$SplitCompatClassLoader;->checkSplitsClassLoaders(Ljava/lang/String;)Ljava/lang/Class;
-HSPLorg/chromium/base/BundleUtils$SplitCompatClassLoader;->findClass(Ljava/lang/String;)Ljava/lang/Class;
-Lorg/chromium/base/ByteArrayGenerator;
-HSPLorg/chromium/base/ByteArrayGenerator;-><init>()V
-Lorg/chromium/base/Callback;
-HSPLorg/chromium/base/Callback;->bind(Ljava/lang/Object;)Lorg/chromium/base/Callback$$ExternalSyntheticLambda0;
-Lorg/chromium/base/Callback$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/Callback$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/base/Callback;Ljava/lang/Object;)V
-HSPLorg/chromium/base/Callback$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/base/Callback$Helper;
-HSPLorg/chromium/base/Callback$Helper;->onBooleanResultFromNative(Lorg/chromium/base/Callback;Z)V
-HSPLorg/chromium/base/Callback$Helper;->onIntResultFromNative(Lorg/chromium/base/Callback;I)V
-HSPLorg/chromium/base/Callback$Helper;->onObjectResultFromNative(Lorg/chromium/base/Callback;Ljava/lang/Object;)V
-Lorg/chromium/base/CallbackController;
-HSPLorg/chromium/base/CallbackController;-><init>()V
-HSPLorg/chromium/base/CallbackController;->destroy()V
-HSPLorg/chromium/base/CallbackController;->makeCancelable(Ljava/lang/Runnable;)Lorg/chromium/base/CallbackController$CancelableRunnable;
-HSPLorg/chromium/base/CallbackController;->makeCancelable(Lorg/chromium/base/Callback;)Lorg/chromium/base/CallbackController$CancelableCallback;
-Lorg/chromium/base/CallbackController$Cancelable;
-Lorg/chromium/base/CallbackController$CancelableCallback;
-HSPLorg/chromium/base/CallbackController$CancelableCallback;-><init>(Lorg/chromium/base/CallbackController;Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/base/CallbackController$CancelableCallback;->cancel()V
-HSPLorg/chromium/base/CallbackController$CancelableCallback;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/base/CallbackController$CancelableRunnable;
-HSPLorg/chromium/base/CallbackController$CancelableRunnable;-><init>(Lorg/chromium/base/CallbackController;Ljava/lang/Runnable;)V
-HSPLorg/chromium/base/CallbackController$CancelableRunnable;->cancel()V
-HSPLorg/chromium/base/CallbackController$CancelableRunnable;->run()V
-Lorg/chromium/base/CollectionUtil;
-HSPLorg/chromium/base/CollectionUtil;->newHashSet([Ljava/lang/Object;)Ljava/util/HashSet;
-HSPLorg/chromium/base/CollectionUtil;->strengthen(Ljava/util/Collection;)Ljava/util/ArrayList;
-Lorg/chromium/base/CommandLine;
-HSPLorg/chromium/base/CommandLine;-><init>()V
-HSPLorg/chromium/base/CommandLine;->getInstance()Lorg/chromium/base/CommandLine;
-HSPLorg/chromium/base/CommandLine;->init([Ljava/lang/String;)V
-Lorg/chromium/base/CommandLine$JavaCommandLine;
-HSPLorg/chromium/base/CommandLine$JavaCommandLine;-><init>([Ljava/lang/String;)V
-HSPLorg/chromium/base/CommandLine$JavaCommandLine;->appendSwitch(Ljava/lang/String;)V
-HSPLorg/chromium/base/CommandLine$JavaCommandLine;->appendSwitchWithValue(Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/base/CommandLine$JavaCommandLine;->getCommandLineArguments()[Ljava/lang/String;
-HSPLorg/chromium/base/CommandLine$JavaCommandLine;->getSwitchValue(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/base/CommandLine$JavaCommandLine;->hasSwitch(Ljava/lang/String;)Z
-Lorg/chromium/base/CommandLine$NativeCommandLine;
-HSPLorg/chromium/base/CommandLine$NativeCommandLine;-><init>([Ljava/lang/String;)V
-HSPLorg/chromium/base/CommandLine$NativeCommandLine;->appendSwitch(Ljava/lang/String;)V
-HSPLorg/chromium/base/CommandLine$NativeCommandLine;->appendSwitchWithValue(Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/base/CommandLine$NativeCommandLine;->getSwitchValue(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/base/CommandLine$NativeCommandLine;->hasSwitch(Ljava/lang/String;)Z
-Lorg/chromium/base/ContentUriUtils;
-PLorg/chromium/base/ContentUriUtils;->isContentUri(Ljava/lang/String;)Z
-Lorg/chromium/base/ContextUtils;
-HSPLorg/chromium/base/ContextUtils;->activityFromContext(Landroid/content/Context;)Landroid/app/Activity;
-HSPLorg/chromium/base/ContextUtils;->getProcessName()Ljava/lang/String;
-HSPLorg/chromium/base/ContextUtils;->registerBroadcastReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent;
-HSPLorg/chromium/base/ContextUtils;->registerExportedBroadcastReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;)V
-HSPLorg/chromium/base/ContextUtils;->registerNonExportedBroadcastReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)V
-HSPLorg/chromium/base/ContextUtils;->registerProtectedBroadcastReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
-Lorg/chromium/base/ContextUtils$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/base/ContextUtils$$ExternalSyntheticApiModelOutline0;->m()Z
-Lorg/chromium/base/ContextUtils$Holder;
-Lorg/chromium/base/DiscardableReferencePool;
-HSPLorg/chromium/base/DiscardableReferencePool;-><init>()V
-HSPLorg/chromium/base/DiscardableReferencePool;->put(Ljava/lang/Object;)Lorg/chromium/base/DiscardableReferencePool$DiscardableReference;
-Lorg/chromium/base/DiscardableReferencePool$DiscardableReference;
-HSPLorg/chromium/base/DiscardableReferencePool$DiscardableReference;-><init>(Ljava/lang/Object;)V
-Lorg/chromium/base/EarlyTraceEvent;
-HSPLorg/chromium/base/EarlyTraceEvent;->begin(Ljava/lang/String;Z)V
-HSPLorg/chromium/base/EarlyTraceEvent;->enabled()Z
-HSPLorg/chromium/base/EarlyTraceEvent;->end(Ljava/lang/String;Z)V
-HSPLorg/chromium/base/EarlyTraceEvent;->getBackgroundStartupTracingFlag()Z
-HSPLorg/chromium/base/EarlyTraceEvent;->setBackgroundStartupTracingFlag(Z)V
-Lorg/chromium/base/FeatureList;
-HSPLorg/chromium/base/FeatureList;->isInitialized()Z
-HSPLorg/chromium/base/FeatureList;->isNativeInitialized()Z
-Lorg/chromium/base/FileUtils;
-HSPLorg/chromium/base/FileUtils;->recursivelyDeleteFile(Ljava/io/File;Ljava/util/function/Function;)V
-Lorg/chromium/base/FileUtils$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/FileUtils$$ExternalSyntheticLambda0;-><init>()V
-Lorg/chromium/base/Flag;
-HSPLorg/chromium/base/Flag;-><init>(Ljava/lang/String;)V
-Lorg/chromium/base/IntentUtils;
-HSPLorg/chromium/base/IntentUtils;->isMainIntentFromLauncher(Landroid/content/Intent;)Z
-HSPLorg/chromium/base/IntentUtils;->isTrustedIntentFromSelf(Landroid/content/Intent;)Z
-HSPLorg/chromium/base/IntentUtils;->safeGetBooleanExtra(Landroid/content/Intent;Ljava/lang/String;Z)Z
-HSPLorg/chromium/base/IntentUtils;->safeGetBundleExtra(Landroid/content/Intent;Ljava/lang/String;)Landroid/os/Bundle;
-HSPLorg/chromium/base/IntentUtils;->safeGetInt(Ljava/lang/String;ILandroid/os/Bundle;)I
-HSPLorg/chromium/base/IntentUtils;->safeGetIntExtra(ILandroid/content/Intent;Ljava/lang/String;)I
-HSPLorg/chromium/base/IntentUtils;->safeGetParcelableExtra(Landroid/content/Intent;Ljava/lang/String;)Landroid/os/Parcelable;
-HSPLorg/chromium/base/IntentUtils;->safeGetStringArrayListExtra(Landroid/content/Intent;Ljava/lang/String;)Ljava/util/ArrayList;
-HSPLorg/chromium/base/IntentUtils;->safeGetStringExtra(Landroid/content/Intent;Ljava/lang/String;)Ljava/lang/String;
-Lorg/chromium/base/JNIUtils;
-HSPLorg/chromium/base/JNIUtils;->getSplitClassLoader(Ljava/lang/String;)Ljava/lang/ClassLoader;
-HSPLorg/chromium/base/JNIUtils;->isSelectiveJniRegistrationEnabled()Z
-Lorg/chromium/base/JavaExceptionReporter;
-HSPLorg/chromium/base/JavaExceptionReporter;-><init>(Ljava/lang/Thread$UncaughtExceptionHandler;Z)V
-HSPLorg/chromium/base/JavaExceptionReporter;->installHandler(Z)V
-Lorg/chromium/base/JavaHandlerThread;
-HSPLorg/chromium/base/JavaHandlerThread;-><init>(ILjava/lang/String;)V
-HSPLorg/chromium/base/JavaHandlerThread;->startAndInitialize(JJ)V
-Lorg/chromium/base/JavaHandlerThread$1;
-HSPLorg/chromium/base/JavaHandlerThread$1;-><init>(JJ)V
-HSPLorg/chromium/base/JavaHandlerThread$1;->run()V
-Lorg/chromium/base/LocaleUtils;
-HSPLorg/chromium/base/LocaleUtils;->getDefaultCountryCode()Ljava/lang/String;
-HSPLorg/chromium/base/LocaleUtils;->getDefaultLocaleListString()Ljava/lang/String;
-HSPLorg/chromium/base/LocaleUtils;->getDefaultLocaleString()Ljava/lang/String;
-HSPLorg/chromium/base/LocaleUtils;->getUpdatedLanguageForChromium(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/base/LocaleUtils;->toBaseLanguage(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/base/LocaleUtils;->toLanguageTag(Ljava/util/Locale;)Ljava/lang/String;
-Lorg/chromium/base/Log;
-HSPLorg/chromium/base/Log;->formatLog(Ljava/lang/String;Ljava/lang/Throwable;[Ljava/lang/Object;)Ljava/lang/String;
-HSPLorg/chromium/base/Log;->getThrowableToLog([Ljava/lang/Object;)Ljava/lang/Throwable;
-HSPLorg/chromium/base/Log;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V
-HSPLorg/chromium/base/Log;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLorg/chromium/base/Log;->i(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
-HSPLorg/chromium/base/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V
-HSPLorg/chromium/base/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLorg/chromium/base/Log;->w(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
-Lorg/chromium/base/MathUtils;
-HSPLorg/chromium/base/MathUtils;->areFloatsEqual(FF)Z
-HSPLorg/chromium/base/MathUtils;->clamp(FFF)F
-HSPLorg/chromium/base/MathUtils;->clamp(III)I
-Lorg/chromium/base/MemoryPressureListener;
-HSPLorg/chromium/base/MemoryPressureListener;->addCallback(Lorg/chromium/base/memory/MemoryPressureCallback;)V
-HSPLorg/chromium/base/MemoryPressureListener;->addNativeCallback()V
-Lorg/chromium/base/MemoryPressureListener$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/MemoryPressureListener$$ExternalSyntheticLambda0;-><init>()V
-Lorg/chromium/base/ObserverList;
-HSPLorg/chromium/base/ObserverList;-><init>()V
-HSPLorg/chromium/base/ObserverList;->addObserver(Ljava/lang/Object;)Z
-HSPLorg/chromium/base/ObserverList;->clear()V
-HSPLorg/chromium/base/ObserverList;->hasObserver(Ljava/lang/Object;)Z
-HSPLorg/chromium/base/ObserverList;->isEmpty()Z
-HSPLorg/chromium/base/ObserverList;->iterator()Ljava/util/Iterator;
-HSPLorg/chromium/base/ObserverList;->removeObserver(Ljava/lang/Object;)Z
-HSPLorg/chromium/base/ObserverList;->rewindableIterator()Lorg/chromium/base/ObserverList$ObserverListIterator;
-Lorg/chromium/base/ObserverList$ObserverListIterator;
-HSPLorg/chromium/base/ObserverList$ObserverListIterator;-><init>(Lorg/chromium/base/ObserverList;)V
-HSPLorg/chromium/base/ObserverList$ObserverListIterator;->compactListIfNeeded()V
-HSPLorg/chromium/base/ObserverList$ObserverListIterator;->hasNext()Z
-HSPLorg/chromium/base/ObserverList$ObserverListIterator;->next()Ljava/lang/Object;
-HSPLorg/chromium/base/ObserverList$ObserverListIterator;->rewind()V
-Lorg/chromium/base/PackageManagerUtils;
-HSPLorg/chromium/base/PackageManagerUtils;->canResolveActivity(Landroid/content/Intent;I)Z
-HSPLorg/chromium/base/PackageManagerUtils;->queryIntentActivities(Landroid/content/Intent;I)Ljava/util/List;
-HSPLorg/chromium/base/PackageManagerUtils;->resolveActivity(Landroid/content/Intent;I)Landroid/content/pm/ResolveInfo;
-HSPLorg/chromium/base/PackageManagerUtils;->resolveDefaultWebBrowserActivity()Landroid/content/pm/ResolveInfo;
-Lorg/chromium/base/PackageUtils;
-HSPLorg/chromium/base/PackageUtils;->getPackageInfo(ILjava/lang/String;)Landroid/content/pm/PackageInfo;
-HSPLorg/chromium/base/PackageUtils;->getPackageVersion(Ljava/lang/String;)I
-HSPLorg/chromium/base/PackageUtils;->isPackageInstalled(Ljava/lang/String;)Z
-Lorg/chromium/base/PathUtils;
-HSPLorg/chromium/base/PathUtils;->chmod(ILjava/lang/String;)V
-HSPLorg/chromium/base/PathUtils;->getAllPrivateDownloadsDirectories()[Ljava/lang/String;
-HSPLorg/chromium/base/PathUtils;->getCacheDirectory()Ljava/lang/String;
-HSPLorg/chromium/base/PathUtils;->getDataDirectory()Ljava/lang/String;
-HSPLorg/chromium/base/PathUtils;->getDirectoryPath(I)Ljava/lang/String;
-HSPLorg/chromium/base/PathUtils;->getDownloadsDirectory()Ljava/lang/String;
-HSPLorg/chromium/base/PathUtils;->getNativeLibraryDirectory()Ljava/lang/String;
-HSPLorg/chromium/base/PathUtils;->getThumbnailCacheDirectory()Ljava/lang/String;
-HSPLorg/chromium/base/PathUtils;->setPrivateDataDirectorySuffix()V
-HSPLorg/chromium/base/PathUtils;->toAbsolutePathStrings(Ljava/util/List;)[Ljava/lang/String;
-Lorg/chromium/base/PathUtils$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/PathUtils$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/base/PathUtils$$ExternalSyntheticLambda0;->call()Ljava/lang/Object;
-Lorg/chromium/base/PowerMonitor;
-HSPLorg/chromium/base/PowerMonitor;-><init>()V
-HSPLorg/chromium/base/PowerMonitor;->create()V
-HSPLorg/chromium/base/PowerMonitor;->getCurrentThermalStatus()I
-HSPLorg/chromium/base/PowerMonitor;->isBatteryPower()Z
-Lorg/chromium/base/PowerMonitor$1;
-HSPLorg/chromium/base/PowerMonitor$1;-><init>()V
-Lorg/chromium/base/PowerMonitorForQ$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/base/PowerMonitorForQ$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/PowerManager;Lorg/chromium/base/PowerMonitorForQ$1;)V
-Lorg/chromium/base/PowerMonitorForQ$1;
-HSPLorg/chromium/base/PowerMonitorForQ$1;-><init>()V
-HSPLorg/chromium/base/PowerMonitorForQ$1;->onThermalStatusChanged(I)V
-Lorg/chromium/base/Promise;
-HSPLorg/chromium/base/Promise;-><init>()V
-HSPLorg/chromium/base/Promise;->exceptInner(Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/base/Promise;->fulfill(Ljava/lang/Object;)V
-HSPLorg/chromium/base/Promise;->fulfilled(Ljava/lang/Object;)Lorg/chromium/base/Promise;
-HSPLorg/chromium/base/Promise;->isFulfilled()Z
-HSPLorg/chromium/base/Promise;->then(Ljava/util/function/Function;)Lorg/chromium/base/Promise;
-HSPLorg/chromium/base/Promise;->then(Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/base/Promise;->then(Lorg/chromium/base/Callback;Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/base/Promise;->thenInner(Lorg/chromium/base/Callback;)V
-Lorg/chromium/base/Promise$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/Promise$$ExternalSyntheticLambda0;-><init>()V
-Lorg/chromium/base/Promise$$ExternalSyntheticLambda1;
-HSPLorg/chromium/base/Promise$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/base/Promise;Ljava/util/function/Function;)V
-HSPLorg/chromium/base/Promise$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/base/Promise$$ExternalSyntheticLambda2;
-HSPLorg/chromium/base/Promise$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/base/Promise;I)V
-Lorg/chromium/base/StreamUtil;
-HSPLorg/chromium/base/StreamUtil;->closeQuietly(Ljava/io/Closeable;)V
-Lorg/chromium/base/StrictModeContext;
-HSPLorg/chromium/base/StrictModeContext;-><init>(Landroid/os/StrictMode$ThreadPolicy;Landroid/os/StrictMode$VmPolicy;)V
-HSPLorg/chromium/base/StrictModeContext;->allowDiskReads()Lorg/chromium/base/StrictModeContext;
-HSPLorg/chromium/base/StrictModeContext;->allowDiskWrites()Lorg/chromium/base/StrictModeContext;
-HSPLorg/chromium/base/StrictModeContext;->close()V
-Lorg/chromium/base/SysUtils;
-HSPLorg/chromium/base/SysUtils;->amountOfPhysicalMemoryKB()I
-HSPLorg/chromium/base/SysUtils;->detectAmountOfPhysicalMemoryKB()I
-HSPLorg/chromium/base/SysUtils;->isLowEndDevice()Z
-Lorg/chromium/base/ThreadUtils;
-HSPLorg/chromium/base/ThreadUtils;->checkUiThread()V
-HSPLorg/chromium/base/ThreadUtils;->getUiThreadHandler()Landroid/os/Handler;
-HSPLorg/chromium/base/ThreadUtils;->getUiThreadLooper()Landroid/os/Looper;
-HSPLorg/chromium/base/ThreadUtils;->postOnUiThread(Ljava/lang/Runnable;)V
-HSPLorg/chromium/base/ThreadUtils;->runOnUiThread(Ljava/lang/Runnable;)V
-HSPLorg/chromium/base/ThreadUtils;->runningOnUiThread()Z
-Lorg/chromium/base/ThreadUtils$ThreadChecker;
-HSPLorg/chromium/base/ThreadUtils$ThreadChecker;-><init>()V
-Lorg/chromium/base/TimezoneUtils;
-HSPLorg/chromium/base/TimezoneUtils;->getDefaultTimeZoneId()Ljava/lang/String;
-Lorg/chromium/base/TraceEvent;
-HSPLorg/chromium/base/TraceEvent;->begin(Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/base/TraceEvent;->end(JLjava/lang/String;)V
-HSPLorg/chromium/base/TraceEvent;->end(Ljava/lang/String;)V
-HSPLorg/chromium/base/TraceEvent;->finishAsync(JLjava/lang/String;)V
-HSPLorg/chromium/base/TraceEvent;->instant(Ljava/lang/String;)V
-HSPLorg/chromium/base/TraceEvent;->scoped(Ljava/lang/String;Ljava/lang/String;)Lorg/chromium/base/TraceEvent;
-HSPLorg/chromium/base/TraceEvent;->setEnabled(Z)V
-HSPLorg/chromium/base/TraceEvent;->startAsync(JLjava/lang/String;)V
-Lorg/chromium/base/TraceEvent$ATrace;
-HSPLorg/chromium/base/TraceEvent$ATrace;-><init>(J)V
-HSPLorg/chromium/base/TraceEvent$ATrace;->onNativeTracingReady()V
-HSPLorg/chromium/base/TraceEvent$ATrace;->pollConfig()V
-HSPLorg/chromium/base/TraceEvent$ATrace;->queueIdle()Z
-Lorg/chromium/base/TraceEvent$ATrace$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/TraceEvent$ATrace$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/base/TraceEvent$ATrace;I)V
-HSPLorg/chromium/base/TraceEvent$ATrace$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/base/TraceEvent$ViewHierarchyDumper;
-HSPLorg/chromium/base/TraceEvent$ViewHierarchyDumper;->updateEnabledState()V
-Lorg/chromium/base/TraceEvent$ViewHierarchyDumper$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/TraceEvent$ViewHierarchyDumper$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/base/TraceEvent$ViewHierarchyDumper$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/base/UnownedUserData;
-HSPLorg/chromium/base/UnownedUserData;->onDetachedFromHost()V
-Lorg/chromium/base/UnownedUserDataHost;
-HSPLorg/chromium/base/UnownedUserDataHost;-><init>()V
-HSPLorg/chromium/base/UnownedUserDataHost;->get(Lorg/chromium/base/UnownedUserDataKey;)Lorg/chromium/base/UnownedUserData;
-Lorg/chromium/base/UnownedUserDataHost$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/UnownedUserDataHost$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/base/UnownedUserDataHost;Lorg/chromium/base/UnownedUserData;)V
-HSPLorg/chromium/base/UnownedUserDataHost$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/base/UnownedUserDataKey;
-HSPLorg/chromium/base/UnownedUserDataKey;-><init>(Ljava/lang/Class;)V
-HSPLorg/chromium/base/UnownedUserDataKey;->attachToHost(Lorg/chromium/base/UnownedUserDataHost;Lorg/chromium/base/UnownedUserData;)V
-HSPLorg/chromium/base/UnownedUserDataKey;->detachFromAllHosts(Lorg/chromium/base/UnownedUserData;)V
-HSPLorg/chromium/base/UnownedUserDataKey;->detachFromHost(Lorg/chromium/base/UnownedUserDataHost;)V
-HSPLorg/chromium/base/UnownedUserDataKey;->removeHostAttachment(Lorg/chromium/base/UnownedUserDataHost;)V
-HSPLorg/chromium/base/UnownedUserDataKey;->retrieveDataFromHost(Lorg/chromium/base/UnownedUserDataHost;)Lorg/chromium/base/UnownedUserData;
-Lorg/chromium/base/UserData;
-HSPLorg/chromium/base/UserData;->destroy()V
-Lorg/chromium/base/UserDataHost;
-HSPLorg/chromium/base/UserDataHost;-><init>()V
-HSPLorg/chromium/base/UserDataHost;->checkThreadAndState()V
-HSPLorg/chromium/base/UserDataHost;->getUserData(Ljava/lang/Class;)Lorg/chromium/base/UserData;
-HSPLorg/chromium/base/UserDataHost;->setUserData(Ljava/lang/Class;Lorg/chromium/base/UserData;)Lorg/chromium/base/UserData;
-Lorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/Class;
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/ClipDescription;)J
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent;
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/res/Configuration;)Z
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m(Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;)V
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m(Landroid/net/ConnectivityManager;Landroid/net/NetworkRequest;Lorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback;Landroid/os/Handler;)V
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Display;)Z
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)V
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/autofill/AutofillManager;)V
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/autofill/AutofillManager;Landroid/view/View;)V
-HSPLorg/chromium/base/compat/ApiHelperForO$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/view/autofill/AutofillManager;
-Lorg/chromium/base/compat/ApiHelperForOMR1$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/base/compat/ApiHelperForOMR1$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;)Z
-Lorg/chromium/base/compat/ApiHelperForP$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/base/compat/ApiHelperForP$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageInfo;)J
-HSPLorg/chromium/base/compat/ApiHelperForP$$ExternalSyntheticApiModelOutline0;->m(Landroid/net/LinkProperties;)Ljava/lang/String;
-HSPLorg/chromium/base/compat/ApiHelperForP$$ExternalSyntheticApiModelOutline0;->m(Landroid/net/LinkProperties;)Z
-Lorg/chromium/base/compat/ApiHelperForQ$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/base/compat/ApiHelperForQ$$ExternalSyntheticApiModelOutline0;->m(ILandroid/content/Context;Landroid/content/Intent;Landroid/content/ServiceConnection;Ljava/lang/String;Ljava/util/concurrent/Executor;)Z
-HSPLorg/chromium/base/compat/ApiHelperForQ$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/Context;Lorg/chromium/base/process_launcher/ChildServiceConnectionImpl;II)V
-HSPLorg/chromium/base/compat/ApiHelperForQ$$ExternalSyntheticApiModelOutline0;->m(Landroid/net/Uri;)Landroid/net/Uri;
-HSPLorg/chromium/base/compat/ApiHelperForQ$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/PowerManager;)I
-Lorg/chromium/base/jank_tracker/FrameMetrics;
-HSPLorg/chromium/base/jank_tracker/FrameMetrics;-><init>([Ljava/lang/Long;[Ljava/lang/Long;[Ljava/lang/Integer;)V
-Lorg/chromium/base/jank_tracker/FrameMetricsListener;
-HSPLorg/chromium/base/jank_tracker/FrameMetricsListener;-><init>(Lorg/chromium/base/jank_tracker/FrameMetricsStore;)V
-HSPLorg/chromium/base/jank_tracker/FrameMetricsListener;->onFrameMetricsAvailable(Landroid/view/Window;Landroid/view/FrameMetrics;I)V
-Lorg/chromium/base/jank_tracker/FrameMetricsStore;
-HSPLorg/chromium/base/jank_tracker/FrameMetricsStore;-><init>()V
-HSPLorg/chromium/base/jank_tracker/FrameMetricsStore;->removeUnusedFrames()V
-Lorg/chromium/base/jank_tracker/JankActivityTracker;
-HSPLorg/chromium/base/jank_tracker/JankActivityTracker;-><init>(Landroid/app/Activity;Lorg/chromium/base/jank_tracker/FrameMetricsListener;Lorg/chromium/base/jank_tracker/JankReportingScheduler;)V
-HSPLorg/chromium/base/jank_tracker/JankActivityTracker;->assertValidState()V
-HSPLorg/chromium/base/jank_tracker/JankActivityTracker;->onActivityStateChange(Landroid/app/Activity;I)V
-HSPLorg/chromium/base/jank_tracker/JankActivityTracker;->startReportingTimer()V
-HSPLorg/chromium/base/jank_tracker/JankActivityTracker;->stopReportingTimer()V
-Lorg/chromium/base/jank_tracker/JankMetricCalculator;
-HSPLorg/chromium/base/jank_tracker/JankMetricCalculator;->areFramesConsecutive(II[J[J)Z
-HSPLorg/chromium/base/jank_tracker/JankMetricCalculator;->longArrayToPrimitiveArray([Ljava/lang/Long;)[J
-Lorg/chromium/base/jank_tracker/JankMetricUMARecorder;
-HSPLorg/chromium/base/jank_tracker/JankMetricUMARecorder;->scenarioToString(I)Ljava/lang/String;
-Lorg/chromium/base/jank_tracker/JankReportingRunnable;
-HSPLorg/chromium/base/jank_tracker/JankReportingRunnable;-><init>(Lorg/chromium/base/jank_tracker/FrameMetricsStore;IZ)V
-HSPLorg/chromium/base/jank_tracker/JankReportingRunnable;->run()V
-Lorg/chromium/base/jank_tracker/JankReportingScheduler;
-HSPLorg/chromium/base/jank_tracker/JankReportingScheduler;-><init>(Lorg/chromium/base/jank_tracker/FrameMetricsStore;)V
-HSPLorg/chromium/base/jank_tracker/JankReportingScheduler;->finishTrackingScenario(I)V
-HSPLorg/chromium/base/jank_tracker/JankReportingScheduler;->getOrCreateHandler()Landroid/os/Handler;
-HSPLorg/chromium/base/jank_tracker/JankReportingScheduler;->startTrackingScenario(I)V
-Lorg/chromium/base/jank_tracker/JankReportingScheduler$1;
-HSPLorg/chromium/base/jank_tracker/JankReportingScheduler$1;-><init>(Lorg/chromium/base/jank_tracker/JankReportingScheduler;)V
-HSPLorg/chromium/base/jank_tracker/JankReportingScheduler$1;->run()V
-Lorg/chromium/base/jank_tracker/JankTracker;
-Lorg/chromium/base/jank_tracker/JankTrackerImpl;
-HSPLorg/chromium/base/jank_tracker/JankTrackerImpl;-><init>(Landroid/app/Activity;)V
-Lorg/chromium/base/library_loader/LibraryLoader;
-HSPLorg/chromium/base/library_loader/LibraryLoader;-><init>()V
-HSPLorg/chromium/base/library_loader/LibraryLoader;->ensureInitialized()V
-HSPLorg/chromium/base/library_loader/LibraryLoader;->ensureMainDexInitialized()V
-HSPLorg/chromium/base/library_loader/LibraryLoader;->initializeAlreadyLocked()V
-HSPLorg/chromium/base/library_loader/LibraryLoader;->isInitialized()Z
-HSPLorg/chromium/base/library_loader/LibraryLoader;->loadMainDexAlreadyLocked(Landroid/content/pm/ApplicationInfo;Z)V
-HSPLorg/chromium/base/library_loader/LibraryLoader;->loadNonMainDex()V
-HSPLorg/chromium/base/library_loader/LibraryLoader;->setLibraryProcessType(I)V
-Lorg/chromium/base/library_loader/LibraryLoader$MultiProcessMediator;
-HSPLorg/chromium/base/library_loader/LibraryLoader$MultiProcessMediator;-><init>(Lorg/chromium/base/library_loader/LibraryLoader;)V
-HSPLorg/chromium/base/library_loader/LibraryLoader$MultiProcessMediator;->creationAsString()Ljava/lang/String;
-HSPLorg/chromium/base/library_loader/LibraryLoader$MultiProcessMediator;->ensureInitializedInMainProcess()V
-HSPLorg/chromium/base/library_loader/LibraryLoader$MultiProcessMediator;->putLoadAddressToBundle(Landroid/os/Bundle;)V
-HSPLorg/chromium/base/library_loader/LibraryLoader$MultiProcessMediator;->putSharedRelrosToBundle(Landroid/os/Bundle;)V
-Lorg/chromium/base/library_loader/LibraryPrefetcher;
-HSPLorg/chromium/base/library_loader/LibraryPrefetcher;->asyncPrefetchLibrariesToMemory()V
-Lorg/chromium/base/library_loader/LibraryPrefetcher$$ExternalSyntheticLambda1;
-HSPLorg/chromium/base/library_loader/LibraryPrefetcher$$ExternalSyntheticLambda1;-><init>(Z)V
-HSPLorg/chromium/base/library_loader/LibraryPrefetcher$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/base/library_loader/ProcessInitException;
-Lorg/chromium/base/lifetime/DestroyChecker;
-HSPLorg/chromium/base/lifetime/DestroyChecker;-><init>()V
-Lorg/chromium/base/memory/MemoryPressureCallback;
-Lorg/chromium/base/memory/MemoryPressureMonitor;
-HSPLorg/chromium/base/memory/MemoryPressureMonitor;-><init>()V
-Lorg/chromium/base/memory/MemoryPressureMonitor$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/memory/MemoryPressureMonitor$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/base/memory/MemoryPressureMonitor$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-Lorg/chromium/base/memory/MemoryPressureMonitor$$ExternalSyntheticLambda1;
-HSPLorg/chromium/base/memory/MemoryPressureMonitor$$ExternalSyntheticLambda1;-><init>()V
-Lorg/chromium/base/memory/MemoryPressureMonitor$$ExternalSyntheticLambda2;
-HSPLorg/chromium/base/memory/MemoryPressureMonitor$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/base/memory/MemoryPressureMonitor;)V
-Lorg/chromium/base/memory/MemoryPressureMonitor$1;
-HSPLorg/chromium/base/memory/MemoryPressureMonitor$1;-><init>(Lorg/chromium/base/memory/MemoryPressureMonitor;)V
-Lorg/chromium/base/memory/MemoryPressureUma;
-HSPLorg/chromium/base/memory/MemoryPressureUma;-><init>(Ljava/lang/String;)V
-Lorg/chromium/base/memory/MemoryPurgeManager;
-HSPLorg/chromium/base/memory/MemoryPurgeManager;-><init>()V
-HSPLorg/chromium/base/memory/MemoryPurgeManager;->onApplicationStateChange(I)V
-Lorg/chromium/base/metrics/CachingUmaRecorder;
-HSPLorg/chromium/base/metrics/CachingUmaRecorder;-><init>()V
-HSPLorg/chromium/base/metrics/CachingUmaRecorder;->cacheOrRecordHistogramSample(ILjava/lang/String;IIII)V
-HSPLorg/chromium/base/metrics/CachingUmaRecorder;->flushHistogramsAlreadyLocked(Ljava/util/Map;I)V
-HSPLorg/chromium/base/metrics/CachingUmaRecorder;->recordBooleanHistogram(Ljava/lang/String;Z)V
-HSPLorg/chromium/base/metrics/CachingUmaRecorder;->recordExponentialHistogram(IIIILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/CachingUmaRecorder;->recordHistogramSampleAlreadyLocked(ILjava/lang/String;IIII)V
-HSPLorg/chromium/base/metrics/CachingUmaRecorder;->recordLinearHistogram(IIIILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/CachingUmaRecorder;->recordSparseHistogram(ILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/CachingUmaRecorder;->recordUserAction(JLjava/lang/String;)V
-Lorg/chromium/base/metrics/CachingUmaRecorder$Histogram;
-HSPLorg/chromium/base/metrics/CachingUmaRecorder$Histogram;-><init>(IIIILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/CachingUmaRecorder$Histogram;->addSample(I)Z
-Lorg/chromium/base/metrics/NativeUmaRecorder;
-HSPLorg/chromium/base/metrics/NativeUmaRecorder;-><init>()V
-HSPLorg/chromium/base/metrics/NativeUmaRecorder;->getNativeHint(Ljava/lang/String;)J
-HSPLorg/chromium/base/metrics/NativeUmaRecorder;->maybeUpdateNativeHint(Ljava/lang/String;JJ)V
-HSPLorg/chromium/base/metrics/NativeUmaRecorder;->recordBooleanHistogram(Ljava/lang/String;Z)V
-HSPLorg/chromium/base/metrics/NativeUmaRecorder;->recordExponentialHistogram(IIIILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/NativeUmaRecorder;->recordLinearHistogram(IIIILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/NativeUmaRecorder;->recordSparseHistogram(ILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/NativeUmaRecorder;->recordUserAction(JLjava/lang/String;)V
-Lorg/chromium/base/metrics/RecordHistogram;
-HSPLorg/chromium/base/metrics/RecordHistogram;->clampToInt(J)I
-HSPLorg/chromium/base/metrics/RecordHistogram;->recordBooleanHistogram(Ljava/lang/String;Z)V
-HSPLorg/chromium/base/metrics/RecordHistogram;->recordCount100Histogram(ILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/RecordHistogram;->recordCount1MHistogram(ILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/RecordHistogram;->recordCustomCountHistogram(IIIILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/RecordHistogram;->recordCustomTimesHistogramMilliseconds(Ljava/lang/String;JJJI)V
-HSPLorg/chromium/base/metrics/RecordHistogram;->recordExactLinearHistogram(IILjava/lang/String;)V
-PLorg/chromium/base/metrics/RecordHistogram;->recordLinearCountHistogram(IIIILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/RecordHistogram;->recordMediumTimesHistogram(JLjava/lang/String;)V
-HSPLorg/chromium/base/metrics/RecordHistogram;->recordPercentageHistogram(ILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/RecordHistogram;->recordSparseHistogram(ILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/RecordHistogram;->recordTimesHistogram(JLjava/lang/String;)V
-Lorg/chromium/base/metrics/RecordUserAction;
-HSPLorg/chromium/base/metrics/RecordUserAction;->record(Ljava/lang/String;)V
-Lorg/chromium/base/metrics/TimingMetric;
-HSPLorg/chromium/base/metrics/TimingMetric;-><init>(ILjava/lang/String;)V
-HSPLorg/chromium/base/metrics/TimingMetric;->close()V
-HSPLorg/chromium/base/metrics/TimingMetric;->mediumUptime(Ljava/lang/String;)Lorg/chromium/base/metrics/TimingMetric;
-Lorg/chromium/base/metrics/UmaRecorder;
-Lorg/chromium/base/metrics/UmaRecorderHolder;
-Lorg/chromium/base/process_launcher/BindService;
-HSPLorg/chromium/base/process_launcher/BindService;->bindServiceByReflection(Landroid/content/Context;Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/Handler;)Z
-HSPLorg/chromium/base/process_launcher/BindService;->doBindService(Landroid/content/Context;Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/Handler;Ljava/util/concurrent/Executor;Ljava/lang/String;)Z
-HSPLorg/chromium/base/process_launcher/BindService;->supportVariableConnections()Z
-Lorg/chromium/base/process_launcher/ChildConnectionAllocator;
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator;-><init>(Landroid/os/Handler;Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda0;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator;->checkServiceExists(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator;->create(Landroid/content/Context;Landroid/os/Handler;Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda0;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Lorg/chromium/base/process_launcher/ChildConnectionAllocator$FixedSizeAllocatorImpl;
-Lorg/chromium/base/process_launcher/ChildConnectionAllocator$1;
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$1;-><init>(Lorg/chromium/base/process_launcher/ChildConnectionAllocator;Lorg/chromium/base/process_launcher/ChildProcessConnection$ServiceCallback;)V
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$1;->onChildProcessDied(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$1;->onChildStarted()V
-Lorg/chromium/base/process_launcher/ChildConnectionAllocator$1$1;
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$1$1;-><init>(Lorg/chromium/base/process_launcher/ChildConnectionAllocator$1;)V
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$1$1;->run()V
-Lorg/chromium/base/process_launcher/ChildConnectionAllocator$1$2;
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$1$2;-><init>(Lorg/chromium/base/process_launcher/ChildConnectionAllocator$1;Lorg/chromium/base/process_launcher/ChildProcessConnection;I)V
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$1$2;->run()V
-Lorg/chromium/base/process_launcher/ChildConnectionAllocator$ConnectionFactoryImpl;
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$ConnectionFactoryImpl;-><init>()V
-Lorg/chromium/base/process_launcher/ChildConnectionAllocator$FixedSizeAllocatorImpl;
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$FixedSizeAllocatorImpl;-><init>(Landroid/os/Handler;Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda0;Ljava/lang/String;Ljava/lang/String;ZI)V
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$FixedSizeAllocatorImpl;->doAllocate(Landroid/content/Context;Landroid/os/Bundle;Lorg/chromium/base/process_launcher/ChildConnectionAllocator$1;)Lorg/chromium/base/process_launcher/ChildProcessConnection;
-Lorg/chromium/base/process_launcher/ChildConnectionAllocator$VariableSizeAllocatorImpl;
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$VariableSizeAllocatorImpl;-><init>(Landroid/os/Handler;Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda0;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$VariableSizeAllocatorImpl;->allocate(Landroid/content/Context;Landroid/os/Bundle;)Lorg/chromium/base/process_launcher/ChildProcessConnection;
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$VariableSizeAllocatorImpl;->doAllocate(Landroid/content/Context;Landroid/os/Bundle;Lorg/chromium/base/process_launcher/ChildConnectionAllocator$1;)Lorg/chromium/base/process_launcher/ChildProcessConnection;
-HSPLorg/chromium/base/process_launcher/ChildConnectionAllocator$VariableSizeAllocatorImpl;->doFree(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-Lorg/chromium/base/process_launcher/ChildProcessConnection;
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;-><init>(Landroid/content/Context;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZLandroid/os/Bundle;Ljava/lang/String;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->addStrongBinding()V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->addVisibleBinding()V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->bind(Z)Z
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->createBindings(Landroid/content/ComponentName;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->doConnectionSetup()V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->isConnected()Z
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->onServiceConnectedOnLauncherThread(Landroid/os/IBinder;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->start(ZLorg/chromium/base/process_launcher/ChildConnectionAllocator$1;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->unbind()V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->updateBindingState()V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection;->updateGroupImportance(II)V
-Lorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-Lorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda2;
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/base/memory/MemoryPressureCallback;I)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda2;->run()V
-Lorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda3;
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda3;-><init>(ILjava/lang/Object;)V
-PLorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda3;->run()V
-Lorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda4;
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda4;-><init>(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$$ExternalSyntheticLambda4;->execute(Ljava/lang/Runnable;)V
-Lorg/chromium/base/process_launcher/ChildProcessConnection$1;
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$1;-><init>(Landroid/os/Bundle;Ljava/util/List;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$1;-><init>(Lorg/chromium/base/process_launcher/ChildProcessConnection;Landroid/content/Context;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$1;->createConnection(Landroid/content/Intent;ILorg/chromium/base/process_launcher/ChildProcessConnection$2;Ljava/lang/String;)Lorg/chromium/base/process_launcher/ChildServiceConnectionImpl;
-Lorg/chromium/base/process_launcher/ChildProcessConnection$2;
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$2;-><init>(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-Lorg/chromium/base/process_launcher/ChildProcessConnection$3;
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$3;-><init>(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$3;->asBinder()Landroid/os/IBinder;
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$3;->finishSetupConnection(IIJLandroid/os/Bundle;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$3;->onTransact$org$chromium$base$process_launcher$IParentProcess$Stub(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$3;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-PLorg/chromium/base/process_launcher/ChildProcessConnection$3;->reportCleanExit()V
-Lorg/chromium/base/process_launcher/ChildProcessConnection$3$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$3$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/base/process_launcher/ChildProcessConnection$3;IIJLandroid/os/Bundle;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessConnection$3$$ExternalSyntheticLambda0;->run()V
-PLorg/chromium/base/process_launcher/ChildProcessConnection$3$1;-><init>(Lorg/chromium/base/process_launcher/ChildProcessConnection$3;)V
-PLorg/chromium/base/process_launcher/ChildProcessConnection$3$1;->run()V
-Lorg/chromium/base/process_launcher/ChildProcessConnection$ServiceCallback;
-Lorg/chromium/base/process_launcher/ChildProcessLauncher;
-HSPLorg/chromium/base/process_launcher/ChildProcessLauncher;-><init>(Landroid/os/Handler;Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$1;[Ljava/lang/String;[Lorg/chromium/base/process_launcher/FileDescriptorInfo;Lorg/chromium/base/process_launcher/ChildConnectionAllocator;Ljava/util/List;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessLauncher;->allocateAndSetupConnection(Lorg/chromium/base/process_launcher/ChildProcessConnection$ServiceCallback;ZZ)Z
-HSPLorg/chromium/base/process_launcher/ChildProcessLauncher;->setupConnection()V
-HSPLorg/chromium/base/process_launcher/ChildProcessLauncher;->start(ZZ)V
-Lorg/chromium/base/process_launcher/ChildProcessLauncher$1;
-HSPLorg/chromium/base/process_launcher/ChildProcessLauncher$1;-><init>(Lorg/chromium/base/process_launcher/ChildProcessLauncher;ZZ)V
-HSPLorg/chromium/base/process_launcher/ChildProcessLauncher$1;->onChildProcessDied(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessLauncher$1;->onChildStarted()V
-Lorg/chromium/base/process_launcher/ChildProcessLauncher$2;
-HSPLorg/chromium/base/process_launcher/ChildProcessLauncher$2;-><init>(Lorg/chromium/base/process_launcher/ChildProcessLauncher;)V
-HSPLorg/chromium/base/process_launcher/ChildProcessLauncher$2;->onConnected()V
-Lorg/chromium/base/process_launcher/ChildProcessLauncher$Delegate;
-HSPLorg/chromium/base/process_launcher/ChildProcessLauncher$Delegate;-><init>()V
-Lorg/chromium/base/process_launcher/ChildServiceConnectionImpl;
-HSPLorg/chromium/base/process_launcher/ChildServiceConnectionImpl;-><init>(Landroid/content/Context;Landroid/content/Intent;ILandroid/os/Handler;Ljava/util/concurrent/Executor;Lorg/chromium/base/process_launcher/ChildProcessConnection$2;Ljava/lang/String;)V
-HSPLorg/chromium/base/process_launcher/ChildServiceConnectionImpl;->bindServiceConnection()Z
-HSPLorg/chromium/base/process_launcher/ChildServiceConnectionImpl;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-HSPLorg/chromium/base/process_launcher/ChildServiceConnectionImpl;->unbindServiceConnection()V
-Lorg/chromium/base/process_launcher/FileDescriptorInfo;
-HSPLorg/chromium/base/process_launcher/FileDescriptorInfo;-><init>(ILandroid/os/ParcelFileDescriptor;JJ)V
-HSPLorg/chromium/base/process_launcher/FileDescriptorInfo;->writeToParcel(Landroid/os/Parcel;I)V
-Lorg/chromium/base/process_launcher/FileDescriptorInfo$1;
-HSPLorg/chromium/base/process_launcher/FileDescriptorInfo$1;-><init>()V
-Lorg/chromium/base/process_launcher/IChildProcessService;
-Lorg/chromium/base/process_launcher/IChildProcessService$Stub;
-Lorg/chromium/base/process_launcher/IChildProcessService$Stub$Proxy;
-HSPLorg/chromium/base/process_launcher/IChildProcessService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-HSPLorg/chromium/base/process_launcher/IChildProcessService$Stub$Proxy;->getAppInfo()Landroid/content/pm/ApplicationInfo;
-HSPLorg/chromium/base/process_launcher/IChildProcessService$Stub$Proxy;->setupConnection(Landroid/os/Bundle;Lorg/chromium/base/process_launcher/IParentProcess;Ljava/util/List;)V
-Lorg/chromium/base/process_launcher/IParentProcess;
-Lorg/chromium/base/supplier/ObservableSupplier;
-Lorg/chromium/base/supplier/ObservableSupplierImpl;
-HSPLorg/chromium/base/supplier/ObservableSupplierImpl;-><init>()V
-HSPLorg/chromium/base/supplier/ObservableSupplierImpl;->addObserver(Lorg/chromium/base/Callback;)Ljava/lang/Object;
-HSPLorg/chromium/base/supplier/ObservableSupplierImpl;->get()Ljava/lang/Object;
-HSPLorg/chromium/base/supplier/ObservableSupplierImpl;->removeObserver(Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/base/supplier/ObservableSupplierImpl;->set(Ljava/lang/Object;)V
-Lorg/chromium/base/supplier/ObservableSupplierImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/supplier/ObservableSupplierImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/base/supplier/ObservableSupplierImpl;Ljava/lang/Object;Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/base/supplier/ObservableSupplierImpl$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/base/supplier/OneShotCallback;
-HSPLorg/chromium/base/supplier/OneShotCallback;-><init>(Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/Callback;)V
-Lorg/chromium/base/supplier/OneShotCallback$CallbackWrapper;
-HSPLorg/chromium/base/supplier/OneShotCallback$CallbackWrapper;-><init>(Lorg/chromium/base/supplier/OneShotCallback;)V
-HSPLorg/chromium/base/supplier/OneShotCallback$CallbackWrapper;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/base/supplier/OneshotSupplier;
-Lorg/chromium/base/supplier/OneshotSupplierImpl;
-HSPLorg/chromium/base/supplier/OneshotSupplierImpl;-><init>()V
-HSPLorg/chromium/base/supplier/OneshotSupplierImpl;->get()Ljava/lang/Object;
-HSPLorg/chromium/base/supplier/OneshotSupplierImpl;->onAvailable(Lorg/chromium/base/Callback;)Ljava/lang/Object;
-HSPLorg/chromium/base/supplier/OneshotSupplierImpl;->set(Ljava/lang/Object;)V
-Lorg/chromium/base/supplier/Supplier;
-HSPLorg/chromium/base/supplier/Supplier;->hasValue()Z
-Lorg/chromium/base/supplier/UnownedUserDataSupplier;
-HSPLorg/chromium/base/supplier/UnownedUserDataSupplier;-><init>(Lorg/chromium/base/UnownedUserDataKey;)V
-HSPLorg/chromium/base/supplier/UnownedUserDataSupplier;->attach(Lorg/chromium/base/UnownedUserDataHost;)V
-HSPLorg/chromium/base/supplier/UnownedUserDataSupplier;->destroy()V
-Lorg/chromium/base/task/AsyncTask;
-HSPLorg/chromium/base/task/AsyncTask;-><init>()V
-PLorg/chromium/base/task/AsyncTask;->cancel(Z)Z
-HSPLorg/chromium/base/task/AsyncTask;->executeOnExecutor(Ljava/util/concurrent/Executor;)V
-HSPLorg/chromium/base/task/AsyncTask;->executeOnTaskRunner(Lorg/chromium/base/task/TaskRunner;)V
-HSPLorg/chromium/base/task/AsyncTask;->executionPreamble()V
-HSPLorg/chromium/base/task/AsyncTask;->get()Ljava/lang/Object;
-HSPLorg/chromium/base/task/AsyncTask;->isCancelled()Z
-PLorg/chromium/base/task/AsyncTask;->onCancelled()V
-PLorg/chromium/base/task/AsyncTask;->onCancelled(Ljava/lang/Object;)V
-HSPLorg/chromium/base/task/AsyncTask;->onPreExecute()V
-HSPLorg/chromium/base/task/AsyncTask;->postResult(Ljava/lang/Object;)V
-Lorg/chromium/base/task/AsyncTask$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/task/AsyncTask$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/base/task/AsyncTask$$ExternalSyntheticLambda0;->execute(Ljava/lang/Runnable;)V
-Lorg/chromium/base/task/AsyncTask$$ExternalSyntheticLambda1;
-HSPLorg/chromium/base/task/AsyncTask$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/base/task/AsyncTask;Ljava/lang/Object;)V
-HSPLorg/chromium/base/task/AsyncTask$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/base/task/AsyncTask$1;
-HSPLorg/chromium/base/task/AsyncTask$1;-><init>(Lorg/chromium/base/task/AsyncTask;)V
-HSPLorg/chromium/base/task/AsyncTask$1;->call()Ljava/lang/Object;
-Lorg/chromium/base/task/AsyncTask$NamedFutureTask;
-HSPLorg/chromium/base/task/AsyncTask$NamedFutureTask;-><init>(Lorg/chromium/base/task/AsyncTask;Lorg/chromium/base/task/AsyncTask$1;)V
-HSPLorg/chromium/base/task/AsyncTask$NamedFutureTask;->done()V
-HSPLorg/chromium/base/task/AsyncTask$NamedFutureTask;->run()V
-Lorg/chromium/base/task/AsyncTask$StealRunnableHandler;
-HSPLorg/chromium/base/task/AsyncTask$StealRunnableHandler;-><init>()V
-Lorg/chromium/base/task/BackgroundOnlyAsyncTask;
-HSPLorg/chromium/base/task/BackgroundOnlyAsyncTask;-><init>()V
-Lorg/chromium/base/task/ChainedTasks;
-HSPLorg/chromium/base/task/ChainedTasks;-><init>()V
-HSPLorg/chromium/base/task/ChainedTasks;->add(Lorg/chromium/base/task/TaskTraits;Ljava/lang/Runnable;)V
-HSPLorg/chromium/base/task/ChainedTasks;->start(Z)V
-Lorg/chromium/base/task/ChainedTasks$1;
-HSPLorg/chromium/base/task/ChainedTasks$1;-><init>(Lorg/chromium/base/task/ChainedTasks;)V
-HSPLorg/chromium/base/task/ChainedTasks$1;->run()V
-Lorg/chromium/base/task/ChoreographerTaskRunner;
-HSPLorg/chromium/base/task/ChoreographerTaskRunner;-><init>(Landroid/view/Choreographer;)V
-HSPLorg/chromium/base/task/ChoreographerTaskRunner;->postDelayedTask(Ljava/lang/Runnable;J)V
-Lorg/chromium/base/task/ChoreographerTaskRunner$1;
-HSPLorg/chromium/base/task/ChoreographerTaskRunner$1;-><init>(Ljava/lang/Runnable;I)V
-HSPLorg/chromium/base/task/ChoreographerTaskRunner$1;->doFrame(J)V
-Lorg/chromium/base/task/ChromeThreadPoolExecutor;
-HSPLorg/chromium/base/task/ChromeThreadPoolExecutor;-><init>()V
-HSPLorg/chromium/base/task/ChromeThreadPoolExecutor;->execute(Ljava/lang/Runnable;)V
-Lorg/chromium/base/task/ChromeThreadPoolExecutor$1;
-HSPLorg/chromium/base/task/ChromeThreadPoolExecutor$1;-><init>()V
-HSPLorg/chromium/base/task/ChromeThreadPoolExecutor$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
-Lorg/chromium/base/task/ChromeThreadPoolExecutor$1$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/task/ChromeThreadPoolExecutor$1$$ExternalSyntheticLambda0;-><init>(Ljava/lang/Runnable;)V
-HSPLorg/chromium/base/task/ChromeThreadPoolExecutor$1$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/base/task/DefaultTaskExecutor;
-HSPLorg/chromium/base/task/DefaultTaskExecutor;-><init>()V
-HSPLorg/chromium/base/task/DefaultTaskExecutor;->createChoreographerTaskRunner()Lorg/chromium/base/task/ChoreographerTaskRunner;
-HSPLorg/chromium/base/task/DefaultTaskExecutor;->createSequencedTaskRunner(Lorg/chromium/base/task/TaskTraits;)Lorg/chromium/base/task/SequencedTaskRunner;
-HSPLorg/chromium/base/task/DefaultTaskExecutor;->createTaskRunner(Lorg/chromium/base/task/TaskTraits;)Lorg/chromium/base/task/TaskRunner;
-HSPLorg/chromium/base/task/DefaultTaskExecutor;->postDelayedTask(Lorg/chromium/base/task/TaskTraits;Ljava/lang/Runnable;J)V
-Lorg/chromium/base/task/DefaultTaskExecutor$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/task/DefaultTaskExecutor$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/base/task/DefaultTaskExecutor$$ExternalSyntheticLambda0;->call()Ljava/lang/Object;
-Lorg/chromium/base/task/PostTask;
-HSPLorg/chromium/base/task/PostTask;->createSequencedTaskRunner(Lorg/chromium/base/task/TaskTraits;)Lorg/chromium/base/task/SequencedTaskRunner;
-HSPLorg/chromium/base/task/PostTask;->onNativeSchedulerReady()V
-HSPLorg/chromium/base/task/PostTask;->postDelayedTask(Lorg/chromium/base/task/TaskTraits;Ljava/lang/Runnable;J)V
-HSPLorg/chromium/base/task/PostTask;->postTask(Lorg/chromium/base/task/TaskTraits;Ljava/lang/Runnable;)V
-HSPLorg/chromium/base/task/PostTask;->runOrPostTask(Lorg/chromium/base/task/TaskTraits;Ljava/lang/Runnable;)V
-Lorg/chromium/base/task/SequencedTaskRunner;
-Lorg/chromium/base/task/SequencedTaskRunnerImpl;
-HSPLorg/chromium/base/task/SequencedTaskRunnerImpl;-><init>(Lorg/chromium/base/task/TaskTraits;)V
-HSPLorg/chromium/base/task/SequencedTaskRunnerImpl;->initNativeTaskRunner()V
-HSPLorg/chromium/base/task/SequencedTaskRunnerImpl;->runPreNativeTask()V
-HSPLorg/chromium/base/task/SequencedTaskRunnerImpl;->schedulePreNativeTask()V
-Lorg/chromium/base/task/SerialExecutor;
-HSPLorg/chromium/base/task/SerialExecutor;-><init>()V
-HSPLorg/chromium/base/task/SerialExecutor;->execute(Ljava/lang/Runnable;)V
-HSPLorg/chromium/base/task/SerialExecutor;->scheduleNext()V
-Lorg/chromium/base/task/SerialExecutor$1;
-HSPLorg/chromium/base/task/SerialExecutor$1;-><init>(Lorg/chromium/base/task/SerialExecutor;Ljava/lang/Runnable;)V
-HSPLorg/chromium/base/task/SerialExecutor$1;->run()V
-Lorg/chromium/base/task/SingleThreadTaskRunner;
-Lorg/chromium/base/task/SingleThreadTaskRunnerImpl;
-HSPLorg/chromium/base/task/SingleThreadTaskRunnerImpl;-><init>(Landroid/os/Handler;Lorg/chromium/base/task/TaskTraits;)V
-HSPLorg/chromium/base/task/SingleThreadTaskRunnerImpl;->belongsToCurrentThread()Z
-HSPLorg/chromium/base/task/SingleThreadTaskRunnerImpl;->schedulePreNativeTask()V
-Lorg/chromium/base/task/TaskExecutor;
-Lorg/chromium/base/task/TaskRunner;
-Lorg/chromium/base/task/TaskRunnerImpl;
-HSPLorg/chromium/base/task/TaskRunnerImpl;-><init>(Lorg/chromium/base/task/TaskTraits;Ljava/lang/String;I)V
-HSPLorg/chromium/base/task/TaskRunnerImpl;->destroyGarbageCollectedTaskRunners()V
-HSPLorg/chromium/base/task/TaskRunnerImpl;->initNativeTaskRunner()V
-HSPLorg/chromium/base/task/TaskRunnerImpl;->oneTimeInitialization()V
-HSPLorg/chromium/base/task/TaskRunnerImpl;->postDelayedTask(Ljava/lang/Runnable;J)V
-HSPLorg/chromium/base/task/TaskRunnerImpl;->postTask(Ljava/lang/Runnable;)V
-HSPLorg/chromium/base/task/TaskRunnerImpl;->runPreNativeTask()V
-HSPLorg/chromium/base/task/TaskRunnerImpl;->schedulePreNativeTask()V
-Lorg/chromium/base/task/TaskRunnerImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/base/task/TaskRunnerImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/base/task/TaskRunnerImpl;)V
-HSPLorg/chromium/base/task/TaskRunnerImpl$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/base/task/TaskRunnerImpl$TaskRunnerCleaner;
-HSPLorg/chromium/base/task/TaskRunnerImpl$TaskRunnerCleaner;-><init>(Lorg/chromium/base/task/TaskRunnerImpl;)V
-Lorg/chromium/base/task/TaskTraits;
-HSPLorg/chromium/base/task/TaskTraits;-><init>()V
-HSPLorg/chromium/base/task/TaskTraits;-><init>(Lorg/chromium/base/task/TaskTraits;)V
-HSPLorg/chromium/base/task/TaskTraits;->hashCode()I
-HSPLorg/chromium/base/task/TaskTraits;->taskPriority(I)Lorg/chromium/base/task/TaskTraits;
-Lorg/chromium/blink/mojom/AndroidFontLookup;
-Lorg/chromium/blink/mojom/AndroidFontLookup_Internal;
-Lorg/chromium/blink/mojom/AndroidFontLookup_Internal$1;
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$1;-><init>()V
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$1;->buildStub(Lorg/chromium/mojo/system/Core;Lorg/chromium/mojo/bindings/Interface;)Lorg/chromium/mojo/bindings/Interface$Stub;
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$1;->getName()Ljava/lang/String;
-Lorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesParams;
-Lorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParams;
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParams;-><init>(I)V
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParams;->encode(Lorg/chromium/mojo/bindings/Encoder;)V
-Lorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParams$$ExternalSyntheticOutline0;
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParams$$ExternalSyntheticOutline0;->m(IIILorg/chromium/mojo/bindings/Encoder;Ljava/lang/String;ZII)I
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParams$$ExternalSyntheticOutline0;->m(Lorg/chromium/mojo/bindings/Message;)Lorg/chromium/mojo/bindings/Decoder;
-Lorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParamsProxyToResponder;
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParamsProxyToResponder;-><init>(Lorg/chromium/mojo/system/Core;Lorg/chromium/mojo/bindings/MessageReceiver;JI)V
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParamsProxyToResponder;->call(Ljava/lang/Object;)V
-Lorg/chromium/blink/mojom/AndroidFontLookup_Internal$Stub;
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$Stub;-><init>(Lorg/chromium/mojo/system/Core;Lorg/chromium/blink/mojom/AndroidFontLookup;)V
-HSPLorg/chromium/blink/mojom/AndroidFontLookup_Internal$Stub;->acceptWithResponder(Lorg/chromium/mojo/bindings/Message;Lorg/chromium/mojo/bindings/MessageReceiver;)Z
-Lorg/chromium/build/NativeLibraries;
-Lorg/chromium/chrome/browser/ActivityTabProvider;
-HSPLorg/chromium/chrome/browser/ActivityTabProvider;-><init>()V
-HSPLorg/chromium/chrome/browser/ActivityTabProvider;->triggerActivityTabChangeEvent(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/ActivityTabProvider$1;
-HSPLorg/chromium/chrome/browser/ActivityTabProvider$1;-><init>(Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-HSPLorg/chromium/chrome/browser/ActivityTabProvider$1;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/ActivityTabProvider$2;
-HSPLorg/chromium/chrome/browser/ActivityTabProvider$2;-><init>(Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/ActivityTabProvider$2;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/ActivityTabProvider$3;
-HSPLorg/chromium/chrome/browser/ActivityTabProvider$3;-><init>(Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-Lorg/chromium/chrome/browser/ActivityTabProvider$ActivityTabTabObserver;
-HSPLorg/chromium/chrome/browser/ActivityTabProvider$ActivityTabTabObserver;-><init>(Lorg/chromium/chrome/browser/ActivityTabProvider;Z)V
-HSPLorg/chromium/chrome/browser/ActivityTabProvider$ActivityTabTabObserver;->destroy()V
-HSPLorg/chromium/chrome/browser/ActivityTabProvider$ActivityTabTabObserver;->onObservingDifferentTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/ActivityTabProvider$ActivityTabTabObserver$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ActivityTabProvider$ActivityTabTabObserver$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/ActivityTabProvider$ActivityTabTabObserver;)V
-HSPLorg/chromium/chrome/browser/ActivityTabProvider$ActivityTabTabObserver$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/ActivityUtils;
-HSPLorg/chromium/chrome/browser/ActivityUtils;->getThemeId()I
-Lorg/chromium/chrome/browser/AppHooks;
-HSPLorg/chromium/chrome/browser/AppHooks;-><init>()V
-HSPLorg/chromium/chrome/browser/AppHooks;->get()Lorg/chromium/chrome/browser/AppHooks;
-Lorg/chromium/chrome/browser/AppHooksImpl;
-HSPLorg/chromium/chrome/browser/AppHooksImpl;-><init>()V
-Lorg/chromium/chrome/browser/AppHooksModule;
-HSPLorg/chromium/chrome/browser/AppHooksModule;-><init>()V
-Lorg/chromium/chrome/browser/AppIndexingUtil;
-HSPLorg/chromium/chrome/browser/AppIndexingUtil;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/AppIndexingUtil;->extractDocumentMetadata(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/AppIndexingUtil$1;
-HSPLorg/chromium/chrome/browser/AppIndexingUtil$1;-><init>(Lorg/chromium/chrome/browser/AppIndexingUtil;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/AppIndexingUtil$1;->didFirstVisuallyNonEmptyPaint(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/AppIndexingUtil$1;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/ApplicationLifetime;
-Lorg/chromium/chrome/browser/ApplicationLifetime$Observer;
-Lorg/chromium/chrome/browser/BackupSigninProcessor;
-HSPLorg/chromium/chrome/browser/BackupSigninProcessor;->setBackupFlowSigninComplete()V
-HSPLorg/chromium/chrome/browser/BackupSigninProcessor;->start(Landroid/app/Activity;)V
-Lorg/chromium/chrome/browser/ChromeActionModeHandler;
-HSPLorg/chromium/chrome/browser/ChromeActionModeHandler;-><init>(Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/base/supplier/ObservableSupplier;)V
-Lorg/chromium/chrome/browser/ChromeActionModeHandler$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ChromeActionModeHandler$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/ChromeActionModeHandler;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/base/supplier/ObservableSupplier;)V
-HSPLorg/chromium/chrome/browser/ChromeActionModeHandler$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/ChromeActionModeHandler$1;
-HSPLorg/chromium/chrome/browser/ChromeActionModeHandler$1;-><init>(Lorg/chromium/chrome/browser/ChromeActionModeHandler;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-HSPLorg/chromium/chrome/browser/ChromeActionModeHandler$1;->onObservingDifferentTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/ChromeActionModeHandler$ActionModeCallback;
-HSPLorg/chromium/chrome/browser/ChromeActionModeHandler$ActionModeCallback;-><init>(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/content_public/browser/WebContents;Lorg/chromium/base/Callback;Lorg/chromium/base/supplier/Supplier;)V
-Lorg/chromium/chrome/browser/ChromeActivitySessionTracker;
-HSPLorg/chromium/chrome/browser/ChromeActivitySessionTracker;-><init>()V
-HSPLorg/chromium/chrome/browser/ChromeActivitySessionTracker;->getInstance()Lorg/chromium/chrome/browser/ChromeActivitySessionTracker;
-HSPLorg/chromium/chrome/browser/ChromeActivitySessionTracker;->updateAcceptLanguages()V
-Lorg/chromium/chrome/browser/ChromeActivitySessionTracker$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ChromeActivitySessionTracker$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/ChromeActivitySessionTracker;)V
-HSPLorg/chromium/chrome/browser/ChromeActivitySessionTracker$$ExternalSyntheticLambda0;->onApplicationStateChange(I)V
-Lorg/chromium/chrome/browser/ChromeApplicationImpl;
-HSPLorg/chromium/chrome/browser/ChromeApplicationImpl;-><init>()V
-HSPLorg/chromium/chrome/browser/ChromeApplicationImpl;->getComponent()Lorg/chromium/chrome/browser/dependency_injection/DaggerChromeAppComponent$ChromeAppComponentImpl;
-HSPLorg/chromium/chrome/browser/ChromeApplicationImpl;->onCreate()V
-Lorg/chromium/chrome/browser/ChromeBackupAgentImpl;
-Lorg/chromium/chrome/browser/ChromeBackupWatcher;
-HSPLorg/chromium/chrome/browser/ChromeBackupWatcher;-><init>()V
-HSPLorg/chromium/chrome/browser/ChromeBackupWatcher;->createChromeBackupWatcher()Lorg/chromium/chrome/browser/ChromeBackupWatcher;
-HSPLorg/chromium/chrome/browser/ChromeBackupWatcher;->onBackupPrefsChanged()V
-Lorg/chromium/chrome/browser/ChromeBackupWatcher$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ChromeBackupWatcher$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/ChromeBackupWatcher;)V
-HSPLorg/chromium/chrome/browser/ChromeBackupWatcher$$ExternalSyntheticLambda0;->onPreferenceChanged(Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/ChromeBackupWatcher$1;
-HSPLorg/chromium/chrome/browser/ChromeBackupWatcher$1;-><init>(Lorg/chromium/chrome/browser/ChromeBackupWatcher;)V
-Lorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;-><init>()V
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->applyOverrides(Landroid/content/Context;Landroid/content/res/Configuration;)Z
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->attachBaseContext(Landroid/content/Context;)V
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->createNightModeStateProvider()Lorg/chromium/chrome/browser/night_mode/NightModeStateProvider;
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->getClassLoader()Ljava/lang/ClassLoader;
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->getModalDialogManager()Lorg/chromium/ui/modaldialog/ModalDialogManager;
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->initializeNightModeStateProvider()V
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->onCreate(Landroid/os/Bundle;)V
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->onDestroy()V
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->setDefaultTaskDescription()V
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity;->setTheme(I)V
-Lorg/chromium/chrome/browser/ChromeBaseAppCompatActivity$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/browser/ChromeBaseAppCompatActivity$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/ChromeInactivityTracker;
-HSPLorg/chromium/chrome/browser/ChromeInactivityTracker;-><init>()V
-HSPLorg/chromium/chrome/browser/ChromeInactivityTracker;->onDestroy()V
-HSPLorg/chromium/chrome/browser/ChromeInactivityTracker;->onPauseWithNative()V
-HSPLorg/chromium/chrome/browser/ChromeInactivityTracker;->onResumeWithNative()V
-HSPLorg/chromium/chrome/browser/ChromeInactivityTracker;->onStartWithNative()V
-HSPLorg/chromium/chrome/browser/ChromeInactivityTracker;->onStopWithNative()V
-HSPLorg/chromium/chrome/browser/ChromeInactivityTracker;->setLastVisibleTimeMsAndRecord(J)V
-Lorg/chromium/chrome/browser/ChromeKeyboardVisibilityDelegate;
-HSPLorg/chromium/chrome/browser/ChromeKeyboardVisibilityDelegate;-><init>(Ljava/lang/ref/WeakReference;Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentSupplier;)V
-HSPLorg/chromium/chrome/browser/ChromeKeyboardVisibilityDelegate;->calculateKeyboardHeight(Landroid/view/View;)I
-HSPLorg/chromium/chrome/browser/ChromeKeyboardVisibilityDelegate;->isKeyboardShowing(Landroid/content/Context;Landroid/view/View;)Z
-Lorg/chromium/chrome/browser/ChromeLocalizationUtils;
-HSPLorg/chromium/chrome/browser/ChromeLocalizationUtils;->recordUiLanguageStatus()V
-Lorg/chromium/chrome/browser/ChromeStrictMode;
-Lorg/chromium/chrome/browser/ChromeStrictMode$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/chrome/browser/ChromeStrictMode$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/StrictMode$VmPolicy$Builder;)V
-Lorg/chromium/chrome/browser/ChromeStrictMode$$ExternalSyntheticApiModelOutline1;
-HSPLorg/chromium/chrome/browser/ChromeStrictMode$$ExternalSyntheticApiModelOutline1;->m(Landroid/os/StrictMode$VmPolicy$Builder;)Landroid/os/StrictMode$VmPolicy$Builder;
-HSPLorg/chromium/chrome/browser/ChromeStrictMode$$ExternalSyntheticApiModelOutline1;->m(Landroid/os/StrictMode$VmPolicy$Builder;)V
-Lorg/chromium/chrome/browser/ChromeStrictMode$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/ChromeStrictMode$$ExternalSyntheticLambda3;-><init>()V
-Lorg/chromium/chrome/browser/ChromeStrictMode$$ExternalSyntheticLambda4;
-HSPLorg/chromium/chrome/browser/ChromeStrictMode$$ExternalSyntheticLambda4;-><init>()V
-HSPLorg/chromium/chrome/browser/ChromeStrictMode$$ExternalSyntheticLambda4;->queueIdle()Z
-Lorg/chromium/chrome/browser/ChromeTabbedActivity;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->$r8$lambda$y0VI-Tx4eNfLGtbQTxAQ0QI-8JA(Lorg/chromium/chrome/browser/ChromeTabbedActivity;)Lorg/chromium/chrome/browser/TabbedModeTabDelegateFactory;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->-$$Nest$mlaunchIntent(Lorg/chromium/chrome/browser/ChromeTabbedActivity;Lorg/chromium/content_public/browser/LoadUrlParams;Ljava/lang/String;ZLandroid/content/Intent;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;-><init>()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->createAppMenuPropertiesDelegate()Lorg/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->createIntentHandlerDelegate()Lorg/chromium/chrome/browser/IntentHandler$IntentHandlerDelegate;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->createLaunchCauseMetrics()Lorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->createModalDialogManager()Lorg/chromium/ui/modaldialog/ModalDialogManager;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->createRootUiCoordinator()Lorg/chromium/chrome/browser/ui/RootUiCoordinator;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->createStartSurface(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;Landroid/view/ViewGroup;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->createTabCreators()Landroid/util/Pair;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->createTabModelOrchestrator()Lorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->createTabModels()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->createTabSwitcherOrStartSurface(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;Landroid/view/ViewGroup;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->destroyTabModels()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->dispatchOnInflationComplete()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->finishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->getActivityType()I
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->getControlContainerHeightResource()I
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->getControlContainerLayoutId()I
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->getLayoutManager()Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->getTabCreator(Z)Lorg/chromium/chrome/browser/tabmodel/ChromeTabCreator;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->getTabCreator(Z)Lorg/chromium/chrome/browser/tabmodel/TabCreator;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->getToolbarLayoutId()I
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->handleDebugIntent(Landroid/content/Intent;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->initDeferredStartupForActivity()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->initializeCompositor()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->initializeCompositorContent()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->initializeState()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->isInOverviewMode()Z
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->isStartSurfaceRefactorEnabled()Z
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->isStartedUpCorrectly(Landroid/content/Intent;)Z
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->maybeDispatchExplicitMainViewIntent(Landroid/content/Intent;I)I
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->maybeDispatchLaunchIntent(Landroid/content/Intent;Landroid/os/Bundle;)I
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onAccessibilityModeChanged(Z)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onAccessibilityTabSwitcherModeChanged()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onDestroyInternal()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onNewIntent(Landroid/content/Intent;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onNewIntentWithNative(Landroid/content/Intent;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onPause()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onPauseWithNative()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onPreCreate()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onResume()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onResumeWithNative()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onSceneChange(Lorg/chromium/chrome/browser/compositor/layouts/Layout;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onStart()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onStartWithNative()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onStop()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->onStopWithNative()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->performPostInflationStartup()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->performPreInflationStartup()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->saveState()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->setInitialOverviewState(Z)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->setTrackColdStartupMetrics(Z)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->setupCompositorContentPreNativeForPhone()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->shouldIgnoreIntent()Z
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->shouldShowOverviewPageOnStart()Z
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity;->startNativeInitialization()V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/Class;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/content/pm/ShortcutManager;
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda11;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda11;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;I)V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda12;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda12;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;I)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda12;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda13;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda13;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;I)V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda14;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda14;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;I)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda14;->getAsBoolean()Z
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda15;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda15;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;)V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda16;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda16;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;I)V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda18;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda18;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;I)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda18;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda19;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda19;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;)V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda3;-><init>(Lorg/chromium/chrome/browser/ui/appmenu/AppMenuBlocker;I)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda3;->run()V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;I)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda5;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda5;-><init>(I)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda5;->run()V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda8;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda8;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda8;->getSnackbarManager()Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$1;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$1;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$1;->hasIncognitoTabs()Z
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$3;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$3;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$3;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$5;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$5;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$5;->onTabStateInitialized()V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$6;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$6;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$6;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$7;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$7;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$7;->getIntentHandlingTimeMs()J
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$7;->processUrlViewIntent(Lorg/chromium/content_public/browser/LoadUrlParams;ILjava/lang/String;ILandroid/content/Intent;)V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$Preload;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$Preload;-><init>()V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$Preload;->getLifecycle()Landroidx/lifecycle/LifecycleRegistry;
-Lorg/chromium/chrome/browser/ChromeTabbedActivity$Preload$1;
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$Preload$1;-><init>(Landroidx/lifecycle/LifecycleOwner;)V
-HSPLorg/chromium/chrome/browser/ChromeTabbedActivity$Preload$1;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V
-Lorg/chromium/chrome/browser/ChromeTabbedActivity2;
-Lorg/chromium/chrome/browser/ChromeWindow;
-HSPLorg/chromium/chrome/browser/ChromeWindow;-><init>(Landroid/app/Activity;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentSupplier;Lorg/chromium/ui/base/IntentRequestTrackerImpl;)V
-HSPLorg/chromium/chrome/browser/ChromeWindow;->getKeyboardDelegate()Lorg/chromium/ui/KeyboardVisibilityDelegate;
-Lorg/chromium/chrome/browser/DefaultBrowserInfo;
-Lorg/chromium/chrome/browser/DefaultBrowserInfo$1;
-HSPLorg/chromium/chrome/browser/DefaultBrowserInfo$1;-><init>()V
-HSPLorg/chromium/chrome/browser/DefaultBrowserInfo$1;->doInBackground()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/DefaultBrowserInfo$2;
-HSPLorg/chromium/chrome/browser/DefaultBrowserInfo$2;-><init>()V
-HSPLorg/chromium/chrome/browser/DefaultBrowserInfo$2;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/DefaultBrowserInfo$2;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/DefaultBrowserInfo$DefaultInfo;
-HSPLorg/chromium/chrome/browser/DefaultBrowserInfo$DefaultInfo;-><init>()V
-Lorg/chromium/chrome/browser/DeferredStartupHandler;
-HSPLorg/chromium/chrome/browser/DeferredStartupHandler;-><init>()V
-HSPLorg/chromium/chrome/browser/DeferredStartupHandler;->addDeferredTask(Ljava/lang/Runnable;)V
-HSPLorg/chromium/chrome/browser/DeferredStartupHandler;->getInstance()Lorg/chromium/chrome/browser/DeferredStartupHandler;
-Lorg/chromium/chrome/browser/DeferredStartupHandler$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/DeferredStartupHandler$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/DeferredStartupHandler;)V
-HSPLorg/chromium/chrome/browser/DeferredStartupHandler$$ExternalSyntheticLambda0;->queueIdle()Z
-PLorg/chromium/chrome/browser/DevToolsServer;-><init>()V
-Lorg/chromium/chrome/browser/FileProviderHelper;
-HSPLorg/chromium/chrome/browser/FileProviderHelper;-><init>()V
-Lorg/chromium/chrome/browser/IntentHandler;
-HSPLorg/chromium/chrome/browser/IntentHandler;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/IntentHandler$IntentHandlerDelegate;)V
-HSPLorg/chromium/chrome/browser/IntentHandler;->determineExternalIntentSource(Landroid/content/Intent;)I
-HSPLorg/chromium/chrome/browser/IntentHandler;->extractUrlFromIntent(Landroid/content/Intent;)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/IntentHandler;->getBringTabToFrontId(Landroid/content/Intent;)I
-HSPLorg/chromium/chrome/browser/IntentHandler;->getExtraHeadersFromIntent(Landroid/content/Intent;)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/IntentHandler;->getReferrerUrl(Landroid/content/Intent;)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/IntentHandler;->getReferrerUrlIncludingExtraHeaders(Landroid/content/Intent;)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/IntentHandler;->getSanitizedUrlScheme(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/IntentHandler;->getTabId(Landroid/content/Intent;)I
-PLorg/chromium/chrome/browser/IntentHandler;->getTimestampFromIntent(Landroid/content/Intent;)J
-HSPLorg/chromium/chrome/browser/IntentHandler;->getTransitionTypeFromIntent(Landroid/content/Intent;I)I
-HSPLorg/chromium/chrome/browser/IntentHandler;->getUrlFromIntent(Landroid/content/Intent;)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/IntentHandler;->hasAnyIncognitoExtra(Landroid/os/Bundle;)Z
-HSPLorg/chromium/chrome/browser/IntentHandler;->intentHasUnsafeInternalScheme(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;)Z
-HSPLorg/chromium/chrome/browser/IntentHandler;->maybeAddAdditionalContentHeaders(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/IntentHandler;->onNewIntent(Landroid/content/Intent;)Z
-HSPLorg/chromium/chrome/browser/IntentHandler;->processUrlViewIntent(Lorg/chromium/content_public/browser/LoadUrlParams;ILjava/lang/String;ILandroid/content/Intent;)V
-HSPLorg/chromium/chrome/browser/IntentHandler;->shouldIgnoreIntent(Landroid/content/Intent;ZZ)Z
-Lorg/chromium/chrome/browser/IntentHandler$IntentHandlerDelegate;
-Lorg/chromium/chrome/browser/LaunchIntentDispatcher;
-HSPLorg/chromium/chrome/browser/LaunchIntentDispatcher;->isCustomTabIntent(Landroid/content/Intent;)Z
-PLorg/chromium/chrome/browser/LauncherShortcutActivity$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/content/pm/ShortcutInfo$Builder;Ljava/lang/String;)Landroid/content/pm/ShortcutInfo$Builder;
-PLorg/chromium/chrome/browser/LauncherShortcutActivity$$ExternalSyntheticApiModelOutline0;->m()V
-PLorg/chromium/chrome/browser/LauncherShortcutActivity$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;)Landroid/content/pm/ShortcutInfo;
-PLorg/chromium/chrome/browser/LauncherShortcutActivity$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder;
-PLorg/chromium/chrome/browser/LauncherShortcutActivity$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Landroid/graphics/drawable/Icon;)Landroid/content/pm/ShortcutInfo$Builder;
-PLorg/chromium/chrome/browser/LauncherShortcutActivity$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutInfo$Builder;Ljava/lang/String;)Landroid/content/pm/ShortcutInfo$Builder;
-PLorg/chromium/chrome/browser/LauncherShortcutActivity$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/ShortcutManager;Ljava/util/List;)Z
-PLorg/chromium/chrome/browser/LauncherShortcutActivity$$ExternalSyntheticApiModelOutline0;->m(Lorg/chromium/chrome/browser/ChromeTabbedActivity;)Landroid/content/pm/ShortcutInfo$Builder;
-Lorg/chromium/chrome/browser/PowerBroadcastReceiver;
-HSPLorg/chromium/chrome/browser/PowerBroadcastReceiver;-><init>()V
-HSPLorg/chromium/chrome/browser/PowerBroadcastReceiver;->onForegroundSessionStart()V
-Lorg/chromium/chrome/browser/PowerBroadcastReceiver$ServiceRunnable;
-HSPLorg/chromium/chrome/browser/PowerBroadcastReceiver$ServiceRunnable;-><init>()V
-PLorg/chromium/chrome/browser/PowerBroadcastReceiver$ServiceRunnable;->run()V
-Lorg/chromium/chrome/browser/ProductConfig;
-Lorg/chromium/chrome/browser/SwipeRefreshHandler;
-HSPLorg/chromium/chrome/browser/SwipeRefreshHandler;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/SwipeRefreshHandler;->cancelStopRefreshingRunnable()V
-HSPLorg/chromium/chrome/browser/SwipeRefreshHandler;->cleanupWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/SwipeRefreshHandler;->destroyInternal()V
-HSPLorg/chromium/chrome/browser/SwipeRefreshHandler;->detachSwipeRefreshLayoutIfNecessary()V
-HSPLorg/chromium/chrome/browser/SwipeRefreshHandler;->from(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/SwipeRefreshHandler;
-HSPLorg/chromium/chrome/browser/SwipeRefreshHandler;->initWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/SwipeRefreshHandler;->reset()V
-Lorg/chromium/chrome/browser/SwipeRefreshHandler$$ExternalSyntheticLambda2;
-Lorg/chromium/chrome/browser/SwipeRefreshHandler$1;
-HSPLorg/chromium/chrome/browser/SwipeRefreshHandler$1;-><init>(Lorg/chromium/chrome/browser/SwipeRefreshHandler;)V
-Lorg/chromium/chrome/browser/TabUsageTracker;
-HSPLorg/chromium/chrome/browser/TabUsageTracker;-><init>(Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/TabUsageTracker;->onDestroy()V
-HSPLorg/chromium/chrome/browser/TabUsageTracker;->onPauseWithNative()V
-HSPLorg/chromium/chrome/browser/TabUsageTracker;->onResumeWithNative()V
-HSPLorg/chromium/chrome/browser/TabUsageTracker;->onStartWithNative()V
-HSPLorg/chromium/chrome/browser/TabUsageTracker;->onStopWithNative()V
-PLorg/chromium/chrome/browser/TabUsageTracker$1;-><init>(Lorg/chromium/chrome/browser/TabUsageTracker;)V
-PLorg/chromium/chrome/browser/TabUsageTracker$1;->onTabStateInitialized()V
-Lorg/chromium/chrome/browser/TabUsageTracker$2;
-HSPLorg/chromium/chrome/browser/TabUsageTracker$2;-><init>(Lorg/chromium/chrome/browser/TabUsageTracker;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/TabUsageTracker$2;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/TabUsageTracker$2;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/TabbedModeTabDelegateFactory;
-HSPLorg/chromium/chrome/browser/TabbedModeTabDelegateFactory;-><init>(Landroid/app/Activity;Lorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate;Lorg/chromium/chrome/browser/share/ShareDelegateSupplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda3;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;Lorg/chromium/chrome/browser/init/ChromeActivityNativeDelegate;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda14;Lorg/chromium/base/jank_tracker/JankTrackerImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda18;Lorg/chromium/chrome/browser/share/crow/CrowButtonDelegateImpl;)V
-HSPLorg/chromium/chrome/browser/TabbedModeTabDelegateFactory;->createBrowserControlsVisibilityDelegate(Lorg/chromium/chrome/browser/tab/TabImpl;)Lorg/chromium/components/browser_ui/util/BrowserControlsVisibilityDelegate;
-HSPLorg/chromium/chrome/browser/TabbedModeTabDelegateFactory;->createContextMenuPopulatorFactory(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/contextmenu/ContextMenuPopulatorFactory;
-HSPLorg/chromium/chrome/browser/TabbedModeTabDelegateFactory;->createExternalNavigationHandler(Lorg/chromium/chrome/browser/tab/TabImpl;)Lorg/chromium/components/external_intents/ExternalNavigationHandler;
-HSPLorg/chromium/chrome/browser/TabbedModeTabDelegateFactory;->createNativePage(Ljava/lang/String;Lorg/chromium/chrome/browser/ui/native_page/NativePage;Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/ui/native_page/NativePage;
-HSPLorg/chromium/chrome/browser/TabbedModeTabDelegateFactory;->createWebContentsDelegate(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid;
-Lorg/chromium/chrome/browser/WarmupManager;
-HSPLorg/chromium/chrome/browser/WarmupManager;-><init>()V
-HSPLorg/chromium/chrome/browser/WarmupManager;->getInstance()Lorg/chromium/chrome/browser/WarmupManager;
-HSPLorg/chromium/chrome/browser/WarmupManager;->maybePreconnectUrlAndSubResources(Ljava/lang/String;Lorg/chromium/chrome/browser/profiles/Profile;)V
-HSPLorg/chromium/chrome/browser/WarmupManager;->takeSpareWebContents(ZZ)Lorg/chromium/content_public/browser/WebContents;
-Lorg/chromium/chrome/browser/WebContentsFactory;
-HSPLorg/chromium/chrome/browser/WebContentsFactory;->createWebContents(Lorg/chromium/chrome/browser/profiles/Profile;Z)Lorg/chromium/content_public/browser/WebContents;
-Lorg/chromium/chrome/browser/WebContentsFactory$WebContentsCreationException;
-HSPLorg/chromium/chrome/browser/WebContentsFactory$WebContentsCreationException;-><init>()V
-Lorg/chromium/chrome/browser/accessibility/AccessibilityTabHelper;
-HSPLorg/chromium/chrome/browser/accessibility/AccessibilityTabHelper;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/accessibility/AccessibilityTabHelper;->destroy()V
-HSPLorg/chromium/chrome/browser/accessibility/AccessibilityTabHelper;->onContentChanged(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/accessibility/AccessibilityTabHelper;->updateWebContentsAccessibilityStateForTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate$ReaderForAccessibilityDelegate$$ExternalSyntheticOutline0;
-HSPLorg/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate$ReaderForAccessibilityDelegate$$ExternalSyntheticOutline0;->m(Ljava/lang/String;)Z
-Lorg/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout;
-HSPLorg/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;)V
-HSPLorg/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout;->destroy()V
-HSPLorg/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout;->setTabModelSelector(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;)V
-Lorg/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout$1;
-HSPLorg/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout$1;-><init>(Lorg/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout;)V
-Lorg/chromium/chrome/browser/announcement/AnnouncementNotificationManager;
-HSPLorg/chromium/chrome/browser/announcement/AnnouncementNotificationManager;->isFirstRun()Z
-Lorg/chromium/chrome/browser/app/ChromeActivity;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;-><init>()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->areTabModelsInitialized()Z
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->changeBackgroundColorForResizing()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->createComponent(Lorg/chromium/chrome/browser/dependency_injection/ChromeActivityCommonsModule;)Lorg/chromium/chrome/browser/dependency_injection/ChromeActivityComponent;
-PLorg/chromium/chrome/browser/app/ChromeActivity;->createContextReporterIfNeeded()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->createModalDialogManager()Lorg/chromium/ui/modaldialog/ModalDialogManager;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->createWindowAndroid()Lorg/chromium/ui/base/ActivityWindowAndroid;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->doLayoutInflation()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->finishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getActivityTab()Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getBackgroundDrawable()Landroid/graphics/drawable/Drawable;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getBaseStatusBarColor(Lorg/chromium/chrome/browser/tab/Tab;)I
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getBrowserControlsManager()Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getCurrentTabModel()Lorg/chromium/chrome/browser/tabmodel/TabModel;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getCurrentWebContents()Lorg/chromium/content_public/browser/WebContents;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getFullscreenManager()Lorg/chromium/chrome/browser/fullscreen/FullscreenManager;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getLaunchCauseMetrics()Lorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getOnCreateTimestampMs()J
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getSnackbarManager()Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getTabCreator(Z)Lorg/chromium/chrome/browser/tabmodel/TabCreator;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getTabModelSelector()Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getTabObscuringHandler()Lorg/chromium/chrome/browser/tab/TabObscuringHandler;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->getViewToBeDrawnBeforeInitializingNative()Landroid/view/View;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->initDeferredStartupForActivity()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->initializeBackPressHandling()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->initializeCompositor()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->initializeCompositorContent(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Landroid/view/View;Landroid/view/ViewGroup;Lorg/chromium/chrome/browser/toolbar/ControlContainer;)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->initializeStartupMetrics()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->initializeState()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->initializeTabModels()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->isCustomTab()Z
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->markSessionEnd()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->markSessionResume()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->maybeRemoveWindowBackground()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onActivityHidden()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onActivityShown()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onAttachFragment(Landroid/app/Fragment;)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onDestroy()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onInitialLayoutInflationComplete()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onNewIntentWithNative(Landroid/content/Intent;)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onPauseWithNative()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onPreCreate()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onResumeWithNative()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onStart()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onStartWithNative()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onStop()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onStopWithNative()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->onWindowFocusChanged(Z)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->performPostInflationStartup()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->performPreInflationStartup()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->postDeferredStartupIfNeeded()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->shouldPostDeferredStartupForReparentedTab()Z
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->shouldStartGpuProcess()Z
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->supportsAppMenu()Z
-HSPLorg/chromium/chrome/browser/app/ChromeActivity;->triggerLayoutInflation()V
-Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/app/ChromeActivity;I)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda11;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda11;-><init>(Landroid/util/Pair;)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda11;->getTabCreator(Z)Lorg/chromium/chrome/browser/tabmodel/TabCreator;
-PLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda12;-><init>(Lorg/chromium/chrome/browser/app/ChromeActivity;)V
-Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda3;-><init>(Lorg/chromium/chrome/browser/app/ChromeActivity;I)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda3;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda4;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda4;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda5;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda5;-><init>(ILjava/lang/Object;)V
-Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda6;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda6;-><init>(Lorg/chromium/chrome/browser/app/ChromeActivity;I)V
-Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda7;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda7;-><init>(Lorg/chromium/chrome/browser/app/ChromeActivity;Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda7;->run()V
-Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda8;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda8;-><init>()V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda8;->run()V
-Lorg/chromium/chrome/browser/app/ChromeActivity$1;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$1;-><init>(Lorg/chromium/chrome/browser/app/ChromeActivity;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$1;->onLoadStopped(Lorg/chromium/chrome/browser/tab/TabImpl;Z)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$1;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/app/ChromeActivity$2;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$2;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$2;->onTabStateInitialized()V
-Lorg/chromium/chrome/browser/app/ChromeActivity$4;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$4;-><init>(Lorg/chromium/chrome/browser/app/ChromeActivity;)V
-Lorg/chromium/chrome/browser/app/ChromeActivity$6;
-HSPLorg/chromium/chrome/browser/app/ChromeActivity$6;-><init>(Lorg/chromium/chrome/browser/app/ChromeActivity;)V
-Lorg/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl;
-HSPLorg/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcherImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/toolbar/ToolbarManager;Landroid/view/View;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;)V
-HSPLorg/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl;->loadingStateChanged(Z)V
-Lorg/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl;I)V
-HSPLorg/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl;)V
-Lorg/chromium/chrome/browser/app/download/DownloadMessageUiDelegate;
-HSPLorg/chromium/chrome/browser/app/download/DownloadMessageUiDelegate;-><init>()V
-HSPLorg/chromium/chrome/browser/app/download/DownloadMessageUiDelegate;->maybeSwitchToFocusedActivity()Z
-Lorg/chromium/chrome/browser/app/feature_guide/notifications/FeatureNotificationGuideDelegate;
-HSPLorg/chromium/chrome/browser/app/feature_guide/notifications/FeatureNotificationGuideDelegate;-><init>()V
-Lorg/chromium/chrome/browser/app/flags/ChromeCachedFlags;
-HSPLorg/chromium/chrome/browser/app/flags/ChromeCachedFlags;-><init>()V
-Lorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics;
-HSPLorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics;-><init>(Landroid/app/Activity;)V
-HSPLorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics;->onActivityStateChange(Landroid/app/Activity;I)V
-HSPLorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics;->onApplicationStateChange(I)V
-Lorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics$1;
-HSPLorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics$1;-><init>()V
-HSPLorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics$1;->onActivityStateChange(Landroid/app/Activity;I)V
-Lorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics$BetweenLaunchState;
-HSPLorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics$BetweenLaunchState;-><init>()V
-Lorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics$PerLaunchState;
-HSPLorg/chromium/chrome/browser/app/metrics/LaunchCauseMetrics$PerLaunchState;-><init>()V
-Lorg/chromium/chrome/browser/app/metrics/TabbedActivityLaunchCauseMetrics;
-HSPLorg/chromium/chrome/browser/app/metrics/TabbedActivityLaunchCauseMetrics;-><init>(Landroid/app/Activity;)V
-HSPLorg/chromium/chrome/browser/app/metrics/TabbedActivityLaunchCauseMetrics;->computeIntentLaunchCause()I
-HSPLorg/chromium/chrome/browser/app/metrics/TabbedActivityLaunchCauseMetrics;->getIntentionalTransitionCauseOrOther()I
-Lorg/chromium/chrome/browser/app/notifications/ContextualNotificationPermissionRequesterImpl;
-HSPLorg/chromium/chrome/browser/app/notifications/ContextualNotificationPermissionRequesterImpl;-><init>()V
-Lorg/chromium/chrome/browser/app/notifications/ContextualNotificationPermissionRequesterImpl$LazyHolder;
-Lorg/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl;
-HSPLorg/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl;-><init>(Landroid/app/Activity;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;)V
-Lorg/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl;)V
-Lorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;-><init>(Lorg/chromium/chrome/browser/tab/Tab;Landroid/app/Activity;Lorg/chromium/chrome/browser/init/ChromeActivityNativeDelegate;ZLorg/chromium/chrome/browser/browser_controls/BrowserControlsVisibilityManager;Lorg/chromium/chrome/browser/fullscreen/FullscreenManager;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->controlsResizeView()Z
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->getBottomControlsHeight()I
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->getBottomControlsMinHeight()I
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->getDisplayMode()I
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->getTopControlsHeight()I
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->getTopControlsMinHeight()I
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->isCustomTab()Z
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->isForceDarkWebContentEnabled()Z
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->isFullscreenForTabOrPending()Z
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->isModalContextMenu()Z
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->isNightModeEnabled()Z
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->isPictureInPictureEnabled()Z
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;->shouldAnimateBrowserControlsHeightChanges()Z
-Lorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid$1;
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid$1;-><init>(Lorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid;)V
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/app/tab_activity_glue/ReparentingDelegateFactory$2;
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/ReparentingDelegateFactory$2;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-Lorg/chromium/chrome/browser/app/tab_activity_glue/TabReparentingController;
-HSPLorg/chromium/chrome/browser/app/tab_activity_glue/TabReparentingController;-><init>(Lorg/chromium/chrome/browser/app/tab_activity_glue/ReparentingDelegateFactory$2;Lorg/chromium/chrome/browser/tabmodel/AsyncTabParamsManagerImpl;)V
-Lorg/chromium/chrome/browser/app/tabmodel/AsyncTabParamsManagerSingleton;
-Lorg/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier;
-HSPLorg/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier;-><init>(Lorg/chromium/base/supplier/OneshotSupplierImpl;)V
-Lorg/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier;)V
-HSPLorg/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/app/tabmodel/ChromeTabModelFilterFactory;
-HSPLorg/chromium/chrome/browser/app/tabmodel/ChromeTabModelFilterFactory;-><init>(Landroid/app/Activity;)V
-Lorg/chromium/chrome/browser/app/tabmodel/DefaultTabModelSelectorFactory;
-HSPLorg/chromium/chrome/browser/app/tabmodel/DefaultTabModelSelectorFactory;-><init>()V
-Lorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator;
-HSPLorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator;-><init>()V
-HSPLorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator;->destroy()V
-HSPLorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator;->loadState(Z)V
-HSPLorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator;->onNativeLibraryReady(Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;)V
-HSPLorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator;->restoreTabs(Z)V
-HSPLorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator;->saveState()V
-Lorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator$1;
-HSPLorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator$1;-><init>(Lorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator;)V
-Lorg/chromium/chrome/browser/app/tabmodel/TabWindowManagerSingleton;
-HSPLorg/chromium/chrome/browser/app/tabmodel/TabWindowManagerSingleton;->getInstance()Lorg/chromium/chrome/browser/tabmodel/TabWindowManagerImpl;
-Lorg/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestrator;
-HSPLorg/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestrator;-><init>(Z)V
-Lorg/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePrompt$$ExternalSyntheticOutline0;
-HSPLorg/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePrompt$$ExternalSyntheticOutline0;->m(Ljava/util/HashMap;Lorg/chromium/ui/modelutil/PropertyModel$WritableObjectPropertyKey;Lorg/chromium/ui/modelutil/PropertyModel$ObjectContainer;Ljava/util/HashMap;)Lorg/chromium/ui/modelutil/PropertyModel;
-Lorg/chromium/chrome/browser/back_press/BackPressManager;
-HSPLorg/chromium/chrome/browser/back_press/BackPressManager;-><init>(Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda1;)V
-HSPLorg/chromium/chrome/browser/back_press/BackPressManager;->isEnabled()Z
-Lorg/chromium/chrome/browser/back_press/BackPressManager$1;
-HSPLorg/chromium/chrome/browser/back_press/BackPressManager$1;-><init>(Lorg/chromium/chrome/browser/back_press/BackPressManager;)V
-Lorg/chromium/chrome/browser/background_sync/GooglePlayServicesChecker;
-HSPLorg/chromium/chrome/browser/background_sync/GooglePlayServicesChecker;->shouldDisableBackgroundSync()Z
-Lorg/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory;
-HSPLorg/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory;-><init>()V
-HSPLorg/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory;->setAsDefault()V
-Lorg/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory$LazyHolder;
-Lorg/chromium/chrome/browser/banners/AppBannerInProductHelpController;
-HSPLorg/chromium/chrome/browser/banners/AppBannerInProductHelpController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda0;)V
-Lorg/chromium/chrome/browser/banners/AppBannerInProductHelpControllerProvider;
-Lorg/chromium/chrome/browser/base/ServiceTracingProxyProvider;
-HSPLorg/chromium/chrome/browser/base/ServiceTracingProxyProvider;->create(Landroid/content/Context;)Lorg/chromium/chrome/browser/base/ServiceTracingProxyProvider;
-Lorg/chromium/chrome/browser/base/SplitChromeApplication;
-HSPLorg/chromium/chrome/browser/base/SplitChromeApplication;-><init>()V
-HSPLorg/chromium/chrome/browser/base/SplitChromeApplication;->attachBaseContext(Landroid/content/Context;)V
-HSPLorg/chromium/chrome/browser/base/SplitChromeApplication;->finishPreload(Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/base/SplitChromeApplication;->getResources()Landroid/content/res/Resources;
-HSPLorg/chromium/chrome/browser/base/SplitChromeApplication;->onCreate()V
-Lorg/chromium/chrome/browser/base/SplitChromeApplication$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/base/SplitChromeApplication$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/base/SplitChromeApplication;I)V
-HSPLorg/chromium/chrome/browser/base/SplitChromeApplication$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/base/SplitChromeApplication$1;
-HSPLorg/chromium/chrome/browser/base/SplitChromeApplication$1;-><init>(Lorg/chromium/chrome/browser/base/SplitChromeApplication;Landroid/content/Context;)V
-Lorg/chromium/chrome/browser/base/SplitChromeApplication$1$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/base/SplitChromeApplication$1$$ExternalSyntheticLambda0;-><init>(Landroid/content/Context;Landroid/os/HandlerThread;)V
-HSPLorg/chromium/chrome/browser/base/SplitChromeApplication$1$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/base/SplitCompatAppComponentFactory;
-HSPLorg/chromium/chrome/browser/base/SplitCompatAppComponentFactory;-><init>()V
-HSPLorg/chromium/chrome/browser/base/SplitCompatAppComponentFactory;->getComponentClassLoader(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/ClassLoader;
-HSPLorg/chromium/chrome/browser/base/SplitCompatAppComponentFactory;->instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
-HSPLorg/chromium/chrome/browser/base/SplitCompatAppComponentFactory;->instantiateProvider(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/content/ContentProvider;
-HSPLorg/chromium/chrome/browser/base/SplitCompatAppComponentFactory;->instantiateReceiver(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/content/BroadcastReceiver;
-Lorg/chromium/chrome/browser/base/SplitCompatApplication;
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication;-><init>()V
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication;->attachBaseContext(Landroid/content/Context;)V
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication;->createChromeContext(Landroid/content/Context;)Landroid/content/Context;
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication;->getImpl()Lorg/chromium/chrome/browser/base/SplitCompatApplication$Impl;
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication;->isBrowserProcess()Z
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication;->onCreate()V
-Lorg/chromium/chrome/browser/base/SplitCompatApplication$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication$$ExternalSyntheticLambda0;->onApplicationStateChange(I)V
-Lorg/chromium/chrome/browser/base/SplitCompatApplication$1;
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication$1;-><init>()V
-Lorg/chromium/chrome/browser/base/SplitCompatApplication$Impl;
-HSPLorg/chromium/chrome/browser/base/SplitCompatApplication$Impl;-><init>()V
-Lorg/chromium/chrome/browser/base/SplitCompatBackupAgent$Impl;
-Lorg/chromium/chrome/browser/base/SplitCompatContentProvider;
-HSPLorg/chromium/chrome/browser/base/SplitCompatContentProvider;-><init>()V
-HSPLorg/chromium/chrome/browser/base/SplitCompatContentProvider;->onCreate()Z
-Lorg/chromium/chrome/browser/base/SplitCompatIntentService$Impl;
-Lorg/chromium/chrome/browser/base/SplitCompatService$Impl;
-Lorg/chromium/chrome/browser/base/SplitPreloader;
-HSPLorg/chromium/chrome/browser/base/SplitPreloader;-><init>(Landroid/content/Context;)V
-Lorg/chromium/chrome/browser/base/SplitPreloader$PreloadTask;
-HSPLorg/chromium/chrome/browser/base/SplitPreloader$PreloadTask;-><init>(Lorg/chromium/chrome/browser/base/SplitPreloader;Lorg/chromium/chrome/browser/base/SplitChromeApplication$1;)V
-HSPLorg/chromium/chrome/browser/base/SplitPreloader$PreloadTask;->createSplitContext()Landroid/content/Context;
-HSPLorg/chromium/chrome/browser/base/SplitPreloader$PreloadTask;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/base/SplitPreloader$PreloadTask;->finish$1()V
-HSPLorg/chromium/chrome/browser/base/SplitPreloader$PreloadTask;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/battery/BatterySaverOSSetting;
-HSPLorg/chromium/chrome/browser/battery/BatterySaverOSSetting;->isBatterySaverEnabled()Z
-Lorg/chromium/chrome/browser/bluetooth/BluetoothNotificationManager;
-HSPLorg/chromium/chrome/browser/bluetooth/BluetoothNotificationManager;->updateBluetoothNotificationForTab(Landroid/content/Context;ILorg/chromium/content_public/browser/WebContents;Lorg/chromium/url/GURL;Z)V
-Lorg/chromium/chrome/browser/bookmarks/BookmarkBridge;
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge;-><init>(J)V
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge;->addObserver(Lorg/chromium/chrome/browser/bookmarks/BookmarkModelObserver;)V
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge;->bookmarkModelLoaded()V
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge;->createBookmarkModel(J)Lorg/chromium/chrome/browser/bookmarks/BookmarkModel;
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge;->finishLoadingBookmarkModel(Ljava/lang/Runnable;)V
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge;->getUserBookmarkIdForTab(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/components/bookmarks/BookmarkId;
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge;->isEditBookmarksEnabled()Z
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge;->removeObserver(Lorg/chromium/chrome/browser/bookmarks/BookmarkModelObserver;)V
-Lorg/chromium/chrome/browser/bookmarks/BookmarkBridge$1;
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge$1;-><init>(Lorg/chromium/chrome/browser/bookmarks/BookmarkBridge;)V
-Lorg/chromium/chrome/browser/bookmarks/BookmarkBridge$2;
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge$2;-><init>(Lorg/chromium/chrome/browser/bookmarks/BookmarkModel;JLjava/lang/Runnable;)V
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkBridge$2;->bookmarkModelLoaded()V
-Lorg/chromium/chrome/browser/bookmarks/BookmarkModel;
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkModel;-><init>(J)V
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkModel;->getForProfile(Lorg/chromium/chrome/browser/profiles/Profile;)Lorg/chromium/chrome/browser/bookmarks/BookmarkModel;
-Lorg/chromium/chrome/browser/bookmarks/BookmarkModelObserver;
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkModelObserver;-><init>()V
-HSPLorg/chromium/chrome/browser/bookmarks/BookmarkModelObserver;->bookmarkModelLoaded()V
-Lorg/chromium/chrome/browser/bookmarks/BookmarkUtils;
-Lorg/chromium/chrome/browser/bookmarks/TabBookmarker;
-HSPLorg/chromium/chrome/browser/bookmarks/TabBookmarker;-><init>(Landroid/app/Activity;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda5;Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda6;Z)V
-Lorg/chromium/chrome/browser/browser_controls/BrowserControlsMarginSupplier;
-Lorg/chromium/chrome/browser/browser_controls/BrowserControlsSizer;
-Lorg/chromium/chrome/browser/browser_controls/BrowserControlsStateProvider$Observer;
-Lorg/chromium/chrome/browser/browser_controls/BrowserControlsUtils;
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserControlsUtils;->getBottomContentOffset(Lorg/chromium/chrome/browser/browser_controls/BrowserControlsVisibilityManager;)I
-Lorg/chromium/chrome/browser/browser_controls/BrowserControlsVisibilityManager;
-Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;-><init>(Lorg/chromium/base/supplier/ObservableSupplierImpl;)V
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;->ensureControlsVisibleForMinDuration()V
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;->releasePersistentShowingToken(I)V
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;->showControlsTransient()V
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;->updateVisibilityConstraints()V
-Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;)V
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;)V
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;I)V
-HSPLorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda2;->run()V
-Lorg/chromium/chrome/browser/browserservices/ClearDataDialogResultRecorder;
-HSPLorg/chromium/chrome/browser/browserservices/ClearDataDialogResultRecorder;-><init>(Ldagger/Lazy;Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer;Lorg/chromium/chrome/browser/browserservices/metrics/TrustedWebActivityUmaRecorder;)V
-PLorg/chromium/chrome/browser/browserservices/ClearDataDialogResultRecorder;->recordDismissals(Ljava/lang/String;Z)V
-Lorg/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider;
-Lorg/chromium/chrome/browser/browserservices/metrics/TrustedWebActivityUmaRecorder;
-HSPLorg/chromium/chrome/browser/browserservices/metrics/TrustedWebActivityUmaRecorder;-><init>(Lorg/chromium/chrome/browser/dependency_injection/ChromeAppModule$1;)V
-Lorg/chromium/chrome/browser/browserservices/metrics/TrustedWebActivityUmaRecorder$DeferredTaskHandler;
-Lorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge;
-HSPLorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge;->getPermissions(I)[Lorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge$Permission;
-HSPLorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge;->setInstalledWebappProvider(J)V
-Lorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge$Permission;
-Lorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappPermissionManager;
-HSPLorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappPermissionManager;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappPermissionStore;Ldagger/Lazy;Lorg/chromium/chrome/browser/browserservices/metrics/TrustedWebActivityUmaRecorder;)V
-HSPLorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappPermissionManager;->get()Lorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappPermissionManager;
-Lorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappPermissionStore;
-HSPLorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappPermissionStore;-><init>()V
-HSPLorg/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappPermissionStore;->getStoredOrigins()Ljava/util/HashSet;
-Lorg/chromium/chrome/browser/commerce/ShoppingFeatures;
-HSPLorg/chromium/chrome/browser/commerce/ShoppingFeatures;->isShoppingListEligible()Z
-Lorg/chromium/chrome/browser/commerce/ShoppingServiceFactory;
-HSPLorg/chromium/chrome/browser/commerce/ShoppingServiceFactory;->getForProfile(Lorg/chromium/chrome/browser/profiles/Profile;)Lorg/chromium/components/commerce/core/ShoppingService;
-Lorg/chromium/chrome/browser/compositor/CompositorSurfaceManager$SurfaceManagerCallbackTarget;
-Lorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;-><init>(Landroid/view/ViewGroup;Lorg/chromium/chrome/browser/compositor/CompositorSurfaceManager$SurfaceManagerCallbackTarget;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;->attachSurfaceNow(Lorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl$SurfaceState;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;->detachSurfaceLater(Lorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl$SurfaceState;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;->detachSurfaceNow(Lorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl$SurfaceState;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;->disownClientSurface(Lorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl$SurfaceState;Z)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;->getStateForHolder(Landroid/view/SurfaceHolder;)Lorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl$SurfaceState;
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;->requestSurface(I)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;->surfaceChanged(Landroid/view/SurfaceHolder;III)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;->surfaceCreated(Landroid/view/SurfaceHolder;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;->surfaceDestroyed(Landroid/view/SurfaceHolder;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl;->surfaceRedrawNeededAsync(Landroid/view/SurfaceHolder;Ljava/lang/Runnable;)V
-Lorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl$SurfaceState;
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl$SurfaceState;-><init>(Landroid/content/Context;ILandroid/view/SurfaceHolder$Callback2;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl$SurfaceState;->isAttached()Z
-HSPLorg/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl$SurfaceState;->surfaceHolder()Landroid/view/SurfaceHolder;
-Lorg/chromium/chrome/browser/compositor/CompositorView;
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/layouts/LayoutRenderHost;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->didSwapBuffers(Z)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->didSwapFrame(I)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->getSurfacePixelFormat()I
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->initializeIfOnUiThread()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->onCompositorLayout()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->onDetachedFromWindow()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->onMeasure(II)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->onSelectionHandlesStateChanged(Z)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->onWindowVisibilityChanged(I)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->runDrawFinishedCallback()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->setVisibility(I)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->surfaceChanged(Landroid/view/Surface;III)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->surfaceCreated()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->surfaceDestroyed(Z)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->surfaceRedrawNeededAsync(Ljava/lang/Runnable;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorView;->updateNeedsDidSwapBuffersCallback()V
-Lorg/chromium/chrome/browser/compositor/CompositorView$ScreenStateReceiverWorkaround;
-HSPLorg/chromium/chrome/browser/compositor/CompositorView$ScreenStateReceiverWorkaround;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorView;)V
-Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->clearChildFocus(Landroid/view/View;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->flushInvalidation()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->getBottomControlsHeightPixels()I
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->getContentView()Lorg/chromium/components/embedder_support/view/ContentView;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->getCurrentTab()Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->getKeyboardBottomInsetForControlsPixels()I
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->getViewportSize()Landroid/graphics/Point;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->getVisibleViewport(Landroid/graphics/RectF;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->getWebContents()Lorg/chromium/content_public/browser/WebContents;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->getWindowViewport(Landroid/graphics/RectF;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->handleSystemUiVisibilityChange()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->handleWindowInsetChanged()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->initializeTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->invalidateAccessibilityProvider()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->onAttachedToWindow()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->onDetachedFromWindow()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->onLayout(ZIIII)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->onMeasure(II)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->onSizeChanged(IIII)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->onViewportChanged()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->requestRender(Ljava/lang/Runnable;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->setSize(Lorg/chromium/content_public/browser/WebContents;Landroid/view/View;II)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->setTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->updateApplicationViewportInsetSuppliers()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->updateContentOverlayVisibility(Z)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->updateNeedsSwapBuffersCallback()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->updateViewportSize()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder;->updateVirtualKeyboardMode(I)V
-Lorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda1;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-Lorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;)V
-Lorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda3;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;I)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$$ExternalSyntheticLambda3;->run()V
-Lorg/chromium/chrome/browser/compositor/CompositorViewHolder$1;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$1;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;)V
-Lorg/chromium/chrome/browser/compositor/CompositorViewHolder$2;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$2;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$2;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-Lorg/chromium/chrome/browser/compositor/CompositorViewHolder$3;
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$3;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;)V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$3;->onChange()V
-HSPLorg/chromium/chrome/browser/compositor/CompositorViewHolder$3;->onNewTabCreated(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/compositor/CompositorViewHolder$Initializer;
-Lorg/chromium/chrome/browser/compositor/Invalidator;
-HSPLorg/chromium/chrome/browser/compositor/Invalidator;-><init>()V
-Lorg/chromium/chrome/browser/compositor/Invalidator$Host;
-Lorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Lorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager;FLorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;->destroy()V
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;->getHandleBackPressChangedSupplier()Lorg/chromium/base/supplier/ObservableSupplier;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;->getWebContents()Lorg/chromium/content_public/browser/WebContents;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;->isActive()Z
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;->onSizeChanged(FFFI)V
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;->shouldHideAndroidBrowserControls()Z
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;->updateOverlay(J)Z
-Lorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel$1;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel$1;-><init>(Lorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;)V
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel$1;->onSceneChange(Lorg/chromium/chrome/browser/compositor/layouts/Layout;)V
-Lorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/compositor/layouts/LayoutUpdateHost;F)V
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation;->getPanelHeightFromState(Ljava/lang/Integer;)F
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation;->getTabHeight()F
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation;->isFullWidthSizePanel()Z
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation;->isPanelOpened()Z
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation;->isSceneOverlayTreeShowing()Z
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation;->isShowing()Z
-Lorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager;-><init>()V
-Lorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager$1;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager$1;-><init>()V
-Lorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager$OverlayPanelManagerObserver;
-Lorg/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Lorg/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager;Lorg/chromium/ui/base/WindowAndroid;Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;FLorg/chromium/chrome/browser/toolbar/ToolbarManager;ILorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel;->closePanel(IZ)V
-HSPLorg/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel;->getBarHeight()F
-HSPLorg/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel;->onActivityStateChange(Landroid/app/Activity;I)V
-HSPLorg/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel;->setManagementDelegate(Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;)V
-Lorg/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelInterface;
-Lorg/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelMetrics;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelMetrics;-><init>()V
-Lorg/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator;-><init>(Landroid/content/Context;Lorg/chromium/ui/base/ActivityWindowAndroid;Landroid/view/View;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetController;Z)V
-Lorg/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator$FaviconLoader;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator$FaviconLoader;-><init>(Landroid/content/Context;)V
-Lorg/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator;
-HSPLorg/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator;-><init>(Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetController;Lorg/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator$FaviconLoader;I)V
-Lorg/chromium/chrome/browser/compositor/layouts/Layout;
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/layouts/LayoutUpdateHost;Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->attachViews(Landroid/view/ViewGroup;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->canHostBeFocusable()Z
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->createLayoutTab(IZ)Lorg/chromium/chrome/browser/compositor/layouts/components/LayoutTab;
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->doneHiding()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->doneShowing()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->forceHideBrowserControlsAndroidView()Z
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->notifySizeChanged()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->onTabCreated(IIZZFF)V
-PLorg/chromium/chrome/browser/compositor/layouts/Layout;->onTabRestored(J)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->onUpdateAnimation()Z
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->setTabContentManager(Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->setTabModelSelector(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->show(JZ)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->startHiding(IZ)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->updateSnap(FFF)F
-HSPLorg/chromium/chrome/browser/compositor/layouts/Layout;->updateSnap(Lorg/chromium/ui/modelutil/PropertyModel;)Z
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;Landroid/view/ViewGroup;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda12;Lorg/chromium/base/jank_tracker/JankTrackerImpl;Landroid/view/ViewGroup;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->createOverviewLayout(Lorg/chromium/chrome/features/start_surface/StartSurface;Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher;Lorg/chromium/base/jank_tracker/JankTracker;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;Landroid/view/ViewGroup;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->destroy()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->doneHiding()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->getLayoutForType(I)Lorg/chromium/chrome/browser/compositor/layouts/Layout;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->getToolbarSwipeHandler()Lorg/chromium/components/browser_ui/widget/gesture/SwipeGestureListener$SwipeHandler;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->init(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/app/ChromeActivity;Lorg/chromium/chrome/browser/toolbar/ControlContainer;Lorg/chromium/ui/resources/dynamics/DynamicResourceLoader;Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->onAccessibilityModeChanged(Z)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->setTabModelSelector(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->shouldDelayHideAnimation(Lorg/chromium/chrome/browser/compositor/layouts/Layout;)Z
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->shouldShowToolbarAnimationOnHide(Lorg/chromium/chrome/browser/compositor/layouts/Layout;I)Z
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->shouldShowToolbarAnimationOnShow(Z)Z
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->startShowing(Lorg/chromium/chrome/browser/compositor/layouts/Layout;Z)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;->tabCreated(IIIZZFF)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome$1;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome$1;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;Lorg/chromium/base/supplier/ObservableSupplierImpl;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome$1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome$1$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome$1$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome$1;)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome$ToolbarSwipeHandler;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome$ToolbarSwipeHandler;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;Landroid/view/ViewGroup;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda12;Lorg/chromium/base/jank_tracker/JankTrackerImpl;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone;->createTabModelObserver()Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$LayoutManagerTabModelObserver;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone;->getLayoutForType(I)Lorg/chromium/chrome/browser/compositor/layouts/Layout;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone;->init(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/app/ChromeActivity;Lorg/chromium/chrome/browser/toolbar/ControlContainer;Lorg/chromium/ui/resources/dynamics/DynamicResourceLoader;Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone$1;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone$1;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone;)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerHost;
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerHost;Landroid/view/ViewGroup;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->addObserver(Lorg/chromium/chrome/browser/layouts/LayoutStateProvider$LayoutStateObserver;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->addSceneOverlay(Lorg/chromium/chrome/browser/layouts/SceneOverlay;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->destroy()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->doneHiding()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->doneShowing()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->getActiveLayoutType()I
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->getLayoutForType(I)Lorg/chromium/chrome/browser/compositor/layouts/Layout;
-PLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->getNextLayoutType()I
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->getViewportPixel(Landroid/graphics/RectF;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->init(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/app/ChromeActivity;Lorg/chromium/chrome/browser/toolbar/ControlContainer;Lorg/chromium/ui/resources/dynamics/DynamicResourceLoader;Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->initLayoutTabFromHost(I)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->isLayoutVisible(I)Z
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->onViewportChanged()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->removeObserver(Lorg/chromium/chrome/browser/layouts/LayoutStateProvider$LayoutStateObserver;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->requestUpdate(Ljava/lang/Runnable;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->setNextLayout(Lorg/chromium/chrome/browser/compositor/layouts/Layout;Z)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->setTabModelSelector(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->showLayout(IZ)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->startHiding(IZ)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->startShowing(Lorg/chromium/chrome/browser/compositor/layouts/Layout;Z)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;->tabCreated(IIIZZFF)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;I)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$1;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$1;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$1;->onBackgroundColorChanged(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$1;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$1;->onShown(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$2;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$2;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$LayoutManagerTabModelObserver;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$LayoutManagerTabModelObserver;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$LayoutManagerTabModelObserver;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$LayoutManagerTabModelObserver;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$LayoutManagerTabModelObserver;->willAddTab(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$ShowingEventSequencer;
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$ShowingEventSequencer;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$ShowingEventSequencer;->close()V
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutRenderHost;
-Lorg/chromium/chrome/browser/compositor/layouts/LayoutUpdateHost;
-Lorg/chromium/chrome/browser/compositor/layouts/SceneChangeObserver;
-Lorg/chromium/chrome/browser/compositor/layouts/StaticLayout;
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerHost;Lorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor$FrameRequestSupplier;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->destroy()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->doneHiding()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->doneShowing()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->getLayoutType()I
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->getSceneLayer()Lorg/chromium/chrome/browser/layouts/scene_layer/SceneLayer;
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->getViewportMode()I
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->setStaticTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->show(JZ)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->updateLayout$1()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->updateSceneLayer(Landroid/graphics/RectF;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/ui/resources/ResourceManager;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->updateStaticTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout;->updateVisibleIdsLiveLayerOnly()V
-Lorg/chromium/chrome/browser/compositor/layouts/StaticLayout$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout$$ExternalSyntheticLambda0;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/compositor/layouts/StaticLayout$1;
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout$1;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/StaticLayout;)V
-Lorg/chromium/chrome/browser/compositor/layouts/StaticLayout$2;
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout$2;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/StaticLayout;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout$2;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/compositor/layouts/StaticLayout$3;
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout$3;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/StaticLayout;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout$3;->onBackgroundColorChanged(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout$3;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout$3;->onShown(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/compositor/layouts/StaticLayout$UnstallRunnable;
-HSPLorg/chromium/chrome/browser/compositor/layouts/StaticLayout$UnstallRunnable;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/StaticLayout;)V
-Lorg/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout;
-HSPLorg/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout;->setTabContentManager(Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;)V
-Lorg/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout$$ExternalSyntheticLambda0;-><init>(I)V
-Lorg/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout;I)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout$$ExternalSyntheticLambda1;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/compositor/layouts/components/LayoutTab;
-HSPLorg/chromium/chrome/browser/compositor/layouts/components/LayoutTab;-><init>(IIIZ)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/components/LayoutTab;->getId()I
-HSPLorg/chromium/chrome/browser/compositor/layouts/components/LayoutTab;->init(II)V
-Lorg/chromium/chrome/browser/compositor/layouts/content/ContentOffsetProvider;
-Lorg/chromium/chrome/browser/compositor/layouts/content/InvalidationAwareThumbnailProvider;
-Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/layouts/content/ContentOffsetProvider;ZLorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda4;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;->cacheTabThumbnail(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;->captureThumbnail(Lorg/chromium/chrome/browser/tab/Tab;ZLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager$$ExternalSyntheticLambda1;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;->getIntegerResourceWithOverride(ILandroid/content/Context;Ljava/lang/String;)I
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;->getNativePtr()J
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;->getTabCaptureAspectRatio()D
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;->updateVisibleIds(ILjava/util/List;)V
-Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManagerHandler;
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManagerHandler;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManagerHandler;->onInteractabilityChanged(Lorg/chromium/chrome/browser/tab/Tab;Z)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManagerHandler;->onTabRegistered(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManagerHandler$1;
-HSPLorg/chromium/chrome/browser/compositor/layouts/content/TabContentManagerHandler$1;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManagerHandler;)V
-Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/BlackHoleEventFilter;
-HSPLorg/chromium/chrome/browser/compositor/layouts/eventfilter/BlackHoleEventFilter;-><init>(Landroid/content/Context;)V
-Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/GestureEventFilter;
-HSPLorg/chromium/chrome/browser/compositor/layouts/eventfilter/GestureEventFilter;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/GestureHandler;)V
-Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/GestureEventFilter$1;
-HSPLorg/chromium/chrome/browser/compositor/layouts/eventfilter/GestureEventFilter$1;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/GestureEventFilter;)V
-Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/GestureEventFilter$LongPressRunnable;
-HSPLorg/chromium/chrome/browser/compositor/layouts/eventfilter/GestureEventFilter$LongPressRunnable;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/GestureEventFilter;)V
-Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/GestureHandler;
-Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter;
-HSPLorg/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/bottombar/OverlayPanel;)V
-HSPLorg/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter;->reset()V
-Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter$InternalGestureDetector;
-HSPLorg/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter$InternalGestureDetector;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter;)V
-Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter$SwipeGestureListenerImpl;
-HSPLorg/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter$SwipeGestureListenerImpl;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter;Landroid/content/Context;)V
-Lorg/chromium/chrome/browser/compositor/layouts/phone/SimpleAnimationLayout;
-HSPLorg/chromium/chrome/browser/compositor/layouts/phone/SimpleAnimationLayout;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;)V
-Lorg/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager;
-Lorg/chromium/chrome/browser/compositor/resources/StaticResourcePreloads;
-Lorg/chromium/chrome/browser/compositor/resources/SystemResourcePreloads;
-Lorg/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer;
-HSPLorg/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer;-><init>(F)V
-HSPLorg/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer;->initializeNative()V
-Lorg/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer;
-HSPLorg/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer;-><init>()V
-HSPLorg/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer;->destroy()V
-HSPLorg/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer;->initializeNative()V
-Lorg/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer;
-HSPLorg/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer;-><init>()V
-HSPLorg/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer;->initializeNative()V
-Lorg/chromium/chrome/browser/compositor/scene_layer/ToolbarSwipeSceneLayer;
-HSPLorg/chromium/chrome/browser/compositor/scene_layer/ToolbarSwipeSceneLayer;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;)V
-HSPLorg/chromium/chrome/browser/compositor/scene_layer/ToolbarSwipeSceneLayer;->initializeNative()V
-Lorg/chromium/chrome/browser/content_capture/ContentCaptureHistoryDeletionObserver;
-HSPLorg/chromium/chrome/browser/content_capture/ContentCaptureHistoryDeletionObserver;-><init>(Lorg/chromium/chrome/browser/init/ProcessInitializationHandler$$ExternalSyntheticLambda2;)V
-Lorg/chromium/chrome/browser/contextmenu/ChromeContextMenuItem$$ExternalSyntheticOutline0;
-HSPLorg/chromium/chrome/browser/contextmenu/ChromeContextMenuItem$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/chromium/chrome/browser/preferences/KeyPrefix;Z)Z
-Lorg/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorFactory;
-HSPLorg/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorFactory;-><init>(Lorg/chromium/chrome/browser/tab/TabContextMenuItemDelegate;Lorg/chromium/base/supplier/Supplier;ILorg/chromium/components/externalauth/ExternalAuthUtils;)V
-HSPLorg/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorFactory;->onDestroy()V
-Lorg/chromium/chrome/browser/contextmenu/ContextMenuHelper;
-HSPLorg/chromium/chrome/browser/contextmenu/ContextMenuHelper;-><init>(JLorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/contextmenu/ContextMenuHelper;->create(JLorg/chromium/content_public/browser/WebContents;)Lorg/chromium/chrome/browser/contextmenu/ContextMenuHelper;
-HSPLorg/chromium/chrome/browser/contextmenu/ContextMenuHelper;->destroy()V
-HSPLorg/chromium/chrome/browser/contextmenu/ContextMenuHelper;->dismissContextMenu()V
-HSPLorg/chromium/chrome/browser/contextmenu/ContextMenuHelper;->setPopulatorFactory(Lorg/chromium/chrome/browser/contextmenu/ContextMenuPopulatorFactory;)V
-Lorg/chromium/chrome/browser/contextmenu/ContextMenuItemDelegate;
-Lorg/chromium/chrome/browser/contextmenu/ContextMenuPopulatorFactory;
-Lorg/chromium/chrome/browser/contextmenu/ContextMenuUtils;
-HSPLorg/chromium/chrome/browser/contextmenu/ContextMenuUtils;->usePopupContextMenuForContext(Landroid/content/Context;)Z
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial;->isEnabled()Z
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateController;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateController;-><init>(Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy;Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$5;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateController;->enter(I)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateController;->notifyFinishedWorkOn(I)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateController;->reset(Ljava/lang/Integer;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateController;->transitionTo(ILjava/lang/Integer;)V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateHandler;
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManagementDelegate;
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$ContextualSearchTabPromotionDelegate;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda6;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;->clearNativeManager()V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;->getSearchPanelWebContents()Lorg/chromium/content_public/browser/WebContents;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;->hideContextualSearch(I)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;->isSearchPanelShowing()Z
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;->onAccessibilityModeChanged(Z)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;->setNativeManager(J)V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$1;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$1;-><init>(Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;Landroid/view/View;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$1;->onGlobalFocusChanged(Landroid/view/View;Landroid/view/View;)V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$2;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$2;-><init>(Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;)V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$3;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$3;-><init>(Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$3;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$3;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$4;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$4;-><init>(Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$5;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$5;-><init>(Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;)V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager$ContextualSearchTabPromotionDelegate;
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchNetworkCommunicator;
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy;-><init>(Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController;Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchNetworkCommunicator;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy;->getPrefService()Lorg/chromium/components/prefs/PrefService;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy;->isContextualSearchEnabled()Z
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionHandler;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionHandler;
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;->getContextualSearchManager(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchManager;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;->getContextualSearchManagerSupplier(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/base/supplier/ObservableSupplierImpl;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;->onContentChanged(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;->onPageLoadStarted(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;->onTemplateURLServiceChanged()V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;->removeContextualSearchHooks(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;->updateContextualSearchHooks(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;->updateHooksForTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper;)V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchTranslationImpl;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTranslationImpl;-><init>()V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchTranslationImpl$TranslateBridgeWrapper;
-HSPLorg/chromium/chrome/browser/contextualsearch/ContextualSearchTranslationImpl$TranslateBridgeWrapper;-><init>()V
-Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchUma;
-Lorg/chromium/chrome/browser/contextualsearch/RelatedSearchesStamp;
-HSPLorg/chromium/chrome/browser/contextualsearch/RelatedSearchesStamp;-><init>(Lorg/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy;)V
-Lorg/chromium/chrome/browser/contextualsearch/SelectionClientManager;
-HSPLorg/chromium/chrome/browser/contextualsearch/SelectionClientManager;-><init>(Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/chrome/browser/cookies/CookiesFetcher;
-HSPLorg/chromium/chrome/browser/cookies/CookiesFetcher;->fetchFileName()Ljava/lang/String;
-Lorg/chromium/chrome/browser/cookies/CookiesFetcher$2;
-HSPLorg/chromium/chrome/browser/cookies/CookiesFetcher$2;-><init>()V
-HSPLorg/chromium/chrome/browser/cookies/CookiesFetcher$2;->doInBackground()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/crash/ApplicationStatusTracker;
-HSPLorg/chromium/chrome/browser/crash/ApplicationStatusTracker;-><init>()V
-HSPLorg/chromium/chrome/browser/crash/ApplicationStatusTracker;->onApplicationStateChange(I)V
-Lorg/chromium/chrome/browser/crash/CrashUploadCountStore;
-HSPLorg/chromium/chrome/browser/crash/CrashUploadCountStore;-><init>()V
-HSPLorg/chromium/chrome/browser/crash/CrashUploadCountStore;->failureUploadKey(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/crash/CrashUploadCountStore;->successUploadKey(Ljava/lang/String;)Ljava/lang/String;
-Lorg/chromium/chrome/browser/crash/MinidumpUploadServiceImpl;
-Lorg/chromium/chrome/browser/crash/MinidumpUploadServiceImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/crash/MinidumpUploadServiceImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/crash/MinidumpUploadServiceImpl$$ExternalSyntheticLambda1;)V
-HSPLorg/chromium/chrome/browser/crash/MinidumpUploadServiceImpl$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/crash/MinidumpUploadServiceImpl$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/crash/MinidumpUploadServiceImpl$$ExternalSyntheticLambda1;-><init>()V
-HSPLorg/chromium/chrome/browser/crash/MinidumpUploadServiceImpl$$ExternalSyntheticLambda1;->onApplicationStateChange(I)V
-Lorg/chromium/chrome/browser/crypto/CipherFactory;
-HSPLorg/chromium/chrome/browser/crypto/CipherFactory;-><init>()V
-HSPLorg/chromium/chrome/browser/crypto/CipherFactory;->restoreFromBundle(Landroid/os/Bundle;)Z
-Lorg/chromium/chrome/browser/crypto/CipherFactory$LazyHolder;
-Lorg/chromium/chrome/browser/customtabs/BaseCustomTabActivity;
-Lorg/chromium/chrome/browser/customtabs/CustomTabActivity;
-Lorg/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider;
-Lorg/chromium/chrome/browser/customtabs/CustomTabTrustedCdnPublisherUrlVisibility;
-Lorg/chromium/chrome/browser/customtabs/features/CustomTabNavigationBarController$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/chrome/browser/customtabs/features/CustomTabNavigationBarController$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;I)V
-Lorg/chromium/chrome/browser/customtabs/features/branding/BrandingController;
-Lorg/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar;
-Lorg/chromium/chrome/browser/datareduction/DataSaverOSSetting;
-HSPLorg/chromium/chrome/browser/datareduction/DataSaverOSSetting;->isDataSaverEnabled()Z
-Lorg/chromium/chrome/browser/dependency_injection/ChromeActivityCommonsModule;
-HSPLorg/chromium/chrome/browser/dependency_injection/ChromeActivityCommonsModule;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda5;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda6;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda6;Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda6;Lorg/chromium/chrome/browser/ui/system/StatusBarColorController;Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda6;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda6;Lorg/chromium/chrome/browser/compositor/CompositorViewHolder$Initializer;Lorg/chromium/chrome/browser/init/ChromeActivityNativeDelegate;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/app/ChromeActivity$$ExternalSyntheticLambda6;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/share/ShareDelegateSupplier;Lorg/chromium/chrome/browser/tabmodel/TabModelInitializer;I)V
-Lorg/chromium/chrome/browser/dependency_injection/ChromeActivityComponent;
-Lorg/chromium/chrome/browser/dependency_injection/ChromeAppModule;
-HSPLorg/chromium/chrome/browser/dependency_injection/ChromeAppModule;-><init>()V
-Lorg/chromium/chrome/browser/dependency_injection/ChromeAppModule$1;
-HSPLorg/chromium/chrome/browser/dependency_injection/ChromeAppModule$1;-><init>(Lorg/chromium/chrome/browser/dependency_injection/ChromeAppModule;)V
-Lorg/chromium/chrome/browser/dependency_injection/ChromeAppModule_ProvideContextFactory;
-HSPLorg/chromium/chrome/browser/dependency_injection/ChromeAppModule_ProvideContextFactory;->provideContext(Lorg/chromium/chrome/browser/dependency_injection/ChromeAppModule;)Landroid/content/Context;
-Lorg/chromium/chrome/browser/dependency_injection/DaggerChromeAppComponent$Builder;
-HSPLorg/chromium/chrome/browser/dependency_injection/DaggerChromeAppComponent$Builder;-><init>(Lorg/chromium/chrome/browser/dependency_injection/DaggerChromeAppComponent$ChromeAppComponentImpl;)V
-Lorg/chromium/chrome/browser/dependency_injection/DaggerChromeAppComponent$ChromeAppComponentImpl;
-HSPLorg/chromium/chrome/browser/dependency_injection/DaggerChromeAppComponent$ChromeAppComponentImpl;-><init>(Lorg/chromium/chrome/browser/dependency_injection/ChromeAppModule;Lorg/chromium/chrome/browser/AppHooksModule;)V
-Lorg/chromium/chrome/browser/dependency_injection/DaggerChromeAppComponent$ChromeAppComponentImpl$SwitchingProvider;
-HSPLorg/chromium/chrome/browser/dependency_injection/DaggerChromeAppComponent$ChromeAppComponentImpl$SwitchingProvider;-><init>(Lorg/chromium/chrome/browser/dependency_injection/DaggerChromeAppComponent$ChromeAppComponentImpl;I)V
-HSPLorg/chromium/chrome/browser/dependency_injection/DaggerChromeAppComponent$ChromeAppComponentImpl$SwitchingProvider;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/desktop_site/DesktopSiteSettingsIPHController;
-HSPLorg/chromium/chrome/browser/desktop_site/DesktopSiteSettingsIPHController;->create(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/profiles/Profile;Landroid/widget/ImageButton;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;D)Lorg/chromium/chrome/browser/desktop_site/DesktopSiteSettingsIPHController;
-Lorg/chromium/chrome/browser/device/DeviceClassManager;
-HSPLorg/chromium/chrome/browser/device/DeviceClassManager;-><init>()V
-HSPLorg/chromium/chrome/browser/device/DeviceClassManager;->enableAccessibilityLayout(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/device/DeviceClassManager;->enableAnimations()Z
-HSPLorg/chromium/chrome/browser/device/DeviceClassManager;->getInstance()Lorg/chromium/chrome/browser/device/DeviceClassManager;
-Lorg/chromium/chrome/browser/directactions/DirectActionInitializer;
-HSPLorg/chromium/chrome/browser/directactions/DirectActionInitializer;-><init>(ILorg/chromium/components/browser_ui/widget/MenuOrKeyboardActionController;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/findinpage/FindToolbarManager;)V
-HSPLorg/chromium/chrome/browser/directactions/DirectActionInitializer;->onDestroy()V
-HSPLorg/chromium/chrome/browser/directactions/DirectActionInitializer;->onFinishNativeInitialization()V
-Lorg/chromium/chrome/browser/dom_distiller/DomDistillerTabUtils;
-HSPLorg/chromium/chrome/browser/dom_distiller/DomDistillerTabUtils;->getDistillerHeuristics()I
-Lorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/chrome/browser/dom_distiller/ReaderModeManager$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;->destroy()V
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;->isEnabled()Z
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;->onContentChanged(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;->onLoadUrl(ILorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/content_public/browser/LoadUrlParams;)V
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;->onShown(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;->tryShowingPrompt()V
-Lorg/chromium/chrome/browser/dom_distiller/ReaderModeManager$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;)V
-Lorg/chromium/chrome/browser/dom_distiller/ReaderModeManager$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/dom_distiller/ReaderModeManager$2;
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager$2;-><init>(Lorg/chromium/chrome/browser/dom_distiller/ReaderModeManager;Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager$2;->didFinishNavigationInPrimaryMainFrame(Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager$2;->didStartNavigationInPrimaryMainFrame(Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeManager$2;->navigationEntryCommitted(Lorg/chromium/content_public/browser/LoadCommittedDetails;)V
-Lorg/chromium/chrome/browser/dom_distiller/ReaderModeToolbarButtonController;
-HSPLorg/chromium/chrome/browser/dom_distiller/ReaderModeToolbarButtonController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/ui/modaldialog/ModalDialogManager;Landroid/graphics/drawable/Drawable;)V
-Lorg/chromium/chrome/browser/dom_distiller/TabDistillabilityProvider;
-HSPLorg/chromium/chrome/browser/dom_distiller/TabDistillabilityProvider;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/dom_distiller/TabDistillabilityProvider;->destroy()V
-HSPLorg/chromium/chrome/browser/dom_distiller/TabDistillabilityProvider;->onContentChanged(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/dom_distiller/TabDistillabilityProvider;->resetState()V
-Lorg/chromium/chrome/browser/dom_distiller/TabDistillabilityProvider$DistillabilityObserver;
-Lorg/chromium/chrome/browser/download/DownloadController$Observer;
-Lorg/chromium/chrome/browser/download/DownloadDelegateImpl;
-HSPLorg/chromium/chrome/browser/download/DownloadDelegateImpl;-><init>()V
-PLorg/chromium/chrome/browser/download/DownloadDelegateImpl;->isDownloadOnSDCard(Ljava/lang/String;)Z
-Lorg/chromium/chrome/browser/download/DownloadDialogBridge;
-HSPLorg/chromium/chrome/browser/download/DownloadDialogBridge;-><init>(JLorg/chromium/chrome/browser/download/dialogs/DownloadLocationDialogCoordinator;)V
-HSPLorg/chromium/chrome/browser/download/DownloadDialogBridge;->create(J)Lorg/chromium/chrome/browser/download/DownloadDialogBridge;
-PLorg/chromium/chrome/browser/download/DownloadDirectoryProvider;->isDownloadOnSDCard(Ljava/lang/String;)Z
-Lorg/chromium/chrome/browser/download/DownloadFileProvider;
-HSPLorg/chromium/chrome/browser/download/DownloadFileProvider;-><init>()V
-HSPLorg/chromium/chrome/browser/download/DownloadFileProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V
-Lorg/chromium/chrome/browser/download/DownloadForegroundServiceManager;
-HSPLorg/chromium/chrome/browser/download/DownloadForegroundServiceManager;-><init>()V
-Lorg/chromium/chrome/browser/download/DownloadForegroundServiceManager$1;
-HSPLorg/chromium/chrome/browser/download/DownloadForegroundServiceManager$1;-><init>(Lorg/chromium/chrome/browser/download/DownloadForegroundServiceManager;)V
-Lorg/chromium/chrome/browser/download/DownloadForegroundServiceManager$2;
-HSPLorg/chromium/chrome/browser/download/DownloadForegroundServiceManager$2;-><init>(Lorg/chromium/chrome/browser/download/DownloadForegroundServiceManager;)V
-Lorg/chromium/chrome/browser/download/DownloadManagerService;
-HSPLorg/chromium/chrome/browser/download/DownloadManagerService;-><init>(Lorg/chromium/chrome/browser/download/SystemDownloadNotifier;Landroid/os/Handler;)V
-HSPLorg/chromium/chrome/browser/download/DownloadManagerService;->getDownloadManagerService()Lorg/chromium/chrome/browser/download/DownloadManagerService;
-HSPLorg/chromium/chrome/browser/download/DownloadManagerService;->getNativeDownloadManagerService()J
-Lorg/chromium/chrome/browser/download/DownloadMessageBridge;
-HSPLorg/chromium/chrome/browser/download/DownloadMessageBridge;-><init>(J)V
-HSPLorg/chromium/chrome/browser/download/DownloadMessageBridge;->create(J)Lorg/chromium/chrome/browser/download/DownloadMessageBridge;
-Lorg/chromium/chrome/browser/download/DownloadMessageUiControllerImpl;
-HSPLorg/chromium/chrome/browser/download/DownloadMessageUiControllerImpl;-><init>(Lorg/chromium/chrome/browser/app/download/DownloadMessageUiDelegate;)V
-Lorg/chromium/chrome/browser/download/DownloadMessageUiControllerImpl$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/download/DownloadMessageUiControllerImpl$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/download/DownloadMessageUiControllerImpl;)V
-HSPLorg/chromium/chrome/browser/download/DownloadMessageUiControllerImpl$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/download/DownloadNotificationService;
-HSPLorg/chromium/chrome/browser/download/DownloadNotificationService;-><init>()V
-HSPLorg/chromium/chrome/browser/download/DownloadNotificationService;->cancelOffTheRecordDownloads()V
-Lorg/chromium/chrome/browser/download/DownloadNotificationService$LazyHolder;
-Lorg/chromium/chrome/browser/download/DownloadServiceDelegate;
-Lorg/chromium/chrome/browser/download/DownloadSharedPreferenceHelper;
-HSPLorg/chromium/chrome/browser/download/DownloadSharedPreferenceHelper;-><init>()V
-Lorg/chromium/chrome/browser/download/DownloadSharedPreferenceHelper$LazyHolder;
-Lorg/chromium/chrome/browser/download/DownloadSnackbarController;
-HSPLorg/chromium/chrome/browser/download/DownloadSnackbarController;-><init>()V
-Lorg/chromium/chrome/browser/download/DownloadUtils;
-HSPLorg/chromium/chrome/browser/download/DownloadUtils;->isAllowedToDownloadPage(Lorg/chromium/chrome/browser/tab/Tab;)Z
-Lorg/chromium/chrome/browser/download/OMADownloadHandler;
-HSPLorg/chromium/chrome/browser/download/OMADownloadHandler;-><init>(Landroid/content/Context;)V
-PLorg/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider;-><init>()V
-PLorg/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider;->getInstance()Lorg/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider;
-PLorg/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider;->onItemsAdded(Ljava/util/List;)V
-PLorg/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider;)V
-PLorg/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/download/SystemDownloadNotifier;
-HSPLorg/chromium/chrome/browser/download/SystemDownloadNotifier;-><init>()V
-Lorg/chromium/chrome/browser/download/dialogs/DownloadLocationDialogCoordinator;
-HSPLorg/chromium/chrome/browser/download/dialogs/DownloadLocationDialogCoordinator;-><init>()V
-Lorg/chromium/chrome/browser/download/items/OfflineContentAggregatorFactory;
-HSPLorg/chromium/chrome/browser/download/items/OfflineContentAggregatorFactory;->get()Lorg/chromium/components/offline_items_collection/OfflineContentAggregatorBridge;
-Lorg/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi;
-HSPLorg/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi;-><init>(Lorg/chromium/components/offline_items_collection/OfflineContentAggregatorBridge;Lorg/chromium/chrome/browser/download/SystemDownloadNotifier;)V
-Lorg/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiFactory;
-HSPLorg/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiFactory;->instance()Lorg/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi;
-Lorg/chromium/chrome/browser/download/service/DownloadTaskScheduler;
-HSPLorg/chromium/chrome/browser/download/service/DownloadTaskScheduler;->cancelTask(I)V
-HPLorg/chromium/chrome/browser/download/service/DownloadTaskScheduler;->scheduleTask(IZZIJJ)V
-Lorg/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegate;
-HSPLorg/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegate;-><init>(Landroid/content/Context;)V
-Lorg/chromium/chrome/browser/enterprise/util/EnterpriseInfo;
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfo;-><init>()V
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfo;->getInstance()Lorg/chromium/chrome/browser/enterprise/util/EnterpriseInfo;
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfo;->getManagedStateForNative()V
-Lorg/chromium/chrome/browser/enterprise/util/EnterpriseInfo$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfo$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfo$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/enterprise/util/EnterpriseInfo$OwnedState;
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfo$OwnedState;-><init>(ZZ)V
-Lorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl;
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl;-><init>()V
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl;->getDeviceEnterpriseInfo(Lorg/chromium/base/Callback;)V
-PLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl;->logDeviceEnterpriseInfo()V
-PLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl;Lorg/chromium/base/Callback;)V
-PLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl$$ExternalSyntheticLambda0;->run()V
-PLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl$$ExternalSyntheticLambda2;-><init>()V
-PLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl$$ExternalSyntheticLambda2;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl$1;
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl$1;-><init>(Lorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl;)V
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl$1;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl$1;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl;
-HSPLorg/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl;->shouldDisableExternalIntentRequestsForUrl(Lorg/chromium/url/GURL;)Z
-Lorg/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl$1;
-HSPLorg/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl$1;-><init>(Lorg/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl;)V
-HSPLorg/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler;
-HSPLorg/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler;-><init>()V
-HSPLorg/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler;->getInstance()Lorg/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler;
-Lorg/chromium/chrome/browser/feature_engagement/ScreenshotMonitorDelegate;
-Lorg/chromium/chrome/browser/feature_engagement/ScreenshotMonitorImpl;
-HSPLorg/chromium/chrome/browser/feature_engagement/ScreenshotMonitorImpl;-><init>(Lorg/chromium/chrome/browser/feature_engagement/ScreenshotMonitorDelegate;)V
-Lorg/chromium/chrome/browser/feature_engagement/ScreenshotMonitorImpl$ScreenshotMonitorContentObserver;
-HSPLorg/chromium/chrome/browser/feature_engagement/ScreenshotMonitorImpl$ScreenshotMonitorContentObserver;-><init>(Lorg/chromium/chrome/browser/feature_engagement/ScreenshotMonitorImpl;Lorg/chromium/chrome/browser/feature_engagement/ScreenshotMonitorImpl;)V
-Lorg/chromium/chrome/browser/feature_engagement/TrackerFactory;
-HSPLorg/chromium/chrome/browser/feature_engagement/TrackerFactory;->getTrackerForProfile(Lorg/chromium/chrome/browser/profiles/Profile;)Lorg/chromium/components/feature_engagement/Tracker;
-Lorg/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideBridge;
-Lorg/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationGuideService$Delegate;
-Lorg/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationUtils;
-HSPLorg/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationUtils;->getIPHFeatureForNotificationFeatureType(I)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationUtils;->registerIPHCallback(ILjava/lang/Runnable;)V
-HSPLorg/chromium/chrome/browser/feature_guide/notifications/FeatureNotificationUtils;->unregisterIPHCallback(I)V
-Lorg/chromium/chrome/browser/feed/FeedFeatures;
-Lorg/chromium/chrome/browser/feed/FeedPlaceholderLayout;
-Lorg/chromium/chrome/browser/feed/FeedStreamViewResizer;
-HSPLorg/chromium/chrome/browser/feed/FeedStreamViewResizer;-><init>(Landroid/app/Activity;Landroid/view/ViewGroup;Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig;II)V
-HSPLorg/chromium/chrome/browser/feed/FeedStreamViewResizer;->createAndAttach(Landroid/app/Activity;Landroid/view/ViewGroup;Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig;)V
-Lorg/chromium/chrome/browser/feed/FeedSurfaceDelegate;
-Lorg/chromium/chrome/browser/feed/FeedSurfaceTracker;
-HSPLorg/chromium/chrome/browser/feed/FeedSurfaceTracker;-><init>()V
-HSPLorg/chromium/chrome/browser/feed/FeedSurfaceTracker;->getInstance()Lorg/chromium/chrome/browser/feed/FeedSurfaceTracker;
-Lorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout;
-HSPLorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout;-><init>(Landroid/app/Activity;)V
-HSPLorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout;->create(Landroid/app/Activity;)Lorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout;
-HSPLorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout;->onWindowVisibilityChanged(I)V
-Lorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout$1;
-HSPLorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout$1;-><init>(Lorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout;Landroid/app/Activity;)V
-Lorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout$2;
-HSPLorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout$2;-><init>(Lorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout;)V
-Lorg/chromium/chrome/browser/feed/ScrollListener;
-Lorg/chromium/chrome/browser/feed/ScrollableContainerDelegate;
-Lorg/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarController$FeedLauncher;
-Lorg/chromium/chrome/browser/findinpage/FindToolbarManager;
-HSPLorg/chromium/chrome/browser/findinpage/FindToolbarManager;-><init>(Landroid/view/ViewStub;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/toolbar/top/ToolbarActionModeCallback;Lorg/chromium/chrome/browser/back_press/BackPressManager;)V
-Lorg/chromium/chrome/browser/findinpage/FindToolbarObserver;
-Lorg/chromium/chrome/browser/firstrun/FirstRunFlowSequencer;
-HSPLorg/chromium/chrome/browser/firstrun/FirstRunFlowSequencer;->checkIfFirstRunIsNecessary(Landroid/content/Intent;Z)Z
-HSPLorg/chromium/chrome/browser/firstrun/FirstRunFlowSequencer;->checkIfFirstRunIsNecessary(ZZ)Z
-HSPLorg/chromium/chrome/browser/firstrun/FirstRunFlowSequencer;->launch(Landroid/content/Context;Landroid/content/Intent;Z)Z
-Lorg/chromium/chrome/browser/firstrun/FirstRunSignInProcessor;
-HSPLorg/chromium/chrome/browser/firstrun/FirstRunSignInProcessor;->openSyncSettingsIfScheduled(Landroid/app/Activity;)V
-Lorg/chromium/chrome/browser/firstrun/FirstRunStatus;
-HSPLorg/chromium/chrome/browser/firstrun/FirstRunStatus;->getFirstRunFlowComplete()Z
-Lorg/chromium/chrome/browser/flags/AllCachedFieldTrialParameters;
-HSPLorg/chromium/chrome/browser/flags/AllCachedFieldTrialParameters;-><init>()V
-HSPLorg/chromium/chrome/browser/flags/AllCachedFieldTrialParameters;->cacheToDisk()V
-Lorg/chromium/chrome/browser/flags/BooleanCachedFieldTrialParameter;
-HSPLorg/chromium/chrome/browser/flags/BooleanCachedFieldTrialParameter;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLorg/chromium/chrome/browser/flags/BooleanCachedFieldTrialParameter;->cacheToDisk()V
-HSPLorg/chromium/chrome/browser/flags/BooleanCachedFieldTrialParameter;->getValue()Z
-Lorg/chromium/chrome/browser/flags/CachedFeatureFlags;
-HSPLorg/chromium/chrome/browser/flags/CachedFeatureFlags;->cacheNativeFlags(Ljava/util/List;)V
-HSPLorg/chromium/chrome/browser/flags/CachedFeatureFlags;->getConsistentBooleanValue(Ljava/lang/String;Z)Z
-HSPLorg/chromium/chrome/browser/flags/CachedFeatureFlags;->getReachedCodeProfilerTrialGroup()Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/flags/CachedFeatureFlags;->isEnabled(Ljava/lang/String;Z)Z
-Lorg/chromium/chrome/browser/flags/CachedFieldTrialParameter;
-HSPLorg/chromium/chrome/browser/flags/CachedFieldTrialParameter;-><init>(Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/flags/CachedFieldTrialParameter;->getSharedPreferenceKey()Ljava/lang/String;
-Lorg/chromium/chrome/browser/flags/CachedFlag;
-HSPLorg/chromium/chrome/browser/flags/CachedFlag;-><init>(Ljava/lang/String;Z)V
-HSPLorg/chromium/chrome/browser/flags/CachedFlag;->isEnabled()Z
-Lorg/chromium/chrome/browser/flags/CachedFlagsSafeMode;
-HSPLorg/chromium/chrome/browser/flags/CachedFlagsSafeMode;->-$$Nest$mwriteSafeValues(Lorg/chromium/chrome/browser/flags/CachedFlagsSafeMode;Lorg/chromium/chrome/browser/flags/ValuesReturned;)V
-HSPLorg/chromium/chrome/browser/flags/CachedFlagsSafeMode;-><init>()V
-HSPLorg/chromium/chrome/browser/flags/CachedFlagsSafeMode;->getSafeValuePreferences()Landroid/content/SharedPreferences;
-HSPLorg/chromium/chrome/browser/flags/CachedFlagsSafeMode;->isSafeModeExperimentEnabled()Z
-HSPLorg/chromium/chrome/browser/flags/CachedFlagsSafeMode;->onFlagChecked()V
-HSPLorg/chromium/chrome/browser/flags/CachedFlagsSafeMode;->shouldEnterSafeMode()Z
-Lorg/chromium/chrome/browser/flags/CachedFlagsSafeMode$1;
-HSPLorg/chromium/chrome/browser/flags/CachedFlagsSafeMode$1;-><init>(Lorg/chromium/chrome/browser/flags/CachedFlagsSafeMode;Lorg/chromium/chrome/browser/flags/ValuesReturned;)V
-HSPLorg/chromium/chrome/browser/flags/CachedFlagsSafeMode$1;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/flags/CachedFlagsSafeMode$1;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/flags/ChromeFeatureList;
-Lorg/chromium/chrome/browser/flags/DoubleCachedFieldTrialParameter;
-HSPLorg/chromium/chrome/browser/flags/DoubleCachedFieldTrialParameter;-><init>(Ljava/lang/String;Ljava/lang/String;D)V
-HSPLorg/chromium/chrome/browser/flags/DoubleCachedFieldTrialParameter;->cacheToDisk()V
-HSPLorg/chromium/chrome/browser/flags/DoubleCachedFieldTrialParameter;->getValue()D
-Lorg/chromium/chrome/browser/flags/IntCachedFieldTrialParameter;
-HSPLorg/chromium/chrome/browser/flags/IntCachedFieldTrialParameter;-><init>(ILjava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/flags/IntCachedFieldTrialParameter;->cacheToDisk()V
-HSPLorg/chromium/chrome/browser/flags/IntCachedFieldTrialParameter;->getValue()I
-Lorg/chromium/chrome/browser/flags/MutableFlagWithSafeDefault;
-HSPLorg/chromium/chrome/browser/flags/MutableFlagWithSafeDefault;-><init>(Ljava/lang/String;Z)V
-HSPLorg/chromium/chrome/browser/flags/MutableFlagWithSafeDefault;->isEnabled()Z
-Lorg/chromium/chrome/browser/flags/PostNativeFlag;
-HSPLorg/chromium/chrome/browser/flags/PostNativeFlag;-><init>()V
-HSPLorg/chromium/chrome/browser/flags/PostNativeFlag;->isEnabled()Z
-Lorg/chromium/chrome/browser/flags/StringCachedFieldTrialParameter;
-HSPLorg/chromium/chrome/browser/flags/StringCachedFieldTrialParameter;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/flags/StringCachedFieldTrialParameter;->cacheToDisk()V
-HSPLorg/chromium/chrome/browser/flags/StringCachedFieldTrialParameter;->getValue()Ljava/lang/String;
-Lorg/chromium/chrome/browser/flags/ValuesOverridden;
-HSPLorg/chromium/chrome/browser/flags/ValuesOverridden;-><init>()V
-Lorg/chromium/chrome/browser/flags/ValuesReturned;
-HSPLorg/chromium/chrome/browser/flags/ValuesReturned;-><init>()V
-Lorg/chromium/chrome/browser/fonts/FontPreloader;
-HSPLorg/chromium/chrome/browser/fonts/FontPreloader;-><init>()V
-HSPLorg/chromium/chrome/browser/fonts/FontPreloader;->getInstance()Lorg/chromium/chrome/browser/fonts/FontPreloader;
-HSPLorg/chromium/chrome/browser/fonts/FontPreloader;->onFirstDraw(Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/fonts/FontPreloader;->onPostInflationStartup(Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/fonts/FontPreloader$OnFontCallback;
-HSPLorg/chromium/chrome/browser/fonts/FontPreloader$OnFontCallback;-><init>(Lorg/chromium/chrome/browser/fonts/FontPreloader;)V
-HSPLorg/chromium/chrome/browser/fonts/FontPreloader$OnFontCallback;->onFontRetrievalFailed(I)V
-HSPLorg/chromium/chrome/browser/fonts/FontPreloader$OnFontCallback;->onFontRetrieved(Landroid/graphics/Typeface;)V
-Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->-$$Nest$monOffsetsChanged(Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;IIIII)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;-><init>(Landroid/app/Activity;)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->addObserver(Lorg/chromium/chrome/browser/browser_controls/BrowserControlsStateProvider$Observer;)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->getBottomControlOffset()I
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->initialize(Lorg/chromium/chrome/browser/toolbar/ControlContainer;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;I)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->onActivityStateChange(Landroid/app/Activity;I)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->removeObserver(Lorg/chromium/chrome/browser/browser_controls/BrowserControlsStateProvider$Observer;)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->scheduleVisibilityUpdate()V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->setBottomControlsHeight(II)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->setPositionsForTab(IIIII)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->setPositionsForTabToNonFullscreen()V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->shouldShowAndroidControls()Z
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->showAndroidControls(Z)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;->updateBrowserControlsOffsets(ZIIIII)V
-Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$$ExternalSyntheticLambda1;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$$ExternalSyntheticLambda2;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$1;
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$1;-><init>(Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;)V
-Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$2;
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$2;-><init>(Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$2;->onObservingDifferentTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$3;
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$3;-><init>(Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$3;->onBrowserControlsOffsetChanged(Lorg/chromium/chrome/browser/tab/TabImpl;IIIII)V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager$3;->onInteractabilityChanged(Lorg/chromium/chrome/browser/tab/Tab;Z)V
-Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManagerSupplier;
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManagerSupplier;-><init>()V
-HSPLorg/chromium/chrome/browser/fullscreen/BrowserControlsManagerSupplier;->getValueOrNullFrom(Lorg/chromium/ui/base/WindowAndroid;)Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;
-Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;-><init>(Landroid/app/Activity;Lorg/chromium/base/supplier/ObservableSupplierImpl;)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;->addObserver(Lorg/chromium/chrome/browser/fullscreen/FullscreenManager$Observer;)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;->createAndShowNotificationToast()V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;->exitPersistentFullscreenMode()V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;->getPersistentFullscreenMode()Z
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;->hideImmediatelyNotificationToast()V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;->onActivityStateChange(Landroid/app/Activity;I)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;->onWindowFocusChanged(Landroid/app/Activity;Z)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;->removeObserver(Lorg/chromium/chrome/browser/fullscreen/FullscreenManager$Observer;)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;->setContentView(Lorg/chromium/components/embedder_support/view/ContentView;)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;->updateMultiTouchZoomSupport(Z)V
-Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;I)V
-Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$1;
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$1;-><init>(Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;)V
-Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$2;
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$2;-><init>(Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$2;->onObservingDifferentTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$3;
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$3;-><init>(Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$3;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$3;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$3;->onInteractabilityChanged(Lorg/chromium/chrome/browser/tab/Tab;Z)V
-Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$FullscreenHandler;
-HSPLorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler$FullscreenHandler;-><init>(Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;)V
-Lorg/chromium/chrome/browser/fullscreen/FullscreenManager;
-Lorg/chromium/chrome/browser/fullscreen/FullscreenManager$Observer;
-Lorg/chromium/chrome/browser/gesturenav/GestureNavigationProperties;
-Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator;
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator;-><init>()V
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator;->isFeatureEnabled()Z
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator;->onPauseWithNative()V
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator;->onResumeWithNative()V
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator;->updateNavigationHandler()V
-Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator;)V
-Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator;I)V
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator;)V
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda2;->run()V
-Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda3;-><init>()V
-Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$1;
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$1;-><init>(Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator;)V
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationLayout;
-HSPLorg/chromium/chrome/browser/gesturenav/HistoryNavigationLayout;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/gesturenav/OverscrollGlowOverlay;Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationCoordinator$$ExternalSyntheticLambda1;)V
-Lorg/chromium/chrome/browser/gesturenav/NavigationGlow;
-HSPLorg/chromium/chrome/browser/gesturenav/NavigationGlow;-><init>(Landroid/view/ViewGroup;)V
-Lorg/chromium/chrome/browser/gesturenav/NavigationHandler;
-HSPLorg/chromium/chrome/browser/gesturenav/NavigationHandler;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/browser/gesturenav/HistoryNavigationLayout;Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$2;)V
-HSPLorg/chromium/chrome/browser/gesturenav/NavigationHandler;->reset()V
-Lorg/chromium/chrome/browser/gesturenav/NavigationHandler$1;
-HSPLorg/chromium/chrome/browser/gesturenav/NavigationHandler$1;-><init>(Lorg/chromium/chrome/browser/gesturenav/NavigationHandler;)V
-Lorg/chromium/chrome/browser/gesturenav/NavigationHandler$SideNavGestureListener;
-HSPLorg/chromium/chrome/browser/gesturenav/NavigationHandler$SideNavGestureListener;-><init>(Lorg/chromium/chrome/browser/gesturenav/NavigationHandler;)V
-Lorg/chromium/chrome/browser/gesturenav/OverscrollGlowOverlay;
-HSPLorg/chromium/chrome/browser/gesturenav/OverscrollGlowOverlay;-><init>(Lorg/chromium/ui/base/ActivityWindowAndroid;Landroid/view/ViewGroup;Lorg/chromium/base/CallbackController$CancelableRunnable;)V
-HSPLorg/chromium/chrome/browser/gesturenav/OverscrollGlowOverlay;->isSceneOverlayTreeShowing()Z
-HSPLorg/chromium/chrome/browser/gesturenav/OverscrollGlowOverlay;->onSizeChanged(FFFI)V
-HSPLorg/chromium/chrome/browser/gesturenav/OverscrollGlowOverlay;->shouldHideAndroidBrowserControls()Z
-HSPLorg/chromium/chrome/browser/gesturenav/OverscrollGlowOverlay;->updateOverlay(J)Z
-Lorg/chromium/chrome/browser/gesturenav/OverscrollSceneLayer;
-HSPLorg/chromium/chrome/browser/gesturenav/OverscrollSceneLayer;-><init>(Lorg/chromium/ui/base/ActivityWindowAndroid;Landroid/view/View;)V
-HSPLorg/chromium/chrome/browser/gesturenav/OverscrollSceneLayer;->destroy()V
-HSPLorg/chromium/chrome/browser/gesturenav/OverscrollSceneLayer;->initializeNative()V
-PLorg/chromium/chrome/browser/gsa/GSAAccountChangeListener;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/gsa/GSAHelper;)V
-PLorg/chromium/chrome/browser/gsa/GSAAccountChangeListener$1;-><init>(Lorg/chromium/chrome/browser/gsa/GSAAccountChangeListener;Lorg/chromium/chrome/browser/gsa/GSAHelper;)V
-PLorg/chromium/chrome/browser/gsa/GSAAccountChangeListener$2;-><init>(Lorg/chromium/chrome/browser/gsa/GSAAccountChangeListener;)V
-PLorg/chromium/chrome/browser/gsa/GSAAccountChangeListener$AccountChangeBroadcastReceiver;-><init>()V
-PLorg/chromium/chrome/browser/gsa/GSAHelper;-><init>()V
-PLorg/chromium/chrome/browser/gsa/GSAServiceClient;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/gsa/GSAAccountChangeListener$2;Lorg/chromium/chrome/browser/gsa/GSAHelper;)V
-PLorg/chromium/chrome/browser/gsa/GSAServiceClient;->connect()V
-PLorg/chromium/chrome/browser/gsa/GSAServiceClient$GSAServiceConnection;-><init>(Lorg/chromium/chrome/browser/gsa/GSAServiceClient;)V
-PLorg/chromium/chrome/browser/gsa/GSAServiceClient$GSAServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-PLorg/chromium/chrome/browser/gsa/GSAServiceClient$IncomingHandler;-><init>(Lorg/chromium/chrome/browser/gsa/GSAServiceClient;)V
-Lorg/chromium/chrome/browser/gsa/GSAState;
-HSPLorg/chromium/chrome/browser/gsa/GSAState;-><init>()V
-HSPLorg/chromium/chrome/browser/gsa/GSAState;->getInstance()Lorg/chromium/chrome/browser/gsa/GSAState;
-PLorg/chromium/chrome/browser/gsa/GSAState;->isAgsaVersionBelowMinimum(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLorg/chromium/chrome/browser/gsa/GSAState;->isGsaAvailable()Z
-Lorg/chromium/chrome/browser/history/HistoryDeletionBridge;
-HSPLorg/chromium/chrome/browser/history/HistoryDeletionBridge;-><init>()V
-Lorg/chromium/chrome/browser/history_clusters/HistoryClustersDelegate;
-Lorg/chromium/chrome/browser/homepage/HomepageManager;
-HSPLorg/chromium/chrome/browser/homepage/HomepageManager;-><init>()V
-HSPLorg/chromium/chrome/browser/homepage/HomepageManager;->getDefaultHomepageUri()Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/homepage/HomepageManager;->getHomepageUri()Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/homepage/HomepageManager;->getInstance()Lorg/chromium/chrome/browser/homepage/HomepageManager;
-HSPLorg/chromium/chrome/browser/homepage/HomepageManager;->isHomepageEnabled()Z
-Lorg/chromium/chrome/browser/homepage/HomepagePolicyManager;
-HSPLorg/chromium/chrome/browser/homepage/HomepagePolicyManager;-><init>()V
-HSPLorg/chromium/chrome/browser/homepage/HomepagePolicyManager;->getInstance()Lorg/chromium/chrome/browser/homepage/HomepagePolicyManager;
-HSPLorg/chromium/chrome/browser/homepage/HomepagePolicyManager;->isHomepageManagedByPolicy()Z
-HSPLorg/chromium/chrome/browser/homepage/HomepagePolicyManager;->refresh()V
-Lorg/chromium/chrome/browser/homepage/HomepagePolicyManager$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/homepage/HomepagePolicyManager$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/homepage/HomepagePolicyManager;)V
-HSPLorg/chromium/chrome/browser/homepage/HomepagePolicyManager$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/identity_disc/IdentityDiscController;
-HSPLorg/chromium/chrome/browser/identity_disc/IdentityDiscController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/base/supplier/ObservableSupplier;)V
-HSPLorg/chromium/chrome/browser/identity_disc/IdentityDiscController;->addObserver(Lorg/chromium/chrome/browser/toolbar/ButtonDataProvider$ButtonDataObserver;)V
-HSPLorg/chromium/chrome/browser/identity_disc/IdentityDiscController;->destroy()V
-HSPLorg/chromium/chrome/browser/identity_disc/IdentityDiscController;->get(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/toolbar/ButtonDataImpl;
-HSPLorg/chromium/chrome/browser/identity_disc/IdentityDiscController;->notifyObservers(Z)V
-HSPLorg/chromium/chrome/browser/identity_disc/IdentityDiscController;->onFinishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/identity_disc/IdentityDiscController;->removeObserver(Lorg/chromium/chrome/browser/toolbar/ButtonDataProvider$ButtonDataObserver;)V
-Lorg/chromium/chrome/browser/identity_disc/IdentityDiscController$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/identity_disc/IdentityDiscController$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/identity_disc/IdentityDiscController;)V
-HSPLorg/chromium/chrome/browser/identity_disc/IdentityDiscController$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/identity_disc/IdentityDiscController$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/identity_disc/IdentityDiscController$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/identity_disc/IdentityDiscController;)V
-Lorg/chromium/chrome/browser/incognito/IncognitoNotificationManager;
-HSPLorg/chromium/chrome/browser/incognito/IncognitoNotificationManager;->dismissIncognitoNotification()V
-Lorg/chromium/chrome/browser/incognito/IncognitoNotificationPresenceController;
-HSPLorg/chromium/chrome/browser/incognito/IncognitoNotificationPresenceController;-><init>()V
-Lorg/chromium/chrome/browser/incognito/IncognitoProfileDestroyer;
-HSPLorg/chromium/chrome/browser/incognito/IncognitoProfileDestroyer;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-Lorg/chromium/chrome/browser/incognito/IncognitoSnapshotController;
-HSPLorg/chromium/chrome/browser/incognito/IncognitoSnapshotController;-><init>(Landroid/view/Window;Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/incognito/IncognitoSnapshotController;->onChange()V
-HSPLorg/chromium/chrome/browser/incognito/IncognitoSnapshotController;->updateIncognitoTabSnapshotState()V
-Lorg/chromium/chrome/browser/incognito/IncognitoTabLauncher;
-HSPLorg/chromium/chrome/browser/incognito/IncognitoTabLauncher;->didCreateIntent(Landroid/content/Intent;)Z
-PLorg/chromium/chrome/browser/incognito/IncognitoTabLauncher;->setComponentEnabled(Z)V
-PLorg/chromium/chrome/browser/incognito/IncognitoTabLauncher$$ExternalSyntheticLambda0;-><init>(Z)V
-PLorg/chromium/chrome/browser/incognito/IncognitoTabLauncher$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController;
-HSPLorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController;-><init>(Landroid/view/Window;Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$$ExternalSyntheticLambda1;)V
-HSPLorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController;->onDestroy()V
-Lorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$$ExternalSyntheticLambda0;-><init>(ILorg/chromium/ui/util/AccessibilityUtil$Observer;)V
-HSPLorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;Lorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$$ExternalSyntheticLambda1;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$1;
-HSPLorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController$1;-><init>(Lorg/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController;)V
-Lorg/chromium/chrome/browser/incognito/IncognitoUtils;
-HSPLorg/chromium/chrome/browser/incognito/IncognitoUtils;->getProfileFromWindowAndroid(Lorg/chromium/ui/base/WindowAndroid;Z)Lorg/chromium/chrome/browser/profiles/Profile;
-Lorg/chromium/chrome/browser/incognito/reauth/IncognitoReauthManager;
-HSPLorg/chromium/chrome/browser/incognito/reauth/IncognitoReauthManager;->isIncognitoReauthFeatureAvailable()Z
-Lorg/chromium/chrome/browser/infobar/IPHBubbleDelegateImpl;
-HSPLorg/chromium/chrome/browser/infobar/IPHBubbleDelegateImpl;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/infobar/IPHInfoBarSupport;
-HSPLorg/chromium/chrome/browser/infobar/IPHInfoBarSupport;-><init>(Lorg/chromium/chrome/browser/infobar/IPHBubbleDelegateImpl;)V
-Lorg/chromium/chrome/browser/infobar/InfoBarContainer;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer;->-$$Nest$mupdateWebContents(Lorg/chromium/chrome/browser/infobar/InfoBarContainer;)V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer;->destroy()V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer;->destroyContainerView()V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer;->get(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/infobar/InfoBarContainer;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer;->initializeContainerView(Landroid/app/Activity;)V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer;->setHidden(Z)V
-Lorg/chromium/chrome/browser/infobar/InfoBarContainer$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$$ExternalSyntheticLambda0;->onAccessibilityModeChanged(Z)V
-Lorg/chromium/chrome/browser/infobar/InfoBarContainer$1;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$1;-><init>(Lorg/chromium/chrome/browser/infobar/InfoBarContainer;)V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$1;->onContentChanged(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$1;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$1;->onDidStartNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-Lorg/chromium/chrome/browser/infobar/InfoBarContainer$2;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$2;-><init>(Lorg/chromium/chrome/browser/infobar/InfoBarContainer;I)V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$2;->onViewAttachedToWindow(Landroid/view/View;)V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$2;->onViewDetachedFromWindow(Landroid/view/View;)V
-Lorg/chromium/chrome/browser/infobar/InfoBarContainer$3;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$3;-><init>(Lorg/chromium/chrome/browser/infobar/InfoBarContainer;)V
-Lorg/chromium/chrome/browser/infobar/InfoBarContainer$4;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$4;-><init>(Lorg/chromium/chrome/browser/infobar/InfoBarContainer;)V
-Lorg/chromium/chrome/browser/infobar/InfoBarContainer$5$1;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainer$5$1;-><init>(Lorg/chromium/chrome/browser/infobar/InfoBarContainer$2;)V
-Lorg/chromium/chrome/browser/infobar/InfoBarContainer$InfoBarContainerObserver;
-Lorg/chromium/chrome/browser/infobar/InfoBarContainerView;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainerView;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/infobar/InfoBarContainer$3;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Z)V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainerView;->addToParentView()V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainerView;->onAttachedToWindow()V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainerView;->runUpEventAnimation(Z)V
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainerView;->setTranslationY(F)V
-Lorg/chromium/chrome/browser/infobar/InfoBarContainerView$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainerView$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/infobar/InfoBarContainerView;)V
-Lorg/chromium/chrome/browser/infobar/InfoBarContainerView$1;
-HSPLorg/chromium/chrome/browser/infobar/InfoBarContainerView$1;-><init>(Lorg/chromium/chrome/browser/infobar/InfoBarContainerView;)V
-Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;
-HSPLorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;-><init>(Landroid/app/Activity;)V
-HSPLorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;->isActivityFinishingOrDestroyed()Z
-HSPLorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;->register(Lorg/chromium/chrome/browser/lifecycle/LifecycleObserver;)V
-HSPLorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;->unregister(Lorg/chromium/chrome/browser/lifecycle/LifecycleObserver;)V
-Lorg/chromium/chrome/browser/init/AsyncInitTaskRunner$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/init/AsyncInitTaskRunner$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/init/NativeInitializationController$1;)V
-HSPLorg/chromium/chrome/browser/init/AsyncInitTaskRunner$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/init/AsyncInitTaskRunner$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/init/AsyncInitTaskRunner$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/init/NativeInitializationController$1;Lorg/chromium/base/library_loader/ProcessInitException;)V
-HSPLorg/chromium/chrome/browser/init/AsyncInitTaskRunner$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/init/AsyncInitializationActivity;
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;-><init>()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->applyOverrides(Landroid/content/Context;Landroid/content/res/Configuration;)Z
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->dispatchOnInflationComplete()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->finishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->getCurrentSmallestScreenWidth(Landroid/content/Context;)I
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->isActivityFinishingOrDestroyed()Z
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->isInstantStartEnabled()Z
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->maybePreconnect()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onAttachedToWindow()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onCreate(Landroid/os/Bundle;)V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onDestroy()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onFirstDrawComplete()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onInitialLayoutInflationComplete()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onNewIntent(Landroid/content/Intent;)V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onPause()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onPauseWithNative()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onResume()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onResumeWithNative()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onStart()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onStartWithNative()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onStop()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onStopWithNative()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->onWindowFocusChanged(Z)V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->performPostInflationStartup()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->performPreInflationStartup()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->postInflationStartup()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->preInflationStartup()V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->requiresFirstRunToBeCompleted(Landroid/content/Intent;)Z
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->setContentViewAndLoadLibrary(Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda2;)V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->shouldAllocateChildConnection()Z
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->shouldPreferLightweightFre(Landroid/content/Intent;)Z
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity;->transformSavedInstanceStateForOnCreate(Landroid/os/Bundle;)Landroid/os/Bundle;
-Lorg/chromium/chrome/browser/init/AsyncInitializationActivity$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/init/AsyncInitializationActivity;)V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/init/AsyncInitializationActivity$1;
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity$1;-><init>(Lorg/chromium/chrome/browser/init/AsyncInitializationActivity;Landroid/app/Activity;)V
-Lorg/chromium/chrome/browser/init/AsyncInitializationActivity$2;
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity$2;-><init>(Lorg/chromium/chrome/browser/init/AsyncInitializationActivity;)V
-HSPLorg/chromium/chrome/browser/init/AsyncInitializationActivity$2;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-Lorg/chromium/chrome/browser/init/BrowserParts;
-HSPLorg/chromium/chrome/browser/init/BrowserParts;->startMinimalBrowser()Z
-Lorg/chromium/chrome/browser/init/ChromeActivityNativeDelegate;
-Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer;
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer;-><init>()V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer;->getInstance()Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer;
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer;->handlePostNativeStartup(ZLorg/chromium/chrome/browser/init/BrowserParts;)V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer;->handlePreNativeStartupAndLoadLibraries(Lorg/chromium/chrome/browser/init/BrowserParts;)V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer;->preInflationStartup()V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer;->runNowOrAfterFullBrowserStarted(Ljava/lang/Runnable;)V
-Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda0;-><init>(I)V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer;I)V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer;Lorg/chromium/chrome/browser/init/BrowserParts;I)V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda2;->run()V
-Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda3;-><init>(Lorg/chromium/chrome/browser/init/BrowserParts;I)V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda3;->run()V
-Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda4;
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda4;-><init>(I)V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$$ExternalSyntheticLambda4;->run()V
-Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer$2;
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$2;-><init>(Lorg/chromium/chrome/browser/init/BrowserParts;Lorg/chromium/base/task/ChainedTasks;)V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$2;->onSuccess()V
-Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer$3;
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$3;-><init>()V
-Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer$4;
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$4;-><init>(Lorg/chromium/chrome/browser/init/ChromeBrowserInitializer;)V
-HSPLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$4;->onActivityStateChange(Landroid/app/Activity;I)V
-Lorg/chromium/chrome/browser/init/ChromeLifetimeController;
-HSPLorg/chromium/chrome/browser/init/ChromeLifetimeController;-><init>()V
-Lorg/chromium/chrome/browser/init/ChromeLifetimeController$1;
-HSPLorg/chromium/chrome/browser/init/ChromeLifetimeController$1;-><init>(Lorg/chromium/chrome/browser/init/ChromeLifetimeController;)V
-Lorg/chromium/chrome/browser/init/NativeInitializationController;
-HSPLorg/chromium/chrome/browser/init/NativeInitializationController;-><init>(Lorg/chromium/chrome/browser/init/ChromeActivityNativeDelegate;)V
-HSPLorg/chromium/chrome/browser/init/NativeInitializationController;->signalNativeLibraryLoadedIfReady()V
-HSPLorg/chromium/chrome/browser/init/NativeInitializationController;->startBackgroundTasks(Z)V
-HSPLorg/chromium/chrome/browser/init/NativeInitializationController;->startNowAndProcessPendingItems()V
-Lorg/chromium/chrome/browser/init/NativeInitializationController$1;
-HSPLorg/chromium/chrome/browser/init/NativeInitializationController$1;-><init>(Lorg/chromium/chrome/browser/init/NativeInitializationController;)V
-HSPLorg/chromium/chrome/browser/init/NativeInitializationController$1;->tasksPossiblyComplete(Lorg/chromium/base/library_loader/ProcessInitException;)V
-Lorg/chromium/chrome/browser/init/ProcessInitializationHandler;
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler;-><init>()V
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler;->getInstance()Lorg/chromium/chrome/browser/init/ProcessInitializationHandler;
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler;->handlePreNativeInitialization()V
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler;->initializePreNative()V
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler;->setProcessStateSummaryForAnrs(Z)V
-Lorg/chromium/chrome/browser/init/ProcessInitializationHandler$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$$ExternalSyntheticLambda0;-><init>(I)V
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/init/ProcessInitializationHandler$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/browserservices/ClearDataDialogResultRecorder;)V
-PLorg/chromium/chrome/browser/init/ProcessInitializationHandler$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/init/ProcessInitializationHandler$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$$ExternalSyntheticLambda2;-><init>(I)V
-Lorg/chromium/chrome/browser/init/ProcessInitializationHandler$1;
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$1;-><init>()V
-Lorg/chromium/chrome/browser/init/ProcessInitializationHandler$10;
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$10;-><init>()V
-PLorg/chromium/chrome/browser/init/ProcessInitializationHandler$10;->run()V
-Lorg/chromium/chrome/browser/init/ProcessInitializationHandler$11;
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$11;-><init>(Lorg/chromium/chrome/browser/init/ProcessInitializationHandler;)V
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$11;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$11;->initCrashReporting()V
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$11;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/init/ProcessInitializationHandler$2;
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$2;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/init/ProcessInitializationHandler$2;->run()V
-Lorg/chromium/chrome/browser/init/SingleWindowKeyboardVisibilityDelegate;
-HSPLorg/chromium/chrome/browser/init/SingleWindowKeyboardVisibilityDelegate;-><init>(Ljava/lang/ref/WeakReference;)V
-HSPLorg/chromium/chrome/browser/init/SingleWindowKeyboardVisibilityDelegate;->isKeyboardShowing(Landroid/content/Context;Landroid/view/View;)Z
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingComponent$SoftKeyboardDelegate;
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentSupplier;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentSupplier;-><init>()V
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator;-><init>()V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator;->isFillingViewShown(Landroid/view/View;)Z
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;-><init>()V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;->is(I)Z
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;->isInitialized()Z
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;->pause()V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;->refreshTabs()V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;->shouldHideOnBackPress()Z
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$1;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$1;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;)V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$1;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$2;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$2;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$3;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$3;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$4;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$4;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator$4;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingProperties;
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingState;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingState;-><init>(Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingState$Observer;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingState$Observer;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingState;Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingState$Observer;->wasHidden()V
-Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingStateCache;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingStateCache;-><init>()V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/ManualFillingStateCache;->getStateFor(Lorg/chromium/content_public/browser/WebContents;)Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingState;
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;Lorg/chromium/ui/AsyncViewStub;)V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator;->skipClosingAnimationOnce()V
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator;I)V
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator$$ExternalSyntheticLambda1;-><init>(I)V
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator$TabSwitchingDelegate;
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator$VisibilityDelegate;
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator;Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator$1;)V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator;->onPropertyChanged(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder$AccessoryBarObserver;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder$AccessoryBarObserver;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator;)V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMetricsRecorder$AccessoryBarObserver;->onPropertyChanged(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties;
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties$BarItem;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties$BarItem;-><init>(ILorg/chromium/chrome/browser/keyboard_accessory/data/KeyboardAccessoryData$Action;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties$SheetOpenerBarItem;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties$SheetOpenerBarItem;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator$1;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/data/KeyboardAccessoryData$Tab;
-Lorg/chromium/chrome/browser/keyboard_accessory/data/Provider$Observer;
-Lorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator;-><init>(Lorg/chromium/ui/AsyncViewStub;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetCoordinator$$ExternalSyntheticLambda0;-><init>()V
-Lorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;)V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator;->onPropertyChanged(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator$1;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator$1;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;)V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMetricsRecorder$$ExternalSyntheticLambda0;->onPropertyChanged(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetProperties;
-Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryButtonGroupView$KeyboardAccessoryButtonGroupListener;
-Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator;-><init>()V
-Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator$1;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator$1;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator$AccessoryTabObserver;
-Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;)V
-HSPLorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator;->onPropertyChanged(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator$1;
-HSPLorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator$1;-><init>(Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator;)V
-Lorg/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties;
-Lorg/chromium/chrome/browser/language/AppLocaleUtils;
-HSPLorg/chromium/chrome/browser/language/AppLocaleUtils;->getAppLanguagePref()Ljava/lang/String;
-Lorg/chromium/chrome/browser/language/AppLocaleUtils$1;
-HSPLorg/chromium/chrome/browser/language/AppLocaleUtils$1;-><init>()V
-HSPLorg/chromium/chrome/browser/language/AppLocaleUtils$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-Lorg/chromium/chrome/browser/language/GlobalAppLocaleController;
-HSPLorg/chromium/chrome/browser/language/GlobalAppLocaleController;-><init>()V
-Lorg/chromium/chrome/browser/language/LanguageBridge;
-HSPLorg/chromium/chrome/browser/language/LanguageBridge;->getULPLanguagesFromDevice(Ljava/lang/String;)[Ljava/lang/String;
-Lorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor;
-HSPLorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/browser/layouts/scene_layer/SceneLayer;Lorg/chromium/ui/modelutil/PropertyModelChangeProcessor$ViewBinder;Lorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor$FrameRequestSupplier;)V
-Lorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor;)V
-HSPLorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor;)V
-HSPLorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor$$ExternalSyntheticLambda1;->onPropertyChanged(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor$FrameRequestSupplier;
-HSPLorg/chromium/chrome/browser/layouts/CompositorModelChangeProcessor$FrameRequestSupplier;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$$ExternalSyntheticLambda0;)V
-Lorg/chromium/chrome/browser/layouts/EventFilter;
-HSPLorg/chromium/chrome/browser/layouts/EventFilter;-><init>(Landroid/content/Context;Z)V
-Lorg/chromium/chrome/browser/layouts/FilterLayoutStateObserver;
-HSPLorg/chromium/chrome/browser/layouts/FilterLayoutStateObserver;-><init>(Lorg/chromium/chrome/browser/layouts/LayoutStateProvider$LayoutStateObserver;)V
-HSPLorg/chromium/chrome/browser/layouts/FilterLayoutStateObserver;->onFinishedHiding(I)V
-HSPLorg/chromium/chrome/browser/layouts/FilterLayoutStateObserver;->onFinishedShowing(I)V
-HSPLorg/chromium/chrome/browser/layouts/FilterLayoutStateObserver;->onStartedHiding(IZZ)V
-HSPLorg/chromium/chrome/browser/layouts/FilterLayoutStateObserver;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/layouts/LayoutManagerProvider;
-Lorg/chromium/chrome/browser/layouts/LayoutManagerProvider$Unowned;
-Lorg/chromium/chrome/browser/layouts/LayoutStateProvider;
-Lorg/chromium/chrome/browser/layouts/LayoutStateProvider$LayoutStateObserver;
-HSPLorg/chromium/chrome/browser/layouts/LayoutStateProvider$LayoutStateObserver;->onFinishedHiding(I)V
-HSPLorg/chromium/chrome/browser/layouts/LayoutStateProvider$LayoutStateObserver;->onFinishedShowing(I)V
-HSPLorg/chromium/chrome/browser/layouts/LayoutStateProvider$LayoutStateObserver;->onStartedHiding(IZZ)V
-Lorg/chromium/chrome/browser/layouts/ManagedLayoutManager;
-Lorg/chromium/chrome/browser/layouts/SceneOverlay;
-Lorg/chromium/chrome/browser/layouts/animation/CompositorAnimationHandler;
-HSPLorg/chromium/chrome/browser/layouts/animation/CompositorAnimationHandler;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl$$ExternalSyntheticLambda0;)V
-Lorg/chromium/chrome/browser/layouts/animation/CompositorAnimator;
-Lorg/chromium/chrome/browser/layouts/animation/CompositorAnimator$AnimatorUpdateListener;
-Lorg/chromium/chrome/browser/layouts/scene_layer/SceneLayer;
-HSPLorg/chromium/chrome/browser/layouts/scene_layer/SceneLayer;-><init>()V
-HSPLorg/chromium/chrome/browser/layouts/scene_layer/SceneLayer;->getNativePtr()J
-HSPLorg/chromium/chrome/browser/layouts/scene_layer/SceneLayer;->initializeNative()V
-HSPLorg/chromium/chrome/browser/layouts/scene_layer/SceneLayer;->setNativePtr(J)V
-Lorg/chromium/chrome/browser/layouts/scene_layer/SceneOverlayLayer;
-HSPLorg/chromium/chrome/browser/layouts/scene_layer/SceneOverlayLayer;-><init>()V
-Lorg/chromium/chrome/browser/lens/LensController;
-HSPLorg/chromium/chrome/browser/lens/LensController;-><init>()V
-Lorg/chromium/chrome/browser/lens/LensControllerDelegateImpl;
-HSPLorg/chromium/chrome/browser/lens/LensControllerDelegateImpl;-><init>()V
-Lorg/chromium/chrome/browser/lifecycle/ConfigurationChangedObserver;
-Lorg/chromium/chrome/browser/lifecycle/DestroyObserver;
-Lorg/chromium/chrome/browser/lifecycle/InflationObserver;
-HSPLorg/chromium/chrome/browser/lifecycle/InflationObserver;->onInflationComplete()V
-Lorg/chromium/chrome/browser/lifecycle/LifecycleObserver;
-Lorg/chromium/chrome/browser/lifecycle/NativeInitObserver;
-Lorg/chromium/chrome/browser/lifecycle/PauseResumeWithNativeObserver;
-Lorg/chromium/chrome/browser/lifecycle/RecreateObserver;
-Lorg/chromium/chrome/browser/lifecycle/SaveInstanceStateObserver;
-Lorg/chromium/chrome/browser/lifecycle/StartStopWithNativeObserver;
-Lorg/chromium/chrome/browser/lifecycle/WindowFocusChangedObserver;
-Lorg/chromium/chrome/browser/locale/LocaleManager;
-HSPLorg/chromium/chrome/browser/locale/LocaleManager;-><init>()V
-HSPLorg/chromium/chrome/browser/locale/LocaleManager;->getInstance()Lorg/chromium/chrome/browser/locale/LocaleManager;
-HSPLorg/chromium/chrome/browser/locale/LocaleManager;->showSearchEnginePromoIfNeeded(Landroid/app/Activity;Lorg/chromium/base/Callback;)V
-Lorg/chromium/chrome/browser/locale/LocaleManagerDelegate$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/locale/LocaleManagerDelegate$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/locale/LocaleManagerDelegateImpl;Landroid/app/Activity;Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/locale/LocaleManagerDelegate$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/locale/LocaleManagerDelegate$1;
-HSPLorg/chromium/chrome/browser/locale/LocaleManagerDelegate$1;-><init>(Lorg/chromium/chrome/browser/locale/LocaleManagerDelegateImpl;)V
-Lorg/chromium/chrome/browser/locale/LocaleManagerDelegateImpl;
-HSPLorg/chromium/chrome/browser/locale/LocaleManagerDelegateImpl;-><init>()V
-Lorg/chromium/chrome/browser/logo/LogoCoordinator$VisibilityObserver;
-Lorg/chromium/chrome/browser/logo/LogoView;
-HSPLorg/chromium/chrome/browser/logo/LogoView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Lorg/chromium/chrome/browser/logo/LogoView$1;
-HSPLorg/chromium/chrome/browser/logo/LogoView$1;-><init>(Lorg/chromium/chrome/browser/logo/LogoView;)V
-Lorg/chromium/chrome/browser/media/MediaCaptureNotificationServiceImpl;
-HSPLorg/chromium/chrome/browser/media/MediaCaptureNotificationServiceImpl;->updateMediaNotificationForTab(Landroid/content/Context;ILorg/chromium/content_public/browser/WebContents;Lorg/chromium/url/GURL;)V
-PLorg/chromium/chrome/browser/media/MediaViewerUtils;->shouldEnableMediaLauncherActivity()Z
-PLorg/chromium/chrome/browser/media/MediaViewerUtils$$ExternalSyntheticLambda0;-><init>()V
-PLorg/chromium/chrome/browser/media/MediaViewerUtils$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/media/router/ChromeMediaRouterClient;
-HSPLorg/chromium/chrome/browser/media/router/ChromeMediaRouterClient;-><init>()V
-HSPLorg/chromium/chrome/browser/media/router/ChromeMediaRouterClient;->initialize()V
-Lorg/chromium/chrome/browser/media/ui/MediaSessionTabHelper;
-HSPLorg/chromium/chrome/browser/media/ui/MediaSessionTabHelper;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/media/ui/MediaSessionTabHelper;->maybeCreateOrUpdateMediaSessionHelper()V
-Lorg/chromium/chrome/browser/media/ui/MediaSessionTabHelper$1;
-HSPLorg/chromium/chrome/browser/media/ui/MediaSessionTabHelper$1;-><init>(Lorg/chromium/chrome/browser/media/ui/MediaSessionTabHelper;)V
-HSPLorg/chromium/chrome/browser/media/ui/MediaSessionTabHelper$1;->onContentChanged(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/media/ui/MediaSessionTabHelper$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetCoordinator;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetCoordinator;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;Landroid/view/View;Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics;Lorg/chromium/ui/base/IntentRequestTrackerImpl;Lorg/chromium/base/supplier/ObservableSupplier;)V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetMediator;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetMediator;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/ui/favicon/FaviconHelper;)V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageScheduler;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageScheduler;-><init>(Lorg/chromium/components/messages/MessageDispatcher;Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageViewModel$MessageActionsHandler;
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics;-><init>()V
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics;->finishRecordingMessageImpact()V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;Landroid/view/View;Lorg/chromium/components/messages/MessageDispatcher;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics;Lorg/chromium/ui/base/IntentRequestTrackerImpl;)V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator;)V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator$OmniboxIconController;
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProvider;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProvider;-><init>()V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEventStorage;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEventStorage;-><init>(Lorg/chromium/chrome/browser/profiles/Profile;)V
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEventStorage;->setNativePtr(J)V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator;-><init>(Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics;)V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator$1;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator$1;-><init>(Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics;Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator$1;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator$1;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactory;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactory;-><init>(Lorg/chromium/base/supplier/ObservableSupplier;)V
-Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactory$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactory$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactory;)V
-HSPLorg/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsStorageFactory$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/merchant_viewer/PageInfoStoreInfoController$StoreInfoActionHandler;
-Lorg/chromium/chrome/browser/messages/ChromeMessageAutodismissDurationProvider;
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageAutodismissDurationProvider;-><init>()V
-Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator;
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator;-><init>(Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/messages/MessageContainerCoordinator;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/base/supplier/OneshotSupplier;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/components/messages/MessageDispatcherImpl;)V
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator;->setLayoutStateProvider(Lorg/chromium/chrome/browser/layouts/LayoutStateProvider;)V
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator;->suspendQueue()I
-Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator;I)V
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$1;
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$1;-><init>(Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator;)V
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$1;->onFinishedShowing(I)V
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$1;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$2;
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$2;-><init>(Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator;)V
-Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$3;
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$3;-><init>(Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator;)V
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$3;->onPauseWithNative()V
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$3;->onResumeWithNative()V
-Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$BrowserControlsObserver;
-HSPLorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator$BrowserControlsObserver;-><init>(Lorg/chromium/chrome/browser/messages/ChromeMessageQueueMediator;)V
-Lorg/chromium/chrome/browser/messages/MessageContainerCoordinator;
-HSPLorg/chromium/chrome/browser/messages/MessageContainerCoordinator;-><init>(Lorg/chromium/components/messages/MessageContainer;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;)V
-Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker;
-HSPLorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier;)V
-Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker;)V
-HSPLorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker;)V
-Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$1;
-HSPLorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$1;-><init>(Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$1;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$2;
-HSPLorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$2;-><init>(Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker;)V
-Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$PageLoadMetricsObserverImpl;
-HSPLorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker$PageLoadMetricsObserverImpl;-><init>(Lorg/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker;)V
-Lorg/chromium/chrome/browser/metrics/LaunchMetrics;
-Lorg/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics;
-HSPLorg/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics;-><init>()V
-PLorg/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics;->logLaunchBehavior(Z)V
-Lorg/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics;)V
-PLorg/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics$$ExternalSyntheticLambda1;-><init>()V
-HSPLorg/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics$$ExternalSyntheticLambda1;->onApplicationStateChange(I)V
-Lorg/chromium/chrome/browser/metrics/PackageMetrics;
-HSPLorg/chromium/chrome/browser/metrics/PackageMetrics;->recordPackageStats()V
-Lorg/chromium/chrome/browser/metrics/PackageMetrics$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/chrome/browser/metrics/PackageMetrics$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/app/usage/StorageStats;)J
-HSPLorg/chromium/chrome/browser/metrics/PackageMetrics$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/app/usage/StorageStats;)J
-HSPLorg/chromium/chrome/browser/metrics/PackageMetrics$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/Class;
-HSPLorg/chromium/chrome/browser/metrics/PackageMetrics$$ExternalSyntheticApiModelOutline0;->m()Ljava/util/UUID;
-HSPLorg/chromium/chrome/browser/metrics/PackageMetrics$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/usage/StorageStats;)J
-HSPLorg/chromium/chrome/browser/metrics/PackageMetrics$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/usage/StorageStatsManager;Ljava/util/UUID;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/app/usage/StorageStats;
-HSPLorg/chromium/chrome/browser/metrics/PackageMetrics$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/app/usage/StorageStatsManager;
-Lorg/chromium/chrome/browser/metrics/PackageMetrics$PackageMetricsData;
-HSPLorg/chromium/chrome/browser/metrics/PackageMetrics$PackageMetricsData;-><init>()V
-Lorg/chromium/chrome/browser/metrics/PageLoadMetrics;
-Lorg/chromium/chrome/browser/metrics/PageLoadMetrics$Observer;
-Lorg/chromium/chrome/browser/metrics/SimpleStartupForegroundSessionDetector;
-Lorg/chromium/chrome/browser/metrics/UmaSessionStats;
-HSPLorg/chromium/chrome/browser/metrics/UmaSessionStats;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/chrome/browser/metrics/UmaSessionStats;->hasVisibleActivity()Z
-HSPLorg/chromium/chrome/browser/metrics/UmaSessionStats;->isMetricsServiceAvailable()Z
-HSPLorg/chromium/chrome/browser/metrics/UmaSessionStats;->updateMetricsServiceState()V
-Lorg/chromium/chrome/browser/metrics/UmaSessionStats$1;
-HSPLorg/chromium/chrome/browser/metrics/UmaSessionStats$1;-><init>(Lorg/chromium/chrome/browser/metrics/UmaSessionStats;)V
-Lorg/chromium/chrome/browser/metrics/UmaSessionStats$2;
-HSPLorg/chromium/chrome/browser/metrics/UmaSessionStats$2;-><init>(Lorg/chromium/chrome/browser/metrics/UmaSessionStats;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/metrics/UmaSessionStats$2;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/metrics/UmaUtils;
-HSPLorg/chromium/chrome/browser/metrics/UmaUtils;->getApplicationStartTime()J
-HSPLorg/chromium/chrome/browser/metrics/UmaUtils;->getProcessStartTime()J
-HSPLorg/chromium/chrome/browser/metrics/UmaUtils;->getStandbyBucket(Landroid/content/Context;)I
-HSPLorg/chromium/chrome/browser/metrics/UmaUtils;->recordForegroundStartTimeWithNative()V
-Lorg/chromium/chrome/browser/metrics/UmaUtils$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/chrome/browser/metrics/UmaUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ActivityManager;)Z
-HSPLorg/chromium/chrome/browser/metrics/UmaUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/usage/UsageStatsManager;)I
-Lorg/chromium/chrome/browser/metrics/VariationsSession;
-HSPLorg/chromium/chrome/browser/metrics/VariationsSession;-><init>()V
-Lorg/chromium/chrome/browser/modaldialog/ChromeTabModalPresenter;
-HSPLorg/chromium/chrome/browser/modaldialog/ChromeTabModalPresenter;-><init>(Landroid/app/Activity;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/fullscreen/FullscreenManager;Lorg/chromium/chrome/browser/browser_controls/BrowserControlsVisibilityManager;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-Lorg/chromium/chrome/browser/modaldialog/ChromeTabModalPresenter$TabModalBrowserControlsVisibilityDelegate;
-HSPLorg/chromium/chrome/browser/modaldialog/ChromeTabModalPresenter$TabModalBrowserControlsVisibilityDelegate;-><init>()V
-Lorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler;
-HSPLorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/ui/modaldialog/ModalDialogManager;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/UnownedUserDataSupplier;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/back_press/BackPressManager;)V
-HSPLorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler;->handleTabChanged(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler;->onDestroy()V
-HSPLorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler;->onFinishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler;->updateSuspensionState()V
-Lorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler$1;
-HSPLorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler$1;-><init>(Lorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler;)V
-HSPLorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler$1;->onInteractabilityChanged(Lorg/chromium/chrome/browser/tab/Tab;Z)V
-Lorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler$2;
-HSPLorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler$2;-><init>(Lorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler$2;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/modules/ModuleInstallUi$FailureUiListener;
-Lorg/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar;
-HSPLorg/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar;->registerMojoInterfaces()V
-Lorg/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar$ChromeWebContentsInterfaceRegistrar;
-HSPLorg/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar$ChromeWebContentsInterfaceRegistrar;-><init>()V
-HSPLorg/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar$ChromeWebContentsInterfaceRegistrar;-><init>(I)V
-HSPLorg/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar$ChromeWebContentsInterfaceRegistrar;-><init>(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/multiwindow/MultiInstanceChromeTabbedActivity;
-Lorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;-><init>(Landroid/app/Activity;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcherImpl;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/components/browser_ui/widget/MenuOrKeyboardActionController;)V
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;->allocInstanceId(IIZ)I
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;->initialize(II)V
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;->isTabModelMergingEnabled()Z
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;->killOtherTask()V
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;->onDestroy()V
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;->onFinishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;->onPauseWithNative()V
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;->onResumeWithNative()V
-Lorg/chromium/chrome/browser/multiwindow/MultiInstanceManager$1;
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceManager$1;-><init>(Lorg/chromium/chrome/browser/multiwindow/MultiInstanceManager;)V
-Lorg/chromium/chrome/browser/multiwindow/MultiInstanceState$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/chrome/browser/multiwindow/MultiInstanceState$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ActivityManager$RecentTaskInfo;)Landroid/content/ComponentName;
-Lorg/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcher$MultiWindowModeObserver;
-Lorg/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcherImpl;
-HSPLorg/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcherImpl;-><init>(Landroid/app/Activity;)V
-Lorg/chromium/chrome/browser/multiwindow/MultiWindowUtils;
-HSPLorg/chromium/chrome/browser/multiwindow/MultiWindowUtils;-><init>()V
-HSPLorg/chromium/chrome/browser/multiwindow/MultiWindowUtils;->areMultipleChromeInstancesRunning(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/multiwindow/MultiWindowUtils;->getActivityNameFromTask(Landroid/app/ActivityManager$AppTask;)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/multiwindow/MultiWindowUtils;->getMaxInstances()I
-HSPLorg/chromium/chrome/browser/multiwindow/MultiWindowUtils;->getOpenInOtherWindowActivity(Landroid/app/Activity;)Ljava/lang/Class;
-HSPLorg/chromium/chrome/browser/multiwindow/MultiWindowUtils;->isInMultiDisplayMode(Landroid/app/Activity;)Z
-HSPLorg/chromium/chrome/browser/multiwindow/MultiWindowUtils;->isInMultiWindowMode(Landroid/app/Activity;)Z
-HSPLorg/chromium/chrome/browser/multiwindow/MultiWindowUtils;->isMultiInstanceApi31Enabled()Z
-HSPLorg/chromium/chrome/browser/multiwindow/MultiWindowUtils;->onActivityStateChange(Landroid/app/Activity;I)V
-Lorg/chromium/chrome/browser/native_page/NativePageAssassin;
-HSPLorg/chromium/chrome/browser/native_page/NativePageAssassin;-><init>()V
-Lorg/chromium/chrome/browser/native_page/NativePageFactory;
-HSPLorg/chromium/chrome/browser/native_page/NativePageFactory;-><init>(Landroid/app/Activity;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetController;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/ui/base/WindowAndroid;Lorg/chromium/base/supplier/Supplier;Ljava/util/function/BooleanSupplier;Lorg/chromium/base/jank_tracker/JankTracker;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/share/crow/CrowButtonDelegate;)V
-Lorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector;
-HSPLorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector;-><init>(Lorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector$Observer;)V
-HSPLorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector;->onConnectionTypeChanged(I)V
-HSPLorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector;->performConnectivityCheck()V
-HSPLorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector;->processConnectivityCheckResult()V
-HSPLorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector;->setConnectionState(I)V
-HSPLorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector;->stopConnectivityCheck()V
-Lorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector$DelegateImpl;
-HSPLorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector$DelegateImpl;-><init>()V
-Lorg/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector$Observer;
-Lorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController;
-HSPLorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController;-><init>(Lorg/chromium/chrome/browser/night_mode/SystemNightModeMonitor;Lorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor;Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager;)V
-HSPLorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController;->addObserver(Lorg/chromium/chrome/browser/night_mode/NightModeStateProvider$Observer;)V
-HSPLorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController;->isInNightMode()Z
-HSPLorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController;->onApplicationStateChange(I)V
-HSPLorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController;->removeObserver(Lorg/chromium/chrome/browser/night_mode/NightModeStateProvider$Observer;)V
-HSPLorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController;->start()V
-HSPLorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController;->updateNightMode()V
-Lorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController;)V
-Lorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController;)V
-HSPLorg/chromium/chrome/browser/night_mode/GlobalNightModeStateController$$ExternalSyntheticLambda1;->onPreferenceChanged(Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolder;
-Lorg/chromium/chrome/browser/night_mode/NightModeStateProvider;
-HSPLorg/chromium/chrome/browser/night_mode/NightModeStateProvider;->shouldOverrideConfiguration()Z
-Lorg/chromium/chrome/browser/night_mode/NightModeStateProvider$Observer;
-Lorg/chromium/chrome/browser/night_mode/NightModeUtils;
-HSPLorg/chromium/chrome/browser/night_mode/NightModeUtils;->wrapContextWithNightModeConfig(ILandroid/content/Context;Z)Landroid/view/ContextThemeWrapper;
-Lorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor;
-HSPLorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor;-><init>()V
-HSPLorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor;->updateAccordingToAppState()V
-HSPLorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor;->updatePowerSaveMode()V
-Lorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor;)V
-HSPLorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor$$ExternalSyntheticLambda0;->onApplicationStateChange(I)V
-Lorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor$1;
-HSPLorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor$1;-><init>(Lorg/chromium/chrome/browser/night_mode/PowerSavingModeMonitor;)V
-Lorg/chromium/chrome/browser/night_mode/SystemNightModeMonitor;
-HSPLorg/chromium/chrome/browser/night_mode/SystemNightModeMonitor;-><init>()V
-HSPLorg/chromium/chrome/browser/night_mode/SystemNightModeMonitor;->getInstance()Lorg/chromium/chrome/browser/night_mode/SystemNightModeMonitor;
-Lorg/chromium/chrome/browser/night_mode/SystemNightModeMonitor$Observer;
-Lorg/chromium/chrome/browser/notifications/NotificationPlatformBridge;
-HSPLorg/chromium/chrome/browser/notifications/NotificationPlatformBridge;-><init>(J)V
-HSPLorg/chromium/chrome/browser/notifications/NotificationPlatformBridge;->create(J)Lorg/chromium/chrome/browser/notifications/NotificationPlatformBridge;
-Lorg/chromium/chrome/browser/notifications/NotificationSettingsBridge;
-HSPLorg/chromium/chrome/browser/notifications/NotificationSettingsBridge;->getSiteChannels()[Lorg/chromium/chrome/browser/notifications/NotificationSettingsBridge$SiteChannel;
-Lorg/chromium/chrome/browser/notifications/NotificationSettingsBridge$SiteChannel;
-Lorg/chromium/chrome/browser/notifications/NotificationTriggerScheduler;
-HSPLorg/chromium/chrome/browser/notifications/NotificationTriggerScheduler;-><init>(Lcom/google/android/datatransport/runtime/TransportImpl$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/notifications/NotificationTriggerScheduler;->getInstance()Lorg/chromium/chrome/browser/notifications/NotificationTriggerScheduler;
-Lorg/chromium/chrome/browser/notifications/NotificationTriggerScheduler$LazyHolder;
-Lorg/chromium/chrome/browser/notifications/channels/ChannelsUpdater;
-HSPLorg/chromium/chrome/browser/notifications/channels/ChannelsUpdater;-><init>(ZLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;Lorg/chromium/components/browser_ui/notifications/channels/ChannelsInitializer;I)V
-HSPLorg/chromium/chrome/browser/notifications/channels/ChannelsUpdater;->updateChannels()V
-Lorg/chromium/chrome/browser/notifications/channels/ChannelsUpdater$LazyHolder;
-Lorg/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions;
-Lorg/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions$PredefinedChannelGroups;
-Lorg/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions$PredefinedChannels;
-Lorg/chromium/chrome/browser/notifications/channels/SiteChannelsManager;
-HSPLorg/chromium/chrome/browser/notifications/channels/SiteChannelsManager;-><init>(Lorg/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl;)V
-HSPLorg/chromium/chrome/browser/notifications/channels/SiteChannelsManager;->getSiteChannels()[Lorg/chromium/chrome/browser/notifications/NotificationSettingsBridge$SiteChannel;
-HSPLorg/chromium/chrome/browser/notifications/channels/SiteChannelsManager;->isValidSiteChannelId(Ljava/lang/String;)Z
-Lorg/chromium/chrome/browser/notifications/channels/SiteChannelsManager$LazyHolder;
-Lorg/chromium/chrome/browser/notifications/chime/ChimeFeatures;
-Lorg/chromium/chrome/browser/notifications/permissions/NotificationPermissionController;
-HSPLorg/chromium/chrome/browser/notifications/permissions/NotificationPermissionController;-><init>(Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/notifications/permissions/NotificationPermissionController;->requestPermissionIfNeeded()Z
-Lorg/chromium/chrome/browser/ntp/FeedPositionUtils$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ntp/FeedPositionUtils$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/browser/ntp/FeedPositionUtils$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/ntp/IncognitoCookieControlsManager;
-HSPLorg/chromium/chrome/browser/ntp/IncognitoCookieControlsManager;-><init>()V
-Lorg/chromium/chrome/browser/ntp/IncognitoCookieControlsManager$Observer;
-Lorg/chromium/chrome/browser/ntp/NewTabPage;
-Lorg/chromium/chrome/browser/ntp/NewTabPageUtils;
-HSPLorg/chromium/chrome/browser/ntp/NewTabPageUtils;->decodeOriginFromNtpUrl(Ljava/lang/String;)I
-Lorg/chromium/chrome/browser/ntp/RecentlyClosedBridge;
-HSPLorg/chromium/chrome/browser/ntp/RecentlyClosedBridge;-><init>(Lorg/chromium/chrome/browser/profiles/Profile;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-Lorg/chromium/chrome/browser/ntp/search/SearchBoxContainerView;
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxContainerView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Lorg/chromium/chrome/browser/ntp/search/SearchBoxCoordinator;
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxCoordinator;-><init>(Landroid/content/Context;Landroid/view/ViewGroup;)V
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxCoordinator;->addLensButtonClickListener(Landroid/view/View$OnClickListener;)V
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxCoordinator;->addVoiceSearchButtonClickListener(Landroid/view/View$OnClickListener;)V
-Lorg/chromium/chrome/browser/ntp/search/SearchBoxMediator;
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxMediator;-><init>(Landroid/content/Context;Lorg/chromium/ui/modelutil/PropertyModel;Landroid/view/ViewGroup;)V
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxMediator;->onAssistantVoiceSearchServiceChanged()V
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxMediator;->onDestroy()V
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxMediator;->onFinishNativeInitialization()V
-Lorg/chromium/chrome/browser/ntp/search/SearchBoxMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxMediator$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;)V
-Lorg/chromium/chrome/browser/ntp/search/SearchBoxProperties;
-Lorg/chromium/chrome/browser/ntp/search/SearchBoxViewBinder;
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxViewBinder;-><init>()V
-HSPLorg/chromium/chrome/browser/ntp/search/SearchBoxViewBinder;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/offlinepages/AutoFetchNotifier;
-HSPLorg/chromium/chrome/browser/offlinepages/AutoFetchNotifier;->autoFetchInProgressNotificationCanceled()Z
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageBridge;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageBridge;-><init>(J)V
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageBridge;->create(J)Lorg/chromium/chrome/browser/offlinepages/OfflinePageBridge;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageBridge;->getForProfile(Lorg/chromium/chrome/browser/profiles/Profile;)Lorg/chromium/chrome/browser/offlinepages/OfflinePageBridge;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageBridge;->offlinePageModelLoaded()V
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageBridge$SavePageCallback;
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageTabData;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageTabData;-><init>()V
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;Lorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver$3;)V
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver;->maybeShowReloadSnackbar(Lorg/chromium/chrome/browser/tab/Tab;Z)V
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver$1;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver$1;-><init>()V
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver$1;->onActivityStateChange(Landroid/app/Activity;I)V
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver$2;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver$2;-><init>(Lorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver$3;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageTabObserver$3;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageUtils;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageUtils;->getInstance()Lorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$1;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageUtils;->isOfflinePage(Lorg/chromium/chrome/browser/tab/Tab;)Z
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageUtils;->isShowingTrustedOfflinePage(Lorg/chromium/content_public/browser/WebContents;)Z
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$1;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$1;-><init>(I)V
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$3;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$3;-><init>()V
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$3;->onActivityStateChange(Landroid/app/Activity;I)V
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$RecentTabTracker;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$RecentTabTracker;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$RecentTabTracker;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-Lorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$TabRestoreTracker;
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$TabRestoreTracker;-><init>()V
-HSPLorg/chromium/chrome/browser/offlinepages/OfflinePageUtils$TabRestoreTracker;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge;
-HSPLorg/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge;-><init>()V
-Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineDetector;
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineDetector;-><init>(Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineDetector;->logToAdbConsoleNow(Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineDetector;->onApplicationStateChange(I)V
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineDetector;->updateState()V
-Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineDetector$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineDetector$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineDetector;)V
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineDetector$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2;
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2;->onApplicationStateChanged(Z)V
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2;->updateStatusIndicator(Z)V
-Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2;I)V
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2;I)V
-Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorInProductHelpController;
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorInProductHelpController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/toolbar/ToolbarManager;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;Lorg/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator;)V
-Lorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorMetricsDelegate;
-HSPLorg/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorMetricsDelegate;-><init>()V
-PLorg/chromium/chrome/browser/omaha/ExponentialBackoffScheduler;-><init>()V
-PLorg/chromium/chrome/browser/omaha/OmahaBase;-><init>(Lorg/chromium/chrome/browser/omaha/OmahaService$OmahaClientDelegate;)V
-PLorg/chromium/chrome/browser/omaha/OmahaDelegateBase;-><init>()V
-PLorg/chromium/chrome/browser/omaha/OmahaService;-><init>()V
-PLorg/chromium/chrome/browser/omaha/OmahaService;->onStartTask(Landroid/content/Context;Lorg/chromium/components/background_task_scheduler/TaskParameters;Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService$TaskFinishedCallbackJobService;)Z
-PLorg/chromium/chrome/browser/omaha/OmahaService;->scheduleJobService(J)Z
-PLorg/chromium/chrome/browser/omaha/OmahaService$1;-><init>(Lorg/chromium/chrome/browser/omaha/OmahaService;Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService$TaskFinishedCallbackJobService;)V
-PLorg/chromium/chrome/browser/omaha/OmahaService$1;->doInBackground()Ljava/lang/Object;
-PLorg/chromium/chrome/browser/omaha/OmahaService$1;->onPostExecute(Ljava/lang/Object;)V
-PLorg/chromium/chrome/browser/omaha/OmahaService$OmahaClientDelegate;-><init>()V
-Lorg/chromium/chrome/browser/omaha/UpdateConfigs;
-HSPLorg/chromium/chrome/browser/omaha/UpdateConfigs;->getStringParamValue(Ljava/lang/String;)Ljava/lang/String;
-Lorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper;
-HSPLorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper;-><init>()V
-HSPLorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper;->getInstance()Lorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper;
-HSPLorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper;->handleStateChanged()V
-HSPLorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper;->registerObserver(Ljava/lang/Runnable;)V
-Lorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper;)V
-HSPLorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper;Ljava/lang/Runnable;)V
-HSPLorg/chromium/chrome/browser/omaha/UpdateMenuItemHelper$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/omaha/UpdateStatusProvider;
-HSPLorg/chromium/chrome/browser/omaha/UpdateStatusProvider;-><init>()V
-Lorg/chromium/chrome/browser/omaha/UpdateStatusProvider$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omaha/UpdateStatusProvider$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/omaha/UpdateStatusProvider;)V
-HSPLorg/chromium/chrome/browser/omaha/UpdateStatusProvider$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/omaha/UpdateStatusProvider$LazyHolder;
-Lorg/chromium/chrome/browser/omaha/UpdateStatusProvider$UpdateQuery;
-HSPLorg/chromium/chrome/browser/omaha/UpdateStatusProvider$UpdateQuery;-><init>(Lorg/chromium/chrome/browser/omaha/UpdateStatusProvider$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/omaha/UpdateStatusProvider$UpdateQuery;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/omaha/UpdateStatusProvider$UpdateQuery;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omaha/UpdateStatusProvider$UpdateStatus;
-HSPLorg/chromium/chrome/browser/omaha/UpdateStatusProvider$UpdateStatus;-><init>()V
-HSPLorg/chromium/chrome/browser/omaha/UpdateStatusProvider$UpdateStatus;-><init>(Lorg/chromium/chrome/browser/omaha/UpdateStatusProvider$UpdateStatus;)V
-Lorg/chromium/chrome/browser/omaha/VersionNumber;
-HSPLorg/chromium/chrome/browser/omaha/VersionNumber;->fromString(Ljava/lang/String;)Lorg/chromium/chrome/browser/omaha/VersionNumber;
-Lorg/chromium/chrome/browser/omaha/VersionNumberGetter;
-Lorg/chromium/chrome/browser/omaha/metrics/TrackingProvider;
-HSPLorg/chromium/chrome/browser/omaha/metrics/TrackingProvider;-><init>()V
-Lorg/chromium/chrome/browser/omaha/metrics/TrackingProvider$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omaha/metrics/TrackingProvider$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/omaha/metrics/TrackingProvider$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/omaha/metrics/TrackingProvider$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/omaha/metrics/TrackingProvider$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/base/Promise;Lorg/chromium/chrome/browser/omaha/metrics/UpdateProtos$Tracking;)V
-HSPLorg/chromium/chrome/browser/omaha/metrics/TrackingProvider$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/omaha/metrics/UpdateProtos$Tracking;
-Lorg/chromium/chrome/browser/omaha/metrics/UpdateSuccessMetrics;
-HSPLorg/chromium/chrome/browser/omaha/metrics/UpdateSuccessMetrics;-><init>()V
-Lorg/chromium/chrome/browser/omaha/metrics/UpdateSuccessMetrics$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omaha/metrics/UpdateSuccessMetrics$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/omaha/metrics/UpdateSuccessMetrics;I)V
-HSPLorg/chromium/chrome/browser/omaha/metrics/UpdateSuccessMetrics$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omnibox/AutocompleteEditText;
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText;->onPreDraw()Z
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText;->onSelectionChanged(II)V
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText;->onTextChanged(Ljava/lang/CharSequence;III)V
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText;->sendAccessibilityEventUnchecked(Landroid/view/accessibility/AccessibilityEvent;)V
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText;->setOnKeyListener(Landroid/view/View$OnKeyListener;)V
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V
-Lorg/chromium/chrome/browser/omnibox/AutocompleteEditText$1;
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText$1;-><init>(Lorg/chromium/chrome/browser/omnibox/AutocompleteEditText;)V
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText$1;->afterTextChanged(Landroid/text/Editable;)V
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText$1;->beforeTextChanged(Ljava/lang/CharSequence;III)V
-HSPLorg/chromium/chrome/browser/omnibox/AutocompleteEditText$1;->onTextChanged(Ljava/lang/CharSequence;III)V
-Lorg/chromium/chrome/browser/omnibox/AutocompleteEditTextModelBase$Delegate;
-Lorg/chromium/chrome/browser/omnibox/BackKeyBehaviorDelegate;
-Lorg/chromium/chrome/browser/omnibox/ChromeAutocompleteSchemeClassifier;
-HSPLorg/chromium/chrome/browser/omnibox/ChromeAutocompleteSchemeClassifier;-><init>(Lorg/chromium/chrome/browser/profiles/Profile;)V
-HSPLorg/chromium/chrome/browser/omnibox/ChromeAutocompleteSchemeClassifier;->destroy()V
-Lorg/chromium/chrome/browser/omnibox/KeyboardHideHelper;
-HSPLorg/chromium/chrome/browser/omnibox/KeyboardHideHelper;-><init>(Landroid/view/View;Lorg/chromium/chrome/browser/omnibox/UrlBar$$ExternalSyntheticLambda0;)V
-Lorg/chromium/chrome/browser/omnibox/KeyboardHideHelper$1;
-HSPLorg/chromium/chrome/browser/omnibox/KeyboardHideHelper$1;-><init>(Lorg/chromium/chrome/browser/omnibox/KeyboardHideHelper;)V
-Lorg/chromium/chrome/browser/omnibox/LocationBar;
-Lorg/chromium/chrome/browser/omnibox/LocationBarCoordinator;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator;-><init>(Landroid/view/View;Landroid/view/View;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/omnibox/LocationBarDataProvider;Landroid/view/ActionMode$Callback;Lorg/chromium/ui/base/WindowDelegate;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/omnibox/OverrideUrlLoadingDelegate;Lorg/chromium/chrome/browser/omnibox/BackKeyBehaviorDelegate;Lorg/chromium/chrome/browser/omnibox/SearchEngineLogoUtils;Ljava/lang/Runnable;Lorg/chromium/chrome/browser/omnibox/status/StatusCoordinator$PageInfoAction;Lorg/chromium/base/Callback;Lorg/chromium/chrome/browser/omnibox/LocationBarMediator$SaveOfflineButtonState;Lorg/chromium/chrome/browser/omnibox/LocationBarMediator$OmniboxUma;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor$BookmarkState;Ljava/util/function/BooleanSupplier;Lorg/chromium/base/jank_tracker/JankTracker;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl;Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;Lorg/chromium/base/Callback;Lorg/chromium/chrome/browser/back_press/BackPressManager;Lorg/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownScrollListener;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator;->destroy()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator;->getOmniboxStub()Lorg/chromium/chrome/browser/omnibox/OmniboxStub;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator;->getSecurityIconView()Landroid/view/View;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator;->getVoiceRecognitionHandler()Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler;
-PLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator;->onDeferredStartup()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator;->onFinishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator;->updateVisualsForState()V
-Lorg/chromium/chrome/browser/omnibox/LocationBarCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omnibox/LocationBarCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/omnibox/LocationBarMediator;I)V
-Lorg/chromium/chrome/browser/omnibox/LocationBarCoordinator$1;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator$1;-><init>(Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplier;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinator$1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omnibox/LocationBarCoordinator$SubCoordinator;
-Lorg/chromium/chrome/browser/omnibox/LocationBarCoordinatorPhone;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinatorPhone;-><init>(Lorg/chromium/chrome/browser/omnibox/LocationBarPhone;Lorg/chromium/chrome/browser/omnibox/status/StatusCoordinator;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarCoordinatorPhone;->destroy()V
-Lorg/chromium/chrome/browser/omnibox/LocationBarDataProvider;
-Lorg/chromium/chrome/browser/omnibox/LocationBarDataProvider$Observer;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarDataProvider$Observer;->hintZeroSuggestRefresh()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarDataProvider$Observer;->onPrimaryColorChanged()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarDataProvider$Observer;->onSecurityStateChanged()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarDataProvider$Observer;->onTitleChanged()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarDataProvider$Observer;->onUrlChanged()V
-Lorg/chromium/chrome/browser/omnibox/LocationBarLayout;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarLayout;->initialize(Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator;Lorg/chromium/chrome/browser/omnibox/UrlBarCoordinator;Lorg/chromium/chrome/browser/omnibox/status/StatusCoordinator;Lorg/chromium/chrome/browser/omnibox/LocationBarDataProvider;Lorg/chromium/chrome/browser/omnibox/SearchEngineLogoUtils;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarLayout;->onFinishInflate()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarLayout;->onFinishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarLayout;->onMeasure(II)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarLayout;->setUnfocusedWidth(I)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarLayout;->setUrlFocusChangePercent(F)V
-Lorg/chromium/chrome/browser/omnibox/LocationBarMediator;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/LocationBarLayout;Lorg/chromium/chrome/browser/omnibox/LocationBarDataProvider;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/omnibox/OverrideUrlLoadingDelegate;Lorg/chromium/chrome/browser/locale/LocaleManager;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/chrome/browser/omnibox/BackKeyBehaviorDelegate;Lorg/chromium/ui/base/ActivityWindowAndroid;ZLorg/chromium/chrome/browser/omnibox/SearchEngineLogoUtils;Lorg/chromium/chrome/browser/lens/LensController;Ljava/lang/Runnable;Lorg/chromium/chrome/browser/omnibox/LocationBarMediator$SaveOfflineButtonState;Lorg/chromium/chrome/browser/omnibox/LocationBarMediator$OmniboxUma;Ljava/util/function/BooleanSupplier;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->addUrlFocusChangeListener(Lorg/chromium/chrome/browser/omnibox/UrlFocusChangeListener;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->getVoiceRecognitionHandler()Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->hintZeroSuggestRefresh()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->isLensEnabled()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->onAssistantVoiceSearchServiceChanged()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->onPrimaryColorChanged()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->onUrlChanged()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->onVoiceAvailabilityImpacted()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->removeUrlFocusChangeListener(Lorg/chromium/chrome/browser/omnibox/UrlFocusChangeListener;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->setUrl(Ljava/lang/String;Lorg/chromium/chrome/browser/omnibox/UrlBarData;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->setUrlBarFocus(Ljava/lang/String;IZ)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->setUrlFocusChangeFraction(F)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->shouldShowDeleteButton()Z
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->shouldShowLensButton()Z
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->updateAssistantVoiceSearchDrawableAndColors()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->updateButtonVisibility()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator;->updateShouldAnimateIconChanges()V
-Lorg/chromium/chrome/browser/omnibox/LocationBarMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/omnibox/LocationBarMediator;I)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omnibox/LocationBarMediator$2;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarMediator$2;-><init>(Lorg/chromium/chrome/browser/omnibox/LocationBarMediator;I)V
-Lorg/chromium/chrome/browser/omnibox/LocationBarMediator$OmniboxUma;
-Lorg/chromium/chrome/browser/omnibox/LocationBarMediator$SaveOfflineButtonState;
-Lorg/chromium/chrome/browser/omnibox/LocationBarPhone;
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarPhone;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarPhone;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarPhone;->onFinishInflate()V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarPhone;->onLayout(ZIIII)V
-HSPLorg/chromium/chrome/browser/omnibox/LocationBarPhone;->onMeasure(II)V
-Lorg/chromium/chrome/browser/omnibox/NewTabPageDelegate;
-Lorg/chromium/chrome/browser/omnibox/NewTabPageDelegate$1;
-HSPLorg/chromium/chrome/browser/omnibox/NewTabPageDelegate$1;-><init>()V
-Lorg/chromium/chrome/browser/omnibox/OmniboxFeatures;
-HSPLorg/chromium/chrome/browser/omnibox/OmniboxFeatures;->shouldMatchToolbarAndStatusBarColor()Z
-HSPLorg/chromium/chrome/browser/omnibox/OmniboxFeatures;->shouldShowModernizeVisualUpdate(Landroid/content/Context;)Z
-Lorg/chromium/chrome/browser/omnibox/OmniboxPrerender;
-HSPLorg/chromium/chrome/browser/omnibox/OmniboxPrerender;-><init>()V
-Lorg/chromium/chrome/browser/omnibox/OmniboxStub;
-Lorg/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl;
-HSPLorg/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl;-><init>(Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/ui/base/WindowDelegate;Landroid/view/View;Lorg/chromium/chrome/browser/omnibox/LocationBarLayout;)V
-HSPLorg/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl;->recalculateOmniboxAlignment()V
-Lorg/chromium/chrome/browser/omnibox/OverrideUrlLoadingDelegate;
-Lorg/chromium/chrome/browser/omnibox/SearchEngineLogoUtils;
-HSPLorg/chromium/chrome/browser/omnibox/SearchEngineLogoUtils;-><init>()V
-HSPLorg/chromium/chrome/browser/omnibox/SearchEngineLogoUtils;->getInstance()Lorg/chromium/chrome/browser/omnibox/SearchEngineLogoUtils;
-Lorg/chromium/chrome/browser/omnibox/UrlBar;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->bringPointIntoView(I)Z
-PLorg/chromium/chrome/browser/omnibox/UrlBar;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->getText()Landroid/text/Editable;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->getText()Ljava/lang/CharSequence;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->onDraw(Landroid/graphics/Canvas;)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->onFinishInflate()V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->onLayout(ZIIII)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->onTextChanged(Ljava/lang/CharSequence;III)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->onWindowFocusChanged(Z)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->scrollDisplayTextInternal(I)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->setIgnoreTextChangesForAutocomplete(Z)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V
-Lorg/chromium/chrome/browser/omnibox/UrlBar$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/omnibox/UrlBar;I)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/omnibox/UrlBar$1;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBar$1;-><init>(Lorg/chromium/chrome/browser/omnibox/UrlBar;)V
-Lorg/chromium/chrome/browser/omnibox/UrlBar$UrlBarDelegate;
-Lorg/chromium/chrome/browser/omnibox/UrlBar$UrlBarTextContextMenuDelegate;
-Lorg/chromium/chrome/browser/omnibox/UrlBar$UrlTextChangeListener;
-Lorg/chromium/chrome/browser/omnibox/UrlBarApi26;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarApi26;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarApi26;->getAutofillType()I
-Lorg/chromium/chrome/browser/omnibox/UrlBarCoordinator;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarCoordinator;-><init>(Lorg/chromium/chrome/browser/omnibox/UrlBar;Lorg/chromium/ui/base/WindowDelegate;Landroid/view/ActionMode$Callback;Lorg/chromium/base/Callback;Lorg/chromium/chrome/browser/omnibox/UrlBar$UrlBarDelegate;Lorg/chromium/ui/KeyboardVisibilityDelegate;ZLorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarCoordinator;->getTextWithAutocomplete()Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarCoordinator;->setUrlBarData(Lorg/chromium/chrome/browser/omnibox/UrlBarData;II)Z
-Lorg/chromium/chrome/browser/omnibox/UrlBarCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarCoordinator$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarCoordinator$$ExternalSyntheticLambda0;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omnibox/UrlBarCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/omnibox/UrlBarCoordinator;)V
-Lorg/chromium/chrome/browser/omnibox/UrlBarData;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarData;-><init>(Ljava/lang/String;Ljava/lang/CharSequence;IILjava/lang/String;)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarData;->create(Ljava/lang/String;Ljava/lang/CharSequence;IILjava/lang/String;)Lorg/chromium/chrome/browser/omnibox/UrlBarData;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarData;->forNonUrlText(Ljava/lang/String;)Lorg/chromium/chrome/browser/omnibox/UrlBarData;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarData;->forUrlAndText(Ljava/lang/String;Landroid/text/SpannableStringBuilder;Ljava/lang/String;)Lorg/chromium/chrome/browser/omnibox/UrlBarData;
-Lorg/chromium/chrome/browser/omnibox/UrlBarEditingTextStateProvider;
-Lorg/chromium/chrome/browser/omnibox/UrlBarMediator;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarMediator;-><init>(Lorg/chromium/chrome/browser/omnibox/UrlBarCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/ui/modelutil/PropertyModel;)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarMediator;->afterTextChanged(Landroid/text/Editable;)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarMediator;->beforeTextChanged(Ljava/lang/CharSequence;III)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarMediator;->onTextChanged(Ljava/lang/CharSequence;III)V
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarMediator;->pushTextToModel()V
-Lorg/chromium/chrome/browser/omnibox/UrlBarMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarMediator$$ExternalSyntheticLambda0;-><init>()V
-Lorg/chromium/chrome/browser/omnibox/UrlBarMediator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarMediator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/omnibox/UrlBarMediator;)V
-Lorg/chromium/chrome/browser/omnibox/UrlBarProperties;
-Lorg/chromium/chrome/browser/omnibox/UrlBarProperties$UrlBarTextState;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarProperties$UrlBarTextState;-><init>(IIILjava/lang/CharSequence;Ljava/lang/CharSequence;)V
-Lorg/chromium/chrome/browser/omnibox/UrlBarViewBinder$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarViewBinder$$ExternalSyntheticApiModelOutline0;->m$1(Lorg/chromium/chrome/browser/omnibox/UrlBar;)Landroid/graphics/drawable/Drawable;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarViewBinder$$ExternalSyntheticApiModelOutline0;->m$2(Lorg/chromium/chrome/browser/omnibox/UrlBar;)Landroid/graphics/drawable/Drawable;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarViewBinder$$ExternalSyntheticApiModelOutline0;->m$3(Lorg/chromium/chrome/browser/omnibox/UrlBar;)Landroid/graphics/drawable/Drawable;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarViewBinder$$ExternalSyntheticApiModelOutline0;->m(Lorg/chromium/chrome/browser/omnibox/UrlBar;)Landroid/graphics/drawable/Drawable;
-Lorg/chromium/chrome/browser/omnibox/UrlBarViewBinder$$ExternalSyntheticLambda4;
-HSPLorg/chromium/chrome/browser/omnibox/UrlBarViewBinder$$ExternalSyntheticLambda4;-><init>(Lorg/chromium/chrome/browser/omnibox/UrlBar;Lorg/chromium/base/Callback;)V
-Lorg/chromium/chrome/browser/omnibox/UrlFocusChangeListener;
-Lorg/chromium/chrome/browser/omnibox/status/PageInfoIPHController;
-HSPLorg/chromium/chrome/browser/omnibox/status/PageInfoIPHController;-><init>(Landroid/app/Activity;Landroid/widget/ImageView;)V
-Lorg/chromium/chrome/browser/omnibox/status/StatusCoordinator;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusCoordinator;-><init>(ZLorg/chromium/chrome/browser/omnibox/status/StatusView;Lorg/chromium/chrome/browser/omnibox/LocationBarDataProvider;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/chrome/browser/omnibox/SearchEngineLogoUtils;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/omnibox/status/StatusCoordinator$PageInfoAction;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;)V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusCoordinator;->onSecurityStateChanged()V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusCoordinator;->updateSecurityIcon()V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusCoordinator;->updateVerboseStatusVisibility()V
-Lorg/chromium/chrome/browser/omnibox/status/StatusCoordinator$PageInfoAction;
-Lorg/chromium/chrome/browser/omnibox/status/StatusIconView;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusIconView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusIconView;->onFinishInflate()V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusIconView;->setVisibility(I)V
-Lorg/chromium/chrome/browser/omnibox/status/StatusMediator;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusMediator;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;Landroid/content/res/Resources;Landroid/content/Context;ZLorg/chromium/chrome/browser/omnibox/LocationBarDataProvider;Lorg/chromium/components/permissions/PermissionDialogController;Lorg/chromium/chrome/browser/omnibox/SearchEngineLogoUtils;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/omnibox/status/PageInfoIPHController;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/base/supplier/ObservableSupplierImpl;)V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusMediator;->isNTPOrStartSurfaceVisible()Z
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusMediator;->shouldDisplaySearchEngineIcon()Z
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusMediator;->updateColorTheme()V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusMediator;->updateLocationBarIcon(I)V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusMediator;->updateStatusVisibility()V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusMediator;->updateVerbaseStatusTextVisibility()V
-Lorg/chromium/chrome/browser/omnibox/status/StatusMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/omnibox/status/StatusMediator;I)V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusMediator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omnibox/status/StatusProperties;
-Lorg/chromium/chrome/browser/omnibox/status/StatusProperties$StatusIconResource;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusProperties$StatusIconResource;-><init>(II)V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusProperties$StatusIconResource;->equals(Ljava/lang/Object;)Z
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusProperties$StatusIconResource;->getDrawable(Landroid/content/Context;Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;
-Lorg/chromium/chrome/browser/omnibox/status/StatusView;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView;->allowBrowserControlsHide()V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView;->keepControlsShownForAnimation()V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView;->onFinishInflate()V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView;->setStatusIconResources(Landroid/graphics/drawable/Drawable;ILjava/lang/Runnable;)V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView;->updateTouchDelegate()V
-Lorg/chromium/chrome/browser/omnibox/status/StatusView$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/omnibox/status/StatusView;)V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView$$ExternalSyntheticLambda0;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-Lorg/chromium/chrome/browser/omnibox/status/StatusView$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/omnibox/status/StatusView;I)V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/omnibox/status/StatusView$1;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView$1;-><init>(Lorg/chromium/chrome/browser/omnibox/status/StatusView;)V
-Lorg/chromium/chrome/browser/omnibox/status/StatusView$2;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusView$2;-><init>(Lorg/chromium/chrome/browser/omnibox/status/StatusView;)V
-Lorg/chromium/chrome/browser/omnibox/status/StatusViewBinder;
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusViewBinder;-><init>()V
-HSPLorg/chromium/chrome/browser/omnibox/status/StatusViewBinder;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider;
-HSPLorg/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider;->getBrandedColorScheme(ILandroid/content/Context;Z)I
-HSPLorg/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider;->getUrlBarPrimaryTextColor(Landroid/content/Context;I)I
-HSPLorg/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider;->getUrlBarSecondaryTextColor(Landroid/content/Context;I)I
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteController;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteController;-><init>(Lorg/chromium/chrome/browser/profiles/Profile;)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteController;->destroy()V
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteController$OnSuggestionsReceivedListener;
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteControllerProvider;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteControllerProvider;-><init>()V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteControllerProvider;->from(Lorg/chromium/ui/base/WindowAndroid;)Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteControllerProvider;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteControllerProvider;->get(Lorg/chromium/chrome/browser/profiles/Profile;)Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteController;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteControllerProvider;->onDetachedFromHost()V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteControllerProvider;->onProfileAdded(Lorg/chromium/chrome/browser/profiles/Profile;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator;-><init>(Lorg/chromium/chrome/browser/omnibox/LocationBarLayout;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteControllerProvider;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate;Lorg/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl;Lorg/chromium/chrome/browser/omnibox/UrlBarCoordinator;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/omnibox/LocationBarDataProvider;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/Callback;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor$BookmarkState;Lorg/chromium/base/jank_tracker/JankTracker;Lorg/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl;Lorg/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownScrollListener;)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator;->prefetchZeroSuggestResults()V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator;->updateSuggestionListLayoutDirection()V
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator;I)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator$$ExternalSyntheticLambda1;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator$$ExternalSyntheticLambda2;-><init>(I)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator$1;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator$1;-><init>(Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator;Landroid/content/Context;Lorg/chromium/ui/modelutil/MVCListAdapter$ModelList;)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator$1;->whenLoaded(Lorg/chromium/base/Callback;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate;
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteControllerProvider;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate;Lorg/chromium/chrome/browser/omnibox/UrlBarCoordinator;Lorg/chromium/ui/modelutil/PropertyModel;Landroid/os/Handler;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/omnibox/LocationBarDataProvider;Lorg/chromium/base/Callback;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor$BookmarkState;Lorg/chromium/base/jank_tracker/JankTracker;Lorg/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl;)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;->cancelAutocompleteRequests()V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;->postAutocompleteRequest(Ljava/lang/Runnable;J)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;->runPendingAutocompleteRequests()V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;->stopAutocomplete(Z)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;I)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;II)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator$$ExternalSyntheticLambda2;->run()V
-Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator$2;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator$2;-><init>(Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;Ljava/lang/Runnable;)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator$2;->run()V
-Lorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemProcessor;->onNativeInitialized()V
-Lorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder;-><init>(Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor$BookmarkState;Lorg/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl;)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder;->registerSuggestionProcessor(Lorg/chromium/chrome/browser/omnibox/suggestions/SuggestionProcessor;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder;I)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager;-><init>(Landroid/content/Context;Lorg/chromium/ui/modelutil/MVCListAdapter$ModelList;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/FaviconFetcher;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/FaviconFetcher;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder$$ExternalSyntheticLambda0;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalDelegate;
-Lorg/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown$GestureObserver;
-Lorg/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder$OmniboxAlignment;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder$OmniboxAlignment;-><init>(IIIII)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownScrollListener;
-Lorg/chromium/chrome/browser/omnibox/suggestions/SuggestionHost;
-Lorg/chromium/chrome/browser/omnibox/suggestions/SuggestionListProperties;
-Lorg/chromium/chrome/browser/omnibox/suggestions/SuggestionProcessor;
-Lorg/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessor;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;Lorg/chromium/chrome/browser/omnibox/UrlBarEditingTextStateProvider;Lorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessor;->onNativeInitialized()V
-Lorg/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;Lorg/chromium/chrome/browser/omnibox/suggestions/FaviconFetcher;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;Lorg/chromium/chrome/browser/omnibox/UrlBarEditingTextStateProvider;Lorg/chromium/chrome/browser/omnibox/suggestions/FaviconFetcher;Lorg/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor$BookmarkState;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor$BookmarkState;
-Lorg/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessor;-><init>(Landroid/content/Context;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessor;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;Lorg/chromium/chrome/browser/omnibox/suggestions/FaviconFetcher;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionProcessor;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate;Lorg/chromium/chrome/browser/omnibox/suggestions/FaviconFetcher;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder$$ExternalSyntheticLambda0;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;Lorg/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder$$ExternalSyntheticLambda0;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor;->onNativeInitialized()V
-Lorg/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;Lorg/chromium/chrome/browser/omnibox/suggestions/FaviconFetcher;)V
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor;->onNativeInitialized()V
-Lorg/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionProcessor;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;Lorg/chromium/chrome/browser/omnibox/UrlBarEditingTextStateProvider;Lorg/chromium/chrome/browser/omnibox/suggestions/FaviconFetcher;Lorg/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor$BookmarkState;Lorg/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalDelegate;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate;)V
-Lorg/chromium/chrome/browser/omnibox/suggestions/tail/TailSuggestionProcessor;
-HSPLorg/chromium/chrome/browser/omnibox/suggestions/tail/TailSuggestionProcessor;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator;)V
-Lorg/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService;
-HSPLorg/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService;-><init>(Landroid/content/Context;Lorg/chromium/components/externalauth/ExternalAuthUtils;Lorg/chromium/components/search_engines/TemplateUrlService;Lorg/chromium/chrome/browser/gsa/GSAState;Lorg/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService$Observer;Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager;Lorg/chromium/components/signin/identitymanager/IdentityManager;Lorg/chromium/components/signin/AccountManagerFacade;)V
-HSPLorg/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService;->isColorfulMicEnabled()Z
-PLorg/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService;->isDeviceEligibleForAssistant(Ljava/util/ArrayList;Z)Z
-PLorg/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService;->reportUserEligibility(Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService$Observer;
-Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler;
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler;-><init>(Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$Delegate;Lorg/chromium/base/supplier/OneshotSupplierImpl;Ljava/lang/Runnable;Lorg/chromium/base/supplier/ObservableSupplier;)V
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler;->isVoiceSearchEnabled()Z
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler;->notifyVoiceAvailabilityImpacted()V
-Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler;)V
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler;)V
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$$ExternalSyntheticLambda2;->onApplicationStateChange(I)V
-Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$Delegate;
-Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$Observer;
-Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$TranslateBridgeWrapper;
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler$TranslateBridgeWrapper;-><init>()V
-Lorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionUtil;
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionUtil;->isRecognitionIntentPresent(Z)Z
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionUtil;->isVoiceSearchEnabled(Lorg/chromium/ui/permissions/AndroidPermissionDelegate;)Z
-HSPLorg/chromium/chrome/browser/omnibox/voice/VoiceRecognitionUtil;->isVoiceSearchPermittedByPolicy(Z)Z
-PLorg/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge;-><init>()V
-PLorg/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeFactory;-><init>(Ljava/util/List;)V
-PLorg/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeFactory;->create()Lorg/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge;
-PLorg/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeFactory$1;-><init>(Lorg/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeFactory;)V
-Lorg/chromium/chrome/browser/optimization_guide/OptimizationGuidePushNotificationManager;
-Lorg/chromium/chrome/browser/page_annotations/PageAnnotationsServiceConfig;
-PLorg/chromium/chrome/browser/page_annotations/PageAnnotationsServiceFactory;-><init>()V
-PLorg/chromium/chrome/browser/page_annotations/PageAnnotationsServiceFactory$1;-><init>()V
-Lorg/chromium/chrome/browser/page_info/ChromePageInfo;
-HSPLorg/chromium/chrome/browser/page_info/ChromePageInfo;-><init>(Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda12;Lorg/chromium/base/supplier/Supplier;)V
-Lorg/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelper;
-HSPLorg/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelper;-><init>(Lorg/chromium/ui/base/ActivityWindowAndroid;JLorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;ZLorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;)V
-Lorg/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelper$1;
-HSPLorg/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelper$1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;Lorg/chromium/ui/base/ActivityWindowAndroid;)V
-HSPLorg/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelper$1;->onTabStateInitialized()V
-Lorg/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperSupplier;
-HSPLorg/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperSupplier;-><init>()V
-Lorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview;
-HSPLorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview;->destroy()V
-HSPLorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview;->get(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview;
-HSPLorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview;->isShowing()Z
-Lorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview$1;
-HSPLorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview$1;-><init>(Lorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview;)V
-Lorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview$TabbedPaintPreviewViewProvider;
-HSPLorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview$TabbedPaintPreviewViewProvider;-><init>(Lorg/chromium/chrome/browser/paint_preview/TabbedPaintPreview;)V
-Lorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService;
-HSPLorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService;-><init>(JJ)V
-Lorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService;[I)V
-Lorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService;)V
-Lorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService$CaptureTriggerListener;
-HSPLorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService$CaptureTriggerListener;-><init>(Lorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService$CaptureTriggerListener;->onApplicationStateChange(I)V
-HSPLorg/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService$CaptureTriggerListener;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmark;
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmark;-><init>()V
-Lorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksFaviconThrottle;
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksFaviconThrottle;-><init>()V
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksFaviconThrottle;->commit()V
-Lorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator;
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator;-><init>(Landroid/database/Cursor;)V
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator;->hasNext()Z
-Lorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader;
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;)V
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader;->shutDown()V
-Lorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader;Lorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;)V
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader$ReadBookmarksTask;
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader$ReadBookmarksTask;-><init>(Lorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader;)V
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader$ReadBookmarksTask;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader$ReadBookmarksTask;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksShim;
-Lorg/chromium/chrome/browser/partnercustomizations/CustomizationProviderDelegateImpl;
-HSPLorg/chromium/chrome/browser/partnercustomizations/CustomizationProviderDelegateImpl;-><init>()V
-HSPLorg/chromium/chrome/browser/partnercustomizations/CustomizationProviderDelegateImpl;->isValid()Z
-Lorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;-><init>()V
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;->getHomePageUrl()Lorg/chromium/url/GURL;
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;->getInstance()Lorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;->initializeAsync(Landroid/content/Context;)V
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;->isHomepageProviderAvailableAndEnabled()Z
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;->isIncognitoDisabled()Z
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;->refreshBookmarksEditingDisabled(Lorg/chromium/chrome/browser/partnercustomizations/CustomizationProviderDelegateImpl;)V
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;->refreshHomepage(Lorg/chromium/chrome/browser/partnercustomizations/CustomizationProviderDelegateImpl;)Z
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;->refreshIncognitoModeDisabled(Lorg/chromium/chrome/browser/partnercustomizations/CustomizationProviderDelegateImpl;)V
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;->setOnInitializeAsyncFinished(Ljava/lang/Runnable;)V
-Lorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations$1;)V
-PLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations$1;
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations$1;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations;)V
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations$1;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations$1;->onFinalized()V
-HSPLorg/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations$1;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/password_check/PasswordCheckUkmRecorder;
-HSPLorg/chromium/chrome/browser/password_check/PasswordCheckUkmRecorder;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/password_check/PasswordCheckUkmRecorder;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/password_check/PasswordCheckUkmRecorder;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/password_manager/ConfirmationDialogHelper;
-HSPLorg/chromium/chrome/browser/password_manager/ConfirmationDialogHelper;-><init>(Ljava/lang/ref/WeakReference;)V
-Lorg/chromium/chrome/browser/password_manager/PasswordManagerLifecycleHelper;
-HSPLorg/chromium/chrome/browser/password_manager/PasswordManagerLifecycleHelper;-><init>()V
-HSPLorg/chromium/chrome/browser/password_manager/PasswordManagerLifecycleHelper;->getInstance()Lorg/chromium/chrome/browser/password_manager/PasswordManagerLifecycleHelper;
-Lorg/chromium/chrome/browser/password_manager/PasswordSettingsAccessorFactoryImpl;
-HSPLorg/chromium/chrome/browser/password_manager/PasswordSettingsAccessorFactoryImpl;-><init>()V
-Lorg/chromium/chrome/browser/password_manager/PasswordSettingsUpdaterDispatcherBridge;
-HSPLorg/chromium/chrome/browser/password_manager/PasswordSettingsUpdaterDispatcherBridge;->canCreateAccessor()Z
-Lorg/chromium/chrome/browser/password_manager/PasswordStoreAndroidBackendDispatcherBridgeImpl;
-HSPLorg/chromium/chrome/browser/password_manager/PasswordStoreAndroidBackendDispatcherBridgeImpl;->canCreateBackend()Z
-Lorg/chromium/chrome/browser/password_manager/PasswordStoreAndroidBackendFactoryImpl;
-HSPLorg/chromium/chrome/browser/password_manager/PasswordStoreAndroidBackendFactoryImpl;-><init>()V
-Lorg/chromium/chrome/browser/policy/CloudManagementSharedPreferences;
-HSPLorg/chromium/chrome/browser/policy/CloudManagementSharedPreferences;->readDmToken()Ljava/lang/String;
-Lorg/chromium/chrome/browser/policy/PolicyAuditorBridge;
-HSPLorg/chromium/chrome/browser/policy/PolicyAuditorBridge;->getPolicyAuditor()Lorg/chromium/chrome/browser/policy/PolicyAuditor;
-Lorg/chromium/chrome/browser/preferences/BaseChromePreferenceKeyChecker;
-HSPLorg/chromium/chrome/browser/preferences/BaseChromePreferenceKeyChecker;-><init>()V
-HSPLorg/chromium/chrome/browser/preferences/BaseChromePreferenceKeyChecker;->checkIsKeyInUse(Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/preferences/ChromePreferenceKeys;
-Lorg/chromium/chrome/browser/preferences/KeyPrefix;
-HSPLorg/chromium/chrome/browser/preferences/KeyPrefix;-><init>(Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/preferences/KeyPrefix;->createKey(Ljava/lang/String;)Ljava/lang/String;
-Lorg/chromium/chrome/browser/preferences/PrefChangeRegistrar;
-HSPLorg/chromium/chrome/browser/preferences/PrefChangeRegistrar;-><init>()V
-HSPLorg/chromium/chrome/browser/preferences/PrefChangeRegistrar;->addObserver(Ljava/lang/String;Lorg/chromium/chrome/browser/preferences/PrefChangeRegistrar$PrefObserver;)V
-Lorg/chromium/chrome/browser/preferences/PrefChangeRegistrar$PrefObserver;
-Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager;
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;-><init>()V
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->addObserver(Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager$Observer;)V
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->contains(Ljava/lang/String;)Z
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->getInstance()Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager;
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->incrementInt(Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->readBoolean(Ljava/lang/String;Z)Z
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->readInt(ILjava/lang/String;)I
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->readLong(JLjava/lang/String;)J
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->readString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-PLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->readStringSet(Ljava/lang/String;)Ljava/util/Set;
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->readStringSet(Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set;
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->removeKey(Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->removeObserver(Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager$Observer;)V
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->writeBoolean(Ljava/lang/String;Z)V
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->writeInt(ILjava/lang/String;)V
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->writeLong(JLjava/lang/String;)V
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager;->writeString(Ljava/lang/String;Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager$Observer;)V
-HSPLorg/chromium/chrome/browser/preferences/SharedPreferencesManager$$ExternalSyntheticLambda0;->onSharedPreferenceChanged(Landroid/content/SharedPreferences;Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager$LazyHolder;
-Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager$Observer;
-Lorg/chromium/chrome/browser/price_tracking/PriceTrackingButtonController;
-HSPLorg/chromium/chrome/browser/price_tracking/PriceTrackingButtonController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/ui/modaldialog/ModalDialogManager;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;Landroid/graphics/drawable/Drawable;Lorg/chromium/base/supplier/ObservableSupplier;)V
-Lorg/chromium/chrome/browser/price_tracking/PriceTrackingButtonController$1;
-HSPLorg/chromium/chrome/browser/price_tracking/PriceTrackingButtonController$1;-><init>(Lorg/chromium/chrome/browser/price_tracking/PriceTrackingButtonController;)V
-Lorg/chromium/chrome/browser/price_tracking/PriceTrackingFeatures;
-HSPLorg/chromium/chrome/browser/price_tracking/PriceTrackingFeatures;->getPriceTrackingNotificationsEnabled()Z
-HSPLorg/chromium/chrome/browser/price_tracking/PriceTrackingFeatures;->isPriceTrackingEligible()Z
-HSPLorg/chromium/chrome/browser/price_tracking/PriceTrackingFeatures;->isPriceTrackingEnabled()Z
-Lorg/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl;
-HSPLorg/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl;->getInstance()Lorg/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl;
-HSPLorg/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl;->isUploadEnabledForTests()Z
-HSPLorg/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl;->isUsageAndCrashReportingPermittedByUser()Z
-HSPLorg/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl;->syncUsageAndCrashReportingPermittedByPolicy()V
-Lorg/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl$1;
-HSPLorg/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl$1;-><init>(Lorg/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl;)V
-Lorg/chromium/chrome/browser/profiles/Profile;
-HSPLorg/chromium/chrome/browser/profiles/Profile;-><init>(J)V
-HSPLorg/chromium/chrome/browser/profiles/Profile;->create(J)Lorg/chromium/chrome/browser/profiles/Profile;
-HSPLorg/chromium/chrome/browser/profiles/Profile;->fromWebContents(Lorg/chromium/content_public/browser/WebContents;)Lorg/chromium/chrome/browser/profiles/Profile;
-HSPLorg/chromium/chrome/browser/profiles/Profile;->getLastUsedRegularProfile()Lorg/chromium/chrome/browser/profiles/Profile;
-HSPLorg/chromium/chrome/browser/profiles/Profile;->getNativeBrowserContextPointer()J
-HSPLorg/chromium/chrome/browser/profiles/Profile;->getNativePointer()J
-HSPLorg/chromium/chrome/browser/profiles/Profile;->getProfileKey()Lorg/chromium/chrome/browser/profiles/ProfileKey;
-HSPLorg/chromium/chrome/browser/profiles/Profile;->isOffTheRecord()Z
-Lorg/chromium/chrome/browser/profiles/ProfileKey;
-HSPLorg/chromium/chrome/browser/profiles/ProfileKey;-><init>(J)V
-HSPLorg/chromium/chrome/browser/profiles/ProfileKey;->create(J)Lorg/chromium/chrome/browser/profiles/ProfileKey;
-HSPLorg/chromium/chrome/browser/profiles/ProfileKey;->getLastUsedRegularProfileKey()Lorg/chromium/chrome/browser/profiles/ProfileKey;
-HSPLorg/chromium/chrome/browser/profiles/ProfileKey;->getNativePointer()J
-Lorg/chromium/chrome/browser/profiles/ProfileManager;
-HSPLorg/chromium/chrome/browser/profiles/ProfileManager;->addObserver(Lorg/chromium/chrome/browser/profiles/ProfileManager$Observer;)V
-HSPLorg/chromium/chrome/browser/profiles/ProfileManager;->onProfileAdded(Lorg/chromium/chrome/browser/profiles/Profile;)V
-HSPLorg/chromium/chrome/browser/profiles/ProfileManager;->removeObserver(Lorg/chromium/chrome/browser/profiles/ProfileManager$Observer;)V
-Lorg/chromium/chrome/browser/profiles/ProfileManager$Observer;
-Lorg/chromium/chrome/browser/profiles/ProfileResolver;
-HSPLorg/chromium/chrome/browser/profiles/ProfileResolver;-><init>()V
-Lorg/chromium/chrome/browser/provider/ChromeBrowserProvider;
-HSPLorg/chromium/chrome/browser/provider/ChromeBrowserProvider;-><init>()V
-PLorg/chromium/chrome/browser/query_tiles/QueryTileUtils;->isQueryTilesEnabledOnNTP()Z
-Lorg/chromium/chrome/browser/query_tiles/QueryTileUtils$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/query_tiles/QueryTileUtils$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/browser/query_tiles/QueryTileUtils$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider;
-HSPLorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider;-><init>()V
-HSPLorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider;->updateWidgets(Landroid/content/Context;Landroid/appwidget/AppWidgetManager;Lorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager$SearchActivityPreferences;[I)V
-Lorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$$ExternalSyntheticLambda2;-><init>()V
-HSPLorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$$ExternalSyntheticLambda2;->run()V
-Lorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$$ExternalSyntheticLambda3;-><init>(Lorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$QuickActionSearchWidgetProviderDino;Lorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$QuickActionSearchWidgetProviderSearch;)V
-HSPLorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$$ExternalSyntheticLambda3;->accept(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$QuickActionSearchWidgetProviderDino;
-HSPLorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$QuickActionSearchWidgetProviderDino;-><init>()V
-Lorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$QuickActionSearchWidgetProviderSearch;
-HSPLorg/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProvider$QuickActionSearchWidgetProviderSearch;-><init>()V
-Lorg/chromium/chrome/browser/read_later/ReadLaterIPHController;
-HSPLorg/chromium/chrome/browser/read_later/ReadLaterIPHController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Landroid/widget/ImageButton;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;)V
-Lorg/chromium/chrome/browser/read_later/ReadLaterIPHController$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/read_later/ReadLaterIPHController$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/read_later/ReadLaterIPHController;I)V
-Lorg/chromium/chrome/browser/rlz/RevenueStats;
-HSPLorg/chromium/chrome/browser/rlz/RevenueStats;-><init>()V
-Lorg/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory;
-HSPLorg/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory;->get()Lorg/chromium/components/search_engines/TemplateUrlService;
-HSPLorg/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory;->getForProfile(Lorg/chromium/chrome/browser/profiles/Profile;)Lorg/chromium/components/search_engines/TemplateUrlService;
-Lorg/chromium/chrome/browser/searchwidget/SearchActivity;
-Lorg/chromium/chrome/browser/searchwidget/SearchActivity$2$1;
-Lorg/chromium/chrome/browser/searchwidget/SearchWidgetProvider;
-HSPLorg/chromium/chrome/browser/searchwidget/SearchWidgetProvider;->getDelegate()Lorg/chromium/chrome/browser/searchwidget/SearchWidgetProvider$SearchWidgetProviderDelegate;
-HSPLorg/chromium/chrome/browser/searchwidget/SearchWidgetProvider;->performUpdate([ILorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager$SearchActivityPreferences;)V
-Lorg/chromium/chrome/browser/searchwidget/SearchWidgetProvider$SearchWidgetProviderDelegate;
-HSPLorg/chromium/chrome/browser/searchwidget/SearchWidgetProvider$SearchWidgetProviderDelegate;-><init>()V
-HSPLorg/chromium/chrome/browser/searchwidget/SearchWidgetProvider$SearchWidgetProviderDelegate;->accept(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController;
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController;-><init>(Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/base/supplier/ObservableSupplier;)V
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController;->getValidActiveTab()Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController;->maybeShowContextualPageAction()V
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController;->showDynamicAction(I)V
-Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/base/supplier/ObservableSupplier;)V
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController;)V
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController;Lorg/chromium/chrome/browser/segmentation_platform/SignalAccumulator;)V
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda2;->run()V
-Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda3;-><init>(Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController;Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$$ExternalSyntheticLambda3;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$1;
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$1;-><init>(Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController;)V
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$1;->didFirstVisuallyNonEmptyPaint(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-Lorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$ActionProvider;
-HSPLorg/chromium/chrome/browser/segmentation_platform/ContextualPageActionController$ActionProvider;->onActionShown(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/segmentation_platform/PriceTrackingActionProvider;
-HSPLorg/chromium/chrome/browser/segmentation_platform/PriceTrackingActionProvider;-><init>(Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/segmentation_platform/PriceTrackingActionProvider;->getAction(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/chrome/browser/segmentation_platform/SignalAccumulator;)V
-Lorg/chromium/chrome/browser/segmentation_platform/PriceTrackingActionProvider$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/segmentation_platform/PriceTrackingActionProvider$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/segmentation_platform/PriceTrackingActionProvider;Lorg/chromium/chrome/browser/segmentation_platform/SignalAccumulator;Lorg/chromium/chrome/browser/bookmarks/BookmarkModel;Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/segmentation_platform/PriceTrackingActionProvider$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/segmentation_platform/SignalAccumulator;
-HSPLorg/chromium/chrome/browser/segmentation_platform/SignalAccumulator;-><init>(Landroid/os/Handler;Lorg/chromium/chrome/browser/tab/Tab;Ljava/util/ArrayList;)V
-HSPLorg/chromium/chrome/browser/segmentation_platform/SignalAccumulator;->proceedToNextStepIfReady()V
-Lorg/chromium/chrome/browser/segmentation_platform/SignalAccumulator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/segmentation_platform/SignalAccumulator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/segmentation_platform/SignalAccumulator;)V
-HSPLorg/chromium/chrome/browser/segmentation_platform/SignalAccumulator$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/settings/SettingsLauncherImpl;
-HSPLorg/chromium/chrome/browser/settings/SettingsLauncherImpl;-><init>()V
-Lorg/chromium/chrome/browser/share/ShareButtonController;
-HSPLorg/chromium/chrome/browser/share/ShareButtonController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Landroid/graphics/drawable/Drawable;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/chrome/browser/share/ShareUtils;Lorg/chromium/ui/modaldialog/ModalDialogManager;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda2;)V
-Lorg/chromium/chrome/browser/share/ShareDelegateImpl;
-HSPLorg/chromium/chrome/browser/share/ShareDelegateImpl;-><init>(Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/share/ShareDelegateImpl$ShareSheetDelegate;Z)V
-Lorg/chromium/chrome/browser/share/ShareDelegateImpl$ShareSheetDelegate;
-HSPLorg/chromium/chrome/browser/share/ShareDelegateImpl$ShareSheetDelegate;-><init>()V
-Lorg/chromium/chrome/browser/share/ShareDelegateSupplier;
-HSPLorg/chromium/chrome/browser/share/ShareDelegateSupplier;-><init>()V
-Lorg/chromium/chrome/browser/share/ShareUtils;
-HSPLorg/chromium/chrome/browser/share/ShareUtils;-><init>()V
-Lorg/chromium/chrome/browser/share/crow/CrowButtonDelegate;
-Lorg/chromium/chrome/browser/share/crow/CrowButtonDelegateImpl;
-HSPLorg/chromium/chrome/browser/share/crow/CrowButtonDelegateImpl;-><init>()V
-HSPLorg/chromium/chrome/browser/share/crow/CrowButtonDelegateImpl;->isEnabledForSite(Lorg/chromium/url/GURL;Lorg/chromium/base/Callback;)V
-Lorg/chromium/chrome/browser/share/crow/CrowIphController;
-HSPLorg/chromium/chrome/browser/share/crow/CrowIphController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;Lorg/chromium/chrome/browser/share/crow/CrowButtonDelegateImpl;Lorg/chromium/chrome/browser/ActivityTabProvider;Landroid/widget/ImageButton;)V
-Lorg/chromium/chrome/browser/share/crow/CrowIphController$1;
-HSPLorg/chromium/chrome/browser/share/crow/CrowIphController$1;-><init>(Lorg/chromium/chrome/browser/share/crow/CrowIphController;)V
-HSPLorg/chromium/chrome/browser/share/crow/CrowIphController$1;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/share/crow/CrowIphController$1$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/share/crow/CrowIphController$1$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/share/crow/CrowIphController$1;Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/share/crow/CrowIphController$1$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/share/link_to_text/LinkToTextIPHController;
-HSPLorg/chromium/chrome/browser/share/link_to_text/LinkToTextIPHController;-><init>(Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/base/supplier/ObservableSupplier;)V
-Lorg/chromium/chrome/browser/share/link_to_text/LinkToTextIPHController$1;
-HSPLorg/chromium/chrome/browser/share/link_to_text/LinkToTextIPHController$1;-><init>(Lorg/chromium/chrome/browser/share/link_to_text/LinkToTextIPHController;Lorg/chromium/base/supplier/ObservableSupplier;)V
-HSPLorg/chromium/chrome/browser/share/link_to_text/LinkToTextIPHController$1;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/sharing/SharingServiceProxy;
-HSPLorg/chromium/chrome/browser/sharing/SharingServiceProxy;->onProxyCreated(J)V
-PLorg/chromium/chrome/browser/signin/SigninCheckerProvider;->get()Lorg/chromium/chrome/browser/signin/services/SigninChecker;
-Lorg/chromium/chrome/browser/signin/SigninManagerImpl;
-HSPLorg/chromium/chrome/browser/signin/SigninManagerImpl;-><init>(JLorg/chromium/components/signin/identitymanager/AccountTrackerService;Lorg/chromium/components/signin/identitymanager/IdentityManager;Lorg/chromium/components/signin/identitymanager/IdentityMutator;)V
-HSPLorg/chromium/chrome/browser/signin/SigninManagerImpl;->create(JLorg/chromium/components/signin/identitymanager/AccountTrackerService;Lorg/chromium/components/signin/identitymanager/IdentityManager;Lorg/chromium/components/signin/identitymanager/IdentityMutator;)Lorg/chromium/chrome/browser/signin/services/SigninManager;
-PLorg/chromium/chrome/browser/signin/SigninManagerImpl;->getIdentityManager()Lorg/chromium/components/signin/identitymanager/IdentityManager;
-PLorg/chromium/chrome/browser/signin/SigninManagerImpl;->isForceSigninEnabled()Z
-HSPLorg/chromium/chrome/browser/signin/SigninManagerImpl;->isSigninSupported()Z
-HSPLorg/chromium/chrome/browser/signin/SigninManagerImpl;->isSyncOptInAllowed()Z
-HSPLorg/chromium/chrome/browser/signin/SigninManagerImpl;->reloadAllAccountsFromSystem(Lorg/chromium/components/signin/base/CoreAccountId;)V
-PLorg/chromium/chrome/browser/signin/SigninManagerImpl;->runAfterOperationInProgress(Ljava/lang/Runnable;)V
-Lorg/chromium/chrome/browser/signin/services/FREMobileIdentityConsistencyFieldTrial;
-HSPLorg/chromium/chrome/browser/signin/services/FREMobileIdentityConsistencyFieldTrial;->generateFirstRunTrialGroup(II)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/signin/services/FREMobileIdentityConsistencyFieldTrial;->getFirstRunTrialGroup()Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/signin/services/FREMobileIdentityConsistencyFieldTrial;->getFirstRunTrialVariationId(II)I
-Lorg/chromium/chrome/browser/signin/services/IdentityServicesProvider;
-HSPLorg/chromium/chrome/browser/signin/services/IdentityServicesProvider;-><init>()V
-HSPLorg/chromium/chrome/browser/signin/services/IdentityServicesProvider;->get()Lorg/chromium/chrome/browser/signin/services/IdentityServicesProvider;
-HSPLorg/chromium/chrome/browser/signin/services/IdentityServicesProvider;->getIdentityManager(Lorg/chromium/chrome/browser/profiles/Profile;)Lorg/chromium/components/signin/identitymanager/IdentityManager;
-HSPLorg/chromium/chrome/browser/signin/services/IdentityServicesProvider;->getSigninManager(Lorg/chromium/chrome/browser/profiles/Profile;)Lorg/chromium/chrome/browser/signin/services/SigninManager;
-Lorg/chromium/chrome/browser/signin/services/ProfileDataCache$Observer;
-PLorg/chromium/chrome/browser/signin/services/SigninChecker;-><init>(Lorg/chromium/chrome/browser/signin/services/SigninManager;Lorg/chromium/components/signin/identitymanager/AccountTrackerService;)V
-PLorg/chromium/chrome/browser/signin/services/SigninChecker;->validatePrimaryAccountExists(Ljava/util/List;Z)V
-PLorg/chromium/chrome/browser/signin/services/SigninChecker$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/signin/services/SigninChecker;)V
-PLorg/chromium/chrome/browser/signin/services/SigninChecker$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-PLorg/chromium/chrome/browser/signin/services/SigninChecker$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/signin/services/SigninChecker;Ljava/lang/Object;I)V
-PLorg/chromium/chrome/browser/signin/services/SigninChecker$$ExternalSyntheticLambda2;->run()V
-PLorg/chromium/chrome/browser/signin/services/SigninChecker$$ExternalSyntheticLambda4;-><init>(Lorg/chromium/chrome/browser/signin/services/SigninChecker;)V
-PLorg/chromium/chrome/browser/signin/services/SigninChecker$$ExternalSyntheticLambda4;->onStatusReady(ZLandroid/accounts/Account;)V
-Lorg/chromium/chrome/browser/signin/services/SigninManager;
-Lorg/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator;
-HSPLorg/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/ui/resources/ResourceManager;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/tab/TabObscuringHandler;Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda4;)V
-Lorg/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator$StatusIndicatorObserver;
-Lorg/chromium/chrome/browser/status_indicator/StatusIndicatorMediator;
-HSPLorg/chromium/chrome/browser/status_indicator/StatusIndicatorMediator;-><init>(Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/tab/TabObscuringHandler;Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/base/supplier/Supplier;)V
-Lorg/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer;
-HSPLorg/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer;-><init>(Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;)V
-HSPLorg/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer;->initializeNative()V
-HSPLorg/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer;->isSceneOverlayTreeShowing()Z
-HSPLorg/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer;->onSizeChanged(FFFI)V
-HSPLorg/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer;->shouldHideAndroidBrowserControls()Z
-HSPLorg/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer;->updateOverlay(J)Z
-Lorg/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator;
-HSPLorg/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-HSPLorg/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator;->onWindowFocusChanged(Z)V
-Lorg/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator;)V
-HSPLorg/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator$1;
-HSPLorg/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator$1;-><init>(Lorg/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator;)V
-Lorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCarouselLayout;
-HSPLorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCarouselLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Lorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator;
-HSPLorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Landroid/view/View;Lorg/chromium/ui/base/WindowAndroid;ZZILorg/chromium/chrome/browser/ntp/NewTabPageLayout$$ExternalSyntheticLambda3;Lorg/chromium/chrome/browser/ntp/NewTabPageLayout$$ExternalSyntheticLambda3;)V
-HSPLorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator;->destroyMvtiles()V
-Lorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator$$ExternalSyntheticLambda1;-><init>()V
-Lorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator;
-HSPLorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator;-><init>(Landroid/content/res/Resources;Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig;Landroid/view/ViewGroup;Landroid/view/ViewStub;Lorg/chromium/chrome/browser/suggestions/tile/TileRenderer;Lorg/chromium/ui/modelutil/PropertyModel;ZZZLorg/chromium/chrome/browser/ntp/NewTabPageLayout$$ExternalSyntheticLambda3;Lorg/chromium/chrome/browser/ntp/NewTabPageLayout$$ExternalSyntheticLambda3;)V
-HSPLorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator;->maybeSetPortraitIntervalPaddingsForCarousel()V
-Lorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesProperties;
-Lorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesViewBinder$ViewHolder;
-HSPLorg/chromium/chrome/browser/suggestions/tile/MostVisitedTilesViewBinder$ViewHolder;-><init>(Landroid/view/View;Landroid/view/ViewGroup;)V
-Lorg/chromium/chrome/browser/suggestions/tile/TileRenderer;
-HSPLorg/chromium/chrome/browser/suggestions/tile/TileRenderer;-><init>(Landroid/content/Context;ILorg/chromium/chrome/browser/suggestions/ImageFetcher;)V
-PLorg/chromium/chrome/browser/sync/SyncErrorNotifier;-><init>()V
-Lorg/chromium/chrome/browser/sync/SyncService;
-HSPLorg/chromium/chrome/browser/sync/SyncService;-><init>()V
-HSPLorg/chromium/chrome/browser/sync/SyncService;->get()Lorg/chromium/chrome/browser/sync/SyncService;
-Lorg/chromium/chrome/browser/sync/SyncService$SyncStateChangedListener;
-Lorg/chromium/chrome/browser/sync/SyncServiceImpl;
-HSPLorg/chromium/chrome/browser/sync/SyncServiceImpl;-><init>()V
-PLorg/chromium/chrome/browser/sync/SyncServiceImpl;->addSyncStateChangedListener(Lorg/chromium/chrome/browser/sync/SyncService$SyncStateChangedListener;)V
-PLorg/chromium/chrome/browser/sync/SyncServiceImpl;->isEngineInitialized()Z
-HSPLorg/chromium/chrome/browser/sync/SyncServiceImpl;->isSyncRequested()Z
-Lorg/chromium/chrome/browser/sync/TrustedVaultClient;
-HSPLorg/chromium/chrome/browser/sync/TrustedVaultClient;-><init>(Lorg/chromium/chrome/browser/sync/TrustedVaultClient$EmptyBackend;)V
-HSPLorg/chromium/chrome/browser/sync/TrustedVaultClient;->get()Lorg/chromium/chrome/browser/sync/TrustedVaultClient;
-HSPLorg/chromium/chrome/browser/sync/TrustedVaultClient;->registerNative(J)V
-Lorg/chromium/chrome/browser/sync/TrustedVaultClient$EmptyBackend;
-HSPLorg/chromium/chrome/browser/sync/TrustedVaultClient$EmptyBackend;-><init>()V
-Lorg/chromium/chrome/browser/sync/settings/SyncSettingsUtils;
-HSPLorg/chromium/chrome/browser/sync/settings/SyncSettingsUtils;->getSyncError()I
-Lorg/chromium/chrome/browser/sync/ui/SyncErrorMessage;
-HSPLorg/chromium/chrome/browser/sync/ui/SyncErrorMessage;->getMessageType(I)I
-HSPLorg/chromium/chrome/browser/sync/ui/SyncErrorMessage;->maybeShowMessageUi(Lorg/chromium/ui/base/ActivityWindowAndroid;)V
-Lorg/chromium/chrome/browser/tab/AccessibilityVisibilityHandler;
-HSPLorg/chromium/chrome/browser/tab/AccessibilityVisibilityHandler;-><init>(Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/tab/TabObscuringHandler;)V
-HSPLorg/chromium/chrome/browser/tab/AccessibilityVisibilityHandler;->onDestroy()V
-Lorg/chromium/chrome/browser/tab/AccessibilityVisibilityHandler$1;
-HSPLorg/chromium/chrome/browser/tab/AccessibilityVisibilityHandler$1;-><init>(Lorg/chromium/chrome/browser/tab/AccessibilityVisibilityHandler;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/tab/TabObscuringHandler;)V
-HSPLorg/chromium/chrome/browser/tab/AccessibilityVisibilityHandler$1;->onObservingDifferentTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tab/AutofillSessionLifetimeController;
-HSPLorg/chromium/chrome/browser/tab/AutofillSessionLifetimeController;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-HSPLorg/chromium/chrome/browser/tab/AutofillSessionLifetimeController;->onDestroy()V
-Lorg/chromium/chrome/browser/tab/AutofillSessionLifetimeController$1;
-HSPLorg/chromium/chrome/browser/tab/AutofillSessionLifetimeController$1;-><init>(Lorg/chromium/chrome/browser/tab/AutofillSessionLifetimeController;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;)V
-HSPLorg/chromium/chrome/browser/tab/AutofillSessionLifetimeController$1;->onInteractabilityChanged(Lorg/chromium/chrome/browser/tab/Tab;Z)V
-Lorg/chromium/chrome/browser/tab/CurrentTabObserver;
-HSPLorg/chromium/chrome/browser/tab/CurrentTabObserver;-><init>(Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/tab/EmptyTabObserver;Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/tab/CurrentTabObserver;->destroy()V
-Lorg/chromium/chrome/browser/tab/CurrentTabObserver$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tab/CurrentTabObserver$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tab/CurrentTabObserver;Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/tab/CurrentTabObserver$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tab/EmptyTabObserver;
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;-><init>()V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->didFirstVisuallyNonEmptyPaint(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onBackgroundColorChanged(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onBrowserControlsOffsetChanged(Lorg/chromium/chrome/browser/tab/TabImpl;IIIII)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onContentChanged(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onDidStartNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onInitialized(Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onInteractabilityChanged(Lorg/chromium/chrome/browser/tab/Tab;Z)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onLoadProgressChanged(Lorg/chromium/chrome/browser/tab/Tab;F)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onLoadStarted(Lorg/chromium/chrome/browser/tab/TabImpl;Z)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onLoadStopped(Lorg/chromium/chrome/browser/tab/TabImpl;Z)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onLoadUrl(ILorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/content_public/browser/LoadUrlParams;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onPageLoadStarted(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onSSLStateUpdated(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onShown(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onTitleUpdated(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onUpdateUrl(Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/tab/EmptyTabObserver;->onUrlUpdated(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-Lorg/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl;
-HSPLorg/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl;->getOrCreateRedirectHandler()Lorg/chromium/components/external_intents/RedirectHandler;
-Lorg/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl$1;
-HSPLorg/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl$1;-><init>(Lorg/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl;)V
-HSPLorg/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl$1;->onContentChanged(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl$1;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-Lorg/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper;
-HSPLorg/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper;->destroy()V
-Lorg/chromium/chrome/browser/tab/RedirectHandlerTabHelper;
-HSPLorg/chromium/chrome/browser/tab/RedirectHandlerTabHelper;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/RedirectHandlerTabHelper;->destroy()V
-HSPLorg/chromium/chrome/browser/tab/RedirectHandlerTabHelper;->getOrCreateHandlerFor(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/components/external_intents/RedirectHandler;
-HSPLorg/chromium/chrome/browser/tab/RedirectHandlerTabHelper;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/tab/RedirectHandlerTabHelper;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/tab/RedirectHandlerTabHelper;->updateIntentInTab(Lorg/chromium/chrome/browser/tab/Tab;Landroid/content/Intent;)V
-Lorg/chromium/chrome/browser/tab/RequestDesktopUtils;
-HSPLorg/chromium/chrome/browser/tab/RequestDesktopUtils;->maybeShowDefaultEnableGlobalSettingMessage(Lorg/chromium/chrome/browser/profiles/Profile;Lorg/chromium/components/messages/ManagedMessageDispatcher;Landroidx/appcompat/app/AppCompatActivity;)Z
-Lorg/chromium/chrome/browser/tab/SadTab;
-HSPLorg/chromium/chrome/browser/tab/SadTab;->isShowing(Lorg/chromium/chrome/browser/tab/Tab;)Z
-Lorg/chromium/chrome/browser/tab/Tab;
-Lorg/chromium/chrome/browser/tab/TabAssociatedApp;
-HSPLorg/chromium/chrome/browser/tab/TabAssociatedApp;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabAssociatedApp;->cleanupWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TabAssociatedApp;->from(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/tab/TabAssociatedApp;
-HSPLorg/chromium/chrome/browser/tab/TabAssociatedApp;->initWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/chrome/browser/tab/TabAssociatedApp$1;
-HSPLorg/chromium/chrome/browser/tab/TabAssociatedApp$1;-><init>(Lorg/chromium/chrome/browser/tab/TabAssociatedApp;)V
-HSPLorg/chromium/chrome/browser/tab/TabAssociatedApp$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabAssociatedApp$1;->onInitialized(Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/tab/TabAssociatedApp$1;->onLoadUrl(ILorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/content_public/browser/LoadUrlParams;)V
-Lorg/chromium/chrome/browser/tab/TabAttributes;
-HSPLorg/chromium/chrome/browser/tab/TabAttributes;-><init>()V
-HSPLorg/chromium/chrome/browser/tab/TabAttributes;->from(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/tab/TabAttributes;
-HSPLorg/chromium/chrome/browser/tab/TabAttributes;->get(Ljava/lang/String;)Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/tab/TabAttributes;->set(Ljava/lang/Object;Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;->destroy()V
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;->get(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;->getConstraints()I
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;->update(IZ)V
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;->updateEnabledState()V
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;->updateVisibilityDelegate()V
-Lorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;)V
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper$1;
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper$1;-><init>(Lorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper;)V
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper$1;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper$1;->onInitialized(Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper;
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper;->destroy()V
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper;->get(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper;
-HSPLorg/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper;->notifyControlsOffsetChanged()V
-Lorg/chromium/chrome/browser/tab/TabBuilder;
-HSPLorg/chromium/chrome/browser/tab/TabBuilder;-><init>()V
-HSPLorg/chromium/chrome/browser/tab/TabBuilder;->build()Lorg/chromium/chrome/browser/tab/TabImpl;
-HSPLorg/chromium/chrome/browser/tab/TabBuilder;->setLaunchType(I)V
-Lorg/chromium/chrome/browser/tab/TabContextMenuItemDelegate;
-HSPLorg/chromium/chrome/browser/tab/TabContextMenuItemDelegate;-><init>(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/base/supplier/Supplier;Ljava/lang/Runnable;Lorg/chromium/base/supplier/Supplier;)V
-Lorg/chromium/chrome/browser/tab/TabContextMenuPopulatorFactory;
-HSPLorg/chromium/chrome/browser/tab/TabContextMenuPopulatorFactory;-><init>(Lorg/chromium/chrome/browser/contextmenu/ContextMenuPopulatorFactory;Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabContextMenuPopulatorFactory;->onDestroy()V
-Lorg/chromium/chrome/browser/tab/TabDelegateFactory;
-Lorg/chromium/chrome/browser/tab/TabFavicon;
-HSPLorg/chromium/chrome/browser/tab/TabFavicon;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabFavicon;->cleanupWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TabFavicon;->destroyInternal()V
-HSPLorg/chromium/chrome/browser/tab/TabFavicon;->initWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/chrome/browser/tab/TabGestureStateListener;
-HSPLorg/chromium/chrome/browser/tab/TabGestureStateListener;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabGestureStateListener;->cleanupWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TabGestureStateListener;->initWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/chrome/browser/tab/TabGestureStateListener$1;
-HSPLorg/chromium/chrome/browser/tab/TabGestureStateListener$1;-><init>(Lorg/chromium/chrome/browser/tab/TabGestureStateListener;Lorg/chromium/content/browser/GestureListenerManagerImpl;)V
-Lorg/chromium/chrome/browser/tab/TabHelpers;
-HSPLorg/chromium/chrome/browser/tab/TabHelpers;->initTabHelpers(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabHelpers;->initWebContentsHelpers(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tab/TabIdManager;
-HSPLorg/chromium/chrome/browser/tab/TabIdManager;-><init>()V
-HSPLorg/chromium/chrome/browser/tab/TabIdManager;->getInstance()Lorg/chromium/chrome/browser/tab/TabIdManager;
-Lorg/chromium/chrome/browser/tab/TabImpl;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;-><init>(IZLjava/lang/Integer;Lorg/chromium/chrome/browser/tab/state/SerializedCriticalPersistedTabData;)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->addObserver(Lorg/chromium/chrome/browser/tab/EmptyTabObserver;)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->calculateUserAgentOverrideOption(Lorg/chromium/url/GURL;)I
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->canGoBack()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->canGoForward()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->clearNativePtr()V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->destroy()V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->destroyWebContents(Z)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->didFinishPageLoad(Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->didStartPageLoad(Lorg/chromium/url/GURL;)V
-PLorg/chromium/chrome/browser/tab/TabImpl;->freezeNativePage()V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getActivity()Lorg/chromium/chrome/browser/app/ChromeActivity;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getContentView$1()Lorg/chromium/components/embedder_support/view/ContentView;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getContext()Landroid/content/Context;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getId()I
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getLaunchType()I
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getNativePage()Lorg/chromium/chrome/browser/ui/native_page/NativePage;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getNativePtr()J
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getPendingLoadParams()Lorg/chromium/content_public/browser/LoadUrlParams;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getProgress()F
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getTabObservers()Lorg/chromium/base/ObserverList$ObserverListIterator;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getTabViewManager()Lorg/chromium/chrome/browser/tab/TabViewManagerImpl;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getThemeColor()I
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getUrl()Lorg/chromium/url/GURL;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getUserDataHost()Lorg/chromium/base/UserDataHost;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getView()Landroid/view/View;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getWebContents()Lorg/chromium/content_public/browser/WebContents;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->getWindowAndroid()Lorg/chromium/ui/base/WindowAndroid;
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->hide(I)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->hideNativePage(Ljava/lang/Runnable;Z)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->initWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isBeingRestored()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isClosing()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isCustomTab()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isDestroyed()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isDetached(Lorg/chromium/chrome/browser/tab/Tab;)Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isFrozen()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isHidden()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isIncognito()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isInitialized()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isLoading()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isNativePage()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isShowingCustomView()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isShowingErrorPage()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isThemingAllowed()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->isUserInteractable()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->loadIfNeeded(I)Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->loadUrl(Lorg/chromium/content_public/browser/LoadUrlParams;)I
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->maybeShowNativePage(Ljava/lang/String;Z)Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->needsReload()Z
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->notifyContentChanged()V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->removeObserver(Lorg/chromium/chrome/browser/tab/EmptyTabObserver;)V
-PLorg/chromium/chrome/browser/tab/TabImpl;->restoreFieldsFromState(Lorg/chromium/chrome/browser/tab/TabState;)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->setIsTabSaveEnabled(Z)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->setNativePtr(J)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->show(II)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->switchUserAgentIfNeeded(I)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->updateInteractableState()V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->updateThemeColor(I)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl;->updateTitle()V
-Lorg/chromium/chrome/browser/tab/TabImpl$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/tab/TabImpl$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl$$ExternalSyntheticLambda2;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tab/TabImpl$1;
-HSPLorg/chromium/chrome/browser/tab/TabImpl$1;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl$1;->onViewAttachedToWindow(Landroid/view/View;)V
-HSPLorg/chromium/chrome/browser/tab/TabImpl$1;->onViewDetachedFromWindow(Landroid/view/View;)V
-Lorg/chromium/chrome/browser/tab/TabImportanceManager;
-HSPLorg/chromium/chrome/browser/tab/TabImportanceManager;->tabShown(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tab/TabObscuringHandler;
-HSPLorg/chromium/chrome/browser/tab/TabObscuringHandler;-><init>()V
-HSPLorg/chromium/chrome/browser/tab/TabObscuringHandler;->addObserver(Lorg/chromium/chrome/browser/tab/TabObscuringHandler$Observer;)V
-HSPLorg/chromium/chrome/browser/tab/TabObscuringHandler;->removeObserver(Lorg/chromium/chrome/browser/tab/TabObscuringHandler$Observer;)V
-Lorg/chromium/chrome/browser/tab/TabObscuringHandler$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tab/TabObscuringHandler$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tab/TabObscuringHandler;I)V
-Lorg/chromium/chrome/browser/tab/TabObscuringHandler$Observer;
-Lorg/chromium/chrome/browser/tab/TabObscuringHandlerSupplier;
-HSPLorg/chromium/chrome/browser/tab/TabObscuringHandlerSupplier;-><init>()V
-Lorg/chromium/chrome/browser/tab/TabState;
-HSPLorg/chromium/chrome/browser/tab/TabState;-><init>()V
-Lorg/chromium/chrome/browser/tab/TabStateAttributes;
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;Ljava/lang/Integer;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes;->cleanupWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes;->destroyInternal()V
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes;->from(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/tab/TabStateAttributes;
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes;->initWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes;->updateIsDirty(I)V
-Lorg/chromium/chrome/browser/tab/TabStateAttributes$1;
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes$1;-><init>(Lorg/chromium/chrome/browser/tab/TabStateAttributes;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes$1;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes$1;->onLoadStopped(Lorg/chromium/chrome/browser/tab/TabImpl;Z)V
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes$1;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes$1;->onTitleUpdated(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tab/TabStateAttributes$2;
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes$2;-><init>(Lorg/chromium/chrome/browser/tab/TabStateAttributes;)V
-Lorg/chromium/chrome/browser/tab/TabStateAttributes$3;
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes$3;-><init>(Lorg/chromium/chrome/browser/tab/TabStateAttributes;Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes$3;->didFinishNavigationInPrimaryMainFrame(Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateAttributes$3;->navigationEntriesChanged()V
-Lorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate;
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate;->calculateVisibilityConstraints()I
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate;->updateVisibilityConstraints()V
-Lorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1;
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1;-><init>(Lorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1;->onPageLoadStarted(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1;->onSSLStateUpdated(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1;->onShown(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1$1;
-HSPLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1$1;-><init>(Lorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1;)V
-PLorg/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate$1$1;->handleMessage(Landroid/os/Message;)V
-Lorg/chromium/chrome/browser/tab/TabStateExtractor;
-HSPLorg/chromium/chrome/browser/tab/TabStateExtractor;->from(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/tab/TabState;
-Lorg/chromium/chrome/browser/tab/TabThemeColorHelper;
-HSPLorg/chromium/chrome/browser/tab/TabThemeColorHelper;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabThemeColorHelper;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabThemeColorHelper;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/tab/TabThemeColorHelper;->onSSLStateUpdated(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/TabThemeColorHelper;->onUrlUpdated(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/TabThemeColorHelper;->updateIfNeeded(Lorg/chromium/chrome/browser/tab/TabImpl;Z)V
-Lorg/chromium/chrome/browser/tab/TabUma;
-HSPLorg/chromium/chrome/browser/tab/TabUma;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;I)V
-HSPLorg/chromium/chrome/browser/tab/TabUma;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabUma;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/tab/TabUma;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/tab/TabUma;->onShown(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/tab/TabUma;->updateTabState(I)V
-Lorg/chromium/chrome/browser/tab/TabUtils;
-HSPLorg/chromium/chrome/browser/tab/TabUtils;->getActivity(Lorg/chromium/chrome/browser/tab/Tab;)Landroid/app/Activity;
-HSPLorg/chromium/chrome/browser/tab/TabUtils;->getTabThumbnailAspectRatio(Landroid/content/Context;)F
-Lorg/chromium/chrome/browser/tab/TabViewAndroidDelegate;
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate;-><init>(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/components/embedder_support/view/ContentView;)V
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate;->getViewportInsetBottom()I
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate;->onBackgroundColorChanged(I)V
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate;->onBottomControlsChanged(II)V
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate;->onTopControlsChanged(III)V
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate;->updateInsetViewportBottom()V
-Lorg/chromium/chrome/browser/tab/TabViewAndroidDelegate$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tab/TabViewAndroidDelegate;)V
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tab/TabViewAndroidDelegate$1;
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate$1;-><init>(Lorg/chromium/chrome/browser/tab/TabViewAndroidDelegate;Lorg/chromium/chrome/browser/tab/TabViewAndroidDelegate$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate$1;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/tab/TabViewAndroidDelegate$1;->onShown(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/tab/TabViewManagerImpl;
-HSPLorg/chromium/chrome/browser/tab/TabViewManagerImpl;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/tab/TabViewManagerImpl;->isShowing(Lorg/chromium/chrome/browser/tab/TabViewProvider;)Z
-Lorg/chromium/chrome/browser/tab/TabViewProvider;
-Lorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid;
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid;-><init>()V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid;->canShowAppBanners()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid;->getManifestScope()Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid;->shouldEnableEmbeddedMediaExperience()Z
-Lorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;-><init>(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid;)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->canShowAppBanners()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->controlsResizeView()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->getBottomControlsHeight()I
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->getBottomControlsMinHeight()I
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->getDisplayMode()I
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->getManifestScope()Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->getTopControlsHeight()I
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->getTopControlsMinHeight()I
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->isCustomTab()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->isForceDarkWebContentEnabled()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->isFullscreenForTabOrPending()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->isModalContextMenu()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->isNightModeEnabled()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->isPictureInPictureEnabled()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->loadingStateChanged(Z)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->navigationStateChanged(I)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->onUpdateUrl(Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->shouldAnimateBrowserControlsHeightChanges()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->shouldEnableEmbeddedMediaExperience()Z
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;->visibleSSLStateChanged()V
-Lorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl;)V
-Lorg/chromium/chrome/browser/tab/TabWebContentsObserver;
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver;->cleanupWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver;->destroyInternal()V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver;->from(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/tab/TabWebContentsObserver;
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver;->initWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/chrome/browser/tab/TabWebContentsObserver$Observer;
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver$Observer;-><init>(Lorg/chromium/chrome/browser/tab/TabWebContentsObserver;Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver$Observer;->destroy()V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver$Observer;->didFinishLoadInPrimaryMainFrame(Lorg/chromium/content_public/browser/GlobalRenderFrameHostId;Lorg/chromium/url/GURL;ZI)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver$Observer;->didFinishNavigationInPrimaryMainFrame(Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver$Observer;->didFirstVisuallyNonEmptyPaint()V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver$Observer;->didStartNavigationInPrimaryMainFrame(Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsObserver$Observer;->loadProgressChanged(F)V
-Lorg/chromium/chrome/browser/tab/TabWebContentsUserData;
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsUserData;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsUserData;->destroy()V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsUserData;->destroyInternal()V
-Lorg/chromium/chrome/browser/tab/TabWebContentsUserData$1;
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsUserData$1;-><init>(Lorg/chromium/chrome/browser/tab/TabWebContentsUserData;)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsUserData$1;->onContentChanged(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TabWebContentsUserData$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tab/TrustedCdn;
-HSPLorg/chromium/chrome/browser/tab/TrustedCdn;-><init>(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tab/TrustedCdn;->cleanupWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TrustedCdn;->destroyInternal()V
-HSPLorg/chromium/chrome/browser/tab/TrustedCdn;->getPublisherUrl(Lorg/chromium/chrome/browser/tab/Tab;)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/tab/TrustedCdn;->initWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/chrome/browser/tab/TrustedCdn;->setPublisherUrl(Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/tab/TrustedCdn$PublisherUrlVisibility;
-Lorg/chromium/chrome/browser/tab/WebContentsState;
-HSPLorg/chromium/chrome/browser/tab/WebContentsState;-><init>(Ljava/nio/ByteBuffer;)V
-Lorg/chromium/chrome/browser/tab/state/CouponPersistedTabData;
-Lorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;
-HSPLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;-><init>(Lorg/chromium/chrome/browser/tab/Tab;Ljava/lang/String;Ljava/lang/String;IIJLorg/chromium/chrome/browser/tab/WebContentsState;ILjava/lang/String;ILjava/lang/Integer;I)V
-HSPLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;->destroy()V
-HSPLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;->from(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;
-HSPLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;->save()V
-PLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;->setRootId(I)V
-HSPLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;->setTimestampMillis(J)V
-HSPLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;->setUrl(Lorg/chromium/url/GURL;)V
-PLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;->setUserAgent(I)V
-PLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData;->setWebContentsState(Lorg/chromium/chrome/browser/tab/WebContentsState;)V
-Lorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData$1;
-HSPLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabData$1;-><init>()V
-Lorg/chromium/chrome/browser/tab/state/CriticalPersistedTabDataObserver;
-HSPLorg/chromium/chrome/browser/tab/state/CriticalPersistedTabDataObserver;->onTimestampChanged(Lorg/chromium/chrome/browser/tab/Tab;J)V
-Lorg/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage;
-HSPLorg/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage;-><init>()V
-Lorg/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage$1;
-HSPLorg/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage$1;-><init>()V
-Lorg/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorageFactory;
-HSPLorg/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorageFactory;-><init>()V
-Lorg/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorageFactory$1;
-HSPLorg/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorageFactory$1;-><init>()V
-Lorg/chromium/chrome/browser/tab/state/MockPersistedTabData;
-Lorg/chromium/chrome/browser/tab/state/PersistedTabData;
-HSPLorg/chromium/chrome/browser/tab/state/PersistedTabData;-><init>(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/chrome/browser/tab/state/PersistedTabDataStorage;Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/tab/state/PersistedTabData;->from(Lorg/chromium/chrome/browser/tab/Tab;Ljava/lang/Class;)Lorg/chromium/chrome/browser/tab/state/PersistedTabData;
-Lorg/chromium/chrome/browser/tab/state/PersistedTabData$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tab/state/PersistedTabData$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tab/state/PersistedTabData;)V
-HSPLorg/chromium/chrome/browser/tab/state/PersistedTabData$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration;
-HSPLorg/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration;-><init>(ILjava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration;->get(Ljava/lang/Class;Z)Lorg/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration;
-HSPLorg/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration;->getFilePersistedTabDataStorage()Lorg/chromium/chrome/browser/tab/state/FilePersistedTabDataStorage;
-HSPLorg/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration;->getStorage()Lorg/chromium/chrome/browser/tab/state/PersistedTabDataStorage;
-Lorg/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration$$ExternalSyntheticLambda0;-><init>(I)V
-HSPLorg/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration$$ExternalSyntheticLambda0;->create()Lorg/chromium/chrome/browser/tab/state/PersistedTabDataStorage;
-Lorg/chromium/chrome/browser/tab/state/PersistedTabDataStorage;
-Lorg/chromium/chrome/browser/tab/state/PersistedTabDataStorageFactory;
-Lorg/chromium/chrome/browser/tab/state/ShoppingPersistedTabData;
-PLorg/chromium/chrome/browser/tab/state/ShoppingPersistedTabData;->isPriceTrackingWithOptimizationGuideEnabled()Z
-Lorg/chromium/chrome/browser/tab/tab_restore/HistoricalTabModelObserver;
-HSPLorg/chromium/chrome/browser/tab/tab_restore/HistoricalTabModelObserver;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModel;)V
-Lorg/chromium/chrome/browser/tab/tab_restore/HistoricalTabSaver;
-Lorg/chromium/chrome/browser/tab/tab_restore/HistoricalTabSaverImpl;
-HSPLorg/chromium/chrome/browser/tab/tab_restore/HistoricalTabSaverImpl;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModel;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcherImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;Lorg/chromium/chrome/browser/toolbar/ToolbarManager;Landroid/view/View;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda19;Lorg/chromium/ui/modaldialog/ModalDialogManager;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;Lorg/chromium/base/supplier/OneshotSupplierImpl;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController;-><init>(Landroid/view/Window;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/fullscreen/FullscreenManager;)V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController;->updateNavigationBarColor()V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController;)V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController$1;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController$1;-><init>(Lorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController$2;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController$2;-><init>(Lorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController$3;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController$3;-><init>(Lorg/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda11;Lorg/chromium/chrome/browser/share/ShareDelegateSupplier;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/base/jank_tracker/JankTrackerImpl;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/components/browser_ui/widget/MenuOrKeyboardActionController;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuBlocker;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda14;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda14;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManagerSupplier;Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuDelegate;Lorg/chromium/chrome/browser/ui/system/StatusBarColorController$StatusBarColorProvider;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/ui/base/IntentRequestTrackerImpl;Lorg/chromium/components/browser_ui/widget/InsetObserverViewSupplier;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda15;Lorg/chromium/base/supplier/OneshotSupplierImpl;ZLorg/chromium/chrome/browser/back_press/BackPressManager;)V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;->buildScrimWidget()Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;->onDestroy()V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;->onFinishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;->onLayoutManagerAvailable(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;)V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;->onPostInflationStartup()V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;->setLayoutStateProvider(Lorg/chromium/chrome/browser/layouts/LayoutStateProvider;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/lifecycle/DestroyObserver;I)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;I)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda3;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;I)V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda3;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda4;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda4;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$$ExternalSyntheticLambda4;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$2;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$2;-><init>(Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$3;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$3;-><init>(Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;)V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$3;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$6;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$6;-><init>(Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$7;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$7;-><init>(Lorg/chromium/base/supplier/ObservableSupplierImpl;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$RootUiTabObserver;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$RootUiTabObserver;-><init>(Lorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$RootUiTabObserver;->destroy()V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$RootUiTabObserver;->onObservingDifferentTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator$RootUiTabObserver;->swapToTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tabbed_mode/TabbedSystemUiCoordinator;
-HSPLorg/chromium/chrome/browser/tabbed_mode/TabbedSystemUiCoordinator;-><init>(Landroid/view/Window;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/fullscreen/FullscreenManager;)V
-Lorg/chromium/chrome/browser/tabmodel/AsyncTabParams;
-Lorg/chromium/chrome/browser/tabmodel/AsyncTabParamsManagerImpl;
-HSPLorg/chromium/chrome/browser/tabmodel/AsyncTabParamsManagerImpl;-><init>()V
-HSPLorg/chromium/chrome/browser/tabmodel/AsyncTabParamsManagerImpl;->hasParamsWithTabToReparent()Z
-HSPLorg/chromium/chrome/browser/tabmodel/AsyncTabParamsManagerImpl;->remove(I)Lorg/chromium/chrome/browser/tabmodel/AsyncTabParams;
-Lorg/chromium/chrome/browser/tabmodel/ChromeTabCreator;
-HSPLorg/chromium/chrome/browser/tabmodel/ChromeTabCreator;-><init>(Landroid/app/Activity;Lorg/chromium/ui/base/WindowAndroid;Lorg/chromium/base/supplier/Supplier;ZLorg/chromium/chrome/browser/ChromeTabbedActivity$7;Lorg/chromium/chrome/browser/tabmodel/AsyncTabParamsManagerImpl;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/tabmodel/ChromeTabCreator;->createDefaultTabDelegateFactory()Lorg/chromium/chrome/browser/tab/TabDelegateFactory;
-PLorg/chromium/chrome/browser/tabmodel/ChromeTabCreator;->createFrozenTab(Lorg/chromium/chrome/browser/tab/TabState;Lorg/chromium/chrome/browser/tab/state/SerializedCriticalPersistedTabData;IZI)Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/tabmodel/ChromeTabCreator;->createNewTab(Lorg/chromium/content_public/browser/LoadUrlParams;ILorg/chromium/chrome/browser/tab/Tab;ILandroid/content/Intent;)Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/tabmodel/ChromeTabCreator;->createNewTab(Lorg/chromium/content_public/browser/LoadUrlParams;ILorg/chromium/chrome/browser/tab/Tab;Landroid/content/Intent;)Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/tabmodel/ChromeTabCreator;->tabLaunchTypeToHistogramKey(Ljava/lang/Integer;)Ljava/lang/String;
-PLorg/chromium/chrome/browser/tabmodel/ChromeTabCreator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-Lorg/chromium/chrome/browser/tabmodel/EmptyTabModel;
-HSPLorg/chromium/chrome/browser/tabmodel/EmptyTabModel;-><init>()V
-HSPLorg/chromium/chrome/browser/tabmodel/EmptyTabModel;->addObserver(Lorg/chromium/chrome/browser/tabmodel/TabModelObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/EmptyTabModel;->destroy()V
-HSPLorg/chromium/chrome/browser/tabmodel/EmptyTabModel;->getComprehensiveModel()Lorg/chromium/chrome/browser/tabmodel/TabList;
-HSPLorg/chromium/chrome/browser/tabmodel/EmptyTabModel;->getCount()I
-HSPLorg/chromium/chrome/browser/tabmodel/EmptyTabModel;->index()I
-HSPLorg/chromium/chrome/browser/tabmodel/EmptyTabModel;->removeObserver(Lorg/chromium/chrome/browser/tabmodel/TabModelObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/EmptyTabModel;->setActive(Z)V
-Lorg/chromium/chrome/browser/tabmodel/EmptyTabModel$LazyHolder;
-Lorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider;
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider;-><init>()V
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider;->addIncognitoStateObserverAndTrigger(Lorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider$IncognitoStateObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider;->isIncognitoSelected()Z
-Lorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider$1;
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider$1;-><init>(Lorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider;)V
-Lorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider$IncognitoStateObserver;
-Lorg/chromium/chrome/browser/tabmodel/IncognitoTabHost;
-Lorg/chromium/chrome/browser/tabmodel/IncognitoTabHostRegistry;
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabHostRegistry;-><init>()V
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabHostRegistry;->getInstance()Lorg/chromium/chrome/browser/tabmodel/IncognitoTabHostRegistry;
-Lorg/chromium/chrome/browser/tabmodel/IncognitoTabHostUtils;
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabHostUtils;->doIncognitoTabsExist()Z
-Lorg/chromium/chrome/browser/tabmodel/IncognitoTabModel;
-Lorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;-><init>(Lorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImplCreator;)V
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;->addObserver(Lorg/chromium/chrome/browser/tabmodel/TabModelObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;->commitAllTabClosures()V
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;->destroy()V
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;->destroyIncognitoIfNecessary()V
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;->getComprehensiveModel()Lorg/chromium/chrome/browser/tabmodel/TabList;
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;->getCount()I
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;->index()I
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;->isIncognito()Z
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;->removeObserver(Lorg/chromium/chrome/browser/tabmodel/TabModelObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl;->setActive(Z)V
-Lorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl$IncognitoTabModelDelegate;
-Lorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImplCreator;
-HSPLorg/chromium/chrome/browser/tabmodel/IncognitoTabModelImplCreator;-><init>(Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/tabmodel/ChromeTabCreator;Lorg/chromium/chrome/browser/tabmodel/ChromeTabCreator;Lorg/chromium/chrome/browser/tabmodel/TabModelOrderControllerImpl;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/chrome/browser/tabmodel/NextTabPolicy$NextTabPolicySupplier;Lorg/chromium/chrome/browser/tabmodel/AsyncTabParamsManagerImpl;ILorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl;)V
-Lorg/chromium/chrome/browser/tabmodel/IncognitoTabModelObserver;
-Lorg/chromium/chrome/browser/tabmodel/NextTabPolicy$NextTabPolicySupplier;
-Lorg/chromium/chrome/browser/tabmodel/PendingTabClosureManager;
-HSPLorg/chromium/chrome/browser/tabmodel/PendingTabClosureManager;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabList;Lorg/chromium/chrome/browser/tabmodel/TabModelImpl$1;)V
-HSPLorg/chromium/chrome/browser/tabmodel/PendingTabClosureManager;->resetState()V
-Lorg/chromium/chrome/browser/tabmodel/PendingTabClosureManager$RewoundList;
-HSPLorg/chromium/chrome/browser/tabmodel/PendingTabClosureManager$RewoundList;-><init>(Lorg/chromium/chrome/browser/tabmodel/PendingTabClosureManager;)V
-HSPLorg/chromium/chrome/browser/tabmodel/PendingTabClosureManager$RewoundList;->getCount()I
-HSPLorg/chromium/chrome/browser/tabmodel/PendingTabClosureManager$RewoundList;->getTabAt(I)Lorg/chromium/chrome/browser/tab/Tab;
-Lorg/chromium/chrome/browser/tabmodel/PendingTabClosureManager$TabClosureEvent;
-Lorg/chromium/chrome/browser/tabmodel/TabCreator;
-HSPLorg/chromium/chrome/browser/tabmodel/TabCreator;-><init>()V
-Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;
-Lorg/chromium/chrome/browser/tabmodel/TabCreatorManagerSupplier;
-HSPLorg/chromium/chrome/browser/tabmodel/TabCreatorManagerSupplier;-><init>()V
-Lorg/chromium/chrome/browser/tabmodel/TabList;
-Lorg/chromium/chrome/browser/tabmodel/TabModel;
-Lorg/chromium/chrome/browser/tabmodel/TabModelDelegate;
-Lorg/chromium/chrome/browser/tabmodel/TabModelFilter;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilter;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModel;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilter;->allTabsClosureCommitted(Z)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilter;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilter;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilter;->restoreCompleted()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilter;->willAddTab(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelFilterProvider;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilterProvider;-><init>()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilterProvider;->addTabModelFilterObserver(Lorg/chromium/chrome/browser/tabmodel/TabModelObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilterProvider;->getCurrentTabModelFilter()Lorg/chromium/chrome/browser/tabmodel/TabModelFilter;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilterProvider;->getTabModelFilter(Z)Lorg/chromium/chrome/browser/tabmodel/TabModelFilter;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilterProvider;->onTabStateInitialized()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelFilterProvider;->removeTabModelFilterObserver(Lorg/chromium/chrome/browser/tabmodel/TabModelObserver;)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelImpl;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;-><init>(Lorg/chromium/chrome/browser/profiles/Profile;ILorg/chromium/chrome/browser/tabmodel/TabCreator;Lorg/chromium/chrome/browser/tabmodel/TabCreator;Lorg/chromium/chrome/browser/tabmodel/TabModelOrderController;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/chrome/browser/tabmodel/NextTabPolicy$NextTabPolicySupplier;Lorg/chromium/chrome/browser/tabmodel/AsyncTabParamsManagerImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelDelegate;Z)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->addObserver(Lorg/chromium/chrome/browser/tabmodel/TabModelObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->addTab(Lorg/chromium/chrome/browser/tab/Tab;III)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->commitAllTabClosures()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->destroy()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->getComprehensiveModel()Lorg/chromium/chrome/browser/tabmodel/TabList;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->getCount()I
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->getTabAt(I)Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->hasValidTab()Z
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->index()I
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->indexOf(Lorg/chromium/chrome/browser/tab/Tab;)I
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->isActiveModel()Z
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->removeObserver(Lorg/chromium/chrome/browser/tabmodel/TabModelObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->setIndex(IIZ)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl;->supportsPendingClosures()Z
-Lorg/chromium/chrome/browser/tabmodel/TabModelImpl$1;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelImpl$1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelImpl;)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelInitializer;
-Lorg/chromium/chrome/browser/tabmodel/TabModelJniBridge;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelJniBridge;-><init>(Lorg/chromium/chrome/browser/profiles/Profile;I)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelJniBridge;->destroy()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelJniBridge;->getProfile()Lorg/chromium/chrome/browser/profiles/Profile;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelJniBridge;->hasOtherRelatedTabs(Lorg/chromium/chrome/browser/tab/Tab;)Z
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelJniBridge;->isIncognito()Z
-Lorg/chromium/chrome/browser/tabmodel/TabModelObserver;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserver;->allTabsClosureCommitted(Z)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserver;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserver;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserver;->restoreCompleted()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserver;->willAddTab(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge;-><init>(JLorg/chromium/chrome/browser/tabmodel/TabModel;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge;->allTabsClosureCommitted(Z)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge;->create(JLorg/chromium/chrome/browser/tabmodel/TabModel;)Lorg/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge;->detachFromTabModel()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge;->willAddTab(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelOrderController;
-Lorg/chromium/chrome/browser/tabmodel/TabModelOrderControllerImpl;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelOrderControllerImpl;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelOrderControllerImpl;->determineInsertionIndex(IILorg/chromium/chrome/browser/tab/Tab;)I
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelOrderControllerImpl;->willOpenInForeground(IZ)Z
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/chrome/browser/app/tabmodel/ChromeTabModelFilterFactory;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->addObserver(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->getCurrentModel()Lorg/chromium/chrome/browser/tabmodel/TabModel;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->getCurrentTab()Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->getCurrentTabId()I
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->getModel(Z)Lorg/chromium/chrome/browser/tabmodel/TabModel;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->getModelForTabId(I)Lorg/chromium/chrome/browser/tabmodel/TabModel;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->getModelIndex(Z)I
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->getTabById(I)Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->getTotalTabCount()I
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->isIncognitoSelected()Z
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->notifyChanged()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;->removeObserver(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorObserver;)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase$1;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase$1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase$1;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase$1;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl;-><init>(Lorg/chromium/chrome/browser/customtabs/content/CustomTabActivityTabFactory$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/chrome/browser/app/tabmodel/ChromeTabModelFilterFactory;Lorg/chromium/chrome/browser/tabmodel/NextTabPolicy$NextTabPolicySupplier;Lorg/chromium/chrome/browser/tabmodel/AsyncTabParamsManagerImpl;ZI)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl;->commitAllTabClosures()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl;->markTabStateInitialized()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl;->requestToShowTab(Lorg/chromium/chrome/browser/tab/Tab;I)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl$1;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl$1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl$1;->onNewTabCreated(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl$2;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl$2;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorImpl$2;->onUrlUpdated(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorObserver;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorObserver;->onChange()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorObserver;->onNewTabCreated(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorObserver;->onTabHidden()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorObserver;->onTabStateInitialized()V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier;->onChange()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier;->onNewTabCreated(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier;->onTabHidden()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier;->onTabStateInitialized()V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier;-><init>()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier;->from(Lorg/chromium/ui/base/WindowAndroid;)Lorg/chromium/base/supplier/ObservableSupplier;
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver;->destroy()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver;->onRegistrationComplete()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver;->registerModelObservers()V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver$1;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver$1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver$1;->onChange()V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver;->destroy()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver;->onTabRegistered(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver;->onTabUnregistered(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver$1;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver$1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver$1;->onTabRegistered(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver$1;->onTabUnregistered(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver;->-$$Nest$monTabRegistered(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver;Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver;->addObserverAndNotifyExistingTabRegistration(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver$Observer;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver;->onTabUnregistered(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver$1;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver$1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver$1;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver$1;->onRegistrationComplete()V
-Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorTabRegistrationObserver$Observer;
-Lorg/chromium/chrome/browser/tabmodel/TabModelUtils;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelUtils;->getCurrentTab(Lorg/chromium/chrome/browser/tabmodel/TabList;)Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelUtils;->getTabById(Lorg/chromium/chrome/browser/tabmodel/TabList;I)Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/tabmodel/TabModelUtils;->getTabIndexById(Lorg/chromium/chrome/browser/tabmodel/TabList;I)I
-Lorg/chromium/chrome/browser/tabmodel/TabPersistencePolicy;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistencePolicy;->setTaskRunner(Lorg/chromium/base/task/SequencedTaskRunner;)V
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->-$$Nest$mcompleteLoad(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabRestoreDetails;Lorg/chromium/chrome/browser/tab/TabState;Lorg/chromium/chrome/browser/tab/state/SerializedCriticalPersistedTabData;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistencePolicy;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->addTabToSaveQueueIfApplicable(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->checkAndUpdateMaxTabId()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->getStateDirectory()Ljava/io/File;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->isCriticalPersistedTabDataSaveAndRestoreEnabled()Z
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->isCriticalPersistedTabDataSaveOnlyEnabled()Z
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->isIncognitoTabBeingRestored(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabRestoreDetails;Lorg/chromium/chrome/browser/tab/TabState;Lorg/chromium/chrome/browser/tab/state/SerializedCriticalPersistedTabData;)Z
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->loadNextTab()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->onStateLoaded()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->readSavedStateFile(Ljava/io/DataInputStream;Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$OnTabStateReadCallback;Landroid/util/SparseBooleanArray;)I
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->restoreTab(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabRestoreDetails;Lorg/chromium/chrome/browser/tab/TabState;Lorg/chromium/chrome/browser/tab/state/SerializedCriticalPersistedTabData;Z)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->saveListToFile([B)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->saveNextTab()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->saveTabListAsynchronously()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore;->serializeTabMetadata()Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabModelSelectorMetadata;
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator$1;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$1;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;)V
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$12;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;I)V
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$12;->doInBackground()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$2;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$2;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$1;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$2;->onTabRegistered(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$2;->onTabUnregistered(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$3;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$3;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;)V
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$5;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;ZZ)V
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$5;->onDetailsRead(IILjava/lang/Boolean;Ljava/lang/String;ZZ)V
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$7;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$7;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$7;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$9;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$9;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;Ljava/lang/String;I)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$9;->doInBackground()Ljava/lang/Object;
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$LoadTabTask;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabRestoreDetails;)V
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$LoadTabTask;->doInBackground()Ljava/lang/Object;
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$LoadTabTask;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$SaveListTask;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$SaveListTask;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$SaveListTask;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$SaveListTask;->onPostExecute(Ljava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$SaveListTask;->onPreExecute()V
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$SaveTabTask;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$SaveTabTask;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$SaveTabTask;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$SaveTabTask;->onPostExecute(Ljava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$SaveTabTask;->onPreExecute()V
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabLoader;
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabLoader;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore;Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabRestoreDetails;)V
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabLoader;->loadTabState()V
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabModelSelectorMetadata;
-HSPLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabModelSelectorMetadata;-><init>([B)V
-Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabRestoreDetails;
-PLorg/chromium/chrome/browser/tabmodel/TabPersistentStore$TabRestoreDetails;-><init>(IILjava/lang/Boolean;Ljava/lang/String;Ljava/lang/Boolean;)V
-Lorg/chromium/chrome/browser/tabmodel/TabSwitchMetrics;
-Lorg/chromium/chrome/browser/tabmodel/TabWindowManagerImpl;
-HSPLorg/chromium/chrome/browser/tabmodel/TabWindowManagerImpl;-><init>(Lorg/chromium/chrome/browser/app/tabmodel/DefaultTabModelSelectorFactory;Lorg/chromium/chrome/browser/tabmodel/AsyncTabParamsManagerImpl;I)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabWindowManagerImpl;->getIndexForWindow(Landroid/app/Activity;)I
-HSPLorg/chromium/chrome/browser/tabmodel/TabWindowManagerImpl;->getTabById(I)Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/tabmodel/TabWindowManagerImpl;->onActivityStateChange(Landroid/app/Activity;I)V
-Lorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;-><init>(IIZZ)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->cancelCleanupInProgress()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->cleanupUnusedFiles(Lorg/chromium/chrome/browser/tabmodel/TabPersistentStore$7;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->destroy()V
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->getOrCreateStateDirectory()Ljava/io/File;
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->getOtherTabsId(I)Landroid/util/SparseBooleanArray;
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->getStateFileName()Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->getStateFileName(I)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->getStateToBeMergedFileNames()Ljava/util/List;
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->isMergeInProgress()Z
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->notifyStateLoaded(I)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->performInitialization(Lorg/chromium/base/task/SequencedTaskRunner;)Z
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->setTabContentManager(Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->shouldMergeOnStartup()Z
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;->waitForInitializationToFinish()V
-Lorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy$$ExternalSyntheticLambda1;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy$1;
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy$1;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;ZZ)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy$1;->doInBackground()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy$CleanUpTabStateDataTask;
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy$CleanUpTabStateDataTask;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy;Lorg/chromium/base/Callback;Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy$CleanUpTabStateDataTask;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy$CleanUpTabStateDataTask;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tabpersistence/TabStateDirectory;
-HSPLorg/chromium/chrome/browser/tabpersistence/TabStateDirectory;->getOrCreateTabbedModeStateDirectory()Ljava/io/File;
-Lorg/chromium/chrome/browser/tabpersistence/TabStateDirectory$BaseStateDirectoryHolder;
-Lorg/chromium/chrome/browser/tabpersistence/TabStateFileManager;
-HSPLorg/chromium/chrome/browser/tabpersistence/TabStateFileManager;->getTabStateFilename(IZ)Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/tabpersistence/TabStateFileManager;->parseInfoFromFilename(Ljava/lang/String;)Landroid/util/Pair;
-PLorg/chromium/chrome/browser/tabpersistence/TabStateFileManager;->readState(Ljava/io/FileInputStream;Z)Lorg/chromium/chrome/browser/tab/TabState;
-PLorg/chromium/chrome/browser/tabpersistence/TabStateFileManager;->restoreTabState(Ljava/io/File;I)Lorg/chromium/chrome/browser/tab/TabState;
-HSPLorg/chromium/chrome/browser/tabpersistence/TabStateFileManager;->saveState(Ljava/io/File;Lorg/chromium/chrome/browser/tab/TabState;Z)V
-Lorg/chromium/chrome/browser/tasks/ReturnToChromeUtil;
-HSPLorg/chromium/chrome/browser/tasks/ReturnToChromeUtil;->isStartSurfaceEnabled(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/tasks/ReturnToChromeUtil;->isStartSurfaceRefactorEnabled(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/tasks/ReturnToChromeUtil;->shouldHideStartSurfaceWithAccessibilityOn(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/tasks/ReturnToChromeUtil;->shouldImproveStartWhenFeedIsDisabled(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/tasks/ReturnToChromeUtil;->shouldShowStartSurfaceAsTheHomePage(Landroidx/appcompat/app/AppCompatActivity;)Z
-HSPLorg/chromium/chrome/browser/tasks/ReturnToChromeUtil;->updateFeedVisibility()V
-Lorg/chromium/chrome/browser/tasks/ReturnToChromeUtil$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tasks/ReturnToChromeUtil$$ExternalSyntheticLambda0;-><init>()V
-Lorg/chromium/chrome/browser/tasks/TasksUma;
-HSPLorg/chromium/chrome/browser/tasks/TasksUma;->getTabsInOneGroupCount(Ljava/util/HashMap;I)I
-Lorg/chromium/chrome/browser/tasks/pseudotab/PseudoTab;
-HSPLorg/chromium/chrome/browser/tasks/pseudotab/PseudoTab;->getListOfPseudoTab(Ljava/util/List;)Ljava/util/ArrayList;
-Lorg/chromium/chrome/browser/tasks/tab_groups/EmptyTabGroupModelFilterObserver;
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/EmptyTabGroupModelFilterObserver;-><init>()V
-Lorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModel;Z)V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->addTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->addTabGroupObserver(Lorg/chromium/chrome/browser/tasks/tab_groups/EmptyTabGroupModelFilterObserver;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->getCount()I
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->getParentId(Lorg/chromium/chrome/browser/tab/Tab;)I
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->getRelatedTabList(I)Ljava/util/List;
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->getRelatedTabList(Ljava/util/List;)Ljava/util/List;
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->getRootId(Lorg/chromium/chrome/browser/tab/Tab;)I
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->getValidPosition(Lorg/chromium/chrome/browser/tab/Tab;I)I
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->hasOtherRelatedTabs(Lorg/chromium/chrome/browser/tab/Tab;)Z
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->isIncognito()Z
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->markTabStateInitialized()V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->recordSessionsCount(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->removeTabGroupObserver(Lorg/chromium/chrome/browser/tasks/tab_groups/EmptyTabGroupModelFilterObserver;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->reorder()V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->reorderGroup(I)V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->selectTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;->shouldNotifyObserversOnSetIndex()Z
-Lorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter$TabGroup;
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter$TabGroup;-><init>(Lorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter;I)V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter$TabGroup;->addTab(I)V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter$TabGroup;->getTabIdList()Ljava/util/List;
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter$TabGroup;->size()I
-Lorg/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils;
-Lorg/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils$2;
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils$2;-><init>(Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils$2;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/CouponCardView;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/CouponCardView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/CouponCardView;->onFinishInflate()V
-Lorg/chromium/chrome/browser/tasks/tab_management/PriceCardView;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/PriceCardView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/PriceCardView;->onFinishInflate()V
-Lorg/chromium/chrome/browser/tasks/tab_management/PriceMessageService$PriceWelcomeMessageProvider;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Landroid/view/ViewGroup;Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator$ResetHandler;Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator;Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator$$ExternalSyntheticLambda5;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;Landroid/view/ViewGroup;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator;->destroy()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator;->initWithNative(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$9;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator;->isVisible()Z
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator;I)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda2;-><init>()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda2;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda3;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda3;->onPropertyChanged(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator;Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator$ResetHandler;Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator$$ExternalSyntheticLambda5;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;->hideDialog(Z)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;->initWithNative(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$9;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;->updateColorProperties(Landroid/content/Context;Z)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;I)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$1;->allTabsClosureCommitted(Z)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$1;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$1;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$2;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$2;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$3;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$3;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView;->onAttachedToWindow()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView;->onDetachedFromWindow()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView;->onFinishInflate()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView;->updateDialogWithOrientation(I)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView$$ExternalSyntheticLambda0;->onGlobalLayout()V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView$1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView$1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView;I)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView$2;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView$2;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView;F)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView$VisibilityListener;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/tasks/tab_management/TabListModel;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$6;Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$3;Ljava/lang/String;ZILorg/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback$OnLongPressTabItemEventListener;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback$OnLongPressTabItemEventListener;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridPanelProperties;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinder$ViewHolder;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinder$ViewHolder;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView;Landroidx/recyclerview/widget/RecyclerView;Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogView;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailView;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUi;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;-><init>(Landroidx/appcompat/app/AppCompatActivity;Landroid/view/ViewGroup;Lorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetController;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda14;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/OneshotSupplier;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;->getHandleBackPressChangedSupplier()Lorg/chromium/base/supplier/ObservableSupplier;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;->onPauseWithNative()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;->onResumeWithNative()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;->recordSessionCount()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;->recordTabGroupCount()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;->resetStripWithListOfTabs(Ljava/util/List;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator$$ExternalSyntheticLambda0;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator$1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator$1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;)V
-PLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator$1;->restoreCompleted()V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;-><init>(Landroid/app/Activity;Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/base/supplier/OneshotSupplier;Lorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider;Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator;Lorg/chromium/base/supplier/ObservableSupplier;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;->getHandleBackPressChangedSupplier()Lorg/chromium/base/supplier/ObservableSupplier;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;->getTabsToShowForId(I)Ljava/util/List;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;->resetTabStripWithRelatedTabsForId(I)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;I)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$$ExternalSyntheticLambda1;->onIncognitoStateChanged(Z)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$$ExternalSyntheticLambda3;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;I)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$1;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$1;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-PLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$1;->restoreCompleted()V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$2;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$2;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$2;->onFinishedHiding(I)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$2;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$3;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$3;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$4;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$4;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$5;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$5;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator$ResetHandler;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiProperties;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView;->onFinishInflate()V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiViewBinder$ViewHolder;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiViewBinder$ViewHolder;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView;Landroidx/recyclerview/widget/RecyclerView;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator;-><init>(ILandroid/content/Context;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$ThumbnailProvider;Lorg/chromium/chrome/browser/tasks/pseudotab/PseudoTab$TitleProvider;ZLorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator;Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$3;ILorg/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator$PriceWelcomeMessageController;Landroid/view/ViewGroup;ZLjava/lang/String;Landroid/view/ViewGroup;Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback$OnLongPressTabItemEventListener;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator;->initWithNative(Lorg/chromium/ui/resources/dynamics/DynamicResourceLoader;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator;->onDestroy()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator;->resetWithListOfTabs$1(Ljava/util/List;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator;->resetWithListOfTabs(Ljava/util/ArrayList;ZZ)Z
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$$ExternalSyntheticLambda0;-><init>(ILandroid/content/Context;Landroid/view/ViewGroup;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$$ExternalSyntheticLambda3;-><init>(I)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$$ExternalSyntheticLambda4;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$$ExternalSyntheticLambda4;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator;Landroid/content/Context;Landroid/view/ViewGroup;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$$ExternalSyntheticLambda5;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$$ExternalSyntheticLambda5;-><init>(Landroid/content/Context;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListCoordinator$1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;-><init>(Landroid/content/Context;Z)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;->colorFaviconWithTheme(Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$ResourceTabFavicon;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;->createChromeOwnedResourceTabFavicon(Landroid/graphics/Bitmap;III)Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$ResourceTabFavicon;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;->getFaviconForUrlAsync(Lorg/chromium/url/GURL;ZLorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;->getResizedBitmapFromDrawable(ILandroid/graphics/drawable/Drawable;)Landroid/graphics/Bitmap;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;->getRoundedGlobeFavicon(Z)Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$ResourceTabFavicon;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;->initWithNative(Lorg/chromium/chrome/browser/profiles/Profile;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;->processBitmap(Landroid/graphics/Bitmap;Z)Landroid/graphics/drawable/Drawable;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;->processBitmapMaybeColor(Landroid/graphics/Bitmap;ZI)Landroid/graphics/drawable/Drawable;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;ZLorg/chromium/url/GURL;Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$$ExternalSyntheticLambda1;->onFaviconAvailable(Landroid/graphics/Bitmap;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$$ExternalSyntheticLambda2;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$ResourceTabFavicon;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$ResourceTabFavicon;-><init>(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;ZI)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$TabFavicon;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider$TabFavicon;-><init>(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Z)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/tasks/tab_management/TabListModel;ILorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$ThumbnailProvider;Lorg/chromium/chrome/browser/tasks/pseudotab/PseudoTab$TitleProvider;Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;ZLorg/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator;Lorg/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator$3;Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator$PriceWelcomeMessageController;Ljava/lang/String;ILorg/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback$OnLongPressTabItemEventListener;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;->initWithNative()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;->onTabAdded(Lorg/chromium/chrome/browser/tab/Tab;Z)I
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;->selectTab(II)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;->updateSpanCount(Landroidx/recyclerview/widget/GridLayoutManager;II)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$$ExternalSyntheticLambda1;-><init>()V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$10;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$10;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;Landroidx/recyclerview/widget/GridLayoutManager;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$11;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$11;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;Landroidx/recyclerview/widget/GridLayoutManager;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$2;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$2;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;I)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$4;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$4;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$5;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$5;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$5;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$5;->didSelectTab(IILorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$6;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$6;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$8;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$8;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$TabActionListener;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$TabGridAccessibilityHelper;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListMediator$ThumbnailProvider;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListModel;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListModel;-><init>()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListModel;->indexFromId(I)I
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListModel$CardProperties;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView;->onAttachedToWindow()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView;->onDetachedFromWindow()V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView;->onLayout(ZIIII)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView$2;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView$2;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView;Landroid/view/View;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView$TabListOnScrollListener;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView$TabListOnScrollListener;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl;-><init>()V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabManagementFieldTrial;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabManagementModule;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabManagementModuleProvider;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabManagementModuleProvider;->getDelegate()Lorg/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabProperties;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter;-><init>(Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/tasks/tab_management/TabListModel;Landroidx/recyclerview/widget/RecyclerView;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter$1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter$1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter$TabStripSnapshotToken;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter$TabStripSnapshotToken;-><init>(Lorg/chromium/ui/modelutil/MVCListAdapter$ModelList;I)V
-Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher$Controller;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher$OnTabSelectingListener;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher$TabListDelegate;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher$TabSwitcherViewObserver;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator;->isShowingTabsInMRUOrder(I)Z
-Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator$MessageItemsController;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator$PriceWelcomeMessageController;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator$ResetHandler;
-Lorg/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities;->isGridTabSwitcherEnabled(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities;->isLaunchPolishEnabled()Z
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities;->isTabGroupsAndroidContinuationEnabled(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities;->isTabGroupsAndroidEnabled(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities;->isTabSelectionEditorV2Enabled(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities;->isTabToGtsAnimationEnabled()Z
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities;->isTabletGridTabSwitcherEnabled(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities;->isTabletGridTabSwitcherPolishEnabled(Landroid/content/Context;)Z
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities;->supportInstantStart(Landroid/content/Context;Z)Z
-Lorg/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider;->getTabGridDialogUngroupBarBackgroundColor(Landroid/content/Context;ZZ)I
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider;->getTabGridDialogUngroupBarTextColor(Landroid/content/Context;ZZ)I
-HSPLorg/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider;->getTitleTextColor(Landroid/content/Context;ZZ)I
-Lorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController$1;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController$1;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController$2;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController$2;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController;)V
-Lorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController$3;
-HSPLorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController$3;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController$3;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-Lorg/chromium/chrome/browser/theme/ThemeColorProvider;
-HSPLorg/chromium/chrome/browser/theme/ThemeColorProvider;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/chrome/browser/theme/ThemeColorProvider;->updatePrimaryColor(IZ)V
-HSPLorg/chromium/chrome/browser/theme/ThemeColorProvider;->updateTint(Landroid/content/res/ColorStateList;I)V
-Lorg/chromium/chrome/browser/theme/ThemeColorProvider$ThemeColorObserver;
-Lorg/chromium/chrome/browser/theme/ThemeColorProvider$TintObserver;
-Lorg/chromium/chrome/browser/theme/ThemeUtils;
-HSPLorg/chromium/chrome/browser/theme/ThemeUtils;->getTextBoxColorForToolbarBackground(Landroid/content/Context;Lorg/chromium/chrome/browser/tab/Tab;I)I
-HSPLorg/chromium/chrome/browser/theme/ThemeUtils;->getTextBoxColorForToolbarBackgroundInNonNativePage(ILandroid/content/Context;Z)I
-HSPLorg/chromium/chrome/browser/theme/ThemeUtils;->getThemedToolbarIconTint(Landroid/content/Context;I)Landroid/content/res/ColorStateList;
-HSPLorg/chromium/chrome/browser/theme/ThemeUtils;->getThemedToolbarIconTintRes(I)I
-HSPLorg/chromium/chrome/browser/theme/ThemeUtils;->isUsingDefaultToolbarColor(ILandroid/content/Context;Z)Z
-Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/supplier/Supplier;ZZZ)V
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;->calculateColor(Lorg/chromium/chrome/browser/tab/Tab;I)I
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;->destroy()V
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;->getBackgroundColor(Lorg/chromium/chrome/browser/tab/Tab;)I
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;->getSceneLayerBackground(Lorg/chromium/chrome/browser/tab/Tab;)I
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;->getTextBoxBackgroundAlpha(Lorg/chromium/chrome/browser/tab/Tab;)F
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;->isThemingAllowed(Lorg/chromium/chrome/browser/tab/Tab;)Z
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;->updateColor(ILorg/chromium/chrome/browser/tab/Tab;Z)V
-Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;)V
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider$1;
-HSPLorg/chromium/chrome/browser/theme/TopUiThemeColorProvider$1;-><init>(Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;)V
-Lorg/chromium/chrome/browser/toolbar/AppThemeColorProvider;
-HSPLorg/chromium/chrome/browser/toolbar/AppThemeColorProvider;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/chrome/browser/toolbar/AppThemeColorProvider;->destroy()V
-HSPLorg/chromium/chrome/browser/toolbar/AppThemeColorProvider;->onIncognitoStateChanged(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/AppThemeColorProvider;->updateTheme()V
-Lorg/chromium/chrome/browser/toolbar/AppThemeColorProvider$1;
-HSPLorg/chromium/chrome/browser/toolbar/AppThemeColorProvider$1;-><init>(Lorg/chromium/chrome/browser/toolbar/AppThemeColorProvider;)V
-HSPLorg/chromium/chrome/browser/toolbar/AppThemeColorProvider$1;->onStartedHiding(IZZ)V
-HSPLorg/chromium/chrome/browser/toolbar/AppThemeColorProvider$1;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/toolbar/BaseButtonDataProvider;
-HSPLorg/chromium/chrome/browser/toolbar/BaseButtonDataProvider;-><init>(Lorg/chromium/base/supplier/Supplier;Lorg/chromium/ui/modaldialog/ModalDialogManager;Landroid/graphics/drawable/Drawable;Ljava/lang/String;II)V
-HSPLorg/chromium/chrome/browser/toolbar/BaseButtonDataProvider;->destroy()V
-HSPLorg/chromium/chrome/browser/toolbar/BaseButtonDataProvider;->notifyObservers(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/BaseButtonDataProvider;->shouldShowButton(Lorg/chromium/chrome/browser/tab/Tab;)Z
-Lorg/chromium/chrome/browser/toolbar/BaseButtonDataProvider$1;
-HSPLorg/chromium/chrome/browser/toolbar/BaseButtonDataProvider$1;-><init>(Lorg/chromium/chrome/browser/toolbar/BaseButtonDataProvider;)V
-Lorg/chromium/chrome/browser/toolbar/ButtonData$ButtonSpec;
-HSPLorg/chromium/chrome/browser/toolbar/ButtonData$ButtonSpec;-><init>(Landroid/graphics/drawable/Drawable;Landroid/view/View$OnClickListener;Landroid/view/View$OnLongClickListener;Ljava/lang/String;ZLorg/chromium/chrome/browser/user_education/IPHCommandBuilder;II)V
-Lorg/chromium/chrome/browser/toolbar/ButtonDataImpl;
-HSPLorg/chromium/chrome/browser/toolbar/ButtonDataImpl;-><init>()V
-HSPLorg/chromium/chrome/browser/toolbar/ButtonDataImpl;-><init>(Landroid/graphics/drawable/Drawable;Landroid/view/View$OnClickListener;Ljava/lang/String;IZLorg/chromium/chrome/browser/user_education/IPHCommandBuilder;I)V
-Lorg/chromium/chrome/browser/toolbar/ButtonDataProvider;
-Lorg/chromium/chrome/browser/toolbar/ButtonDataProvider$ButtonDataObserver;
-Lorg/chromium/chrome/browser/toolbar/ConstraintsChecker;
-HSPLorg/chromium/chrome/browser/toolbar/ConstraintsChecker;-><init>(Lorg/chromium/ui/resources/dynamics/ViewResourceAdapter;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$ConstraintsProxy;Landroid/os/Looper;)V
-Lorg/chromium/chrome/browser/toolbar/ControlContainer;
-Lorg/chromium/chrome/browser/toolbar/HomeButton;
-HSPLorg/chromium/chrome/browser/toolbar/HomeButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/toolbar/HomeButton;->onLayout(ZIIII)V
-HSPLorg/chromium/chrome/browser/toolbar/HomeButton;->onMeasure(II)V
-HSPLorg/chromium/chrome/browser/toolbar/HomeButton;->updateContextMenuListener()V
-Lorg/chromium/chrome/browser/toolbar/HomeButton$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/HomeButton$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/HomeButton;)V
-HSPLorg/chromium/chrome/browser/toolbar/HomeButton$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/HomeButton$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/HomeButton$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/toolbar/HomeButton;)V
-Lorg/chromium/chrome/browser/toolbar/KeyboardNavigationListener;
-HSPLorg/chromium/chrome/browser/toolbar/KeyboardNavigationListener;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/LocationBarFocusScrimHandler;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarFocusScrimHandler;-><init>(Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$12;Landroid/content/Context;Lorg/chromium/chrome/browser/toolbar/LocationBarModel;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda13;Landroid/view/View;)V
-Lorg/chromium/chrome/browser/toolbar/LocationBarModel;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/omnibox/NewTabPageDelegate;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda5;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda5;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$1;Lorg/chromium/chrome/browser/omnibox/SearchEngineLogoUtils;)V
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->addObserver(Lorg/chromium/chrome/browser/omnibox/LocationBarDataProvider$Observer;)V
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->buildUrlBarData(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Lorg/chromium/chrome/browser/omnibox/UrlBarData;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getActiveWebContents()Lorg/chromium/content_public/browser/WebContents;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getCurrentGurl()Lorg/chromium/url/GURL;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getCurrentUrl()Ljava/lang/String;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getNewTabPageDelegate()Lorg/chromium/chrome/browser/omnibox/NewTabPageDelegate;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getPageClassification(ZZ)I
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getPrimaryColor()I
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getProfile()Lorg/chromium/chrome/browser/profiles/Profile;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getSecurityIconColorStateList()I
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getSecurityIconContentDescriptionResourceId()I
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getSecurityIconResource(Z)I
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getSecurityLevel()I
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getSecurityLevel(Lorg/chromium/chrome/browser/tab/Tab;Z)I
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getTab()Lorg/chromium/chrome/browser/tab/Tab;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->getUrlBarData()Lorg/chromium/chrome/browser/omnibox/UrlBarData;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->hasTab()Z
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->isInOverviewAndShowingOmnibox()Z
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->isIncognito()Z
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->isOfflinePage()Z
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->isPaintPreview()Z
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->isUsingBrandColor()Z
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->notifyPrimaryColorChanged()V
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->notifySecurityStateChanged()V
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->notifyTitleChanged()V
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->notifyUrlChanged()V
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->removeObserver(Lorg/chromium/chrome/browser/omnibox/LocationBarDataProvider$Observer;)V
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel;->updateUsingBrandColor()V
-Lorg/chromium/chrome/browser/toolbar/LocationBarModel$SpannableDisplayTextCacheKey;
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel$SpannableDisplayTextCacheKey;-><init>(Ljava/lang/String;Ljava/lang/String;IIIII)V
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel$SpannableDisplayTextCacheKey;->equals(Ljava/lang/Object;)Z
-HSPLorg/chromium/chrome/browser/toolbar/LocationBarModel$SpannableDisplayTextCacheKey;->hashCode()I
-Lorg/chromium/chrome/browser/toolbar/ProgressAnimationSmooth;
-HSPLorg/chromium/chrome/browser/toolbar/ProgressAnimationSmooth;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/SettableThemeColorProvider;
-HSPLorg/chromium/chrome/browser/toolbar/SettableThemeColorProvider;-><init>(Landroid/content/Context;)V
-Lorg/chromium/chrome/browser/toolbar/TabCountProvider;
-HSPLorg/chromium/chrome/browser/toolbar/TabCountProvider;-><init>()V
-HSPLorg/chromium/chrome/browser/toolbar/TabCountProvider;->addObserverAndTrigger(Lorg/chromium/chrome/browser/toolbar/TabCountProvider$TabCountObserver;)V
-HSPLorg/chromium/chrome/browser/toolbar/TabCountProvider;->updateTabCount()V
-Lorg/chromium/chrome/browser/toolbar/TabCountProvider$1;
-HSPLorg/chromium/chrome/browser/toolbar/TabCountProvider$1;-><init>(Lorg/chromium/chrome/browser/toolbar/TabCountProvider;)V
-PLorg/chromium/chrome/browser/toolbar/TabCountProvider$1;->onTabStateInitialized()V
-Lorg/chromium/chrome/browser/toolbar/TabCountProvider$2;
-HSPLorg/chromium/chrome/browser/toolbar/TabCountProvider$2;-><init>(Lorg/chromium/chrome/browser/toolbar/TabCountProvider;)V
-HSPLorg/chromium/chrome/browser/toolbar/TabCountProvider$2;->didAddTab(Lorg/chromium/chrome/browser/tab/Tab;IIZ)V
-PLorg/chromium/chrome/browser/toolbar/TabCountProvider$2;->restoreCompleted()V
-Lorg/chromium/chrome/browser/toolbar/TabCountProvider$TabCountObserver;
-Lorg/chromium/chrome/browser/toolbar/TabSwitcherDrawable;
-HSPLorg/chromium/chrome/browser/toolbar/TabSwitcherDrawable;-><init>(Landroid/content/Context;ILandroid/graphics/Bitmap;)V
-HSPLorg/chromium/chrome/browser/toolbar/TabSwitcherDrawable;->createTabSwitcherDrawable(Landroid/content/Context;I)Lorg/chromium/chrome/browser/toolbar/TabSwitcherDrawable;
-HSPLorg/chromium/chrome/browser/toolbar/TabSwitcherDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLorg/chromium/chrome/browser/toolbar/TabSwitcherDrawable;->onStateChange([I)Z
-HSPLorg/chromium/chrome/browser/toolbar/TabSwitcherDrawable;->setTint(Landroid/content/res/ColorStateList;)V
-HSPLorg/chromium/chrome/browser/toolbar/TabSwitcherDrawable;->updateForTabCount(IZ)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/base/supplier/Supplier;Landroid/widget/ImageButton;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController;->onPauseWithNative()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController;->onResumeWithNative()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController;->showDownloadPageTextBubble(Lorg/chromium/chrome/browser/tab/Tab;Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController;I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController$1;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController$1;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController$1;->handleIPHForSuccessfulPageLoad(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController$1;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarDataProvider;
-Lorg/chromium/chrome/browser/toolbar/ToolbarFeatures;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarFeatures;->shouldBlockCapturesForAblation()Z
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarFeatures;->shouldSuppressCaptures()Z
-Lorg/chromium/chrome/browser/toolbar/ToolbarIntentMetadata;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarIntentMetadata;-><init>(Z)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/fullscreen/FullscreenManager;Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer;Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;Lorg/chromium/chrome/browser/tab/TabObscuringHandler;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/identity_disc/IdentityDiscController;Ljava/util/List;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;Lorg/chromium/chrome/browser/toolbar/top/ToolbarActionModeCallback;Lorg/chromium/chrome/browser/findinpage/FindToolbarManager;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/supplier/OneshotSupplier;Lorg/chromium/base/supplier/OneshotSupplierImpl;ZLorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/supplier/OneshotSupplier;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/ui/system/StatusBarColorController;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuDelegate;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;Lorg/chromium/base/jank_tracker/JankTracker;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplier;Lorg/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl;Lorg/chromium/base/supplier/Supplier;ZLorg/chromium/chrome/browser/back_press/BackPressManager;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->checkIfNtpLoaded()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->getMenuButtonView()Landroid/widget/ImageButton;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->getNewTabPageForCurrentTab()Lorg/chromium/chrome/browser/ntp/NewTabPage;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->initializeWithNative(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda13;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda13;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda13;Lorg/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinator$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->isUrlBarFocused()Z
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->maybeShowCursorInLocationBar()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->onAccessibilityModeChanged(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->onBackPressStateChanged()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->onTabOrModelChanged()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->onThemeColorChanged(IZ)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->onTintChanged(Landroid/content/res/ColorStateList;I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->refreshSelectedTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->setUrlBarFocus(IZ)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->updateBookmarkButtonStatus()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->updateButtonStatus()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->updateForLayout(IZ)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager;->updateTabLoadingState(Z)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/tabmodel/IncognitoStateProvider;I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda1;->getAsBoolean()Z
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda10;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda10;-><init>(I)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda11;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda11;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda11;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda12;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda12;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda12;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda13;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda13;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda13;->run()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda14;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda14;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda14;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda15;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda15;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;Lorg/chromium/chrome/browser/identity_disc/IdentityDiscController;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda15;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda16;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda16;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda16;->getAsBoolean()Z
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda17;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda17;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda17;->onHomepageStateUpdated()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda18;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda18;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda19;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda19;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda2;-><init>(I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda2;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda3;-><init>(I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda3;->getAsBoolean()Z
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda4;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda4;-><init>(ILjava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda5;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda5;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda6;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda6;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda7;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda7;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;I)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda8;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda8;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;Lorg/chromium/base/supplier/Supplier;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda9;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda9;-><init>(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$1;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$1;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$10;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$10;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$10;->onFinishedHiding(I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$10;->onFinishedShowing(I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$10;->onStartedHiding(IZZ)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$10;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$11;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$11;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$12;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$12;-><init>(Lorg/chromium/chrome/browser/tab/TabObscuringHandler;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$12;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;Lorg/chromium/base/supplier/ObservableSupplier;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$12;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$13;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$13;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$13;->setSearchBoxScrollListener(Lorg/chromium/base/Callback;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$15;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$15;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$15;->onViewDetachedFromWindow(Landroid/view/View;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$16;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$16;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$2;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$2;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$4;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$4;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$4;->maybeTriggerCacheRefreshForZeroSuggest(Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$4;->onDidFinishNavigationInPrimaryMainFrame(Lorg/chromium/chrome/browser/tab/TabImpl;Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$4;->onLoadStopped(Lorg/chromium/chrome/browser/tab/TabImpl;Z)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$4;->onObservingDifferentTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$4;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$4;->onSSLStateUpdated(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$4;->onTitleUpdated(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$4;->onUrlUpdated(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$5;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$5;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-PLorg/chromium/chrome/browser/toolbar/ToolbarManager$5;->onTabStateInitialized()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$6;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$6;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$6;->bookmarkModelChanged()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$7;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$7;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$8;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$8;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$9;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$9;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$ConstraintsProxy;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$ConstraintsProxy;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarManager$ToolbarNtpDelegate;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$ToolbarNtpDelegate;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$ToolbarNtpDelegate;->isCurrentlyVisible()Z
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$ToolbarNtpDelegate;->isLocationBarShown()Z
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$ToolbarNtpDelegate;->setSearchBoxScrollListener(Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$ToolbarNtpDelegate;->setUrlFocusChangeAnimationPercent(F)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarManager$ToolbarNtpDelegate;->wasShowingNtp()Z
-Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;-><init>(ILandroid/content/Context;Landroid/view/View;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->animateAlphaTo(F)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->finish(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->getAccessibilityClassName()Ljava/lang/CharSequence;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->initializeAnimation()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->onAttachedToWindow()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->onDetachedFromWindow()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->onSizeChanged(IIII)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->setAlpha(F)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->setForegroundColor(I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->setProgress(F)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->setVisibility(I)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->start()V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;->updateTopMargin()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBar$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar$$ExternalSyntheticLambda0;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBar$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBar$1;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar$1;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBar$2;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBar$2;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView;-><init>(Landroid/content/Context;Landroid/widget/FrameLayout$LayoutParams;)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView;->updateAnimation(Landroid/animation/ValueAnimator;F)V
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView;->updateAnimationDuration()V
-Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView$1;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView$1;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView$ProgressBarUpdateListener;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView$ProgressBarUpdateListener;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView;)V
-Lorg/chromium/chrome/browser/toolbar/ToolbarTabControllerImpl;
-HSPLorg/chromium/chrome/browser/toolbar/ToolbarTabControllerImpl;-><init>(Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda12;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda12;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda12;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda13;Lorg/chromium/base/supplier/Supplier;)V
-Lorg/chromium/chrome/browser/toolbar/VoiceToolbarButtonController;
-HSPLorg/chromium/chrome/browser/toolbar/VoiceToolbarButtonController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Landroid/graphics/drawable/Drawable;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/ui/modaldialog/ModalDialogManager;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$4;)V
-HSPLorg/chromium/chrome/browser/toolbar/VoiceToolbarButtonController;->shouldShowButton(Lorg/chromium/chrome/browser/tab/Tab;)Z
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator;Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController$$ExternalSyntheticLambda1;)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarBridge;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarBridge;->createResult(ZI)Ljava/lang/Object;
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarBridge$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarBridge$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor$$ExternalSyntheticLambda1;)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarBridge$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/settings/SettingsLauncherImpl;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/preferences/SharedPreferencesManager;)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;->addButtonVariant(ILorg/chromium/chrome/browser/toolbar/BaseButtonDataProvider;)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;->addObserver(Lorg/chromium/chrome/browser/toolbar/ButtonDataProvider$ButtonDataObserver;)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;->destroy()V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;->get(Lorg/chromium/chrome/browser/tab/Tab;)Lorg/chromium/chrome/browser/toolbar/ButtonDataImpl;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;->notifyObservers(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;->onFinishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;->onPreferenceChanged(Ljava/lang/String;)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;->removeObserver(Lorg/chromium/chrome/browser/toolbar/ButtonDataProvider$ButtonDataObserver;)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;->setSingleProvider(I)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;I)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController$$ExternalSyntheticLambda1;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/settings/SettingsLauncherImpl;)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController$1;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController$1;-><init>(Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController;)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures;->getSegmentationDefault()I
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures;->isCustomizationEnabled()Z
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures;->isReaderModePageActionEnabled()Z
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor;-><init>(Lorg/chromium/ui/permissions/AndroidPermissionDelegate;)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor;->isValidSegment(I)Z
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor;->recomputeUiState(Lorg/chromium/base/Callback;)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor;ZIIZLorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor$UiState;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor$UiState;-><init>(IIIZ)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStats$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStats$$ExternalSyntheticLambda1;-><init>()V
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStats$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonController;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Landroid/graphics/drawable/Drawable;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;)V
-Lorg/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonController$Delegate;
-HSPLorg/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonController$Delegate;-><init>(Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/ui/base/WindowAndroid;Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;Lorg/chromium/ui/resources/ResourceManager;Lorg/chromium/chrome/browser/browser_controls/BrowserControlsSizer;Lorg/chromium/chrome/browser/fullscreen/FullscreenManager;Lorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout;Lorg/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator;Lorg/chromium/chrome/browser/tab/TabObscuringHandler;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$ConstraintsProxy;)V
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator;->getHandleBackPressChangedSupplier()Lorg/chromium/base/supplier/ObservableSupplier;
-Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda0;-><init>(I)V
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda0;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator;)V
-Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout;)V
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsCoordinator$$ExternalSyntheticLambda2;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator;
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator;-><init>(Lorg/chromium/ui/base/WindowAndroid;Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/browser/browser_controls/BrowserControlsSizer;Lorg/chromium/chrome/browser/fullscreen/FullscreenManager;Lorg/chromium/chrome/browser/tab/TabObscuringHandler;ILorg/chromium/base/supplier/ObservableSupplierImpl;)V
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator;->isCompositedViewVisible()Z
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator;->onStartedShowing(IZ)V
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator;->updateAndroidViewVisibility()V
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator;->updateCompositedViewVisibility()V
-Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator;)V
-Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsProperties;
-Lorg/chromium/chrome/browser/toolbar/bottom/BottomControlsViewBinder$ViewHolder;
-HSPLorg/chromium/chrome/browser/toolbar/bottom/BottomControlsViewBinder$ViewHolder;-><init>(Lorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout;Lorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer;)V
-Lorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout;
-HSPLorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout;->createResourceAdapter()Lorg/chromium/ui/resources/dynamics/ViewResourceAdapter;
-Lorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout$1;
-HSPLorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout$1;-><init>(Lorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout;Landroid/view/View;)V
-Lorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer;
-HSPLorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer;-><init>(Lorg/chromium/components/browser_ui/widget/ViewResourceFrameLayout;I)V
-HSPLorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer;->initializeNative()V
-HSPLorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer;->isSceneOverlayTreeShowing()Z
-HSPLorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer;->onSizeChanged(FFFI)V
-HSPLorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer;->shouldHideAndroidBrowserControls()Z
-HSPLorg/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer;->updateOverlay(J)Z
-Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressCoordinator;-><init>(Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/toolbar/ToolbarProgressBar;Z)V
-Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressViewBinder;)V
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressCoordinator$$ExternalSyntheticLambda0;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator;
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator;-><init>(Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/ui/modelutil/PropertyModel;Z)V
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator;->finishLoadProgress(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator;->onNewTabObserved(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator;->updateLoadProgress(F)V
-Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator;)V
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator$1;
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator$1;-><init>(Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator;)V
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator$1;->onLoadProgressChanged(Lorg/chromium/chrome/browser/tab/Tab;F)V
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator$1;->onLoadStopped(Lorg/chromium/chrome/browser/tab/TabImpl;Z)V
-Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressProperties;
-Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressSimulator;
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressSimulator;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;)V
-Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressSimulator$1;
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressSimulator$1;-><init>(Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressSimulator;Landroid/os/Looper;)V
-Lorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressViewBinder;
-HSPLorg/chromium/chrome/browser/toolbar/load_progress/LoadProgressViewBinder;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButton;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButton;->onFinishInflate()V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButton;->onLayout(ZIIII)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButton;->onTintChanged(Landroid/content/res/ColorStateList;I)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButton;->setOnKeyListener(Landroid/view/View$OnKeyListener;)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButton;->updateImageResources()V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButton;->updateMenuButtonHighlightDrawable()V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator;-><init>(Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda7;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda0;ZLorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/theme/ThemeColorProvider;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda6;I)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator;->destroy()V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator;)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator;)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$$ExternalSyntheticLambda1;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator;)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$$ExternalSyntheticLambda2;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$SetFocusFunction;
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;ZLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/theme/ThemeColorProvider;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda7;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda6;)V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator;)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator$$ExternalSyntheticLambda0;->onTintChanged(Landroid/content/res/ColorStateList;I)V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator;)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator$$ExternalSyntheticLambda2;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties;
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties$ShowBadgeProperty;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties$ShowBadgeProperty;-><init>(ZZ)V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties$ThemeProperty;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties$ThemeProperty;-><init>(Landroid/content/res/ColorStateList;I)V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonState;
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder;-><init>()V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder;->bind(Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButton;Lorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;)V
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/menu_button/MenuUiState;
-HSPLorg/chromium/chrome/browser/toolbar/menu_button/MenuUiState;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/optional_button/OptionalButtonCoordinator;
-Lorg/chromium/chrome/browser/toolbar/top/ActionModeController;
-HSPLorg/chromium/chrome/browser/toolbar/top/ActionModeController;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/toolbar/top/ViewShiftingActionBarDelegate;Lorg/chromium/chrome/browser/toolbar/top/ToolbarActionModeCallback;)V
-Lorg/chromium/chrome/browser/toolbar/top/ActionModeController$1;
-HSPLorg/chromium/chrome/browser/toolbar/top/ActionModeController$1;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/top/CaptureReadinessResult;
-HSPLorg/chromium/chrome/browser/toolbar/top/CaptureReadinessResult;-><init>(IIIZ)V
-HSPLorg/chromium/chrome/browser/toolbar/top/CaptureReadinessResult;->logCaptureReasonFromResult(Lorg/chromium/chrome/browser/toolbar/top/CaptureReadinessResult;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/CaptureReadinessResult;->notReady(I)Lorg/chromium/chrome/browser/toolbar/top/CaptureReadinessResult;
-Lorg/chromium/chrome/browser/toolbar/top/HomeButtonCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/top/HomeButtonCoordinator;-><init>(Landroidx/appcompat/app/AppCompatActivity;Landroid/view/View;Lorg/chromium/chrome/browser/user_education/UserEducationHelper;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda1;Lorg/chromium/base/supplier/OneshotSupplier;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda3;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/HomeButtonCoordinator;->handlePageLoadFinished(Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/toolbar/top/HomeButtonCoordinator$1;
-HSPLorg/chromium/chrome/browser/toolbar/top/HomeButtonCoordinator$1;-><init>(Lorg/chromium/chrome/browser/toolbar/top/HomeButtonCoordinator;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/HomeButtonCoordinator$1;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController;
-HSPLorg/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController;-><init>(Ljava/util/List;Lorg/chromium/chrome/browser/user_education/UserEducationHelper;Lorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;Lorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda1;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController;->showHighestPrecedenceOptionalButton()V
-Lorg/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController;Lorg/chromium/chrome/browser/toolbar/ButtonDataProvider;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController$$ExternalSyntheticLambda0;->buttonDataChanged(Z)V
-Lorg/chromium/chrome/browser/toolbar/top/PhoneCaptureStateToken;
-HSPLorg/chromium/chrome/browser/toolbar/top/PhoneCaptureStateToken;-><init>(IILorg/chromium/chrome/browser/toolbar/ButtonDataImpl;ILorg/chromium/chrome/browser/toolbar/top/VisibleUrlText;ILandroid/content/res/ColorStateList;ZZI)V
-Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceTabSwitcherActionMenuCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceTabSwitcherActionMenuCoordinator;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator;-><init>(Landroid/view/ViewStub;Lorg/chromium/chrome/browser/user_education/UserEducationHelper;Lorg/chromium/chrome/browser/toolbar/ButtonDataProvider;Lorg/chromium/chrome/browser/toolbar/AppThemeColorProvider;Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda15;ZZZLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda3;Lorg/chromium/base/CallbackController$CancelableCallback;ZZLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/toolbar/top/ToolbarColorObserverManager;)V
-Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator;Lorg/chromium/chrome/browser/user_education/UserEducationHelper;)V
-Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator;)V
-Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator;
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator;-><init>(Landroid/content/Context;Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator$$ExternalSyntheticLambda0;ZLorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator;Lorg/chromium/chrome/browser/toolbar/ButtonDataProvider;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda15;ZZZLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda3;Lorg/chromium/base/CallbackController$CancelableCallback;ZZZLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda2;Lorg/chromium/chrome/browser/toolbar/top/ToolbarColorObserverManager;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator;->buttonDataChanged(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator;->isOnGridTabSwitcher()Z
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator;->updateIdentityDisc(Lorg/chromium/chrome/browser/toolbar/ButtonDataImpl;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator;->updateNewTabViewTextVisibility()V
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator;->updateNewTabViewVisibility()V
-Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator$1;
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator$1;-><init>(Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator;)V
-PLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator$1;->onTabStateInitialized()V
-Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator$2;
-HSPLorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator$2;-><init>(Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator;)V
-Lorg/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties;
-Lorg/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuCoordinator;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuCoordinator;Lorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda0;)V
-Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButton;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButton;->onFinishInflate()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButton;->onLayout(ZIIII)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButton;->onMeasure(II)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButton;->onTabCountChanged(IZ)V
-Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButton;Lorg/chromium/chrome/browser/user_education/UserEducationHelper;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda1;Lorg/chromium/base/supplier/OneshotSupplier;Lorg/chromium/base/supplier/OneshotSupplier;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator;I)V
-Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$1;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$1;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$1;->onPageLoadFinished(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$2;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$2;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$2;->onStartedHiding(IZZ)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator$2;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/toolbar/top/Toolbar;
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarActionModeCallback;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarActionModeCallback;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarColorObserverManager;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarColorObserverManager;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarColorObserverManager;->notifyToolbarColorChanged()V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer;->gatherTransparentRegion(Landroid/graphics/Region;)Z
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer;->initWithToolbar(I)V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer;)V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$SwipeGestureListenerImpl;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$SwipeGestureListenerImpl;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer;Landroid/content/Context;Lorg/chromium/components/browser_ui/widget/gesture/SwipeGestureListener$SwipeHandler;)V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceAdapter;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceAdapter;-><init>(Landroid/view/View;Z)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceAdapter;->createNativeResource()J
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceAdapter;->isDirty()Z
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceAdapter;->onCaptureEnd()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceAdapter;->onCaptureStart(Landroid/graphics/Canvas;Landroid/graphics/Rect;)V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceAdapter$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceAdapter$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceAdapter;)V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceFrameLayout;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceFrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceFrameLayout;->createResourceAdapter()Lorg/chromium/ui/resources/dynamics/ViewResourceAdapter;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer$ToolbarViewResourceFrameLayout;->isReadyForCapture()Z
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->destroy()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->draw(Landroid/graphics/Canvas;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->getTabStripHeight()I
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->initialize(Lorg/chromium/chrome/browser/toolbar/LocationBarModel;Lorg/chromium/chrome/browser/toolbar/ToolbarTabControllerImpl;Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda5;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda16;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda5;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->isIncognito()Z
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->onAttachedToWindow()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->onDraw(Landroid/graphics/Canvas;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->onFinishInflate()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->onLayout(ZIIII)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->onMeasure(II)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->onNativeLibraryReady$1()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->onNavigatedToDifferentPage()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->onThemeColorChanged(IZ)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->setBookmarkClickHandler(Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda13;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->setCustomTabCloseClickHandler(Lorg/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinator$$ExternalSyntheticLambda2;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->setVisibility(I)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->updateBackButtonVisibility(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->updateBookmarkButton(ZZ)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->updateForwardButtonVisibility(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;->updateReloadButtonVisibility(Z)V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarLayout$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarLayout$1;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout$1;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarLayout$2;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarLayout$2;-><init>()V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->destroy()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->dispatchDraw(Landroid/graphics/Canvas;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->draw(Landroid/graphics/Canvas;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->drawLocationBar(Landroid/graphics/Canvas;J)Z
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->finishAnimations()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->generateToolbarSnapshotState()Lorg/chromium/chrome/browser/toolbar/top/PhoneCaptureStateToken;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getBoundsAfterAccountingForLeftButton()I
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getBoundsAfterAccountingForRightButtons()I
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getHomeButton()Lorg/chromium/chrome/browser/toolbar/HomeButton;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getLocationBar()Lorg/chromium/chrome/browser/omnibox/LocationBar;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getLocationBarColorForToolbarColor(I)I
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getLocationBarContentRect(Landroid/graphics/Rect;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getLocationBarDefaultColorForToolbarColor(I)I
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getToolbarColorForVisualState(I)I
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getToolbarDefaultColor()I
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getViewBoundsLeftOfLocationBar(I)I
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->getViewBoundsRightOfLocationBar(I)I
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->hideOptionalButton()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->isLocationBarShownInNTP()Z
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->isReadyForTextureCapture()Lorg/chromium/chrome/browser/toolbar/top/CaptureReadinessResult;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->layoutLocationBarWithoutAnimationExpansion(I)Z
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onAttachedToWindow()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onFinishInflate()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onHomeButtonUpdate(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onMeasure(II)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onNativeLibraryReady$1()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onPrimaryColorChanged(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onSizeChanged(IIII)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onStateRestored()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onTabCountChanged(IZ)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onTabOrModelChanged()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onTintChanged(Landroid/content/res/ColorStateList;I)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->onWindowVisibilityChanged(I)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->resetNtpAnimationValues()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->setBrowserControlsVisibilityDelegate(Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->setContentAttached()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->setForceTextureCapture(Z)Z
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->setLayoutUpdater(Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->setLocationBarCoordinator(Lorg/chromium/chrome/browser/omnibox/LocationBarCoordinator;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->setOnTabSwitcherClickHandler(Landroid/view/View$OnClickListener;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->setOnTabSwitcherLongClickHandler(Landroid/view/View$OnLongClickListener;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->setTabCountProvider(Lorg/chromium/chrome/browser/toolbar/TabCountProvider;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->setTextureCaptureMode(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateButtonVisibility()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateLocationBarBackgroundBounds(ILandroid/graphics/Rect;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateLocationBarLayoutForExpansionAnimation()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateModernLocationBarColor(I)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateNtpAnimationState()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateProgressBarVisibility()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateShadowVisibility()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateToolbarBackground(I)V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateUnfocusedLocationBarLayoutParams()Z
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateUrlExpansionAnimation()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateUrlExpansionFraction()V
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;->updateVisualsForLocationBarState()V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarPhone$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;I)V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarPhone$1;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone$1;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;)V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarPhone$2;
-HSPLorg/chromium/chrome/browser/toolbar/top/ToolbarPhone$2;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToolbarPhone;I)V
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarPhone$NtpSearchBoxDrawable;
-Lorg/chromium/chrome/browser/toolbar/top/ToolbarTablet;
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator;-><init>(Lorg/chromium/chrome/browser/toolbar/top/ToolbarControlContainer;Landroid/view/ViewStub;Lorg/chromium/chrome/browser/toolbar/top/ToolbarLayout;Lorg/chromium/chrome/browser/toolbar/LocationBarModel;Lorg/chromium/chrome/browser/toolbar/ToolbarTabControllerImpl;Lorg/chromium/chrome/browser/user_education/UserEducationHelper;Ljava/util/List;Lorg/chromium/chrome/browser/theme/ThemeColorProvider;Lorg/chromium/chrome/browser/toolbar/AppThemeColorProvider;Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator;Lorg/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/toolbar/ButtonDataProvider;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda15;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda14;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda3;ZZZZZLorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda5;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda16;Lorg/chromium/chrome/browser/toolbar/ToolbarManager$$ExternalSyntheticLambda5;ZLorg/chromium/base/CallbackController$CancelableCallback;ZLorg/chromium/chrome/browser/toolbar/ToolbarManager$ConstraintsProxy;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate;Z)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator;->finishAnimations()V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator;->setTabCountProvider(Lorg/chromium/chrome/browser/toolbar/TabCountProvider;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator;->updateButtonVisibility()V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator;->updateReloadButtonVisibility(Z)V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/toolbar/LocationBarModel;I)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda1;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator;I)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$$ExternalSyntheticLambda2;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$ToolbarColorObserver;
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator$UrlExpansionObserver;
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarInteractabilityManager;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarInteractabilityManager;-><init>(Lorg/chromium/chrome/browser/toolbar/top/TopToolbarInteractabilityManager$Delegate;)V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarInteractabilityManager$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarInteractabilityManager$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/top/TopToolbarInteractabilityManager;)V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarInteractabilityManager$Delegate;
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/layouts/LayoutManagerProvider$Unowned;Lorg/chromium/base/Callback;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/browser_controls/BrowserControlsSizer;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;IZ)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator;->getUpdatedSceneOverlayTree(Landroid/graphics/RectF;Lorg/chromium/ui/resources/ResourceManager;F)Lorg/chromium/chrome/browser/layouts/scene_layer/SceneOverlayLayer;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator;->isSceneOverlayTreeShowing()Z
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator;->onSizeChanged(FFFI)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator;->setManualVisibility(Z)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator;->shouldHideAndroidBrowserControls()Z
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator;->updateOverlay(J)Z
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator$$ExternalSyntheticLambda0;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;Landroid/content/Context;Lorg/chromium/chrome/browser/layouts/LayoutStateProvider;Lorg/chromium/base/Callback;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/browser_controls/BrowserControlsSizer;Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;IZ)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator;->updateProgress()V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator;->updateShadowState()V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator;->updateThemeColor(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator;->updateVisibility()V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$1;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$1;-><init>(Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator;I)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$1;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$2;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$2;-><init>(Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$2;->onLoadProgressChanged(Lorg/chromium/chrome/browser/tab/Tab;F)V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$3;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator$3;-><init>(Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator;)V
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarOverlayProperties;
-Lorg/chromium/chrome/browser/toolbar/top/TopToolbarSceneLayer;
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarSceneLayer;-><init>(Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarSceneLayer;->destroy()V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarSceneLayer;->initializeNative()V
-HSPLorg/chromium/chrome/browser/toolbar/top/TopToolbarSceneLayer;->setContentTree(Lorg/chromium/chrome/browser/layouts/scene_layer/SceneLayer;)V
-Lorg/chromium/chrome/browser/toolbar/top/ViewShiftingActionBarDelegate;
-HSPLorg/chromium/chrome/browser/toolbar/top/ViewShiftingActionBarDelegate;-><init>(Landroidx/appcompat/app/ActionBar;Landroid/view/View;Landroid/view/View;)V
-Lorg/chromium/chrome/browser/toolbar/top/VisibleUrlText;
-HSPLorg/chromium/chrome/browser/toolbar/top/VisibleUrlText;-><init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V
-Lorg/chromium/chrome/browser/translate/TranslateUtils;
-HSPLorg/chromium/chrome/browser/translate/TranslateUtils;->canTranslateCurrentTab(Lorg/chromium/chrome/browser/tab/Tab;Z)Z
-Lorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker;
-HSPLorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker;-><init>(Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlockerFactory;)V
-HSPLorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker;->recordBlockDrawForInitialTabHistograms(ZZ)V
-Lorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker;)V
-HSPLorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$1;
-HSPLorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$1;-><init>(Lorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker;)V
-HSPLorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$1;->onPostInflationStartup()V
-HSPLorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$1;->onPreInflationStartup()V
-Lorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$2;
-HSPLorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$2;-><init>(Lorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker;)V
-HSPLorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$2;->onStartWithNative()V
-HSPLorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$2;->onStopWithNative()V
-Lorg/chromium/chrome/browser/ui/BottomContainer;
-HSPLorg/chromium/chrome/browser/ui/BottomContainer;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/browser/ui/BottomContainer;->setTranslationY(F)V
-Lorg/chromium/chrome/browser/ui/BottomContainer$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ui/BottomContainer$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/ui/BottomContainer;)V
-HSPLorg/chromium/chrome/browser/ui/BottomContainer$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/ui/BottomSheetManager;
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager;-><init>(Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/chrome/browser/tab/TabObscuringHandler;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/base/supplier/OneshotSupplier;Lorg/chromium/base/supplier/OneshotSupplier;Z)V
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager;->onDestroy()V
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager;->setActivityTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager;->updateSuppressionForTabSwitcher(Lorg/chromium/chrome/browser/tab/Tab;Ljava/lang/Integer;Ljava/lang/Integer;)V
-Lorg/chromium/chrome/browser/ui/BottomSheetManager$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/ui/BottomSheetManager;I)V
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/ui/BottomSheetManager$1;
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager$1;-><init>(Lorg/chromium/chrome/browser/ui/BottomSheetManager;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;)V
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/ui/BottomSheetManager$2;
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager$2;-><init>(Lorg/chromium/chrome/browser/ui/BottomSheetManager;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;)V
-Lorg/chromium/chrome/browser/ui/BottomSheetManager$3;
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager$3;-><init>(Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;)V
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager$3;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/ui/BottomSheetManager$4;
-HSPLorg/chromium/chrome/browser/ui/BottomSheetManager$4;-><init>(Lorg/chromium/chrome/browser/ui/BottomSheetManager;Lorg/chromium/chrome/features/start_surface/StartSurface;)V
-Lorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker;
-HSPLorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker;->-$$Nest$mmaybeUnblockDraw(Lorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker;)V
-HSPLorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker;-><init>(Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/ui/AppLaunchDrawBlocker$$ExternalSyntheticLambda0;)V
-Lorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker;)V
-HSPLorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker$1;
-HSPLorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker$1;-><init>(Lorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker;)V
-HSPLorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker$1;->onFinishNativeInitialization()V
-Lorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker$2;
-HSPLorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker$2;-><init>(Lorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker;)V
-HSPLorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker$2;->onTabStateInitialized()V
-Lorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlockerFactory;
-HSPLorg/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlockerFactory;-><init>(Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier;)V
-Lorg/chromium/chrome/browser/ui/MediaCaptureOverlayController;
-HSPLorg/chromium/chrome/browser/ui/MediaCaptureOverlayController;-><init>(Lorg/chromium/ui/base/ActivityWindowAndroid;Landroid/view/View;)V
-Lorg/chromium/chrome/browser/ui/MediaCaptureOverlayController$CaptureOverlayTabObserver;
-HSPLorg/chromium/chrome/browser/ui/MediaCaptureOverlayController$CaptureOverlayTabObserver;-><init>(Lorg/chromium/chrome/browser/ui/MediaCaptureOverlayController;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda11;Lorg/chromium/chrome/browser/share/ShareDelegateSupplier;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplier;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/base/jank_tracker/JankTracker;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/components/browser_ui/widget/MenuOrKeyboardActionController;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuBlocker;Ljava/util/function/BooleanSupplier;Ljava/util/function/BooleanSupplier;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManagerSupplier;Lorg/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/base/supplier/Supplier;ILorg/chromium/base/supplier/Supplier;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuDelegate;Lorg/chromium/chrome/browser/ui/system/StatusBarColorController$StatusBarColorProvider;Lorg/chromium/ui/base/IntentRequestTrackerImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/Supplier;ZLorg/chromium/chrome/browser/back_press/BackPressManager;)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->getPrimaryDisplaySizeInInches()D
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->initializeToolbar()V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->onDestroy()V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->onFinishNativeInitialization()V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->onInflationComplete()V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->onLayoutManagerAvailable(Lorg/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl;)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->onPostInflationStartup()V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->onPreInflationStartup()V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->setLayoutStateProvider(Lorg/chromium/chrome/browser/layouts/LayoutStateProvider;)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->shouldAllowBrightThemeColors()Z
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator;->shouldAllowThemingInNightMode()Z
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;->get()Ljava/lang/Object;
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda2;-><init>(ILjava/lang/Object;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda3;-><init>(Lorg/chromium/chrome/browser/toolbar/VoiceToolbarButtonController;)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda3;->onVoiceAvailabilityImpacted()V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda4;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda4;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda5;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda5;-><init>(I)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$1;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$1;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$10;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$10;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$11;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$11;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$12;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$12;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$2;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$2;-><init>(Landroid/view/ViewGroup;)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$2;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$3;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$3;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$4;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$4;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$5;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$5;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$8;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$8;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$8;->onFinishedHiding(I)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$8;->onFinishedShowing(I)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$8;->onStartedHiding(IZZ)V
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$8;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/ui/RootUiCoordinator$9;
-HSPLorg/chromium/chrome/browser/ui/RootUiCoordinator$9;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator;)V
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenu;
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenuBlocker;
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenuButtonHelper;
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenuButtonHelperImpl;
-HSPLorg/chromium/chrome/browser/ui/appmenu/AppMenuButtonHelperImpl;-><init>(Lorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;)V
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenuClickHandler;
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl;
-HSPLorg/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/toolbar/ToolbarManager;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuDelegate;Landroid/view/View;Landroid/view/View;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;)V
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenuDelegate;
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenuHandler;
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;
-HSPLorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate;Lorg/chromium/chrome/browser/ui/appmenu/AppMenuDelegate;Landroid/view/View;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Landroid/view/View;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;)V
-HSPLorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;->hideAppMenu()V
-HSPLorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;->onStartWithNative()V
-HSPLorg/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl;->onStopWithNative()V
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenuObserver;
-Lorg/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate;
-Lorg/chromium/chrome/browser/ui/appmenu/MenuButtonDelegate;
-Lorg/chromium/chrome/browser/ui/favicon/FaviconHelper;
-HSPLorg/chromium/chrome/browser/ui/favicon/FaviconHelper;-><init>()V
-HSPLorg/chromium/chrome/browser/ui/favicon/FaviconHelper;->getLocalFaviconImageForURL(Lorg/chromium/chrome/browser/profiles/Profile;Ljava/lang/String;ILorg/chromium/chrome/browser/ui/favicon/FaviconHelper$FaviconImageCallback;)Z
-Lorg/chromium/chrome/browser/ui/favicon/FaviconHelper$FaviconImageCallback;
-Lorg/chromium/chrome/browser/ui/favicon/FaviconUtils;
-HSPLorg/chromium/chrome/browser/ui/favicon/FaviconUtils;->createCircularIconGenerator(Landroid/content/Context;)Lorg/chromium/components/browser_ui/widget/RoundedIconGenerator;
-HSPLorg/chromium/chrome/browser/ui/favicon/FaviconUtils;->createRoundedBitmapDrawable(Landroid/content/res/Resources;Landroid/graphics/Bitmap;)Landroidx/core/graphics/drawable/RoundedBitmapDrawable21;
-Lorg/chromium/chrome/browser/ui/messages/snackbar/Snackbar;
-Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarCollection;
-HSPLorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarCollection;-><init>()V
-HSPLorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarCollection;->getCurrent()Lorg/chromium/chrome/browser/ui/messages/snackbar/Snackbar;
-HSPLorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarCollection;->removeSnackbarFromList(Ljava/util/LinkedList;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager$SnackbarController;)Z
-Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;
-HSPLorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;-><init>(Landroid/app/Activity;Landroid/view/ViewGroup;Lorg/chromium/ui/base/ActivityWindowAndroid;)V
-HSPLorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;->dismissSnackbars(Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager$SnackbarController;)V
-HSPLorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;->onActivityStateChange(Landroid/app/Activity;I)V
-HSPLorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;->updateView()V
-Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager$1;
-HSPLorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager$1;-><init>(Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;)V
-Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager$SnackbarController;
-Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager$SnackbarManageable;
-Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManagerProvider;
-HSPLorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManagerProvider;->from(Lorg/chromium/ui/base/WindowAndroid;)Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;
-Lorg/chromium/chrome/browser/ui/native_page/NativePage;
-HSPLorg/chromium/chrome/browser/ui/native_page/NativePage;->isNativePageUrl(Lorg/chromium/url/GURL;Z)Z
-HSPLorg/chromium/chrome/browser/ui/native_page/NativePage;->nativePageType(Ljava/lang/String;Lorg/chromium/chrome/browser/ui/native_page/NativePage;Z)I
-Lorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager;
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager;-><init>()V
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager;->get()Lorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager;
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager;->initializeFromCache()V
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager;->onTemplateURLServiceChanged()V
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager;->onTemplateUrlServiceLoaded()V
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager;->setCurrentlyLoadedPreferences(Lorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager$SearchActivityPreferences;Z)V
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager;->updateDefaultSearchEngineInfo()V
-Lorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager$$ExternalSyntheticLambda0;-><init>(ZLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager$SearchActivityPreferences;Lorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager;)V
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager$SearchActivityPreferences;
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager$SearchActivityPreferences;-><init>(Ljava/lang/String;Ljava/lang/String;ZZZ)V
-HSPLorg/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager$SearchActivityPreferences;->equals(Ljava/lang/Object;)Z
-Lorg/chromium/chrome/browser/ui/system/StatusBarColorController;
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController;-><init>(Landroid/view/Window;ZLandroidx/appcompat/app/AppCompatActivity;Lorg/chromium/chrome/browser/ui/system/StatusBarColorController$StatusBarColorProvider;Lorg/chromium/base/supplier/ObservableSupplierImpl;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/theme/TopUiThemeColorProvider;)V
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController;->calculateDefaultStatusBarColor()I
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController;->isStandardNTP()Z
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController;->onDestroy()V
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController;->onToolbarColorChanged(I)V
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController;->setStatusBarColor(Landroid/view/Window;I)V
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController;->updateStatusBarColor()V
-Lorg/chromium/chrome/browser/ui/system/StatusBarColorController$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/ui/system/StatusBarColorController;)V
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/ui/system/StatusBarColorController$1;
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController$1;-><init>(Lorg/chromium/chrome/browser/ui/system/StatusBarColorController;Lorg/chromium/chrome/browser/ActivityTabProvider;)V
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController$1;->onDestroyed(Lorg/chromium/chrome/browser/tab/Tab;)V
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController$1;->onObservingDifferentTab(Lorg/chromium/chrome/browser/tab/Tab;)V
-Lorg/chromium/chrome/browser/ui/system/StatusBarColorController$2;
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController$2;-><init>(Lorg/chromium/chrome/browser/ui/system/StatusBarColorController;)V
-Lorg/chromium/chrome/browser/ui/system/StatusBarColorController$3;
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController$3;-><init>(Lorg/chromium/chrome/browser/ui/system/StatusBarColorController;)V
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController$3;->onFinishedHiding(I)V
-HSPLorg/chromium/chrome/browser/ui/system/StatusBarColorController$3;->onStartedShowing(IZ)V
-Lorg/chromium/chrome/browser/ui/system/StatusBarColorController$StatusBarColorProvider;
-Lorg/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController;
-HSPLorg/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda8;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;)V
-Lorg/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController$1;
-HSPLorg/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController$1;-><init>(Lorg/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda4;Landroid/content/Context;)V
-HSPLorg/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController$1;->allTabsClosureCommitted(Z)V
-HSPLorg/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController$1;->disableUndo(Z)Z
-Lorg/chromium/chrome/browser/usage_stats/DigitalWellbeingClient;
-HSPLorg/chromium/chrome/browser/usage_stats/DigitalWellbeingClient;-><init>()V
-Lorg/chromium/chrome/browser/usage_stats/EventTracker;
-HSPLorg/chromium/chrome/browser/usage_stats/EventTracker;-><init>(Lorg/chromium/chrome/browser/usage_stats/UsageStatsBridge;)V
-Lorg/chromium/chrome/browser/usage_stats/EventTracker$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/usage_stats/EventTracker$$ExternalSyntheticLambda1;-><init>(I)V
-Lorg/chromium/chrome/browser/usage_stats/EventTracker$$ExternalSyntheticLambda2;
-HSPLorg/chromium/chrome/browser/usage_stats/EventTracker$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/chrome/browser/usage_stats/EventTracker;)V
-HSPLorg/chromium/chrome/browser/usage_stats/EventTracker$$ExternalSyntheticLambda2;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/usage_stats/NotificationSuspender;
-HSPLorg/chromium/chrome/browser/usage_stats/NotificationSuspender;-><init>(Lorg/chromium/chrome/browser/profiles/Profile;)V
-Lorg/chromium/chrome/browser/usage_stats/PageViewObserver;
-HSPLorg/chromium/chrome/browser/usage_stats/PageViewObserver;-><init>(Landroid/app/Activity;Lorg/chromium/base/supplier/ObservableSupplier;Lorg/chromium/chrome/browser/usage_stats/EventTracker;Lorg/chromium/chrome/browser/usage_stats/TokenTracker;Lorg/chromium/chrome/browser/usage_stats/SuspensionTracker;Lorg/chromium/base/supplier/ObservableSupplierImpl;)V
-HSPLorg/chromium/chrome/browser/usage_stats/PageViewObserver;->checkSuspendedTabState(Ljava/lang/String;Z)Z
-HSPLorg/chromium/chrome/browser/usage_stats/PageViewObserver;->didFirstVisuallyNonEmptyPaint(Lorg/chromium/chrome/browser/tab/TabImpl;)V
-HSPLorg/chromium/chrome/browser/usage_stats/PageViewObserver;->onHidden(Lorg/chromium/chrome/browser/tab/Tab;I)V
-HSPLorg/chromium/chrome/browser/usage_stats/PageViewObserver;->onUpdateUrl(Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/chrome/browser/usage_stats/PageViewObserver;->updateUrl(Lorg/chromium/url/GURL;)V
-Lorg/chromium/chrome/browser/usage_stats/PageViewObserver$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/usage_stats/PageViewObserver$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/usage_stats/PageViewObserver;)V
-HSPLorg/chromium/chrome/browser/usage_stats/PageViewObserver$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/usage_stats/SuspendedTab;
-HSPLorg/chromium/chrome/browser/usage_stats/SuspendedTab;-><init>(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/chrome/browser/usage_stats/SuspendedTab;->destroy()V
-HSPLorg/chromium/chrome/browser/usage_stats/SuspendedTab;->from(Lorg/chromium/chrome/browser/tab/Tab;Lorg/chromium/base/supplier/Supplier;)Lorg/chromium/chrome/browser/usage_stats/SuspendedTab;
-Lorg/chromium/chrome/browser/usage_stats/SuspensionTracker;
-HSPLorg/chromium/chrome/browser/usage_stats/SuspensionTracker;-><init>(Lorg/chromium/chrome/browser/usage_stats/UsageStatsBridge;Lorg/chromium/chrome/browser/usage_stats/NotificationSuspender;)V
-Lorg/chromium/chrome/browser/usage_stats/SuspensionTracker$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/usage_stats/SuspensionTracker$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/usage_stats/SuspensionTracker;)V
-HSPLorg/chromium/chrome/browser/usage_stats/SuspensionTracker$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/usage_stats/SuspensionTracker$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/usage_stats/SuspensionTracker$$ExternalSyntheticLambda1;-><init>()V
-HSPLorg/chromium/chrome/browser/usage_stats/SuspensionTracker$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-Lorg/chromium/chrome/browser/usage_stats/TokenTracker;
-HSPLorg/chromium/chrome/browser/usage_stats/TokenTracker;-><init>(Lorg/chromium/chrome/browser/usage_stats/UsageStatsBridge;)V
-Lorg/chromium/chrome/browser/usage_stats/TokenTracker$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/usage_stats/TokenTracker$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/usage_stats/TokenTracker;)V
-HSPLorg/chromium/chrome/browser/usage_stats/TokenTracker$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/usage_stats/TokenTracker$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/usage_stats/TokenTracker$$ExternalSyntheticLambda1;-><init>(I)V
-Lorg/chromium/chrome/browser/usage_stats/UsageStatsBridge;
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsBridge;-><init>(Lorg/chromium/chrome/browser/profiles/Profile;Lorg/chromium/chrome/browser/usage_stats/UsageStatsService;)V
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsBridge;->createEventListAndRunCallback([[BLorg/chromium/base/Callback;)V
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsBridge;->createMapAndRunCallback([Ljava/lang/String;[Ljava/lang/String;Lorg/chromium/base/Callback;)V
-Lorg/chromium/chrome/browser/usage_stats/UsageStatsBridge$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsBridge$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/usage_stats/SuspensionTracker$$ExternalSyntheticLambda0;)V
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsBridge$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/usage_stats/UsageStatsService;
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsService;-><init>()V
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsService;->createPageViewObserverIfEnabled(Landroid/app/Activity;Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/base/supplier/ObservableSupplierImpl;)V
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsService;->getInstance()Lorg/chromium/chrome/browser/usage_stats/UsageStatsService;
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsService;->notifyObserversOfSuspensions(Ljava/util/List;Z)V
-Lorg/chromium/chrome/browser/usage_stats/UsageStatsService$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsService$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/browser/usage_stats/UsageStatsService;I)V
-HSPLorg/chromium/chrome/browser/usage_stats/UsageStatsService$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/usb/UsbNotificationManager;
-HSPLorg/chromium/chrome/browser/usb/UsbNotificationManager;->updateUsbNotificationForTab(Landroid/content/Context;ILorg/chromium/content_public/browser/WebContents;Lorg/chromium/url/GURL;Z)V
-Lorg/chromium/chrome/browser/user_education/IPHCommand;
-HSPLorg/chromium/chrome/browser/user_education/IPHCommand;-><init>(Landroid/content/res/Resources;Ljava/lang/String;I[Ljava/lang/Object;I[Ljava/lang/Object;ZLandroid/view/View;Ljava/lang/Runnable;Ljava/lang/Runnable;Ljava/lang/Runnable;JLorg/chromium/ui/widget/ViewRectProvider;Lorg/chromium/components/browser_ui/widget/highlight/ViewHighlighter$HighlightParams;Landroid/graphics/Rect;ZI)V
-Lorg/chromium/chrome/browser/user_education/IPHCommandBuilder;
-HSPLorg/chromium/chrome/browser/user_education/IPHCommandBuilder;-><init>(Landroid/content/res/Resources;Ljava/lang/String;II)V
-HSPLorg/chromium/chrome/browser/user_education/IPHCommandBuilder;->build()Lorg/chromium/chrome/browser/user_education/IPHCommand;
-Lorg/chromium/chrome/browser/user_education/UserEducationHelper;
-HSPLorg/chromium/chrome/browser/user_education/UserEducationHelper;-><init>(Landroid/app/Activity;Landroid/os/Handler;)V
-HSPLorg/chromium/chrome/browser/user_education/UserEducationHelper;->requestShowIPH(Lorg/chromium/chrome/browser/user_education/IPHCommand;)V
-Lorg/chromium/chrome/browser/user_education/UserEducationHelper$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/user_education/UserEducationHelper$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/user_education/UserEducationHelper;Lorg/chromium/components/feature_engagement/Tracker;Lorg/chromium/chrome/browser/user_education/IPHCommand;)V
-HSPLorg/chromium/chrome/browser/user_education/UserEducationHelper$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/browser/util/AndroidTaskUtils;
-HSPLorg/chromium/chrome/browser/util/AndroidTaskUtils;->getTaskInfoFromTask(Landroid/app/ActivityManager$AppTask;)Landroid/app/ActivityManager$RecentTaskInfo;
-Lorg/chromium/chrome/browser/util/ChromeAccessibilityUtil;
-HSPLorg/chromium/chrome/browser/util/ChromeAccessibilityUtil;-><init>()V
-HSPLorg/chromium/chrome/browser/util/ChromeAccessibilityUtil;->get()Lorg/chromium/chrome/browser/util/ChromeAccessibilityUtil;
-HSPLorg/chromium/chrome/browser/util/ChromeAccessibilityUtil;->isAccessibilityEnabled()Z
-Lorg/chromium/chrome/browser/util/ChromeAccessibilityUtil$ActivityStateListenerImpl;
-HSPLorg/chromium/chrome/browser/util/ChromeAccessibilityUtil$ActivityStateListenerImpl;-><init>(Lorg/chromium/chrome/browser/util/ChromeAccessibilityUtil;)V
-HSPLorg/chromium/chrome/browser/util/ChromeAccessibilityUtil$ActivityStateListenerImpl;->onActivityStateChange(Landroid/app/Activity;I)V
-Lorg/chromium/chrome/browser/util/ChromeFileProvider;
-HSPLorg/chromium/chrome/browser/util/ChromeFileProvider;-><init>()V
-Lorg/chromium/chrome/browser/video_tutorials/VideoTutorialServiceFactory$LazyHolder;
-Lorg/chromium/chrome/browser/video_tutorials/iph/TryNowTrackerImpl;
-HSPLorg/chromium/chrome/browser/video_tutorials/iph/TryNowTrackerImpl;-><init>()V
-Lorg/chromium/chrome/browser/vr/VrDelegate;
-HSPLorg/chromium/chrome/browser/vr/VrDelegate;-><init>()V
-Lorg/chromium/chrome/browser/vr/VrDelegateFallback;
-HSPLorg/chromium/chrome/browser/vr/VrDelegateFallback;-><init>()V
-Lorg/chromium/chrome/browser/vr/VrDelegateProviderFallback;
-HSPLorg/chromium/chrome/browser/vr/VrDelegateProviderFallback;-><init>()V
-Lorg/chromium/chrome/browser/vr/VrModule;
-Lorg/chromium/chrome/browser/vr/VrModuleProvider;
-HSPLorg/chromium/chrome/browser/vr/VrModuleProvider;->getDelegate()Lorg/chromium/chrome/browser/vr/VrDelegateFallback;
-Lorg/chromium/chrome/browser/webapps/AddToHomescreenIPHController;
-HSPLorg/chromium/chrome/browser/webapps/AddToHomescreenIPHController;-><init>(Landroidx/appcompat/app/AppCompatActivity;Lorg/chromium/ui/base/ActivityWindowAndroid;Lorg/chromium/ui/modaldialog/ModalDialogManager;Lorg/chromium/components/messages/MessageDispatcher;)V
-Lorg/chromium/chrome/browser/webapps/AddToHomescreenMostVisitedTileClickObserver;
-HSPLorg/chromium/chrome/browser/webapps/AddToHomescreenMostVisitedTileClickObserver;-><init>(Lorg/chromium/chrome/browser/ActivityTabProvider;Lorg/chromium/chrome/browser/webapps/AddToHomescreenIPHController;)V
-Lorg/chromium/chrome/browser/webapps/ChromeWebApkHost;
-HSPLorg/chromium/chrome/browser/webapps/ChromeWebApkHost;->init()V
-Lorg/chromium/chrome/browser/webapps/WebappRegistry;
-HSPLorg/chromium/chrome/browser/webapps/WebappRegistry;-><init>()V
-HSPLorg/chromium/chrome/browser/webapps/WebappRegistry;->getOriginsWithWebApk()Ljava/util/HashSet;
-HSPLorg/chromium/chrome/browser/webapps/WebappRegistry;->initStorages(Ljava/lang/String;)V
-Lorg/chromium/chrome/browser/webapps/WebappRegistry$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/browser/webapps/WebappRegistry$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/browser/webapps/WebappRegistry;Ljava/util/ArrayList;Z)V
-HSPLorg/chromium/chrome/browser/webapps/WebappRegistry$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/chrome/browser/webapps/WebappRegistry$Holder;
-Lorg/chromium/chrome/browser/webauthn/CableAuthenticatorModuleProvider;
-HSPLorg/chromium/chrome/browser/webauthn/CableAuthenticatorModuleProvider;->canDeviceSupportCable()Z
-Lorg/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator;
-Lorg/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory;
-HSPLorg/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory;-><init>(Landroid/app/Activity;Landroid/view/ViewGroup;Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetController;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$ScrollableContainerDelegateImpl;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/ui/base/WindowAndroid;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/base/supplier/Supplier;JLorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout;Lorg/chromium/chrome/browser/share/crow/CrowButtonDelegate;)V
-Lorg/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory$$ExternalSyntheticLambda0;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/features/start_surface/StartSurface;
-Lorg/chromium/chrome/features/start_surface/StartSurface$OnTabSelectingListener;
-Lorg/chromium/chrome/features/start_surface/StartSurface$StateObserver;
-Lorg/chromium/chrome/features/start_surface/StartSurfaceConfiguration;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceConfiguration;->isBehaviouralTargetingEnabled()Z
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceConfiguration;->isStartSurfaceFlagEnabled()Z
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceConfiguration;->recordHistogram(JLjava/lang/String;Z)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;-><init>(Landroid/app/Activity;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/base/supplier/ObservableSupplierImpl;ZLorg/chromium/ui/base/ActivityWindowAndroid;Landroid/view/ViewGroup;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda16;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;Lorg/chromium/chrome/browser/fullscreen/BrowserControlsManager;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;Lorg/chromium/chrome/browser/share/ShareDelegateSupplier;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda18;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/ui/modaldialog/ModalDialogManager;Lorg/chromium/chrome/browser/init/ChromeActivityNativeDelegate;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/components/browser_ui/widget/MenuOrKeyboardActionController;Lorg/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcherImpl;Lorg/chromium/base/jank_tracker/JankTrackerImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda18;Lorg/chromium/chrome/browser/share/crow/CrowButtonDelegateImpl;Lorg/chromium/chrome/browser/back_press/BackPressManager;Lorg/chromium/base/supplier/OneshotSupplierImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda13;)V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;->addHeaderOffsetChangeListener(Lcom/google/android/material/appbar/AppBarLayout$OnOffsetChangedListener;)V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;->createSwipeRefreshLayout()V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;->createTasksSurface(Landroid/app/Activity;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;Lorg/chromium/ui/modelutil/PropertyModel;ILorg/chromium/base/supplier/Supplier;ZZLorg/chromium/ui/base/WindowAndroid;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/ui/modaldialog/ModalDialogManager;Lorg/chromium/chrome/browser/browser_controls/BrowserControlsVisibilityManager;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/components/browser_ui/widget/MenuOrKeyboardActionController;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcherImpl;Landroid/view/ViewGroup;Lorg/chromium/base/supplier/OneshotSupplier;)Lorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;->getPixelSize(I)I
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;->initWithNative()V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;->initializeOffsetChangedListener()V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;->onHide()V
-PLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;->onOverviewShownAtLaunch(JZ)V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;->setOnTabSelectingListener(Lorg/chromium/chrome/features/start_surface/StartSurface$OnTabSelectingListener;)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda3;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda3;-><init>(I)V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda3;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda6;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda6;-><init>(Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;IIIIIIIII)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$ScrollableContainerDelegateImpl;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$ScrollableContainerDelegateImpl;-><init>(Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator;)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceMediator;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher$Controller;Landroid/view/ViewGroup;Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher;Lorg/chromium/chrome/browser/tabmodel/TabModelSelectorBase;Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda1;ZLandroid/content/Context;Lorg/chromium/chrome/browser/browser_controls/BrowserControlsVisibilityManager;Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda1;ZLorg/chromium/base/supplier/OneshotSupplierImpl;ZLorg/chromium/base/jank_tracker/JankTrackerImpl;Lorg/chromium/chrome/features/start_surface/StartSurfaceCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/base/supplier/ObservableSupplierImpl;Landroid/view/View;Lorg/chromium/chrome/browser/back_press/BackPressManager;Landroid/view/ViewGroup;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/ChromeTabbedActivity$$ExternalSyntheticLambda13;)V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator;->getFeedReliabilityLogger()V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator;->isHomepageShown()Z
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator;->mayRecordHomepageSessionBegin()V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator;->mayRecordHomepageSessionEnd()V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator;->onHide()V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator;->onPauseWithNative()V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator;->onResumeWithNative()V
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator;->setStartSurfaceState(II)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceMediator$1;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator$1;-><init>(Lorg/chromium/chrome/features/start_surface/StartSurfaceMediator;)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceMediator$2;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator$2;-><init>(Lorg/chromium/chrome/features/start_surface/StartSurfaceMediator;)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceMediator$4;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator$4;-><init>(Lorg/chromium/chrome/features/start_surface/StartSurfaceMediator;)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceMediator$5;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceMediator$5;-><init>(Lorg/chromium/chrome/features/start_surface/StartSurfaceMediator;)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceProperties;
-Lorg/chromium/chrome/features/start_surface/StartSurfaceUserData;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceUserData;-><init>()V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceUserData$LazyHolder;
-Lorg/chromium/chrome/features/start_surface/StartSurfaceWithParentViewBinder;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceWithParentViewBinder;->bind(Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/features/start_surface/StartSurfaceWithParentViewBinder$ViewHolder;Lorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;)V
-Lorg/chromium/chrome/features/start_surface/StartSurfaceWithParentViewBinder$ViewHolder;
-HSPLorg/chromium/chrome/features/start_surface/StartSurfaceWithParentViewBinder$ViewHolder;-><init>(Landroid/view/ViewGroup;Lorg/chromium/chrome/features/tasks/TasksView;Lorg/chromium/chrome/browser/feed/FeedSwipeRefreshLayout;)V
-Lorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout;
-HSPLorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/compositor/layouts/LayoutUpdateHost;Lorg/chromium/chrome/browser/compositor/CompositorViewHolder;Lorg/chromium/chrome/features/start_surface/StartSurface;Lorg/chromium/base/jank_tracker/JankTracker;Landroid/view/ViewGroup;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;)V
-HSPLorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout;->destroy()V
-HSPLorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout;->onFinishNativeInitialization()V
-HSPLorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout;->setTabModelSelector(Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;)V
-Lorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout;)V
-Lorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout$1;
-HSPLorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout$1;-><init>(Lorg/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout;Landroid/content/Context;)V
-Lorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator;
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator;-><init>(Landroid/app/Activity;Landroid/widget/FrameLayout;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;)V
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator;->getController()Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher$Controller;
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator;->getTabListDelegate()Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher$TabListDelegate;
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator;->initWithNative()V
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator;->setOnTabSelectingListener(Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher$OnTabSelectingListener;)V
-Lorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator$$ExternalSyntheticLambda0;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator$1;
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator$1;-><init>()V
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator$1;->postHiding()V
-Lorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator;
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator;-><init>(Landroid/content/Context;Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider;)V
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator;->addTabSwitcherViewObserver(Lorg/chromium/chrome/browser/tasks/tab_management/TabSwitcher$TabSwitcherViewObserver;)V
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator;->overviewVisible()Z
-Lorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator;I)V
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator;)V
-Lorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator$1;
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator$1;-><init>(Lorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator;)V
-Lorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator$2;
-HSPLorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator$2;-><init>(Lorg/chromium/chrome/features/tasks/SingleTabSwitcherMediator;)V
-Lorg/chromium/chrome/features/tasks/SingleTabView;
-HSPLorg/chromium/chrome/features/tasks/SingleTabView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/features/tasks/SingleTabView;->onFinishInflate()V
-Lorg/chromium/chrome/features/tasks/SingleTabViewProperties;
-Lorg/chromium/chrome/features/tasks/TasksSurface;
-Lorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator;
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator;-><init>(Landroid/app/Activity;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;Lorg/chromium/ui/modelutil/PropertyModel;ILorg/chromium/base/supplier/Supplier;ZZLorg/chromium/ui/base/WindowAndroid;Lorg/chromium/chrome/browser/init/ActivityLifecycleDispatcherImpl;Lorg/chromium/chrome/browser/tabmodel/TabModelSelector;Lorg/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/compositor/layouts/content/TabContentManager;Lorg/chromium/ui/modaldialog/ModalDialogManager;Lorg/chromium/chrome/browser/browser_controls/BrowserControlsVisibilityManager;Lorg/chromium/chrome/browser/tabmodel/TabCreatorManager;Lorg/chromium/components/browser_ui/widget/MenuOrKeyboardActionController;Lorg/chromium/base/supplier/Supplier;Lorg/chromium/chrome/browser/multiwindow/MultiWindowModeStateDispatcherImpl;Landroid/view/ViewGroup;Lorg/chromium/base/supplier/OneshotSupplier;)V
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator;->onFinishNativeInitialization(Lorg/chromium/chrome/browser/omnibox/OmniboxStub;)V
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator;->onHide()V
-Lorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator$$ExternalSyntheticLambda0;->bind(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator$$ExternalSyntheticLambda1;-><init>(Landroid/app/Activity;)V
-Lorg/chromium/chrome/features/tasks/TasksSurfaceMediator;
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceMediator;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/features/tasks/TasksSurfaceCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/chrome/browser/ntp/IncognitoCookieControlsManager;Z)V
-Lorg/chromium/chrome/features/tasks/TasksSurfaceMediator$1;
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceMediator$1;-><init>(Lorg/chromium/chrome/features/tasks/TasksSurfaceMediator;I)V
-Lorg/chromium/chrome/features/tasks/TasksSurfaceMediator$2;
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceMediator$2;-><init>(Lorg/chromium/chrome/features/tasks/TasksSurfaceMediator;)V
-Lorg/chromium/chrome/features/tasks/TasksSurfaceMediator$3;
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceMediator$3;-><init>(Lorg/chromium/chrome/features/tasks/TasksSurfaceMediator;)V
-Lorg/chromium/chrome/features/tasks/TasksSurfaceMediator$5;
-HSPLorg/chromium/chrome/features/tasks/TasksSurfaceMediator$5;-><init>(Lorg/chromium/chrome/features/tasks/TasksSurfaceMediator;)V
-Lorg/chromium/chrome/features/tasks/TasksSurfaceProperties;
-Lorg/chromium/chrome/features/tasks/TasksView;
-HSPLorg/chromium/chrome/features/tasks/TasksView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/chrome/features/tasks/TasksView;->addHeaderOffsetChangeListener(Lcom/google/android/material/appbar/AppBarLayout$OnOffsetChangedListener;)V
-HSPLorg/chromium/chrome/features/tasks/TasksView;->onFinishInflate()V
-Lorg/chromium/chrome/features/tasks/TasksView$1;
-HSPLorg/chromium/chrome/features/tasks/TasksView$1;-><init>()V
-Lorg/chromium/chrome/features/tasks/TasksViewBinder;
-HSPLorg/chromium/chrome/features/tasks/TasksViewBinder;->bind(Lorg/chromium/ui/modelutil/PropertyModel;Lorg/chromium/chrome/features/tasks/TasksView;Lorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;)V
-Lorg/chromium/components/background_task_scheduler/BackgroundTaskSchedulerExternalUma;
-HSPLorg/chromium/components/background_task_scheduler/BackgroundTaskSchedulerExternalUma;-><init>()V
-HSPLorg/chromium/components/background_task_scheduler/BackgroundTaskSchedulerExternalUma;->toUmaEnumValueFromTaskId(I)I
-PLorg/chromium/components/background_task_scheduler/TaskInfo;-><init>(Lorg/chromium/components/background_task_scheduler/TaskInfo$Builder;)V
-PLorg/chromium/components/background_task_scheduler/TaskInfo;->createOneOffTask(IJJ)Lorg/chromium/components/background_task_scheduler/TaskInfo$Builder;
-PLorg/chromium/components/background_task_scheduler/TaskInfo$Builder;-><init>(I)V
-PLorg/chromium/components/background_task_scheduler/TaskInfo$Builder;->build()Lorg/chromium/components/background_task_scheduler/TaskInfo;
-PLorg/chromium/components/background_task_scheduler/TaskInfo$OneOffInfo;-><init>(I)V
-PLorg/chromium/components/background_task_scheduler/TaskInfo$OneOffInfo;-><init>(Lorg/chromium/components/background_task_scheduler/TaskInfo$OneOffInfo;)V
-PLorg/chromium/components/background_task_scheduler/TaskInfo$OneOffInfo;-><init>(Lorg/chromium/components/background_task_scheduler/TaskInfo$OneOffInfo;I)V
-PLorg/chromium/components/background_task_scheduler/TaskInfo$OneOffInfo;->accept(Lorg/chromium/components/background_task_scheduler/TaskInfo$TimingInfoVisitor;)V
-PLorg/chromium/components/background_task_scheduler/TaskInfo$OneOffInfo;->expiresAfterWindowEndTime()Z
-PLorg/chromium/components/background_task_scheduler/TaskParameters;-><init>(Lorg/chromium/components/background_task_scheduler/TaskParameters$Builder;)V
-PLorg/chromium/components/background_task_scheduler/TaskParameters$Builder;-><init>(I)V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService;-><init>()V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService;->onStartJob(Landroid/app/job/JobParameters;)Z
-Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService$$ExternalSyntheticLambda0;-><init>()V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService$TaskFinishedCallbackJobService;-><init>(Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService;Lorg/chromium/components/background_task_scheduler/BackgroundTask;Landroid/app/job/JobParameters;)V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService$TaskFinishedCallbackJobService;->taskFinished(Z)V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService$TaskFinishedCallbackJobService$1;-><init>(Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService$TaskFinishedCallbackJobService;Z)V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService$TaskFinishedCallbackJobService$1;->run()V
-Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerDelegate;
-Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerFactoryInternal;
-HSPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerFactoryInternal;->getScheduler()Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl;
-Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl;
-HSPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl;-><init>(Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobService;)V
-HSPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl;->cancel(Landroid/content/Context;I)V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl;->schedule(Landroid/content/Context;Lorg/chromium/components/background_task_scheduler/TaskInfo;)Z
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl$MetricsVisitor;-><init>(I)V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl$MetricsVisitor;->visit(Lorg/chromium/components/background_task_scheduler/TaskInfo$OneOffInfo;)V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl$SchedulingVisitor;-><init>(Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl;Landroid/content/Context;Lorg/chromium/components/background_task_scheduler/TaskInfo;)V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl$SchedulingVisitor;->visit(Lorg/chromium/components/background_task_scheduler/TaskInfo$OneOffInfo;)V
-Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobService;
-HSPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobService;-><init>()V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobService;->getTaskParametersFromJobParameters(Landroid/app/job/JobParameters;)Lorg/chromium/components/background_task_scheduler/TaskParameters;
-HPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobService;->schedule(Landroid/content/Context;Lorg/chromium/components/background_task_scheduler/TaskInfo;)Z
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobService$JobInfoBuilderVisitor;-><init>(Landroid/app/job/JobInfo$Builder;Landroid/os/PersistableBundle;)V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobService$JobInfoBuilderVisitor;->visit(Lorg/chromium/components/background_task_scheduler/TaskInfo$OneOffInfo;)V
-Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma;
-HSPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma;-><init>()V
-HSPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma;->cacheEvent(ILjava/lang/String;)V
-PLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma;->flushStats()V
-HSPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma;->getInstance()Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma;
-Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma$CachedUmaEntry;
-HSPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma$CachedUmaEntry;-><init>(IILjava/lang/String;)V
-HPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma$CachedUmaEntry;->parseEntry(Ljava/lang/String;)Lorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma$CachedUmaEntry;
-HSPLorg/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma$CachedUmaEntry;->toString()Ljava/lang/String;
-Lorg/chromium/components/bookmarks/BookmarkId;
-Lorg/chromium/components/browser_ui/accessibility/FontSizePrefs;
-HSPLorg/chromium/components/browser_ui/accessibility/FontSizePrefs;-><init>(Lorg/chromium/chrome/browser/profiles/Profile;)V
-HSPLorg/chromium/components/browser_ui/accessibility/FontSizePrefs;->getUserFontScaleFactor()F
-HSPLorg/chromium/components/browser_ui/accessibility/FontSizePrefs;->onFontScaleFactorChanged(F)V
-HSPLorg/chromium/components/browser_ui/accessibility/FontSizePrefs;->setFontScaleFactor(F)V
-Lorg/chromium/components/browser_ui/accessibility/PageZoomCoordinator;
-HSPLorg/chromium/components/browser_ui/accessibility/PageZoomCoordinator;-><init>(Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda4;)V
-Lorg/chromium/components/browser_ui/accessibility/PageZoomCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/browser_ui/accessibility/PageZoomCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/components/browser_ui/accessibility/PageZoomCoordinator;)V
-Lorg/chromium/components/browser_ui/accessibility/PageZoomCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/components/browser_ui/accessibility/PageZoomCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/components/browser_ui/accessibility/PageZoomCoordinator;)V
-Lorg/chromium/components/browser_ui/accessibility/PageZoomMediator;
-HSPLorg/chromium/components/browser_ui/accessibility/PageZoomMediator;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;)V
-Lorg/chromium/components/browser_ui/accessibility/PageZoomMediator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/browser_ui/accessibility/PageZoomMediator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/components/browser_ui/accessibility/PageZoomMediator;I)V
-Lorg/chromium/components/browser_ui/accessibility/PageZoomProperties;
-Lorg/chromium/components/browser_ui/accessibility/PageZoomUtils;
-HSPLorg/chromium/components/browser_ui/accessibility/PageZoomUtils;->convertZoomFactorToSeekBarValue(D)I
-HSPLorg/chromium/components/browser_ui/accessibility/PageZoomUtils;->shouldShowZoomMenuItem()Z
-Lorg/chromium/components/browser_ui/banners/SwipableOverlayView;
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView;-><init>(Landroid/content/Context;Z)V
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView;->cancelCurrentAnimation()Z
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView;->createVerticalSnapAnimation(Z)Landroid/animation/ObjectAnimator;
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView;->gatherTransparentRegion(Landroid/graphics/Region;)Z
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView;->onAttachedToWindow()V
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView;->onDetachedFromWindow()V
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView;->onLayout(ZIIII)V
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView;->onWindowFocusChanged(Z)V
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView;->removeFromParentView()Z
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView;->setWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/components/browser_ui/banners/SwipableOverlayView$2;
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView$2;-><init>(Lorg/chromium/components/browser_ui/banners/SwipableOverlayView;)V
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView$2;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-Lorg/chromium/components/browser_ui/banners/SwipableOverlayView$3;
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView$3;-><init>(Lorg/chromium/components/browser_ui/banners/SwipableOverlayView;)V
-HSPLorg/chromium/components/browser_ui/banners/SwipableOverlayView$3;->onAnimationEnd(Landroid/animation/Animator;)V
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheet;
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetController;
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerFactory;
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerFactory;->setExceptionReporter(Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda5;)V
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;-><init>(Lorg/chromium/base/supplier/Supplier;Lorg/chromium/base/Callback;Landroid/view/Window;Lorg/chromium/ui/KeyboardVisibilityDelegate;Lorg/chromium/base/supplier/Supplier;)V
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;->addObserver(Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetObserver;)V
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;->clearRequestsAndHide()V
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;->destroy()V
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;->isSheetOpen()Z
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;->removeObserver(Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetObserver;)V
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;->suppressSheet(I)I
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;->updateBackPressStateChangedSupplier()V
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl$$ExternalSyntheticLambda1;
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;I)V
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl$$ExternalSyntheticLambda2;
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;Lorg/chromium/base/Callback;Landroid/view/Window;Lorg/chromium/ui/KeyboardVisibilityDelegate;Lorg/chromium/base/supplier/Supplier;)V
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl$1;
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl$1;-><init>(Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl;)V
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerProvider;
-HSPLorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerProvider;->from(Lorg/chromium/ui/base/WindowAndroid;)Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetController;
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetControllerProvider$Unowned;
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetObserver;
-Lorg/chromium/components/browser_ui/bottomsheet/BottomSheetSwipeDetector$SwipeableBottomSheet;
-Lorg/chromium/components/browser_ui/bottomsheet/EmptyBottomSheetObserver;
-HSPLorg/chromium/components/browser_ui/bottomsheet/EmptyBottomSheetObserver;-><init>()V
-Lorg/chromium/components/browser_ui/media/MediaImageCallback;
-Lorg/chromium/components/browser_ui/media/MediaImageManager;
-HSPLorg/chromium/components/browser_ui/media/MediaImageManager;-><init>(I)V
-Lorg/chromium/components/browser_ui/media/MediaNotificationController;
-Lorg/chromium/components/browser_ui/media/MediaNotificationImageUtils;
-HSPLorg/chromium/components/browser_ui/media/MediaNotificationImageUtils;->downscaleIconToIdealSize(Landroid/graphics/Bitmap;)Landroid/graphics/Bitmap;
-Lorg/chromium/components/browser_ui/media/MediaNotificationListener;
-Lorg/chromium/components/browser_ui/media/MediaNotificationManager;
-Lorg/chromium/components/browser_ui/media/MediaSessionHelper;
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper;->-$$Nest$mupdateNotificationMetadata(Lorg/chromium/components/browser_ui/media/MediaSessionHelper;)V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper;-><init>(Lorg/chromium/content_public/browser/WebContents;Lorg/chromium/chrome/browser/media/ui/MediaSessionTabHelper;)V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper;->cleanupMediaSessionObserver()V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper;->getActivity()Landroid/app/Activity;
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper;->getMetadata()Lorg/chromium/services/media_session/MediaMetadata;
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper;->hideNotificationInternal()V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper;->isNotificationHidingOrHidden()Z
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper;->setWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/components/browser_ui/media/MediaSessionHelper$1;
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$1;-><init>(Lorg/chromium/components/browser_ui/media/MediaSessionHelper;)V
-Lorg/chromium/components/browser_ui/media/MediaSessionHelper$2;
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$2;-><init>(Lorg/chromium/components/browser_ui/media/MediaSessionHelper;)V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$2;->run()V
-Lorg/chromium/components/browser_ui/media/MediaSessionHelper$3;
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$3;-><init>(Lorg/chromium/components/browser_ui/media/MediaSessionHelper;Lorg/chromium/content/browser/MediaSessionImpl;)V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$3;->mediaSessionActionsChanged(Ljava/util/HashSet;)V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$3;->mediaSessionArtworkChanged(Ljava/util/List;)V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$3;->mediaSessionMetadataChanged(Lorg/chromium/services/media_session/MediaMetadata;)V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$3;->mediaSessionPositionChanged(Lorg/chromium/services/media_session/MediaPosition;)V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$3;->mediaSessionStateChanged(ZZ)V
-Lorg/chromium/components/browser_ui/media/MediaSessionHelper$4;
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$4;-><init>(Lorg/chromium/components/browser_ui/media/MediaSessionHelper;Lorg/chromium/content_public/browser/WebContents;Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$4;->didFinishNavigationInPrimaryMainFrame(Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/components/browser_ui/media/MediaSessionHelper$4;->wasShown()V
-Lorg/chromium/components/browser_ui/modaldialog/AppModalPresenter;
-HSPLorg/chromium/components/browser_ui/modaldialog/AppModalPresenter;-><init>(Landroid/content/Context;)V
-Lorg/chromium/components/browser_ui/modaldialog/TabModalPresenter;
-HSPLorg/chromium/components/browser_ui/modaldialog/TabModalPresenter;-><init>(Landroid/content/Context;)V
-Lorg/chromium/components/browser_ui/notifications/NotificationManagerProxy;
-Lorg/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl;
-HSPLorg/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl;->createNotificationChannel(Landroid/app/NotificationChannel;)V
-HSPLorg/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl;->createNotificationChannelGroup(Landroid/app/NotificationChannelGroup;)V
-HSPLorg/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl;->deleteNotificationChannel(Ljava/lang/String;)V
-HSPLorg/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl;->getNotificationChannels()Ljava/util/List;
-Lorg/chromium/components/browser_ui/notifications/channels/ChannelDefinitions;
-Lorg/chromium/components/browser_ui/notifications/channels/ChannelDefinitions$PredefinedChannel;
-HSPLorg/chromium/components/browser_ui/notifications/channels/ChannelDefinitions$PredefinedChannel;-><init>(Ljava/lang/String;IIZZ)V
-HSPLorg/chromium/components/browser_ui/notifications/channels/ChannelDefinitions$PredefinedChannel;->create(IILjava/lang/String;)Lorg/chromium/components/browser_ui/notifications/channels/ChannelDefinitions$PredefinedChannel;
-Lorg/chromium/components/browser_ui/notifications/channels/ChannelDefinitions$PredefinedChannelGroup;
-HSPLorg/chromium/components/browser_ui/notifications/channels/ChannelDefinitions$PredefinedChannelGroup;-><init>(ILjava/lang/String;)V
-Lorg/chromium/components/browser_ui/notifications/channels/ChannelDefinitions$PredefinedChannelGroup$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/components/browser_ui/notifications/channels/ChannelDefinitions$PredefinedChannelGroup$$ExternalSyntheticApiModelOutline0;->m()V
-HSPLorg/chromium/components/browser_ui/notifications/channels/ChannelDefinitions$PredefinedChannelGroup$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannelGroup;
-Lorg/chromium/components/browser_ui/notifications/channels/ChannelsInitializer;
-HSPLorg/chromium/components/browser_ui/notifications/channels/ChannelsInitializer;-><init>(Lorg/chromium/components/browser_ui/notifications/NotificationManagerProxy;Landroid/content/res/Resources;)V
-HSPLorg/chromium/components/browser_ui/notifications/channels/ChannelsInitializer;->ensureInitializedWithEnabledState(Ljava/util/Collection;Ljava/util/Collection;)V
-HSPLorg/chromium/components/browser_ui/notifications/channels/ChannelsInitializer;->initializeStartupChannels()V
-Lorg/chromium/components/browser_ui/photo_picker/DecodeVideoTask$VideoDecodingCallback;
-Lorg/chromium/components/browser_ui/photo_picker/DecoderServiceHost;
-Lorg/chromium/components/browser_ui/photo_picker/IDecoderServiceCallback;
-Lorg/chromium/components/browser_ui/photo_picker/IDecoderServiceCallback$Stub;
-Lorg/chromium/components/browser_ui/photo_picker/PhotoPickerDelegateBase;
-HSPLorg/chromium/components/browser_ui/photo_picker/PhotoPickerDelegateBase;-><init>()V
-Lorg/chromium/components/browser_ui/settings/SettingsLauncher;
-Lorg/chromium/components/browser_ui/share/ClipboardImageFileProvider;
-HSPLorg/chromium/components/browser_ui/share/ClipboardImageFileProvider;-><init>()V
-HSPLorg/chromium/components/browser_ui/share/ClipboardImageFileProvider;->getLastCopiedImageMetadata()Lorg/chromium/ui/base/Clipboard$ImageFileProvider$ClipboardFileMetadata;
-Lorg/chromium/components/browser_ui/share/ShareImageFileUtils;
-HSPLorg/chromium/components/browser_ui/share/ShareImageFileUtils;->getSharedFilesDirectory()Ljava/io/File;
-Lorg/chromium/components/browser_ui/share/ShareImageFileUtils$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/components/browser_ui/share/ShareImageFileUtils$$ExternalSyntheticApiModelOutline0;->m()Landroid/net/Uri;
-Lorg/chromium/components/browser_ui/share/ShareImageFileUtils$$ExternalSyntheticLambda3;
-HSPLorg/chromium/components/browser_ui/share/ShareImageFileUtils$$ExternalSyntheticLambda3;-><init>()V
-HSPLorg/chromium/components/browser_ui/share/ShareImageFileUtils$$ExternalSyntheticLambda3;->run()V
-Lorg/chromium/components/browser_ui/share/ShareImageFileUtils$$ExternalSyntheticLambda6;
-HSPLorg/chromium/components/browser_ui/share/ShareImageFileUtils$$ExternalSyntheticLambda6;-><init>(Ljava/lang/String;)V
-Lorg/chromium/components/browser_ui/share/ShareParams$TargetChosenCallback;
-Lorg/chromium/components/browser_ui/styles/ChromeColors;
-HSPLorg/chromium/components/browser_ui/styles/ChromeColors;->getDefaultThemeColor(Landroid/content/Context;Z)I
-HSPLorg/chromium/components/browser_ui/styles/ChromeColors;->getPrimaryBackgroundColor(Landroid/content/Context;Z)I
-HSPLorg/chromium/components/browser_ui/styles/ChromeColors;->getSurfaceColor(Landroid/content/Context;I)I
-Lorg/chromium/components/browser_ui/styles/SemanticColorUtils;
-HSPLorg/chromium/components/browser_ui/styles/SemanticColorUtils;->getDefaultBgColor(Landroid/content/Context;)I
-HSPLorg/chromium/components/browser_ui/styles/SemanticColorUtils;->getDefaultControlColorActive(Landroid/content/Context;)I
-HSPLorg/chromium/components/browser_ui/styles/SemanticColorUtils;->getDefaultIconColor(Landroid/content/Context;)I
-HSPLorg/chromium/components/browser_ui/styles/SemanticColorUtils;->getDividerLineBgColor(Landroid/content/Context;)I
-HSPLorg/chromium/components/browser_ui/styles/SemanticColorUtils;->resolve(Landroid/content/Context;I)I
-Lorg/chromium/components/browser_ui/util/BitmapCache;
-HSPLorg/chromium/components/browser_ui/util/BitmapCache;-><init>(Lorg/chromium/base/DiscardableReferencePool;I)V
-Lorg/chromium/components/browser_ui/util/BitmapCache$RecentlyUsedCache;
-HSPLorg/chromium/components/browser_ui/util/BitmapCache$RecentlyUsedCache;-><init>(I)V
-Lorg/chromium/components/browser_ui/util/BrowserControlsVisibilityDelegate;
-HSPLorg/chromium/components/browser_ui/util/BrowserControlsVisibilityDelegate;-><init>()V
-HSPLorg/chromium/components/browser_ui/util/BrowserControlsVisibilityDelegate;->set(Ljava/lang/Integer;)V
-Lorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate;
-HSPLorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate;->$r8$lambda$bSxtxU-NyBJzu8vAHQiKOc2_5Kc(Lorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate;)V
-HSPLorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate;-><init>([Lorg/chromium/components/browser_ui/util/BrowserControlsVisibilityDelegate;)V
-HSPLorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate;->calculateVisibilityConstraints()I
-HSPLorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate;->set(Ljava/lang/Integer;)V
-Lorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate;)V
-HSPLorg/chromium/components/browser_ui/util/ComposedBrowserControlsVisibilityDelegate$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/components/browser_ui/util/DimensionCompat;
-HSPLorg/chromium/components/browser_ui/util/DimensionCompat;-><init>(Landroid/app/Activity;)V
-Lorg/chromium/components/browser_ui/util/DimensionCompat$DimensionCompatR;
-HSPLorg/chromium/components/browser_ui/util/DimensionCompat$DimensionCompatR;-><init>(Landroid/app/Activity;)V
-HSPLorg/chromium/components/browser_ui/util/DimensionCompat$DimensionCompatR;-><init>(Landroid/app/Activity;II)V
-Lorg/chromium/components/browser_ui/util/FirstDrawDetector;
-HSPLorg/chromium/components/browser_ui/util/FirstDrawDetector;-><init>(Landroid/view/View;Ljava/lang/Runnable;)V
-HSPLorg/chromium/components/browser_ui/util/FirstDrawDetector;->startWaiting(Z)V
-Lorg/chromium/components/browser_ui/util/FirstDrawDetector$1;
-HSPLorg/chromium/components/browser_ui/util/FirstDrawDetector$1;-><init>(Lorg/chromium/components/browser_ui/util/FirstDrawDetector;)V
-HSPLorg/chromium/components/browser_ui/util/FirstDrawDetector$1;->onDraw()V
-Lorg/chromium/components/browser_ui/util/FirstDrawDetector$1$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/browser_ui/util/FirstDrawDetector$1$$ExternalSyntheticLambda0;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/components/browser_ui/util/FirstDrawDetector$1$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/components/browser_ui/util/FirstDrawDetector$2;
-HSPLorg/chromium/components/browser_ui/util/FirstDrawDetector$2;-><init>(Lorg/chromium/components/browser_ui/util/FirstDrawDetector;)V
-HSPLorg/chromium/components/browser_ui/util/FirstDrawDetector$2;->onPreDraw()Z
-Lorg/chromium/components/browser_ui/util/GlobalDiscardableReferencePool;
-Lorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable;
-HSPLorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable;-><init>(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
-HSPLorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable;->draw(Landroid/graphics/Canvas;)V
-HSPLorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable;->startTransition()Lorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable$TransitionHandle;
-Lorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable$1;
-HSPLorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable$1;-><init>()V
-HSPLorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable$1;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable$1;->setValue(Ljava/lang/Object;I)V
-Lorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable$TransitionHandle;
-HSPLorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable$TransitionHandle;-><init>(Landroid/animation/ObjectAnimator;)V
-Lorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable$TransitionHandle$1;
-HSPLorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable$TransitionHandle$1;-><init>(Lorg/chromium/chrome/browser/omnibox/status/StatusView$$ExternalSyntheticLambda1;)V
-HSPLorg/chromium/components/browser_ui/widget/ChromeTransitionDrawable$TransitionHandle$1;->onEnd()V
-Lorg/chromium/components/browser_ui/widget/ClipDrawableProgressBar;
-HSPLorg/chromium/components/browser_ui/widget/ClipDrawableProgressBar;-><init>(Landroid/content/Context;I)V
-HSPLorg/chromium/components/browser_ui/widget/ClipDrawableProgressBar;->onSetAlpha(I)Z
-HSPLorg/chromium/components/browser_ui/widget/ClipDrawableProgressBar;->setBackgroundColor(I)V
-HSPLorg/chromium/components/browser_ui/widget/ClipDrawableProgressBar;->setProgress(F)V
-HSPLorg/chromium/components/browser_ui/widget/ClipDrawableProgressBar;->setVisibility(I)V
-Lorg/chromium/components/browser_ui/widget/ClipDrawableProgressBar$DrawingInfo;
-HSPLorg/chromium/components/browser_ui/widget/ClipDrawableProgressBar$DrawingInfo;-><init>()V
-Lorg/chromium/components/browser_ui/widget/CompositeTouchDelegate;
-HSPLorg/chromium/components/browser_ui/widget/CompositeTouchDelegate;-><init>(Landroid/view/View;)V
-Lorg/chromium/components/browser_ui/widget/CoordinatorLayoutForPointer;
-HSPLorg/chromium/components/browser_ui/widget/CoordinatorLayoutForPointer;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Lorg/chromium/components/browser_ui/widget/InsetObserverView;
-HSPLorg/chromium/components/browser_ui/widget/InsetObserverView;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/components/browser_ui/widget/InsetObserverView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
-Lorg/chromium/components/browser_ui/widget/InsetObserverView$BottomInsetObservableSupplier;
-HSPLorg/chromium/components/browser_ui/widget/InsetObserverView$BottomInsetObservableSupplier;-><init>()V
-HSPLorg/chromium/components/browser_ui/widget/InsetObserverView$BottomInsetObservableSupplier;->onInsetChanged(I)V
-Lorg/chromium/components/browser_ui/widget/InsetObserverView$InsetObserverViewApi28;
-HSPLorg/chromium/components/browser_ui/widget/InsetObserverView$InsetObserverViewApi28;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/components/browser_ui/widget/InsetObserverView$InsetObserverViewApi28;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
-Lorg/chromium/components/browser_ui/widget/InsetObserverView$WindowInsetObserver;
-Lorg/chromium/components/browser_ui/widget/InsetObserverViewSupplier;
-HSPLorg/chromium/components/browser_ui/widget/InsetObserverViewSupplier;-><init>()V
-Lorg/chromium/components/browser_ui/widget/MenuOrKeyboardActionController;
-Lorg/chromium/components/browser_ui/widget/MenuOrKeyboardActionController$MenuOrKeyboardActionHandler;
-Lorg/chromium/components/browser_ui/widget/RoundedCornerImageView;
-HSPLorg/chromium/components/browser_ui/widget/RoundedCornerImageView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/components/browser_ui/widget/RoundedCornerImageView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HSPLorg/chromium/components/browser_ui/widget/RoundedCornerImageView;->refreshState()V
-HSPLorg/chromium/components/browser_ui/widget/RoundedCornerImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLorg/chromium/components/browser_ui/widget/RoundedCornerImageView;->setRoundedCorners(IIII)V
-Lorg/chromium/components/browser_ui/widget/RoundedIconGenerator;
-HSPLorg/chromium/components/browser_ui/widget/RoundedIconGenerator;-><init>(IIIIF)V
-Lorg/chromium/components/browser_ui/widget/TintedDrawable;
-HSPLorg/chromium/components/browser_ui/widget/TintedDrawable;-><init>(Landroid/content/Context;Landroid/graphics/Bitmap;)V
-HSPLorg/chromium/components/browser_ui/widget/TintedDrawable;->isStateful()Z
-HSPLorg/chromium/components/browser_ui/widget/TintedDrawable;->onStateChange([I)Z
-HSPLorg/chromium/components/browser_ui/widget/TintedDrawable;->setTint(Landroid/content/res/ColorStateList;)V
-Lorg/chromium/components/browser_ui/widget/ViewResourceFrameLayout;
-HSPLorg/chromium/components/browser_ui/widget/ViewResourceFrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/components/browser_ui/widget/ViewResourceFrameLayout;->isReadyForCapture()Z
-HSPLorg/chromium/components/browser_ui/widget/ViewResourceFrameLayout;->onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V
-HSPLorg/chromium/components/browser_ui/widget/ViewResourceFrameLayout;->onFinishInflate()V
-Lorg/chromium/components/browser_ui/widget/animation/CancelAwareAnimatorListener;
-HSPLorg/chromium/components/browser_ui/widget/animation/CancelAwareAnimatorListener;-><init>()V
-HSPLorg/chromium/components/browser_ui/widget/animation/CancelAwareAnimatorListener;->onAnimationEnd(Landroid/animation/Animator;)V
-Lorg/chromium/components/browser_ui/widget/animation/Interpolators;
-Lorg/chromium/components/browser_ui/widget/displaystyle/DisplayStyleObserver;
-Lorg/chromium/components/browser_ui/widget/displaystyle/DisplayStyleObserverAdapter;
-HSPLorg/chromium/components/browser_ui/widget/displaystyle/DisplayStyleObserverAdapter;-><init>(Landroid/view/View;Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig;Lorg/chromium/components/browser_ui/widget/displaystyle/DisplayStyleObserver;)V
-HSPLorg/chromium/components/browser_ui/widget/displaystyle/DisplayStyleObserverAdapter;->onDisplayStyleChanged(Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig$DisplayStyle;)V
-Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig;
-HSPLorg/chromium/components/browser_ui/widget/displaystyle/UiConfig;-><init>(Landroid/view/View;)V
-HSPLorg/chromium/components/browser_ui/widget/displaystyle/UiConfig;->addObserver(Lorg/chromium/components/browser_ui/widget/displaystyle/DisplayStyleObserver;)V
-HSPLorg/chromium/components/browser_ui/widget/displaystyle/UiConfig;->computeDisplayStyleForCurrentConfig()Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig$DisplayStyle;
-Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig$1;
-HSPLorg/chromium/components/browser_ui/widget/displaystyle/UiConfig$1;-><init>(Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig;)V
-Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig$DisplayStyle;
-HSPLorg/chromium/components/browser_ui/widget/displaystyle/UiConfig$DisplayStyle;-><init>(II)V
-Lorg/chromium/components/browser_ui/widget/displaystyle/ViewResizer;
-HSPLorg/chromium/components/browser_ui/widget/displaystyle/ViewResizer;-><init>(Landroid/view/View;Lorg/chromium/components/browser_ui/widget/displaystyle/UiConfig;II)V
-HSPLorg/chromium/components/browser_ui/widget/displaystyle/ViewResizer;->attach$1()V
-Lorg/chromium/components/browser_ui/widget/gesture/BackPressHandler;
-HSPLorg/chromium/components/browser_ui/widget/gesture/BackPressHandler;->getHandleBackPressChangedSupplier()Lorg/chromium/base/supplier/ObservableSupplier;
-Lorg/chromium/components/browser_ui/widget/gesture/SwipeGestureListener;
-HSPLorg/chromium/components/browser_ui/widget/gesture/SwipeGestureListener;-><init>(Landroid/content/Context;Lorg/chromium/components/browser_ui/widget/gesture/SwipeGestureListener$SwipeHandler;)V
-Lorg/chromium/components/browser_ui/widget/gesture/SwipeGestureListener$SwipeHandler;
-Lorg/chromium/components/browser_ui/widget/highlight/ViewHighlighter$HighlightParams;
-HSPLorg/chromium/components/browser_ui/widget/highlight/ViewHighlighter$HighlightParams;-><init>(I)V
-Lorg/chromium/components/browser_ui/widget/listmenu/ListMenuButton;
-HSPLorg/chromium/components/browser_ui/widget/listmenu/ListMenuButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/components/browser_ui/widget/listmenu/ListMenuButton;->dismiss()V
-HSPLorg/chromium/components/browser_ui/widget/listmenu/ListMenuButton;->onAttachedToWindow()V
-HSPLorg/chromium/components/browser_ui/widget/listmenu/ListMenuButton;->onDetachedFromWindow()V
-HSPLorg/chromium/components/browser_ui/widget/listmenu/ListMenuButton;->onFinishInflate()V
-Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;
-HSPLorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;-><init>(Landroid/content/Context;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator$SystemUiScrimDelegate;Landroid/view/ViewGroup;I)V
-Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;)V
-Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator$$ExternalSyntheticLambda1;
-HSPLorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator;Landroid/content/Context;Landroid/view/ViewGroup;I)V
-Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator$SystemUiScrimDelegate;
-Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator$TouchEventDelegate;
-Lorg/chromium/components/browser_ui/widget/scrim/ScrimMediator;
-HSPLorg/chromium/components/browser_ui/widget/scrim/ScrimMediator;-><init>(Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/components/browser_ui/widget/scrim/ScrimCoordinator$SystemUiScrimDelegate;)V
-Lorg/chromium/components/browser_ui/widget/scrim/ScrimProperties;
-Lorg/chromium/components/browser_ui/widget/text/VerticallyFixedEditText;
-HSPLorg/chromium/components/browser_ui/widget/text/VerticallyFixedEditText;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/components/browser_ui/widget/text/VerticallyFixedEditText;->scrollTo(II)V
-Lorg/chromium/components/commerce/core/ShoppingService;
-HSPLorg/chromium/components/commerce/core/ShoppingService;-><init>(J)V
-HSPLorg/chromium/components/commerce/core/ShoppingService;->create(J)Lorg/chromium/components/commerce/core/ShoppingService;
-Lorg/chromium/components/commerce/core/SubscriptionsObserver;
-Lorg/chromium/components/content_capture/OnscreenContentProvider;
-HSPLorg/chromium/components/content_capture/OnscreenContentProvider;-><init>(Landroid/content/Context;Landroid/view/View;Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/components/content_capture/PlatformContentCaptureController;
-HSPLorg/chromium/components/content_capture/PlatformContentCaptureController;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/components/content_capture/PlatformContentCaptureController;->log(Ljava/lang/String;)V
-Lorg/chromium/components/content_capture/PlatformContentCaptureController$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/components/content_capture/PlatformContentCaptureController$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/Class;
-HSPLorg/chromium/components/content_capture/PlatformContentCaptureController$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/view/contentcapture/ContentCaptureManager;
-Lorg/chromium/components/content_capture/UrlAllowlist;
-HSPLorg/chromium/components/content_capture/UrlAllowlist;-><init>(Ljava/util/HashSet;Ljava/util/ArrayList;)V
-Lorg/chromium/components/crash/CrashKeys;
-HSPLorg/chromium/components/crash/CrashKeys;-><init>()V
-HSPLorg/chromium/components/crash/CrashKeys;->flushToNative()V
-HSPLorg/chromium/components/crash/CrashKeys;->getInstance()Lorg/chromium/components/crash/CrashKeys;
-HSPLorg/chromium/components/crash/CrashKeys;->set(ILjava/lang/String;)V
-Lorg/chromium/components/crash/CrashKeys$Holder;
-Lorg/chromium/components/crash/PureJavaExceptionHandler;
-HSPLorg/chromium/components/crash/PureJavaExceptionHandler;-><init>(Ljava/lang/Thread$UncaughtExceptionHandler;Lorg/chromium/chrome/browser/base/SplitCompatApplication$1;)V
-HSPLorg/chromium/components/crash/PureJavaExceptionHandler;->uninstallHandler()V
-Lorg/chromium/components/crash/browser/ChildProcessCrashObserver;
-Lorg/chromium/components/dom_distiller/content/DistillablePageUtils$PageDistillableDelegate;
-Lorg/chromium/components/dom_distiller/core/DomDistillerUrlUtils;
-HSPLorg/chromium/components/dom_distiller/core/DomDistillerUrlUtils;->isDistilledPage(Ljava/lang/String;)Z
-HSPLorg/chromium/components/dom_distiller/core/DomDistillerUrlUtils;->isDistilledPage(Lorg/chromium/url/GURL;)Z
-Lorg/chromium/components/download/BackgroundNetworkStatusListener;
-HSPLorg/chromium/components/download/BackgroundNetworkStatusListener;-><init>(Lorg/chromium/components/download/NetworkStatusListenerAndroid$Helper;)V
-HSPLorg/chromium/components/download/BackgroundNetworkStatusListener;->onNetworkConnect(IJ)V
-Lorg/chromium/components/download/BackgroundNetworkStatusListener$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/download/BackgroundNetworkStatusListener$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/components/download/BackgroundNetworkStatusListener;II)V
-HSPLorg/chromium/components/download/BackgroundNetworkStatusListener$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/components/download/BackgroundNetworkStatusListener$Observer;
-Lorg/chromium/components/download/DownloadCollectionBridge;
-HSPLorg/chromium/components/download/DownloadCollectionBridge;->getDisplayNamesForDownloads()[Lorg/chromium/components/download/DownloadCollectionBridge$DisplayNameInfo;
-PLorg/chromium/components/download/DownloadCollectionBridge;->shouldPublishDownload(Ljava/lang/String;)Z
-Lorg/chromium/components/download/DownloadDelegate;
-HSPLorg/chromium/components/download/DownloadDelegate;-><init>()V
-Lorg/chromium/components/download/NetworkStatusListenerAndroid;
-HSPLorg/chromium/components/download/NetworkStatusListenerAndroid;-><init>(J)V
-HSPLorg/chromium/components/download/NetworkStatusListenerAndroid;->create(J)Lorg/chromium/components/download/NetworkStatusListenerAndroid;
-HSPLorg/chromium/components/download/NetworkStatusListenerAndroid;->getCurrentConnectionType()I
-HSPLorg/chromium/components/download/NetworkStatusListenerAndroid;->onNetworkStatusReady(I)V
-Lorg/chromium/components/download/NetworkStatusListenerAndroid$Helper;
-HSPLorg/chromium/components/download/NetworkStatusListenerAndroid$Helper;-><init>()V
-HSPLorg/chromium/components/download/NetworkStatusListenerAndroid$Helper;->onNetworkStatusReady(I)V
-Lorg/chromium/components/download/NetworkStatusListenerAndroid$Helper$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/download/NetworkStatusListenerAndroid$Helper$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/components/download/NetworkStatusListenerAndroid$Helper;I)V
-HSPLorg/chromium/components/download/NetworkStatusListenerAndroid$Helper$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/components/download/internal/BatteryStatusListenerAndroid;
-HSPLorg/chromium/components/download/internal/BatteryStatusListenerAndroid;->getBatteryPercentage()I
-Lorg/chromium/components/embedder_support/browser_context/PartitionResolverSupplier;
-Lorg/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid;
-HSPLorg/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid;-><init>()V
-HSPLorg/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid;->getDisplayModeChecked()I
-HSPLorg/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid;->loadingStateChanged(Z)V
-HSPLorg/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid;->navigationStateChanged(I)V
-HSPLorg/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid;->onUpdateUrl(Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid;->visibleSSLStateChanged()V
-Lorg/chromium/components/embedder_support/simple_factory_key/SimpleFactoryKeyHandle;
-Lorg/chromium/components/embedder_support/util/UrlUtilities;
-HSPLorg/chromium/components/embedder_support/util/UrlUtilities;->hasIntentScheme(Lorg/chromium/url/GURL;)Z
-HSPLorg/chromium/components/embedder_support/util/UrlUtilities;->isAcceptedScheme(Lorg/chromium/url/GURL;)Z
-HSPLorg/chromium/components/embedder_support/util/UrlUtilities;->isCanonicalizedNTPUrl(Ljava/lang/String;)Z
-HSPLorg/chromium/components/embedder_support/util/UrlUtilities;->isHttpOrHttps(Lorg/chromium/url/GURL;)Z
-HSPLorg/chromium/components/embedder_support/util/UrlUtilities;->isInternalScheme(Lorg/chromium/url/GURL;)Z
-HSPLorg/chromium/components/embedder_support/util/UrlUtilities;->isNTPUrl(Ljava/lang/String;)Z
-HSPLorg/chromium/components/embedder_support/util/UrlUtilities;->isNTPUrl(Lorg/chromium/url/GURL;)Z
-HSPLorg/chromium/components/embedder_support/util/UrlUtilities;->isSchemeHttpOrHttps(Ljava/lang/String;)Z
-Lorg/chromium/components/embedder_support/view/ContentView;
-HSPLorg/chromium/components/embedder_support/view/ContentView;-><init>(Landroid/content/Context;Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/components/embedder_support/view/ContentView;->awakenScrollBars(IZ)Z
-HSPLorg/chromium/components/embedder_support/view/ContentView;->getAccessibilityNodeProvider()Landroid/view/accessibility/AccessibilityNodeProvider;
-HSPLorg/chromium/components/embedder_support/view/ContentView;->getViewEventSink()Lorg/chromium/content_public/browser/ViewEventSink;
-HSPLorg/chromium/components/embedder_support/view/ContentView;->hasValidWebContents()Z
-HSPLorg/chromium/components/embedder_support/view/ContentView;->onAttachedToWindow()V
-HSPLorg/chromium/components/embedder_support/view/ContentView;->onCheckIsTextEditor()Z
-HSPLorg/chromium/components/embedder_support/view/ContentView;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;
-HSPLorg/chromium/components/embedder_support/view/ContentView;->onDetachedFromWindow()V
-HSPLorg/chromium/components/embedder_support/view/ContentView;->onFocusChanged(ZILandroid/graphics/Rect;)V
-HSPLorg/chromium/components/embedder_support/view/ContentView;->onMeasure(II)V
-HSPLorg/chromium/components/embedder_support/view/ContentView;->onScrollChanged(IIII)V
-HSPLorg/chromium/components/embedder_support/view/ContentView;->onWindowFocusChanged(Z)V
-HSPLorg/chromium/components/embedder_support/view/ContentView;->setDeferKeepScreenOnChanges(Z)V
-Lorg/chromium/components/external_intents/ExternalNavigationDelegate;
-Lorg/chromium/components/external_intents/ExternalNavigationHandler;
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler;-><init>(Lorg/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl;)V
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler;->debug()Z
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler;->handleFallbackUrl(Lorg/chromium/components/external_intents/ExternalNavigationParams;Lorg/chromium/url/GURL;Z)Lorg/chromium/components/external_intents/ExternalNavigationHandler$OverrideUrlLoadingResult;
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler;->isIncomingIntentRedirect(Lorg/chromium/components/external_intents/ExternalNavigationParams;)Z
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler;->isInternalScheme(Ljava/lang/String;)Z
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler;->sanitizeQueryIntentActivitiesIntent(Landroid/content/Intent;)V
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler;->shouldBlockAllExternalAppLaunches(Lorg/chromium/components/external_intents/ExternalNavigationParams;Z)Z
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler;->shouldOverrideUrlLoading(Lorg/chromium/components/external_intents/ExternalNavigationParams;)Lorg/chromium/components/external_intents/ExternalNavigationHandler$OverrideUrlLoadingResult;
-Lorg/chromium/components/external_intents/ExternalNavigationHandler$IntentBasedSupplier;
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler$IntentBasedSupplier;-><init>(Landroid/content/Intent;Lorg/chromium/base/supplier/Supplier;)V
-Lorg/chromium/components/external_intents/ExternalNavigationHandler$LazySupplier;
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler$LazySupplier;-><init>(Lorg/chromium/base/supplier/Supplier;)V
-Lorg/chromium/components/external_intents/ExternalNavigationHandler$OverrideUrlLoadingResult;
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler$OverrideUrlLoadingResult;-><init>(I)V
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler$OverrideUrlLoadingResult;-><init>(IZ)V
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler$OverrideUrlLoadingResult;->forNoOverride()Lorg/chromium/components/external_intents/ExternalNavigationHandler$OverrideUrlLoadingResult;
-Lorg/chromium/components/external_intents/ExternalNavigationHandler$QueryIntentActivitiesSupplier;
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler$QueryIntentActivitiesSupplier;-><init>(Landroid/content/Intent;Lorg/chromium/components/external_intents/ExternalNavigationHandler;)V
-Lorg/chromium/components/external_intents/ExternalNavigationHandler$QueryIntentActivitiesSupplier$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler$QueryIntentActivitiesSupplier$$ExternalSyntheticLambda0;-><init>(Landroid/content/Intent;Lorg/chromium/components/external_intents/ExternalNavigationHandler;)V
-Lorg/chromium/components/external_intents/ExternalNavigationHandler$QueryIntentActivitiesSupplier$QueryNonDefaultSupplier;
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler$QueryIntentActivitiesSupplier$QueryNonDefaultSupplier;-><init>(Landroid/content/Intent;)V
-Lorg/chromium/components/external_intents/ExternalNavigationHandler$ResolveActivitySupplier$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/external_intents/ExternalNavigationHandler$ResolveActivitySupplier$$ExternalSyntheticLambda0;-><init>(Landroid/content/Intent;I)V
-Lorg/chromium/components/external_intents/ExternalNavigationParams;
-HSPLorg/chromium/components/external_intents/ExternalNavigationParams;-><init>(Lorg/chromium/url/GURL;ZLorg/chromium/url/GURL;IZZLorg/chromium/components/external_intents/RedirectHandler;ZZZZZLorg/chromium/base/Callback;ZZZ)V
-Lorg/chromium/components/external_intents/InterceptNavigationDelegateClient;
-Lorg/chromium/components/external_intents/InterceptNavigationDelegateImpl;
-HSPLorg/chromium/components/external_intents/InterceptNavigationDelegateImpl;-><init>(Lorg/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl;)V
-HSPLorg/chromium/components/external_intents/InterceptNavigationDelegateImpl;->associateWithWebContents(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/components/external_intents/InterceptNavigationDelegateImpl;->getLastCommittedEntryIndex()I
-HSPLorg/chromium/components/external_intents/InterceptNavigationDelegateImpl;->isTabOnInitialNavigationChain()Z
-HSPLorg/chromium/components/external_intents/InterceptNavigationDelegateImpl;->shouldIgnoreNavigation(Lorg/chromium/content_public/browser/NavigationHandle;Lorg/chromium/url/GURL;Z)Z
-HSPLorg/chromium/components/external_intents/InterceptNavigationDelegateImpl;->shouldOverrideUrlLoading(Lorg/chromium/components/external_intents/RedirectHandler;Lorg/chromium/url/GURL;IZZZLorg/chromium/url/GURL;ZZLorg/chromium/components/external_intents/InterceptNavigationDelegateImpl$$ExternalSyntheticLambda0;Z)Lorg/chromium/components/external_intents/ExternalNavigationHandler$OverrideUrlLoadingResult;
-Lorg/chromium/components/external_intents/InterceptNavigationDelegateImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/external_intents/InterceptNavigationDelegateImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/components/external_intents/InterceptNavigationDelegateImpl;I)V
-Lorg/chromium/components/external_intents/RedirectHandler;
-HSPLorg/chromium/components/external_intents/RedirectHandler;-><init>()V
-HSPLorg/chromium/components/external_intents/RedirectHandler;->updateNewUrlLoading(IZZJIZZ)V
-Lorg/chromium/components/external_intents/RedirectHandler$InitialNavigationState;
-HSPLorg/chromium/components/external_intents/RedirectHandler$InitialNavigationState;-><init>(ZZZZZ)V
-Lorg/chromium/components/external_intents/RedirectHandler$IntentState;
-HSPLorg/chromium/components/external_intents/RedirectHandler$IntentState;-><init>(Landroid/content/Intent;ZZZ)V
-Lorg/chromium/components/external_intents/RedirectHandler$NavigationChainState;
-HSPLorg/chromium/components/external_intents/RedirectHandler$NavigationChainState;-><init>(Lorg/chromium/components/external_intents/RedirectHandler;ZLorg/chromium/components/external_intents/RedirectHandler$InitialNavigationState;)V
-Lorg/chromium/components/externalauth/ExternalAuthGoogleDelegateImpl;
-HSPLorg/chromium/components/externalauth/ExternalAuthGoogleDelegateImpl;-><init>()V
-Lorg/chromium/components/externalauth/ExternalAuthUtils;
-HSPLorg/chromium/components/externalauth/ExternalAuthUtils;-><init>()V
-HSPLorg/chromium/components/externalauth/ExternalAuthUtils;->canUseGooglePlayServices()Z
-HSPLorg/chromium/components/externalauth/ExternalAuthUtils;->canUseGooglePlayServices(Lorg/chromium/components/externalauth/UserRecoverableErrorHandler;)Z
-HSPLorg/chromium/components/externalauth/ExternalAuthUtils;->checkGooglePlayServicesAvailable(Landroid/content/Context;)I
-PLorg/chromium/components/externalauth/ExternalAuthUtils;->isGoogleSigned()V
-Lorg/chromium/components/externalauth/UserRecoverableErrorHandler;
-HSPLorg/chromium/components/externalauth/UserRecoverableErrorHandler;-><init>()V
-Lorg/chromium/components/externalauth/UserRecoverableErrorHandler$Silent;
-HSPLorg/chromium/components/externalauth/UserRecoverableErrorHandler$Silent;-><init>()V
-Lorg/chromium/components/favicon/LargeIconBridge;
-HSPLorg/chromium/components/favicon/LargeIconBridge;-><init>(Lorg/chromium/content_public/browser/BrowserContextHandle;)V
-HSPLorg/chromium/components/favicon/LargeIconBridge;->destroy()V
-Lorg/chromium/components/favicon/LargeIconBridge$LargeIconCallback;
-Lorg/chromium/components/feature_engagement/Tracker;
-Lorg/chromium/components/feature_engagement/internal/TrackerImpl;
-HSPLorg/chromium/components/feature_engagement/internal/TrackerImpl;-><init>(J)V
-HSPLorg/chromium/components/feature_engagement/internal/TrackerImpl;->addOnInitializedCallback(Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/components/feature_engagement/internal/TrackerImpl;->create(J)Lorg/chromium/components/feature_engagement/internal/TrackerImpl;
-HSPLorg/chromium/components/feature_engagement/internal/TrackerImpl;->getPendingPriorityNotification()Ljava/lang/String;
-HSPLorg/chromium/components/feature_engagement/internal/TrackerImpl;->registerPriorityNotificationHandler(Ljava/lang/String;Ljava/lang/Runnable;)V
-HSPLorg/chromium/components/feature_engagement/internal/TrackerImpl;->shouldTriggerHelpUI(Ljava/lang/String;)Z
-HSPLorg/chromium/components/feature_engagement/internal/TrackerImpl;->unregisterPriorityNotificationHandler(Ljava/lang/String;)V
-Lorg/chromium/components/gcm_driver/GCMDriver;
-HSPLorg/chromium/components/gcm_driver/GCMDriver;-><init>(J)V
-HSPLorg/chromium/components/gcm_driver/GCMDriver;->create(J)Lorg/chromium/components/gcm_driver/GCMDriver;
-HSPLorg/chromium/components/gcm_driver/GCMDriver;->replayPersistedMessages(Ljava/lang/String;)V
-Lorg/chromium/components/gcm_driver/GoogleCloudMessagingV2;
-HSPLorg/chromium/components/gcm_driver/GoogleCloudMessagingV2;-><init>()V
-Lorg/chromium/components/gcm_driver/instance_id/InstanceIDBridge;
-HSPLorg/chromium/components/gcm_driver/instance_id/InstanceIDBridge;-><init>(JLjava/lang/String;)V
-HSPLorg/chromium/components/gcm_driver/instance_id/InstanceIDBridge;->create(JLjava/lang/String;)Lorg/chromium/components/gcm_driver/instance_id/InstanceIDBridge;
-Lorg/chromium/components/image_fetcher/ImageFetcher;
-HSPLorg/chromium/components/image_fetcher/ImageFetcher;-><init>(Lorg/chromium/components/image_fetcher/ImageFetcher;)V
-HSPLorg/chromium/components/image_fetcher/ImageFetcher;-><init>(Lorg/chromium/components/image_fetcher/ImageFetcherBridge;)V
-Lorg/chromium/components/image_fetcher/ImageFetcherBridge;
-HSPLorg/chromium/components/image_fetcher/ImageFetcherBridge;-><init>(Lorg/chromium/chrome/browser/profiles/ProfileKey;)V
-Lorg/chromium/components/image_fetcher/ImageFetcherFactory;
-HSPLorg/chromium/components/image_fetcher/ImageFetcherFactory;->createImageFetcher(ILorg/chromium/components/image_fetcher/ImageFetcherBridge;Lorg/chromium/base/DiscardableReferencePool;I)Lorg/chromium/components/image_fetcher/ImageFetcher;
-Lorg/chromium/components/image_fetcher/InMemoryCachedImageFetcher;
-HSPLorg/chromium/components/image_fetcher/InMemoryCachedImageFetcher;-><init>(Lorg/chromium/components/image_fetcher/ImageFetcher;Lorg/chromium/base/DiscardableReferencePool;I)V
-HSPLorg/chromium/components/image_fetcher/InMemoryCachedImageFetcher;->destroy()V
-Lorg/chromium/components/image_fetcher/NetworkImageFetcher;
-HSPLorg/chromium/components/image_fetcher/NetworkImageFetcher;-><init>(Lorg/chromium/components/image_fetcher/ImageFetcherBridge;)V
-HSPLorg/chromium/components/image_fetcher/NetworkImageFetcher;->destroy()V
-HSPLorg/chromium/components/image_fetcher/NetworkImageFetcher;->getConfig()I
-Lorg/chromium/components/infobars/InfoBar$Container;
-Lorg/chromium/components/infobars/InfoBarAnimationListener;
-Lorg/chromium/components/infobars/InfoBarContainerLayout;
-HSPLorg/chromium/components/infobars/InfoBarContainerLayout;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/infobar/InfoBarContainerView$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/infobar/InfoBarContainerView$1;)V
-HSPLorg/chromium/components/infobars/InfoBarContainerLayout;->onLayout(ZIIII)V
-HSPLorg/chromium/components/infobars/InfoBarContainerLayout;->onMeasure(II)V
-Lorg/chromium/components/infobars/InfoBarContainerLayout$FloatingBehavior;
-HSPLorg/chromium/components/infobars/InfoBarContainerLayout$FloatingBehavior;-><init>(Landroid/widget/FrameLayout;)V
-HSPLorg/chromium/components/infobars/InfoBarContainerLayout$FloatingBehavior;->updateShadowPosition()V
-Lorg/chromium/components/media_router/BrowserMediaRouter;
-HSPLorg/chromium/components/media_router/BrowserMediaRouter;-><init>(J)V
-HSPLorg/chromium/components/media_router/BrowserMediaRouter;->create(J)Lorg/chromium/components/media_router/BrowserMediaRouter;
-HSPLorg/chromium/components/media_router/BrowserMediaRouter;->getAndroidMediaRouter()Landroidx/mediarouter/media/MediaRouter;
-Lorg/chromium/components/media_router/DiscoveryDelegate;
-Lorg/chromium/components/media_router/MediaRouteManager;
-Lorg/chromium/components/media_router/MediaRouteProvider;
-Lorg/chromium/components/media_router/caf/BaseNotificationController;
-HSPLorg/chromium/components/media_router/caf/BaseNotificationController;-><init>(Lorg/chromium/components/media_router/caf/BaseSessionController;)V
-Lorg/chromium/components/media_router/caf/BaseSessionController;
-HSPLorg/chromium/components/media_router/caf/BaseSessionController;-><init>(Lorg/chromium/components/media_router/caf/CafBaseMediaRouteProvider;)V
-Lorg/chromium/components/media_router/caf/BaseSessionController$Callback;
-Lorg/chromium/components/media_router/caf/BaseSessionController$RemoteMediaClientCallback;
-HSPLorg/chromium/components/media_router/caf/BaseSessionController$RemoteMediaClientCallback;-><init>(Lorg/chromium/components/media_router/caf/BaseSessionController;)V
-Lorg/chromium/components/media_router/caf/CafBaseMediaRouteProvider;
-HSPLorg/chromium/components/media_router/caf/CafBaseMediaRouteProvider;-><init>(Landroidx/mediarouter/media/MediaRouter;Lorg/chromium/components/media_router/BrowserMediaRouter;)V
-Lorg/chromium/components/media_router/caf/CafMediaRouteProvider;
-HSPLorg/chromium/components/media_router/caf/CafMediaRouteProvider;-><init>(Landroidx/mediarouter/media/MediaRouter;Lorg/chromium/components/media_router/BrowserMediaRouter;)V
-Lorg/chromium/components/media_router/caf/CafMessageHandler;
-HSPLorg/chromium/components/media_router/caf/CafMessageHandler;-><init>(Lorg/chromium/components/media_router/caf/CafMediaRouteProvider;Lorg/chromium/components/media_router/caf/CastSessionController;)V
-Lorg/chromium/components/media_router/caf/CafNotificationController;
-HSPLorg/chromium/components/media_router/caf/CafNotificationController;-><init>(Lorg/chromium/components/media_router/caf/BaseSessionController;)V
-Lorg/chromium/components/media_router/caf/CastSessionController;
-HSPLorg/chromium/components/media_router/caf/CastSessionController;-><init>(Lorg/chromium/components/media_router/caf/CafBaseMediaRouteProvider;)V
-Lorg/chromium/components/media_router/caf/CastSessionController$CastListener;
-HSPLorg/chromium/components/media_router/caf/CastSessionController$CastListener;-><init>(Lorg/chromium/components/media_router/caf/CastSessionController;)V
-Lorg/chromium/components/media_router/caf/remoting/CafRemotingMediaRouteProvider;
-HSPLorg/chromium/components/media_router/caf/remoting/CafRemotingMediaRouteProvider;-><init>(Landroidx/mediarouter/media/MediaRouter;Lorg/chromium/components/media_router/BrowserMediaRouter;)V
-Lorg/chromium/components/media_router/caf/remoting/RemotingNotificationController;
-HSPLorg/chromium/components/media_router/caf/remoting/RemotingNotificationController;-><init>(Lorg/chromium/components/media_router/caf/BaseSessionController;)V
-Lorg/chromium/components/media_router/caf/remoting/RemotingSessionController;
-HSPLorg/chromium/components/media_router/caf/remoting/RemotingSessionController;-><init>(Lorg/chromium/components/media_router/caf/CafBaseMediaRouteProvider;)V
-Lorg/chromium/components/messages/ManagedMessageDispatcher;
-Lorg/chromium/components/messages/MessageAnimationCoordinator;
-HSPLorg/chromium/components/messages/MessageAnimationCoordinator;-><init>(Lorg/chromium/components/messages/MessageContainer;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda0;)V
-Lorg/chromium/components/messages/MessageContainer;
-HSPLorg/chromium/components/messages/MessageContainer;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/components/messages/MessageContainer;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V
-Lorg/chromium/components/messages/MessageContainer$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/messages/MessageContainer$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/components/messages/MessageContainer;)V
-Lorg/chromium/components/messages/MessageContainer$MessageContainerA11yDelegateProxy;
-HSPLorg/chromium/components/messages/MessageContainer$MessageContainerA11yDelegateProxy;-><init>(Lorg/chromium/components/messages/MessageContainer;)V
-Lorg/chromium/components/messages/MessageDispatcher;
-Lorg/chromium/components/messages/MessageDispatcherImpl;
-HSPLorg/chromium/components/messages/MessageDispatcherImpl;-><init>(Lorg/chromium/components/messages/MessageContainer;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda1;Lorg/chromium/chrome/browser/messages/ChromeMessageAutodismissDurationProvider;Lorg/chromium/chrome/browser/ui/RootUiCoordinator$$ExternalSyntheticLambda0;Lorg/chromium/ui/base/ActivityWindowAndroid;)V
-Lorg/chromium/components/messages/MessageDispatcherProvider;
-HSPLorg/chromium/components/messages/MessageDispatcherProvider;->from(Lorg/chromium/ui/base/WindowAndroid;)Lorg/chromium/components/messages/MessageDispatcher;
-Lorg/chromium/components/messages/MessageQueueDelegate;
-Lorg/chromium/components/messages/MessageQueueManager;
-HSPLorg/chromium/components/messages/MessageQueueManager;-><init>(Lorg/chromium/components/messages/MessageAnimationCoordinator;)V
-HSPLorg/chromium/components/messages/MessageQueueManager;->getNextMessages()Ljava/util/List;
-HSPLorg/chromium/components/messages/MessageQueueManager;->updateCurrentDisplayedMessages()V
-HSPLorg/chromium/components/messages/MessageQueueManager;->updateCurrentDisplayedWithoutStacking()Lorg/chromium/components/messages/MessageQueueManager$MessageState;
-Lorg/chromium/components/messages/MessageQueueManager$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/messages/MessageQueueManager$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/components/messages/MessageQueueManager;I)V
-HSPLorg/chromium/components/messages/MessageQueueManager$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/components/messages/MessageQueueManager$MessageState;
-Lorg/chromium/components/messages/ScopeChangeController;
-HSPLorg/chromium/components/messages/ScopeChangeController;-><init>(Lorg/chromium/components/messages/ScopeChangeController$Delegate;)V
-Lorg/chromium/components/messages/ScopeChangeController$Delegate;
-Lorg/chromium/components/messages/SwipeAnimationHandler;
-Lorg/chromium/components/metrics/LowEntropySource;
-HSPLorg/chromium/components/metrics/LowEntropySource;->generateLowEntropySource()I
-HSPLorg/chromium/components/metrics/LowEntropySource;->generatePseudoLowEntropySource()I
-Lorg/chromium/components/metrics/LowEntropySource$LazyHolder;
-Lorg/chromium/components/metrics/LowEntropySource$LazyHolderForPseudo;
-Lorg/chromium/components/minidump_uploader/CrashFileManager;
-HSPLorg/chromium/components/minidump_uploader/CrashFileManager;-><init>(Ljava/io/File;)V
-HSPLorg/chromium/components/minidump_uploader/CrashFileManager;->cleanOutAllNonFreshMinidumpFiles()V
-HSPLorg/chromium/components/minidump_uploader/CrashFileManager;->getCrashDirectory()Ljava/io/File;
-HSPLorg/chromium/components/minidump_uploader/CrashFileManager;->getMinidumpsReadyForUpload()[Ljava/io/File;
-HSPLorg/chromium/components/minidump_uploader/CrashFileManager;->importCrashpadMinidumps()V
-HSPLorg/chromium/components/minidump_uploader/CrashFileManager;->listCrashFiles(Ljava/util/regex/Pattern;)[Ljava/io/File;
-Lorg/chromium/components/minidump_uploader/CrashFileManager$1;
-HSPLorg/chromium/components/minidump_uploader/CrashFileManager$1;-><init>()V
-Lorg/chromium/components/minidump_uploader/CrashFileManager$2;
-HSPLorg/chromium/components/minidump_uploader/CrashFileManager$2;-><init>(Ljava/util/regex/Pattern;)V
-Lorg/chromium/components/minidump_uploader/util/CrashReportingPermissionManager;
-HSPLorg/chromium/components/minidump_uploader/util/CrashReportingPermissionManager;->isUsageAndCrashReportingPermitted()Z
-Lorg/chromium/components/module_installer/builder/Module;
-HSPLorg/chromium/components/module_installer/builder/Module;-><init>(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;)V
-HSPLorg/chromium/components/module_installer/builder/Module;->getImpl()Ljava/lang/Object;
-HSPLorg/chromium/components/module_installer/builder/Module;->getInstallEngine()Lorg/chromium/components/module_installer/engine/InstallEngine;
-HSPLorg/chromium/components/module_installer/builder/Module;->isInstalled()Z
-Lorg/chromium/components/module_installer/builder/ModuleEngine;
-HSPLorg/chromium/components/module_installer/builder/ModuleEngine;-><init>(Ljava/lang/String;)V
-HSPLorg/chromium/components/module_installer/builder/ModuleEngine;->isInstalled(Ljava/lang/String;)Z
-Lorg/chromium/components/module_installer/engine/EngineFactory;
-HSPLorg/chromium/components/module_installer/engine/EngineFactory;-><init>()V
-Lorg/chromium/components/module_installer/engine/InstallEngine;
-Lorg/chromium/components/module_installer/util/Timer;
-HSPLorg/chromium/components/module_installer/util/Timer;-><init>()V
-HSPLorg/chromium/components/module_installer/util/Timer;->close()V
-Lorg/chromium/components/navigation_interception/InterceptNavigationDelegate;
-HSPLorg/chromium/components/navigation_interception/InterceptNavigationDelegate;-><init>()V
-Lorg/chromium/components/offline_items_collection/OfflineContentAggregatorBridge;
-HSPLorg/chromium/components/offline_items_collection/OfflineContentAggregatorBridge;-><init>(J)V
-HSPLorg/chromium/components/offline_items_collection/OfflineContentAggregatorBridge;->create(J)Lorg/chromium/components/offline_items_collection/OfflineContentAggregatorBridge;
-Lorg/chromium/components/offline_items_collection/OfflineContentProvider$Observer;
-Lorg/chromium/components/offline_items_collection/OfflineItemVisuals;
-HSPLorg/chromium/components/offline_items_collection/OfflineItemVisuals;-><init>()V
-Lorg/chromium/components/offline_items_collection/VisualsCallback;
-PLorg/chromium/components/offline_items_collection/bridges/OfflineItemBridge;->createArrayList()Ljava/util/ArrayList;
-Lorg/chromium/components/omnibox/AutocompleteMatch;
-Lorg/chromium/components/omnibox/AutocompleteResult;
-HSPLorg/chromium/components/omnibox/AutocompleteResult;-><init>(JLjava/util/List;Lorg/chromium/components/omnibox/GroupsProto$GroupsInfo;)V
-Lorg/chromium/components/omnibox/AutocompleteSchemeClassifier;
-HSPLorg/chromium/components/omnibox/AutocompleteSchemeClassifier;-><init>(J)V
-HSPLorg/chromium/components/omnibox/AutocompleteSchemeClassifier;->getNativePtr()J
-Lorg/chromium/components/omnibox/GroupsProto$GroupConfig;
-HSPLorg/chromium/components/omnibox/GroupsProto$GroupConfig;-><init>()V
-Lorg/chromium/components/omnibox/GroupsProto$GroupsInfo;
-HSPLorg/chromium/components/omnibox/GroupsProto$GroupsInfo;-><init>()V
-HSPLorg/chromium/components/omnibox/GroupsProto$GroupsInfo;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Lorg/chromium/components/omnibox/GroupsProto$GroupsInfo$Builder;
-HSPLorg/chromium/components/omnibox/GroupsProto$GroupsInfo$Builder;-><init>(I)V
-Lorg/chromium/components/omnibox/GroupsProto$GroupsInfo$GroupConfigsDefaultEntryHolder;
-Lorg/chromium/components/omnibox/OmniboxUrlEmphasizer;
-HSPLorg/chromium/components/omnibox/OmniboxUrlEmphasizer;->emphasizeUrl(Landroid/text/Spannable;Lorg/chromium/components/omnibox/AutocompleteSchemeClassifier;IZIIII)V
-HSPLorg/chromium/components/omnibox/OmniboxUrlEmphasizer;->parseForEmphasizeComponents(Ljava/lang/String;Lorg/chromium/components/omnibox/AutocompleteSchemeClassifier;)Lorg/chromium/components/omnibox/OmniboxUrlEmphasizer$EmphasizeComponentsResponse;
-Lorg/chromium/components/omnibox/OmniboxUrlEmphasizer$EmphasizeComponentsResponse;
-HSPLorg/chromium/components/omnibox/OmniboxUrlEmphasizer$EmphasizeComponentsResponse;-><init>(IIII)V
-HSPLorg/chromium/components/omnibox/OmniboxUrlEmphasizer$EmphasizeComponentsResponse;->extractScheme(Ljava/lang/String;)Ljava/lang/String;
-Lorg/chromium/components/omnibox/OmniboxUrlEmphasizer$UrlEmphasisColorSpan;
-HSPLorg/chromium/components/omnibox/OmniboxUrlEmphasizer$UrlEmphasisColorSpan;-><init>(I)V
-Lorg/chromium/components/omnibox/OmniboxUrlEmphasizer$UrlEmphasisSpan;
-Lorg/chromium/components/omnibox/SecurityStatusIcon;
-HSPLorg/chromium/components/omnibox/SecurityStatusIcon;->getSecurityIconResource(IZZZ)I
-Lorg/chromium/components/omnibox/action/OmniboxPedal;
-HSPLorg/chromium/components/omnibox/action/OmniboxPedal;-><init>(ILjava/lang/String;)V
-HSPLorg/chromium/components/omnibox/action/OmniboxPedal;->build(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/chromium/url/GURL;)Lorg/chromium/components/omnibox/action/OmniboxPedal;
-Lorg/chromium/components/page_info/PageInfoDiscoverabilityMetrics;
-HSPLorg/chromium/components/page_info/PageInfoDiscoverabilityMetrics;-><init>()V
-Lorg/chromium/components/paintpreview/browser/NativePaintPreviewServiceProvider;
-Lorg/chromium/components/permissions/AndroidPermissionRequester$RequestDelegate;
-Lorg/chromium/components/permissions/PermissionDialogController;
-HSPLorg/chromium/components/permissions/PermissionDialogController;-><init>()V
-Lorg/chromium/components/permissions/PermissionDialogController$Holder;
-Lorg/chromium/components/permissions/PermissionDialogController$Observer;
-Lorg/chromium/components/policy/AbstractAppRestrictionsProvider$1;
-HSPLorg/chromium/components/policy/AbstractAppRestrictionsProvider$1;-><init>(Lorg/chromium/components/policy/AppRestrictionsProvider;)V
-Lorg/chromium/components/policy/AppRestrictionsProvider;
-HSPLorg/chromium/components/policy/AppRestrictionsProvider;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/components/policy/AppRestrictionsProvider;->refresh()V
-HSPLorg/chromium/components/policy/AppRestrictionsProvider;->startListeningForPolicyChanges()V
-Lorg/chromium/components/policy/CombinedPolicyProvider;
-HSPLorg/chromium/components/policy/CombinedPolicyProvider;-><init>()V
-HSPLorg/chromium/components/policy/CombinedPolicyProvider;->get()Lorg/chromium/components/policy/CombinedPolicyProvider;
-HSPLorg/chromium/components/policy/CombinedPolicyProvider;->linkNative(JLorg/chromium/components/policy/PolicyConverter;)Lorg/chromium/components/policy/CombinedPolicyProvider;
-HSPLorg/chromium/components/policy/CombinedPolicyProvider;->refreshPolicies()V
-Lorg/chromium/components/policy/PolicyCache;
-HSPLorg/chromium/components/policy/PolicyCache;-><init>()V
-Lorg/chromium/components/policy/PolicyCache$Type;
-HSPLorg/chromium/components/policy/PolicyCache$Type;-><init>(ILjava/lang/String;)V
-Lorg/chromium/components/policy/PolicyCacheProvider;
-HSPLorg/chromium/components/policy/PolicyCacheProvider;-><init>()V
-HSPLorg/chromium/components/policy/PolicyCacheProvider;->refresh()V
-Lorg/chromium/components/policy/PolicyCacheUpdater;
-HSPLorg/chromium/components/policy/PolicyCacheUpdater;->cachePolicies(Lorg/chromium/components/policy/PolicyMap;)V
-Lorg/chromium/components/policy/PolicyConverter;
-HSPLorg/chromium/components/policy/PolicyConverter;-><init>(J)V
-HSPLorg/chromium/components/policy/PolicyConverter;->create(J)Lorg/chromium/components/policy/PolicyConverter;
-Lorg/chromium/components/policy/PolicyMap;
-HSPLorg/chromium/components/policy/PolicyMap;-><init>(J)V
-Lorg/chromium/components/policy/PolicyProvider;
-HSPLorg/chromium/components/policy/PolicyProvider;-><init>()V
-HSPLorg/chromium/components/policy/PolicyProvider;->notifySettingsAvailable(Landroid/os/Bundle;)V
-Lorg/chromium/components/policy/PolicyService;
-HSPLorg/chromium/components/policy/PolicyService;-><init>(J)V
-Lorg/chromium/components/policy/PolicyService$Observer;
-Lorg/chromium/components/prefs/PrefService;
-HSPLorg/chromium/components/prefs/PrefService;-><init>(J)V
-HSPLorg/chromium/components/prefs/PrefService;->create(J)Lorg/chromium/components/prefs/PrefService;
-HSPLorg/chromium/components/prefs/PrefService;->getBoolean(Ljava/lang/String;)Z
-HSPLorg/chromium/components/prefs/PrefService;->getString(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/components/prefs/PrefService;->isManagedPreference(Ljava/lang/String;)Z
-HSPLorg/chromium/components/prefs/PrefService;->setBoolean(Ljava/lang/String;Z)V
-Lorg/chromium/components/safe_browsing/SafeBrowsingApiBridge;
-HSPLorg/chromium/components/safe_browsing/SafeBrowsingApiBridge;->ensureInitialized()Z
-HSPLorg/chromium/components/safe_browsing/SafeBrowsingApiBridge;->getHandler()V
-Lorg/chromium/components/search_engines/TemplateUrl;
-HSPLorg/chromium/components/search_engines/TemplateUrl;-><init>(J)V
-HSPLorg/chromium/components/search_engines/TemplateUrl;->create(J)Lorg/chromium/components/search_engines/TemplateUrl;
-HSPLorg/chromium/components/search_engines/TemplateUrl;->getKeyword()Ljava/lang/String;
-HSPLorg/chromium/components/search_engines/TemplateUrl;->getShortName()Ljava/lang/String;
-Lorg/chromium/components/search_engines/TemplateUrlService;
-HSPLorg/chromium/components/search_engines/TemplateUrlService;-><init>(J)V
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->addObserver(Lorg/chromium/components/search_engines/TemplateUrlService$TemplateUrlServiceObserver;)V
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->create(J)Lorg/chromium/components/search_engines/TemplateUrlService;
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->doesDefaultSearchEngineHaveLogo()Z
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->getDefaultSearchEngineTemplateUrl()Lorg/chromium/components/search_engines/TemplateUrl;
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->isDefaultSearchEngineGoogle()Z
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->isLoaded()Z
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->onTemplateURLServiceChanged()V
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->registerLoadListener(Lorg/chromium/components/search_engines/TemplateUrlService$LoadListener;)V
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->removeObserver(Lorg/chromium/components/search_engines/TemplateUrlService$TemplateUrlServiceObserver;)V
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->runWhenLoaded(Ljava/lang/Runnable;)V
-HSPLorg/chromium/components/search_engines/TemplateUrlService;->templateUrlServiceLoaded()V
-Lorg/chromium/components/search_engines/TemplateUrlService$LoadListener;
-Lorg/chromium/components/search_engines/TemplateUrlService$TemplateUrlServiceObserver;
-Lorg/chromium/components/security_state/SecurityStateModel;
-HSPLorg/chromium/components/security_state/SecurityStateModel;->getSecurityLevelForWebContents(Lorg/chromium/content_public/browser/WebContents;)I
-Lorg/chromium/components/segmentation_platform/SegmentSelectionResult;
-HSPLorg/chromium/components/segmentation_platform/SegmentSelectionResult;-><init>(ZILjava/lang/Float;)V
-Lorg/chromium/components/segmentation_platform/SegmentationPlatformConversionBridge;
-HSPLorg/chromium/components/segmentation_platform/SegmentationPlatformConversionBridge;->createSegmentSelectionResult(ZIZF)Lorg/chromium/components/segmentation_platform/SegmentSelectionResult;
-Lorg/chromium/components/segmentation_platform/SegmentationPlatformServiceImpl;
-HSPLorg/chromium/components/segmentation_platform/SegmentationPlatformServiceImpl;-><init>(J)V
-HSPLorg/chromium/components/segmentation_platform/SegmentationPlatformServiceImpl;->create(J)Lorg/chromium/components/segmentation_platform/SegmentationPlatformServiceImpl;
-Lorg/chromium/components/signin/AccountManagerDelegate;
-Lorg/chromium/components/signin/AccountManagerFacade;
-Lorg/chromium/components/signin/AccountManagerFacadeImpl;
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl;-><init>(Lorg/chromium/components/signin/SystemAccountManagerDelegate;)V
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl;->addObserver(Lorg/chromium/components/signin/AccountsChangeObserver;)V
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl;->getAccounts()Lorg/chromium/base/Promise;
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl;->removeObserver(Lorg/chromium/components/signin/AccountsChangeObserver;)V
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl;->updateAccounts()V
-Lorg/chromium/components/signin/AccountManagerFacadeImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/components/signin/AccountManagerFacadeImpl;)V
-Lorg/chromium/components/signin/AccountManagerFacadeImpl$$ExternalSyntheticLambda1;
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/components/signin/AccountManagerFacadeImpl;I)V
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/components/signin/AccountManagerFacadeImpl$$ExternalSyntheticLambda2;
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$$ExternalSyntheticLambda2;-><init>()V
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$$ExternalSyntheticLambda2;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/components/signin/AccountManagerFacadeImpl$3;
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$3;-><init>(Lorg/chromium/components/signin/AccountManagerFacadeImpl;Ljava/util/ArrayList;)V
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$3;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$3;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/components/signin/AccountManagerFacadeImpl$4;
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$4;-><init>(Lorg/chromium/components/signin/AccountManagerFacadeImpl;)V
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$4;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/components/signin/AccountManagerFacadeImpl$4;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/components/signin/AccountManagerFacadeProvider;
-HSPLorg/chromium/components/signin/AccountManagerFacadeProvider;->getInstance()Lorg/chromium/components/signin/AccountManagerFacade;
-Lorg/chromium/components/signin/AccountRestrictionPatternReceiver;
-HSPLorg/chromium/components/signin/AccountRestrictionPatternReceiver;-><init>(Lorg/chromium/components/signin/AccountManagerFacadeImpl$$ExternalSyntheticLambda1;)V
-Lorg/chromium/components/signin/AccountRestrictionPatternReceiver$1;
-HSPLorg/chromium/components/signin/AccountRestrictionPatternReceiver$1;-><init>(Lorg/chromium/components/signin/AccountRestrictionPatternReceiver;Lorg/chromium/components/signin/AccountManagerFacadeImpl$$ExternalSyntheticLambda1;)V
-Lorg/chromium/components/signin/AccountRestrictionPatternReceiver$2;
-HSPLorg/chromium/components/signin/AccountRestrictionPatternReceiver$2;-><init>(Lorg/chromium/components/signin/AccountRestrictionPatternReceiver;Lorg/chromium/base/Promise;)V
-HSPLorg/chromium/components/signin/AccountRestrictionPatternReceiver$2;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/components/signin/AccountRestrictionPatternReceiver$2;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/components/signin/AccountUtils;
-PLorg/chromium/components/signin/AccountUtils;->checkChildAccountStatus(Lorg/chromium/components/signin/AccountManagerFacade;Ljava/util/List;Lorg/chromium/components/signin/AccountManagerFacade$ChildAccountStatusListener;)V
-HSPLorg/chromium/components/signin/AccountUtils;->getAccountsIfFulfilledOrEmpty(Lorg/chromium/base/Promise;)Ljava/util/List;
-HSPLorg/chromium/components/signin/AccountUtils;->toAccountNames(Ljava/util/List;)Ljava/util/ArrayList;
-Lorg/chromium/components/signin/AccountsChangeObserver;
-HSPLorg/chromium/components/signin/AccountsChangeObserver;->onCoreAccountInfosChanged()V
-Lorg/chromium/components/signin/PatternMatcher$IllegalPatternException;
-Lorg/chromium/components/signin/SystemAccountManagerDelegate;
-HSPLorg/chromium/components/signin/SystemAccountManagerDelegate;-><init>()V
-Lorg/chromium/components/signin/SystemAccountManagerDelegate$1;
-HSPLorg/chromium/components/signin/SystemAccountManagerDelegate$1;-><init>(Lorg/chromium/components/signin/SystemAccountManagerDelegate;)V
-Lorg/chromium/components/signin/base/CoreAccountInfo;
-Lorg/chromium/components/signin/identitymanager/AccountInfoServiceImpl;
-HSPLorg/chromium/components/signin/identitymanager/AccountInfoServiceImpl;-><init>(Lorg/chromium/components/signin/identitymanager/IdentityManager;Lorg/chromium/components/signin/identitymanager/AccountTrackerService;)V
-HSPLorg/chromium/components/signin/identitymanager/AccountInfoServiceImpl;->onAccountsSeeded(Ljava/util/List;Z)V
-Lorg/chromium/components/signin/identitymanager/AccountInfoServiceProvider;
-Lorg/chromium/components/signin/identitymanager/AccountTrackerService;
-HSPLorg/chromium/components/signin/identitymanager/AccountTrackerService;-><init>(J)V
-HSPLorg/chromium/components/signin/identitymanager/AccountTrackerService;->finishSeedingAccounts(Ljava/util/List;Z)V
-HSPLorg/chromium/components/signin/identitymanager/AccountTrackerService;->onCoreAccountInfosChanged()V
-HSPLorg/chromium/components/signin/identitymanager/AccountTrackerService;->seedAccounts(Z)V
-HSPLorg/chromium/components/signin/identitymanager/AccountTrackerService;->seedAccountsIfNeeded(Ljava/lang/Runnable;)V
-Lorg/chromium/components/signin/identitymanager/AccountTrackerService$$ExternalSyntheticLambda1;
-HSPLorg/chromium/components/signin/identitymanager/AccountTrackerService$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/components/signin/identitymanager/AccountTrackerService;Lorg/chromium/components/signin/AccountManagerFacade;Z)V
-HSPLorg/chromium/components/signin/identitymanager/AccountTrackerService$$ExternalSyntheticLambda1;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/components/signin/identitymanager/AccountTrackerService$1;
-HSPLorg/chromium/components/signin/identitymanager/AccountTrackerService$1;-><init>(Ljava/util/ArrayList;Lorg/chromium/components/signin/AccountManagerFacade;Lorg/chromium/components/signin/identitymanager/AccountTrackerService;Z)V
-HSPLorg/chromium/components/signin/identitymanager/AccountTrackerService$1;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/components/signin/identitymanager/AccountTrackerService$1;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/components/signin/identitymanager/AccountTrackerService$Observer;
-Lorg/chromium/components/signin/identitymanager/IdentityManager;
-HSPLorg/chromium/components/signin/identitymanager/IdentityManager;-><init>(J)V
-HSPLorg/chromium/components/signin/identitymanager/IdentityManager;->addObserver(Lorg/chromium/components/signin/identitymanager/IdentityManager$Observer;)V
-HSPLorg/chromium/components/signin/identitymanager/IdentityManager;->create(JLorg/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate;)Lorg/chromium/components/signin/identitymanager/IdentityManager;
-HSPLorg/chromium/components/signin/identitymanager/IdentityManager;->getPrimaryAccountInfo(I)Lorg/chromium/components/signin/base/CoreAccountInfo;
-PLorg/chromium/components/signin/identitymanager/IdentityManager;->hasPrimaryAccount(I)Z
-HSPLorg/chromium/components/signin/identitymanager/IdentityManager;->removeObserver(Lorg/chromium/components/signin/identitymanager/IdentityManager$Observer;)V
-Lorg/chromium/components/signin/identitymanager/IdentityManager$Observer;
-Lorg/chromium/components/signin/identitymanager/IdentityMutator;
-HSPLorg/chromium/components/signin/identitymanager/IdentityMutator;-><init>(J)V
-Lorg/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate;
-HSPLorg/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate;-><init>(JLorg/chromium/components/signin/identitymanager/AccountTrackerService;)V
-HSPLorg/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate;->seedAndReloadAccountsWithPrimaryAccount(Ljava/lang/String;)V
-Lorg/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate$$ExternalSyntheticLambda1;
-HSPLorg/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate;Ljava/lang/String;)V
-HSPLorg/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/components/strictmode/ReflectiveThreadStrictModeInterceptor;
-HSPLorg/chromium/components/strictmode/ReflectiveThreadStrictModeInterceptor;-><init>(Ljava/util/ArrayList;Ljava/util/function/Consumer;)V
-Lorg/chromium/components/strictmode/ReflectiveThreadStrictModeInterceptor$1;
-HSPLorg/chromium/components/strictmode/ReflectiveThreadStrictModeInterceptor$1;-><init>(Lorg/chromium/components/strictmode/ReflectiveThreadStrictModeInterceptor;)V
-Lorg/chromium/components/strictmode/ThreadStrictModeInterceptor$Builder;
-HSPLorg/chromium/components/strictmode/ThreadStrictModeInterceptor$Builder;-><init>()V
-HSPLorg/chromium/components/strictmode/ThreadStrictModeInterceptor$Builder;->ignoreExternalMethod(ILjava/lang/String;)V
-Lorg/chromium/components/strictmode/ThreadStrictModeInterceptor$Builder$$ExternalSyntheticLambda0;
-HSPLorg/chromium/components/strictmode/ThreadStrictModeInterceptor$Builder$$ExternalSyntheticLambda0;-><init>()V
-Lorg/chromium/components/strictmode/ThreadStrictModeInterceptor$Builder$$ExternalSyntheticLambda1;
-HSPLorg/chromium/components/strictmode/ThreadStrictModeInterceptor$Builder$$ExternalSyntheticLambda1;-><init>(IILjava/lang/String;)V
-Lorg/chromium/components/strictmode/ThreadStrictModeInterceptor$Builder$$ExternalSyntheticLambda3;
-HSPLorg/chromium/components/strictmode/ThreadStrictModeInterceptor$Builder$$ExternalSyntheticLambda3;-><init>(ILjava/lang/String;Ljava/lang/String;)V
-Lorg/chromium/components/stylus_handwriting/DirectWritingSettingsHelper;
-HSPLorg/chromium/components/stylus_handwriting/DirectWritingSettingsHelper;->isEnabled(Landroid/content/Context;)Z
-Lorg/chromium/components/stylus_handwriting/DisabledStylusWritingHandler;
-HSPLorg/chromium/components/stylus_handwriting/DisabledStylusWritingHandler;-><init>()V
-HSPLorg/chromium/components/stylus_handwriting/DisabledStylusWritingHandler;->onWebContentsChanged(Landroid/content/Context;Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/components/stylus_handwriting/DisabledStylusWritingHandler;->onWindowFocusChanged(Landroid/content/Context;Z)V
-Lorg/chromium/components/stylus_handwriting/StylusApiOption;
-HSPLorg/chromium/components/stylus_handwriting/StylusApiOption;->getStylusWritingCursorHandler()Lorg/chromium/ui/base/ViewAndroidDelegate$StylusWritingCursorHandler;
-Lorg/chromium/components/stylus_handwriting/StylusWritingController;
-HSPLorg/chromium/components/stylus_handwriting/StylusWritingController;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/components/stylus_handwriting/StylusWritingController;->getHandler()Lorg/chromium/components/stylus_handwriting/StylusApiOption;
-HSPLorg/chromium/components/stylus_handwriting/StylusWritingController;->onWebContentsChanged(Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/components/url_formatter/UrlFormatter;
-HSPLorg/chromium/components/url_formatter/UrlFormatter;->fixupUrl(Ljava/lang/String;)Lorg/chromium/url/GURL;
-Lorg/chromium/components/user_prefs/UserPrefs;
-HSPLorg/chromium/components/user_prefs/UserPrefs;->get(Lorg/chromium/content_public/browser/BrowserContextHandle;)Lorg/chromium/components/prefs/PrefService;
-Lorg/chromium/components/variations/NormalizedMurmurHashEntropyProvider;
-HSPLorg/chromium/components/variations/NormalizedMurmurHashEntropyProvider;->hash16(I)I
-Lorg/chromium/components/variations/firstrun/VariationsSeedBridge;
-HSPLorg/chromium/components/variations/firstrun/VariationsSeedBridge;->clearFirstRunPrefs()V
-HSPLorg/chromium/components/variations/firstrun/VariationsSeedBridge;->getVariationsFirstRunSeedCountry()Ljava/lang/String;
-HSPLorg/chromium/components/variations/firstrun/VariationsSeedBridge;->getVariationsFirstRunSeedData()[B
-HSPLorg/chromium/components/variations/firstrun/VariationsSeedBridge;->getVariationsFirstRunSeedDate()J
-HSPLorg/chromium/components/variations/firstrun/VariationsSeedBridge;->getVariationsFirstRunSeedIsGzipCompressed()Z
-HSPLorg/chromium/components/variations/firstrun/VariationsSeedBridge;->getVariationsFirstRunSeedSignature()Ljava/lang/String;
-Lorg/chromium/components/version_info/VersionConstantsBridge;
-HSPLorg/chromium/components/version_info/VersionConstantsBridge;->getChannel()I
-Lorg/chromium/components/webapk/lib/client/ChromeWebApkHostSignature;
-Lorg/chromium/components/webapk/lib/client/WebApkValidator;
-Lorg/chromium/components/webapps/AddToHomescreenViewDelegate;
-Lorg/chromium/components/webapps/AppBannerManager;
-HSPLorg/chromium/components/webapps/AppBannerManager;-><init>()V
-HSPLorg/chromium/components/webapps/AppBannerManager;->create(J)Lorg/chromium/components/webapps/AppBannerManager;
-HSPLorg/chromium/components/webapps/AppBannerManager;->destroy()V
-HSPLorg/chromium/components/webapps/AppBannerManager;->isSupported()Z
-Lorg/chromium/components/webapps/AppBannerManager$InstallStringPair;
-HSPLorg/chromium/components/webapps/AppBannerManager$InstallStringPair;-><init>(II)V
-Lorg/chromium/components/webapps/WebappsUtils;
-HSPLorg/chromium/components/webapps/WebappsUtils;->isAddToHomeIntentSupported()Z
-HSPLorg/chromium/components/webapps/WebappsUtils;->isRequestPinShortcutSupported()Z
-Lorg/chromium/components/webapps/WebappsUtils$$ExternalSyntheticApiModelOutline2;
-HSPLorg/chromium/components/webapps/WebappsUtils$$ExternalSyntheticApiModelOutline2;->m(Landroid/content/pm/ShortcutManager;)Z
-Lorg/chromium/components/webapps/bottomsheet/PwaBottomSheetController;
-HSPLorg/chromium/components/webapps/bottomsheet/PwaBottomSheetController;-><init>(Landroidx/appcompat/app/AppCompatActivity;)V
-Lorg/chromium/components/webapps/bottomsheet/PwaBottomSheetController$1;
-HSPLorg/chromium/components/webapps/bottomsheet/PwaBottomSheetController$1;-><init>(Lorg/chromium/components/webapps/bottomsheet/PwaBottomSheetController;)V
-Lorg/chromium/components/webapps/bottomsheet/PwaBottomSheetControllerProvider;
-Lorg/chromium/content/browser/AudioFocusDelegate;
-HSPLorg/chromium/content/browser/AudioFocusDelegate;-><init>(J)V
-HSPLorg/chromium/content/browser/AudioFocusDelegate;->abandonAudioFocus()V
-HSPLorg/chromium/content/browser/AudioFocusDelegate;->create(J)Lorg/chromium/content/browser/AudioFocusDelegate;
-HSPLorg/chromium/content/browser/AudioFocusDelegate;->tearDown()V
-Lorg/chromium/content/browser/BackgroundSyncNetworkObserver;
-HSPLorg/chromium/content/browser/BackgroundSyncNetworkObserver;-><init>()V
-HSPLorg/chromium/content/browser/BackgroundSyncNetworkObserver;->broadcastNetworkChangeIfNecessary(I)V
-HSPLorg/chromium/content/browser/BackgroundSyncNetworkObserver;->createObserver(J)Lorg/chromium/content/browser/BackgroundSyncNetworkObserver;
-HSPLorg/chromium/content/browser/BackgroundSyncNetworkObserver;->onNetworkConnect(IJ)V
-Lorg/chromium/content/browser/BindingManager;
-HSPLorg/chromium/content/browser/BindingManager;-><init>(Landroid/content/Context;ILorg/chromium/content/browser/ChildProcessRanking;)V
-PLorg/chromium/content/browser/BindingManager;->addBinding(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-HSPLorg/chromium/content/browser/BindingManager;->ensureLowestRankIsWaived()V
-PLorg/chromium/content/browser/BindingManager;->removeBinding(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-PLorg/chromium/content/browser/BindingManager;->useNotPerceptibleBinding()Z
-Lorg/chromium/content/browser/BindingManager$2;
-HSPLorg/chromium/content/browser/BindingManager$2;-><init>(Lorg/chromium/content/browser/BindingManager;I)V
-Lorg/chromium/content/browser/BrowserContextHandleImpl;
-HSPLorg/chromium/content/browser/BrowserContextHandleImpl;->getNativeBrowserContextPointer(Lorg/chromium/content_public/browser/BrowserContextHandle;)J
-Lorg/chromium/content/browser/BrowserStartupControllerImpl;
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;-><init>()V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;->addStartupCompletedObserver(Lorg/chromium/content_public/browser/BrowserStartupController$StartupCallback;)V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;->browserStartupComplete(I)V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;->contentStart()I
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;->executeEnqueuedCallbacks(I)V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;->executeMinimalBrowserStartupCallbacks(I)V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;->isFullBrowserStarted()Z
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;->prepareToStartBrowserProcess(Lorg/chromium/content/browser/BrowserStartupControllerImpl$2;)V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;->recordStartupUma()V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;->shouldStartGpuProcessOnBrowserStartup()Z
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl;->startBrowserProcessesAsync(ZZLorg/chromium/chrome/browser/init/ChromeBrowserInitializer$2;)V
-Lorg/chromium/content/browser/BrowserStartupControllerImpl$1;
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl$1;-><init>(Lorg/chromium/content/browser/BrowserStartupControllerImpl;)V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl$1;->run()V
-Lorg/chromium/content/browser/BrowserStartupControllerImpl$1$1;
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl$1$1;-><init>(Lorg/chromium/content/browser/BrowserStartupControllerImpl$1;)V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl$1$1;->onSuccess()V
-Lorg/chromium/content/browser/BrowserStartupControllerImpl$2;
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl$2;-><init>(Lorg/chromium/content/browser/BrowserStartupControllerImpl;Z)V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl$2;->run()V
-Lorg/chromium/content/browser/BrowserStartupControllerImpl$3;
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl$3;-><init>(Lorg/chromium/content/browser/BrowserStartupControllerImpl;Lorg/chromium/content_public/browser/BrowserStartupController$StartupCallback;)V
-HSPLorg/chromium/content/browser/BrowserStartupControllerImpl$3;->run()V
-Lorg/chromium/content/browser/ChildProcessConnectionMetrics;
-HSPLorg/chromium/content/browser/ChildProcessConnectionMetrics;-><init>()V
-HSPLorg/chromium/content/browser/ChildProcessConnectionMetrics;->getInstance()Lorg/chromium/content/browser/ChildProcessConnectionMetrics;
-Lorg/chromium/content/browser/ChildProcessConnectionMetrics$$ExternalSyntheticLambda0;
-HSPLorg/chromium/content/browser/ChildProcessConnectionMetrics$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/content/browser/ChildProcessConnectionMetrics;I)V
-HSPLorg/chromium/content/browser/ChildProcessConnectionMetrics$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/content/browser/ChildProcessConnectionMetrics$$ExternalSyntheticLambda1;
-HSPLorg/chromium/content/browser/ChildProcessConnectionMetrics$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/content/browser/ChildProcessConnectionMetrics;)V
-HSPLorg/chromium/content/browser/ChildProcessConnectionMetrics$$ExternalSyntheticLambda1;->onApplicationStateChange(I)V
-Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl;-><init>(J[Ljava/lang/String;[Lorg/chromium/base/process_launcher/FileDescriptorInfo;ZZZLorg/chromium/content/browser/GpuProcessCallback;)V
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl;->createAndStart(J[Ljava/lang/String;[Lorg/chromium/base/process_launcher/FileDescriptorInfo;Z)Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl;->getConnectionAllocator(Landroid/content/Context;Z)Lorg/chromium/base/process_launcher/ChildConnectionAllocator;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl;->getTerminationInfoAndStop(J)V
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl;->makeFdInfo(IIZJJ)Lorg/chromium/base/process_launcher/FileDescriptorInfo;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl;->setPriority(IZZZJZZI)V
-Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda0;-><init>(I)V
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda1;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda1;-><init>(ILjava/lang/Object;)V
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda2;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda2;-><init>(ILorg/chromium/base/process_launcher/ChildProcessConnection;)V
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda2;->run()V
-Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda3;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda3;-><init>()V
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$$ExternalSyntheticLambda3;->onApplicationStateChange(I)V
-Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$1;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$1;-><init>(Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl;)V
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$1;->getBoundConnection(Lorg/chromium/base/process_launcher/ChildConnectionAllocator;Lorg/chromium/base/process_launcher/ChildProcessLauncher$1;)Lorg/chromium/base/process_launcher/ChildProcessConnection;
-Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$2;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$2;-><init>(Landroid/content/Context;Z)V
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$2;->run()V
-Lorg/chromium/content/browser/ChildProcessLauncherHelperImpl$3;
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$3;-><init>(Landroid/content/Context;I)V
-HSPLorg/chromium/content/browser/ChildProcessLauncherHelperImpl$3;->run()V
-Lorg/chromium/content/browser/ChildProcessRanking;
-HSPLorg/chromium/content/browser/ChildProcessRanking;->$r8$lambda$-oTVVp0pFyCDWD4D1LzuoctqOYk(Lorg/chromium/content/browser/ChildProcessRanking;)V
-HSPLorg/chromium/content/browser/ChildProcessRanking;-><init>()V
-HSPLorg/chromium/content/browser/ChildProcessRanking;->iterator()Ljava/util/Iterator;
-HSPLorg/chromium/content/browser/ChildProcessRanking;->reposition(I)V
-HSPLorg/chromium/content/browser/ChildProcessRanking;->reshuffleGroupImportance()V
-Lorg/chromium/content/browser/ChildProcessRanking$$ExternalSyntheticLambda0;
-HSPLorg/chromium/content/browser/ChildProcessRanking$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/content/browser/ChildProcessRanking;I)V
-HSPLorg/chromium/content/browser/ChildProcessRanking$$ExternalSyntheticLambda0;->run()V
-Lorg/chromium/content/browser/ChildProcessRanking$ConnectionWithRank;
-HSPLorg/chromium/content/browser/ChildProcessRanking$ConnectionWithRank;-><init>(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-HSPLorg/chromium/content/browser/ChildProcessRanking$ConnectionWithRank;->shouldBeInLowRankGroup()Z
-Lorg/chromium/content/browser/ChildProcessRanking$RankComparator;
-HSPLorg/chromium/content/browser/ChildProcessRanking$RankComparator;->compare(Lorg/chromium/content/browser/ChildProcessRanking$ConnectionWithRank;Lorg/chromium/content/browser/ChildProcessRanking$ConnectionWithRank;)I
-HSPLorg/chromium/content/browser/ChildProcessRanking$RankComparator;->compareByIntersectsViewportAndDepth(Lorg/chromium/content/browser/ChildProcessRanking$ConnectionWithRank;Lorg/chromium/content/browser/ChildProcessRanking$ConnectionWithRank;)I
-Lorg/chromium/content/browser/ChildProcessRanking$ReverseRankIterator;
-HSPLorg/chromium/content/browser/ChildProcessRanking$ReverseRankIterator;-><init>(Lorg/chromium/content/browser/ChildProcessRanking;)V
-HSPLorg/chromium/content/browser/ChildProcessRanking$ReverseRankIterator;->hasNext()Z
-HSPLorg/chromium/content/browser/ChildProcessRanking$ReverseRankIterator;->next()Ljava/lang/Object;
-Lorg/chromium/content/browser/ContentClassFactory;
-HSPLorg/chromium/content/browser/ContentClassFactory;-><init>()V
-Lorg/chromium/content/browser/ContentNfcDelegate;
-HSPLorg/chromium/content/browser/ContentNfcDelegate;-><init>()V
-HSPLorg/chromium/content/browser/ContentNfcDelegate;->create()Lorg/chromium/content/browser/ContentNfcDelegate;
-Lorg/chromium/content/browser/ContentUiEventHandler;
-HSPLorg/chromium/content/browser/ContentUiEventHandler;-><init>(Lorg/chromium/content/browser/webcontents/WebContentsImpl;)V
-Lorg/chromium/content/browser/GestureListenerManagerImpl;
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;-><init>(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->addListener(Lorg/chromium/content_public/browser/GestureStateListener;I)V
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->fromWebContents(Lorg/chromium/content_public/browser/WebContents;)Lorg/chromium/content/browser/GestureListenerManagerImpl;
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->isScrollInProgress()Z
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->onNativeDestroyed()V
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->onRootScrollOffsetChangedImpl(FFF)V
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->onWindowFocusChanged(Z)V
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->removeListener(Lorg/chromium/content_public/browser/GestureStateListener;)V
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->resetPopupsAndInput(Z)V
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->updateRootScrollOffsetUpdateFrequency()V
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->updateScrollInfo(FFFFFFFFFFZ)V
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->verticalScrollExtent()I
-HSPLorg/chromium/content/browser/GestureListenerManagerImpl;->verticalScrollOffset()I
-Lorg/chromium/content/browser/GpuProcessCallback;
-HSPLorg/chromium/content/browser/GpuProcessCallback;-><init>()V
-HSPLorg/chromium/content/browser/GpuProcessCallback;->getViewSurface(I)Lorg/chromium/content/common/SurfaceWrapper;
-Lorg/chromium/content/browser/InterfaceRegistrarImpl;
-HSPLorg/chromium/content/browser/InterfaceRegistrarImpl;->createInterfaceRegistryOnIOThread(J)V
-Lorg/chromium/content/browser/LauncherThread;
-HSPLorg/chromium/content/browser/LauncherThread;->getHandlerThread()Lorg/chromium/base/JavaHandlerThread;
-HSPLorg/chromium/content/browser/LauncherThread;->post(Ljava/lang/Runnable;)V
-Lorg/chromium/content/browser/MediaSessionImpl;
-HSPLorg/chromium/content/browser/MediaSessionImpl;-><init>(J)V
-HSPLorg/chromium/content/browser/MediaSessionImpl;->create(J)Lorg/chromium/content/browser/MediaSessionImpl;
-HSPLorg/chromium/content/browser/MediaSessionImpl;->hasObservers()Z
-HSPLorg/chromium/content/browser/MediaSessionImpl;->mediaSessionActionsChanged([I)V
-HSPLorg/chromium/content/browser/MediaSessionImpl;->mediaSessionArtworkChanged([Lorg/chromium/services/media_session/MediaImage;)V
-HSPLorg/chromium/content/browser/MediaSessionImpl;->mediaSessionDestroyed()V
-HSPLorg/chromium/content/browser/MediaSessionImpl;->mediaSessionMetadataChanged(Lorg/chromium/services/media_session/MediaMetadata;)V
-HSPLorg/chromium/content/browser/MediaSessionImpl;->mediaSessionPositionChanged(Lorg/chromium/services/media_session/MediaPosition;)V
-HSPLorg/chromium/content/browser/MediaSessionImpl;->mediaSessionStateChanged(ZZ)V
-Lorg/chromium/content/browser/PopupController;
-HSPLorg/chromium/content/browser/PopupController;-><init>()V
-HSPLorg/chromium/content/browser/PopupController;->fromWebContents(Lorg/chromium/content_public/browser/WebContents;)Lorg/chromium/content/browser/PopupController;
-HSPLorg/chromium/content/browser/PopupController;->hideAllPopups()V
-Lorg/chromium/content/browser/PopupController$HideablePopup;
-Lorg/chromium/content/browser/PopupController$UserDataFactoryLazyHolder;
-Lorg/chromium/content/browser/PopupController$UserDataFactoryLazyHolder$$ExternalSyntheticLambda0;
-HSPLorg/chromium/content/browser/PopupController$UserDataFactoryLazyHolder$$ExternalSyntheticLambda0;-><init>()V
-Lorg/chromium/content/browser/RenderCoordinatesImpl;
-HSPLorg/chromium/content/browser/RenderCoordinatesImpl;-><init>()V
-HSPLorg/chromium/content/browser/RenderCoordinatesImpl;->fromLocalCssToPix(F)F
-HSPLorg/chromium/content/browser/RenderCoordinatesImpl;->getScrollYPixInt()I
-Lorg/chromium/content/browser/RenderWidgetHostViewImpl;
-HSPLorg/chromium/content/browser/RenderWidgetHostViewImpl;-><init>(J)V
-HSPLorg/chromium/content/browser/RenderWidgetHostViewImpl;->clearNativePtr()V
-HSPLorg/chromium/content/browser/RenderWidgetHostViewImpl;->create(J)Lorg/chromium/content/browser/RenderWidgetHostViewImpl;
-Lorg/chromium/content/browser/ScreenOrientationProviderImpl;
-HSPLorg/chromium/content/browser/ScreenOrientationProviderImpl;-><init>()V
-HSPLorg/chromium/content/browser/ScreenOrientationProviderImpl;->getInstance()Lorg/chromium/content/browser/ScreenOrientationProviderImpl;
-Lorg/chromium/content/browser/ScreenOrientationProviderImpl$Holder;
-Lorg/chromium/content/browser/ServicificationStartupUma;
-HSPLorg/chromium/content/browser/ServicificationStartupUma;-><init>()V
-HSPLorg/chromium/content/browser/ServicificationStartupUma;->getStartupMode(ZZZ)I
-Lorg/chromium/content/browser/SpareChildConnection;
-HSPLorg/chromium/content/browser/SpareChildConnection;-><init>(Landroid/content/Context;Lorg/chromium/base/process_launcher/ChildConnectionAllocator;Landroid/os/Bundle;)V
-Lorg/chromium/content/browser/SpareChildConnection$1;
-HSPLorg/chromium/content/browser/SpareChildConnection$1;-><init>(Lorg/chromium/content/browser/SpareChildConnection;)V
-HSPLorg/chromium/content/browser/SpareChildConnection$1;->onChildProcessDied(Lorg/chromium/base/process_launcher/ChildProcessConnection;)V
-HSPLorg/chromium/content/browser/SpareChildConnection$1;->onChildStarted()V
-Lorg/chromium/content/browser/SpareChildConnection$2;
-HSPLorg/chromium/content/browser/SpareChildConnection$2;-><init>(Lorg/chromium/base/process_launcher/ChildProcessLauncher$1;)V
-HSPLorg/chromium/content/browser/SpareChildConnection$2;->run()V
-Lorg/chromium/content/browser/SpeechRecognitionImpl;
-HSPLorg/chromium/content/browser/SpeechRecognitionImpl;->getComponent(ILjava/lang/String;)Landroid/content/ComponentName;
-Lorg/chromium/content/browser/TracingControllerAndroidImpl;
-HSPLorg/chromium/content/browser/TracingControllerAndroidImpl;-><init>(Landroid/content/Context;)V
-Lorg/chromium/content/browser/TracingControllerAndroidImpl$TracingBroadcastReceiver;
-HSPLorg/chromium/content/browser/TracingControllerAndroidImpl$TracingBroadcastReceiver;-><init>(Lorg/chromium/content/browser/TracingControllerAndroidImpl;)V
-Lorg/chromium/content/browser/TracingControllerAndroidImpl$TracingIntentFilter;
-HSPLorg/chromium/content/browser/TracingControllerAndroidImpl$TracingIntentFilter;-><init>(Landroid/content/Context;)V
-Lorg/chromium/content/browser/UiThreadTaskTraitsImpl;
-Lorg/chromium/content/browser/UiThreadTaskTraitsImpl$Descriptor;
-HSPLorg/chromium/content/browser/UiThreadTaskTraitsImpl$Descriptor;-><init>()V
-Lorg/chromium/content/browser/ViewEventSinkImpl;
-HSPLorg/chromium/content/browser/ViewEventSinkImpl;-><init>(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/content/browser/ViewEventSinkImpl;->from(Lorg/chromium/content_public/browser/WebContents;)Lorg/chromium/content/browser/ViewEventSinkImpl;
-HSPLorg/chromium/content/browser/ViewEventSinkImpl;->onActivityPaused()V
-HSPLorg/chromium/content/browser/ViewEventSinkImpl;->onActivityResumed()V
-HSPLorg/chromium/content/browser/ViewEventSinkImpl;->onFocusChanged$1()V
-Lorg/chromium/content/browser/WindowEventObserver;
-HSPLorg/chromium/content/browser/WindowEventObserver;->onAttachedToWindow()V
-HSPLorg/chromium/content/browser/WindowEventObserver;->onDetachedFromWindow()V
-HSPLorg/chromium/content/browser/WindowEventObserver;->onViewFocusChanged(ZZ)V
-HSPLorg/chromium/content/browser/WindowEventObserver;->onWindowFocusChanged(Z)V
-Lorg/chromium/content/browser/WindowEventObserverManager;
-HSPLorg/chromium/content/browser/WindowEventObserverManager;-><init>(Lorg/chromium/content/browser/webcontents/WebContentsImpl;)V
-HSPLorg/chromium/content/browser/WindowEventObserverManager;->addObserver(Lorg/chromium/content/browser/WindowEventObserver;)V
-HSPLorg/chromium/content/browser/WindowEventObserverManager;->addUiObservers()V
-HSPLorg/chromium/content/browser/WindowEventObserverManager;->from(Lorg/chromium/content_public/browser/WebContents;)Lorg/chromium/content/browser/WindowEventObserverManager;
-HSPLorg/chromium/content/browser/WindowEventObserverManager;->onDIPScaleChanged(F)V
-HSPLorg/chromium/content/browser/WindowEventObserverManager;->onRotationChanged(I)V
-HSPLorg/chromium/content/browser/WindowEventObserverManager;->onWindowAndroidChanged(Lorg/chromium/ui/base/WindowAndroid;)V
-Lorg/chromium/content/browser/WindowEventObserverManager$UserDataFactoryLazyHolder;
-Lorg/chromium/content/browser/WindowEventObserverManager$UserDataFactoryLazyHolder$$ExternalSyntheticLambda0;
-HSPLorg/chromium/content/browser/WindowEventObserverManager$UserDataFactoryLazyHolder$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/content/browser/WindowEventObserverManager$UserDataFactoryLazyHolder$$ExternalSyntheticLambda0;->create(Lorg/chromium/content/browser/webcontents/WebContentsImpl;)Ljava/lang/Object;
-Lorg/chromium/content/browser/accessibility/AccessibilityDelegate;
-HSPLorg/chromium/content/browser/accessibility/AccessibilityDelegate;->getNativeAXTree()J
-HSPLorg/chromium/content/browser/accessibility/AccessibilityDelegate;->setOnScrollPositionChangedCallback(Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$$ExternalSyntheticLambda1;)V
-Lorg/chromium/content/browser/accessibility/AccessibilityDelegate$AccessibilityCoordinates;
-Lorg/chromium/content/browser/accessibility/AccessibilityEventDispatcher;
-HSPLorg/chromium/content/browser/accessibility/AccessibilityEventDispatcher;-><init>(Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$1;Ljava/util/HashMap;Ljava/util/HashSet;Ljava/util/HashSet;)V
-Lorg/chromium/content/browser/accessibility/AccessibilityHistogramRecorder;
-HSPLorg/chromium/content/browser/accessibility/AccessibilityHistogramRecorder;-><init>()V
-Lorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder;
-HSPLorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder;-><init>(Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$1;)V
-HSPLorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder;->addAccessibilityNodeInfoActions(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;IZZZZZZZZZZZZZZZZZ)V
-HSPLorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder;->addAccessibilityNodeInfoChildren(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;[I)V
-HSPLorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder;->convertWebRectToAndroidCoordinates(Landroid/graphics/Rect;Landroid/os/Bundle;)V
-HSPLorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder;->setAccessibilityNodeInfoBaseAttributes(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZIILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder;->setAccessibilityNodeInfoBooleanAttributes(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;IZZZZZZZZZZZZ)V
-HSPLorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder;->setAccessibilityNodeInfoLocation(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;IIIIIIIZ)V
-HSPLorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder;->setAccessibilityNodeInfoOAttributes(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;ZZLjava/lang/String;)V
-HSPLorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder;->setAccessibilityNodeInfoText(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Ljava/lang/String;ZZLjava/lang/String;[I[I[Ljava/lang/String;Ljava/lang/String;)V
-Lorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/util/List;)V
-Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate;-><init>(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate;->getAccessibilityCoordinates()Lorg/chromium/content/browser/accessibility/AccessibilityDelegate$AccessibilityCoordinates;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate;->getContainerView()Landroid/view/View;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate;->getProductVersion()Ljava/lang/String;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate;->getWebContents()Lorg/chromium/content_public/browser/WebContents;
-Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate$AccessibilityCoordinatesImpl;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate$AccessibilityCoordinatesImpl;-><init>(Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate;)V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate$AccessibilityCoordinatesImpl;->fromLocalCssToPix(F)F
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate$AccessibilityCoordinatesImpl;->getContentOffsetYPix()F
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate$AccessibilityCoordinatesImpl;->getContentWidthCss()F
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate$AccessibilityCoordinatesImpl;->getLastFrameViewportHeightPixInt()I
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate$AccessibilityCoordinatesImpl;->getRenderCoordinates()Lorg/chromium/content/browser/RenderCoordinatesImpl;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate$AccessibilityCoordinatesImpl;->getScrollX()F
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityDelegate$AccessibilityCoordinatesImpl;->getScrollY()F
-Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;-><init>(Lorg/chromium/content/browser/accessibility/AccessibilityDelegate;)V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->buildAccessibilityEvent(II)Landroid/view/accessibility/AccessibilityEvent;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->clearNodeInfoCacheForGivenId(I)V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->createAccessibilityNodeInfo(I)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->fromWebContents(Lorg/chromium/content_public/browser/WebContents;)Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->getAccessibilityNodeProvider()Landroid/view/accessibility/AccessibilityNodeProvider;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->handleFocusChanged(I)V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->handleNavigate(I)V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->isAccessibilityEnabled()Z
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->isFrameInfoInitialized()Z
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->isNativeInitialized()Z
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->moveAccessibilityFocusToId(I)Z
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->notifyFrameInfoInitialized()V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->onAttachedToWindow()V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->onDetachedFromWindow()V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->onNativeInit()V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->onNativeObjectDestroyed()V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->performAction(IILandroid/os/Bundle;)Z
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->refreshNativeState()V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->registerLocaleChangeReceiver()V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->requestSendAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->sendAccessibilityEvent(II)V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->setAccessibilityEventBaseAttributes(Landroid/view/accessibility/AccessibilityEvent;ZZZZIIIIIILjava/lang/String;)V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;->updateMaxNodesInCache()V
-Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$$ExternalSyntheticApiModelOutline0;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/autofill/AutofillManager;)Z
-Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$$ExternalSyntheticLambda1;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;I)V
-Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$1;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$1;-><init>(Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;)V
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$1;->dispatchEvent(II)Z
-Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$3;
-HSPLorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl$3;-><init>(Lorg/chromium/content/browser/accessibility/WebContentsAccessibilityImpl;)V
-Lorg/chromium/content/browser/accessibility/captioning/CaptioningBridge;
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningBridge;-><init>()V
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningBridge;->getCaptioningStyleFrom(Landroid/view/accessibility/CaptioningManager$CaptionStyle;)Lorg/chromium/content/browser/accessibility/captioning/CaptioningStyle;
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningBridge;->syncToDelegate()V
-Lorg/chromium/content/browser/accessibility/captioning/CaptioningChangeDelegate;
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningChangeDelegate;-><init>()V
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningChangeDelegate;->androidColorToCssColor(Ljava/lang/Integer;)Ljava/lang/String;
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningChangeDelegate;->notifyListener(Lorg/chromium/content/browser/accessibility/captioning/CaptioningController;)V
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningChangeDelegate;->notifySettingsChanged()V
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningChangeDelegate;->onUserStyleChanged(Lorg/chromium/content/browser/accessibility/captioning/CaptioningStyle;)V
-Lorg/chromium/content/browser/accessibility/captioning/CaptioningController;
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningController;-><init>(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningController;->onDestroy()V
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningController;->onRenderProcessChange()V
-Lorg/chromium/content/browser/accessibility/captioning/CaptioningStyle;
-HSPLorg/chromium/content/browser/accessibility/captioning/CaptioningStyle;-><init>(Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Landroid/graphics/Typeface;)V
-Lorg/chromium/content/browser/font/AndroidFontLookupImpl;
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl;->close()V
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl;->createFontQuery(ILjava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl;->fetchAllFontFiles(Lorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParamsProxyToResponder;)V
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl;->fetchFontInBackground(Ljava/lang/String;Lorg/chromium/mojo/system/Core;)Lorg/chromium/mojo_base/mojom/ReadOnlyFile;
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl;->onConnectionError(Lorg/chromium/mojo/system/MojoException;)V
-Lorg/chromium/content/browser/font/AndroidFontLookupImpl$$ExternalSyntheticLambda1;
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/content/browser/font/AndroidFontLookupImpl;Lorg/chromium/mojo/system/impl/CoreImpl;JLjava/util/concurrent/Executor;Lorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParamsProxyToResponder;)V
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/content/browser/font/AndroidFontLookupImpl$$ExternalSyntheticLambda2;
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl$$ExternalSyntheticLambda2;-><init>(Lorg/chromium/blink/mojom/AndroidFontLookup_Internal$AndroidFontLookupFetchAllFontFilesResponseParamsProxyToResponder;Ljava/lang/Object;I)V
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl$$ExternalSyntheticLambda2;->run()V
-Lorg/chromium/content/browser/font/AndroidFontLookupImpl$Factory;
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl$Factory;-><init>()V
-HSPLorg/chromium/content/browser/font/AndroidFontLookupImpl$Factory;->createImpl()Lorg/chromium/mojo/bindings/Interface;
-Lorg/chromium/content/browser/font/FontsContractWrapper;
-HSPLorg/chromium/content/browser/font/FontsContractWrapper;-><init>()V
-Lorg/chromium/content/browser/framehost/NavigationControllerImpl;
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;-><init>(J)V
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->canGoBack()Z
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->canGoForward()Z
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->create(J)Lorg/chromium/content/browser/framehost/NavigationControllerImpl;
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->createNavigationEntry(ILorg/chromium/url/GURL;Lorg/chromium/url/GURL;Lorg/chromium/url/GURL;Ljava/lang/String;Landroid/graphics/Bitmap;IJZ)Lorg/chromium/content_public/browser/NavigationEntry;
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->destroy()V
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->getEntryAtIndex(I)Lorg/chromium/content_public/browser/NavigationEntry;
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->getLastCommittedEntryIndex()I
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->getUseDesktopUserAgent()Z
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->isInitialNavigation()Z
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->loadUrl(Lorg/chromium/content_public/browser/LoadUrlParams;)V
-HSPLorg/chromium/content/browser/framehost/NavigationControllerImpl;->needsReload()Z
-Lorg/chromium/content/browser/framehost/RenderFrameHostDelegate;
-Lorg/chromium/content/browser/input/CursorAnchorInfoController;
-HSPLorg/chromium/content/browser/input/CursorAnchorInfoController;-><init>(Lorg/chromium/content/browser/input/InputMethodManagerWrapperImpl;Lorg/chromium/content/browser/input/ImeAdapterImpl$1;Lorg/chromium/content/browser/input/CursorAnchorInfoController$1;)V
-Lorg/chromium/content/browser/input/CursorAnchorInfoController$1;
-HSPLorg/chromium/content/browser/input/CursorAnchorInfoController$1;-><init>()V
-Lorg/chromium/content/browser/input/ImeAdapterImpl;
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;-><init>(Lorg/chromium/content/browser/webcontents/WebContentsImpl;)V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->fromWebContents(Lorg/chromium/content_public/browser/WebContents;)Lorg/chromium/content/browser/input/ImeAdapterImpl;
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->getContainerView()Landroid/view/View;
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->hideKeyboard()V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->isValid()Z
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->onAttachedToWindow()V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->onConnectedToRenderProcess()V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->onDetachedFromWindow()V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->onNativeDestroyed()V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->onResizeScrollableViewport(Z)V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->onViewFocusChanged(ZZ)V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->onWindowFocusChanged(Z)V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->resetAndHideKeyboard()V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl;->updateFrameInfo(FFZZFFF)V
-Lorg/chromium/content/browser/input/ImeAdapterImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/content/browser/input/ImeAdapterImpl;)V
-Lorg/chromium/content/browser/input/ImeAdapterImpl$1;
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl$1;-><init>(Lorg/chromium/content/browser/input/ImeAdapterImpl;)V
-Lorg/chromium/content/browser/input/ImeAdapterImpl$UserDataFactoryLazyHolder;
-Lorg/chromium/content/browser/input/ImeAdapterImpl$UserDataFactoryLazyHolder$$ExternalSyntheticLambda0;
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl$UserDataFactoryLazyHolder$$ExternalSyntheticLambda0;-><init>()V
-HSPLorg/chromium/content/browser/input/ImeAdapterImpl$UserDataFactoryLazyHolder$$ExternalSyntheticLambda0;->create(Lorg/chromium/content/browser/webcontents/WebContentsImpl;)Ljava/lang/Object;
-Lorg/chromium/content/browser/input/InputMethodManagerWrapperImpl;
-HSPLorg/chromium/content/browser/input/InputMethodManagerWrapperImpl;-><init>(Landroid/content/Context;Lorg/chromium/ui/base/WindowAndroid;Lorg/chromium/content_public/browser/InputMethodManagerWrapper$Delegate;)V
-HSPLorg/chromium/content/browser/input/InputMethodManagerWrapperImpl;->getInputMethodManager()Landroid/view/inputmethod/InputMethodManager;
-HSPLorg/chromium/content/browser/input/InputMethodManagerWrapperImpl;->hideSoftInputFromWindow(Landroid/os/IBinder;)Z
-HSPLorg/chromium/content/browser/input/InputMethodManagerWrapperImpl;->isActive(Landroid/view/View;)Z
-Lorg/chromium/content/browser/input/ThreadedInputConnectionFactory;
-HSPLorg/chromium/content/browser/input/ThreadedInputConnectionFactory;-><init>(Lorg/chromium/content_public/browser/InputMethodManagerWrapper;)V
-Lorg/chromium/content/browser/selection/AdditionalMenuItemProviderImpl;
-HSPLorg/chromium/content/browser/selection/AdditionalMenuItemProviderImpl;-><init>()V
-Lorg/chromium/content/browser/selection/MagnifierAnimator;
-HSPLorg/chromium/content/browser/selection/MagnifierAnimator;-><init>(Lorg/chromium/content/browser/selection/MagnifierWrapperImpl;)V
-HSPLorg/chromium/content/browser/selection/MagnifierAnimator;->createValueAnimator()V
-Lorg/chromium/content/browser/selection/MagnifierAnimator$$ExternalSyntheticLambda0;
-HSPLorg/chromium/content/browser/selection/MagnifierAnimator$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/content/browser/selection/MagnifierAnimator;)V
-Lorg/chromium/content/browser/selection/MagnifierWrapper;
-Lorg/chromium/content/browser/selection/MagnifierWrapperImpl;
-HSPLorg/chromium/content/browser/selection/MagnifierWrapperImpl;-><init>(Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl$$ExternalSyntheticLambda0;)V
-Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl;
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;-><init>(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->clearSelection()V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->destroyPastePopup()V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->dismissTextHandles()V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->finishActionMode()V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->fromWebContents(Lorg/chromium/content_public/browser/WebContents;)Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl;
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->hide()V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->hidePopupsAndPreserveSelection()V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->isActionModeValid()Z
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->nativeSelectionPopupControllerDestroyed()V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->onAttachedToWindow()V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->onDetachedFromWindow()V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->onViewFocusChanged(ZZ)V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->onWindowFocusChanged(Z)V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->restoreSelectionPopupsIfNecessary()V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->setSelectionClient(Lorg/chromium/content_public/browser/SelectionClient;)V
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl;->updateTextSelectionUI(Z)V
-Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl$$ExternalSyntheticLambda0;
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl;)V
-Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl$1;
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl$1;-><init>(Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl;)V
-Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl$2;
-HSPLorg/chromium/content/browser/selection/SelectionPopupControllerImpl$2;-><init>(Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl;)V
-Lorg/chromium/content/browser/selection/SmartSelectionClient;
-HSPLorg/chromium/content/browser/selection/SmartSelectionClient;-><init>(Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl$2;Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/content/browser/selection/SmartSelectionClient;->getSelectionEventProcessor()Lorg/chromium/content_public/browser/SelectionEventProcessor;
-HSPLorg/chromium/content/browser/selection/SmartSelectionClient;->onNativeSideDestroyed(J)V
-Lorg/chromium/content/browser/selection/SmartSelectionEventProcessor;
-HSPLorg/chromium/content/browser/selection/SmartSelectionEventProcessor;-><init>(Lorg/chromium/content_public/browser/WebContents;)V
-Lorg/chromium/content/browser/selection/SmartSelectionEventProcessor$1;
-HSPLorg/chromium/content/browser/selection/SmartSelectionEventProcessor$1;-><init>(Lorg/chromium/content/browser/selection/SmartSelectionEventProcessor;)V
-Lorg/chromium/content/browser/selection/SmartSelectionProvider;
-HSPLorg/chromium/content/browser/selection/SmartSelectionProvider;-><init>(Lorg/chromium/content/browser/selection/SelectionPopupControllerImpl$2;Lorg/chromium/content_public/browser/WebContents;Lorg/chromium/content/browser/selection/SmartSelectionEventProcessor;)V
-Lorg/chromium/content/browser/selection/SmartSelectionProvider$1;
-HSPLorg/chromium/content/browser/selection/SmartSelectionProvider$1;-><init>(Lorg/chromium/content/browser/selection/SmartSelectionProvider;)V
-Lorg/chromium/content/browser/selection/SmartSelectionProvider$2;
-HSPLorg/chromium/content/browser/selection/SmartSelectionProvider$2;-><init>(Lorg/chromium/content/browser/selection/SmartSelectionProvider;)V
-Lorg/chromium/content/browser/sms/SmsProviderGms;
-HSPLorg/chromium/content/browser/sms/SmsProviderGms;-><init>(JIZ)V
-HSPLorg/chromium/content/browser/sms/SmsProviderGms;->create(JI)Lorg/chromium/content/browser/sms/SmsProviderGms;
-Lorg/chromium/content/browser/sms/SmsUserConsentReceiver;
-HSPLorg/chromium/content/browser/sms/SmsUserConsentReceiver;-><init>(Lorg/chromium/content/browser/sms/SmsProviderGms;Lorg/chromium/content/browser/sms/Wrappers$WebOTPServiceContext;)V
-Lorg/chromium/content/browser/sms/SmsVerificationReceiver;
-HSPLorg/chromium/content/browser/sms/SmsVerificationReceiver;-><init>(Lorg/chromium/content/browser/sms/SmsProviderGms;Lorg/chromium/content/browser/sms/Wrappers$WebOTPServiceContext;)V
-Lorg/chromium/content/browser/sms/Wrappers$WebOTPServiceContext;
-HSPLorg/chromium/content/browser/sms/Wrappers$WebOTPServiceContext;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/content/browser/sms/Wrappers$WebOTPServiceContext;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent;
-Lorg/chromium/content/browser/webcontents/WebContentsImpl;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;-><init>(JLorg/chromium/content_public/browser/NavigationController;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->addObserver(Lorg/chromium/content_public/browser/WebContentsObserver;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->checkNotDestroyed()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->clearNativePtr()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->create(JLorg/chromium/content_public/browser/NavigationController;)Lorg/chromium/content/browser/webcontents/WebContentsImpl;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getContext()Landroid/content/Context;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getLastCommittedUrl()Lorg/chromium/url/GURL;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getLoadProgress()F
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getNativePointer()J
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getNavigationController()Lorg/chromium/content_public/browser/NavigationController;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getOrSetUserData(Ljava/lang/Class;Lorg/chromium/content/browser/webcontents/WebContentsImpl$UserDataFactory;)Lorg/chromium/base/UserData;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getRenderWidgetHostView$1()Lorg/chromium/content/browser/RenderWidgetHostViewImpl;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getRenderWidgetHostView()Lorg/chromium/content/browser/RenderWidgetHostViewImpl;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getTitle()Ljava/lang/String;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getTopLevelNativeWindow()Lorg/chromium/ui/base/WindowAndroid;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getUserDataHost()Lorg/chromium/base/UserDataHost;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getViewAndroidDelegate()Lorg/chromium/ui/base/ViewAndroidDelegate;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getVirtualKeyboardMode()I
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getVisibility()I
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->getVisibleUrl()Lorg/chromium/url/GURL;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->initialize(Lorg/chromium/ui/base/ViewAndroidDelegate;Lorg/chromium/components/embedder_support/view/ContentView;Lorg/chromium/ui/base/WindowAndroid;Lorg/chromium/content_public/browser/WebContents$1;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->isDestroyed()Z
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->isIncognito()Z
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->isLoading()Z
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->notifyRendererPreferenceUpdate()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->onDIPScaleChanged(F)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->onHide()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->onShow()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->removeObserver(Lorg/chromium/content_public/browser/WebContentsObserver;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->setFocus(Z)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->setImportance(I)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->setMediaSession(Lorg/chromium/content/browser/MediaSessionImpl;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->setOverscrollRefreshHandler(Lorg/chromium/ui/OverscrollRefreshHandler;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->setSize(II)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->setStylusWritingHandler(Lorg/chromium/content_public/browser/StylusWritingHandler;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl;->setTopLevelNativeWindow(Lorg/chromium/ui/base/WindowAndroid;)V
-Lorg/chromium/content/browser/webcontents/WebContentsImpl$1;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl$1;-><init>()V
-Lorg/chromium/content/browser/webcontents/WebContentsImpl$UserDataFactory;
-Lorg/chromium/content/browser/webcontents/WebContentsImpl$WebContentsInternalsImpl;
-HSPLorg/chromium/content/browser/webcontents/WebContentsImpl$WebContentsInternalsImpl;-><init>()V
-Lorg/chromium/content/browser/webcontents/WebContentsObserverProxy;
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;-><init>(Lorg/chromium/content/browser/webcontents/WebContentsImpl;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->destroy()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->didChangeVisibleSecurityState()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->didFinishLoadInPrimaryMainFrame(IILorg/chromium/url/GURL;ZI)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->didFinishLoadInPrimaryMainFrame(Lorg/chromium/content_public/browser/GlobalRenderFrameHostId;Lorg/chromium/url/GURL;ZI)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->didFinishNavigationInPrimaryMainFrame(Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->didFirstVisuallyNonEmptyPaint()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->didStartLoading(Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->didStartNavigationInPrimaryMainFrame(Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->didStopLoading(Lorg/chromium/url/GURL;Z)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->documentLoadedInPrimaryMainFrame(III)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->documentLoadedInPrimaryMainFrame(Lorg/chromium/content_public/browser/GlobalRenderFrameHostId;I)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->finishObserverCall()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->handleObserverCall()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->loadProgressChanged(F)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->navigationEntriesChanged()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->navigationEntryCommitted(Lorg/chromium/content_public/browser/LoadCommittedDetails;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->onWebContentsFocused()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->onWebContentsLostFocus()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->primaryMainDocumentElementAvailable()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->renderFrameCreated(II)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->renderFrameCreated(Lorg/chromium/content_public/browser/GlobalRenderFrameHostId;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->renderFrameDeleted(II)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->renderFrameDeleted(Lorg/chromium/content_public/browser/GlobalRenderFrameHostId;)V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->renderProcessGone()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->wasHidden()V
-HSPLorg/chromium/content/browser/webcontents/WebContentsObserverProxy;->wasShown()V
-Lorg/chromium/content/common/ContentSwitchUtils;
-HSPLorg/chromium/content/common/ContentSwitchUtils;->getSwitchValue([Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Lorg/chromium/content/common/IGpuProcessCallback;
-Lorg/chromium/content/common/IGpuProcessCallback$Stub;
-HSPLorg/chromium/content/common/IGpuProcessCallback$Stub;-><init>()V
-HSPLorg/chromium/content/common/IGpuProcessCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-Lorg/chromium/content/common/SurfaceWrapper;
-HSPLorg/chromium/content/common/SurfaceWrapper;-><init>(Landroid/view/Surface;Z)V
-HSPLorg/chromium/content/common/SurfaceWrapper;->create(Landroid/view/Surface;Z)Lorg/chromium/content/common/SurfaceWrapper;
-HSPLorg/chromium/content/common/SurfaceWrapper;->writeToParcel(Landroid/os/Parcel;I)V
-Lorg/chromium/content/common/SurfaceWrapper$1;
-HSPLorg/chromium/content/common/SurfaceWrapper$1;-><init>()V
-Lorg/chromium/content_public/browser/ActionModeCallbackHelper;
-HSPLorg/chromium/content_public/browser/ActionModeCallbackHelper;-><init>()V
-Lorg/chromium/content_public/browser/ActionModeCallbackHelper$EmptyActionCallback;
-HSPLorg/chromium/content_public/browser/ActionModeCallbackHelper$EmptyActionCallback;-><init>()V
-Lorg/chromium/content_public/browser/BrowserContextHandle;
-Lorg/chromium/content_public/browser/BrowserStartupController;
-HSPLorg/chromium/content_public/browser/BrowserStartupController;->getInstance()Lorg/chromium/content/browser/BrowserStartupControllerImpl;
-Lorg/chromium/content_public/browser/BrowserStartupController$StartupCallback;
-Lorg/chromium/content_public/browser/BrowserTaskExecutor;
-HSPLorg/chromium/content_public/browser/BrowserTaskExecutor;-><init>()V
-HSPLorg/chromium/content_public/browser/BrowserTaskExecutor;->canRunTaskImmediately(Lorg/chromium/base/task/TaskTraits;)Z
-HSPLorg/chromium/content_public/browser/BrowserTaskExecutor;->createSingleThreadTaskRunner(Lorg/chromium/base/task/TaskTraits;)Lorg/chromium/base/task/SingleThreadTaskRunner;
-HSPLorg/chromium/content_public/browser/BrowserTaskExecutor;->postDelayedTask(Lorg/chromium/base/task/TaskTraits;Ljava/lang/Runnable;J)V
-Lorg/chromium/content_public/browser/ContactsPicker;
-Lorg/chromium/content_public/browser/GestureListenerManager;
-Lorg/chromium/content_public/browser/GestureStateListener;
-HSPLorg/chromium/content_public/browser/GestureStateListener;-><init>()V
-HSPLorg/chromium/content_public/browser/GestureStateListener;->onScrollOffsetOrExtentChanged(II)V
-Lorg/chromium/content_public/browser/GlobalRenderFrameHostId;
-HSPLorg/chromium/content_public/browser/GlobalRenderFrameHostId;-><init>(II)V
-Lorg/chromium/content_public/browser/HostZoomMap;
-Lorg/chromium/content_public/browser/ImageDownloadCallback;
-Lorg/chromium/content_public/browser/ImeEventObserver;
-Lorg/chromium/content_public/browser/InputMethodManagerWrapper;
-Lorg/chromium/content_public/browser/InputMethodManagerWrapper$Delegate;
-Lorg/chromium/content_public/browser/InterfaceRegistrar;
-Lorg/chromium/content_public/browser/InterfaceRegistrar$Registry;
-HSPLorg/chromium/content_public/browser/InterfaceRegistrar$Registry;-><init>()V
-Lorg/chromium/content_public/browser/LoadCommittedDetails;
-HSPLorg/chromium/content_public/browser/LoadCommittedDetails;-><init>(ILorg/chromium/url/GURL;ZZZI)V
-Lorg/chromium/content_public/browser/LoadUrlParams;
-HSPLorg/chromium/content_public/browser/LoadUrlParams;-><init>(ILjava/lang/String;)V
-Lorg/chromium/content_public/browser/MediaSession;
-HSPLorg/chromium/content_public/browser/MediaSession;-><init>()V
-Lorg/chromium/content_public/browser/MediaSessionObserver;
-HSPLorg/chromium/content_public/browser/MediaSessionObserver;-><init>(Lorg/chromium/content/browser/MediaSessionImpl;)V
-Lorg/chromium/content_public/browser/NavigationController;
-Lorg/chromium/content_public/browser/NavigationEntry;
-HSPLorg/chromium/content_public/browser/NavigationEntry;-><init>(ILorg/chromium/url/GURL;Lorg/chromium/url/GURL;Lorg/chromium/url/GURL;Ljava/lang/String;Landroid/graphics/Bitmap;)V
-Lorg/chromium/content_public/browser/NavigationHandle;
-HSPLorg/chromium/content_public/browser/NavigationHandle;-><init>()V
-HSPLorg/chromium/content_public/browser/NavigationHandle;->didFinish(Lorg/chromium/url/GURL;ZZZZZIIIZ)V
-HSPLorg/chromium/content_public/browser/NavigationHandle;->initialize(JLorg/chromium/url/GURL;Lorg/chromium/url/GURL;Lorg/chromium/url/GURL;ZZZLorg/chromium/url/Origin;IZZZZJZZ)V
-HSPLorg/chromium/content_public/browser/NavigationHandle;->release()V
-Lorg/chromium/content_public/browser/SelectionClient;
-HSPLorg/chromium/content_public/browser/SelectionClient;->createSmartSelectionClient(Lorg/chromium/content_public/browser/WebContents;)Lorg/chromium/content/browser/selection/SmartSelectionClient;
-Lorg/chromium/content_public/browser/SelectionEventProcessor;
-Lorg/chromium/content_public/browser/SmartClipProvider;
-Lorg/chromium/content_public/browser/UiThreadTaskTraits;
-Lorg/chromium/content_public/browser/ViewEventSink;
-Lorg/chromium/content_public/browser/ViewEventSink$InternalAccessDelegate;
-Lorg/chromium/content_public/browser/WebContents;
-Lorg/chromium/content_public/browser/WebContents$1;
-HSPLorg/chromium/content_public/browser/WebContents$1;-><init>()V
-Lorg/chromium/content_public/browser/WebContentsAccessibility;
-Lorg/chromium/content_public/browser/WebContentsObserver;
-HSPLorg/chromium/content_public/browser/WebContentsObserver;-><init>()V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;-><init>(Lorg/chromium/content_public/browser/WebContents;)V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->destroy()V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->didChangeVisibleSecurityState()V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->didFinishLoadInPrimaryMainFrame(Lorg/chromium/content_public/browser/GlobalRenderFrameHostId;Lorg/chromium/url/GURL;ZI)V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->didFinishNavigationInPrimaryMainFrame(Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->didFirstVisuallyNonEmptyPaint()V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->didStartLoading(Lorg/chromium/url/GURL;)V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->didStartNavigationInPrimaryMainFrame(Lorg/chromium/content_public/browser/NavigationHandle;)V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->didStopLoading(Lorg/chromium/url/GURL;Z)V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->documentLoadedInPrimaryMainFrame(Lorg/chromium/content_public/browser/GlobalRenderFrameHostId;I)V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->loadProgressChanged(F)V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->navigationEntriesChanged()V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->navigationEntryCommitted(Lorg/chromium/content_public/browser/LoadCommittedDetails;)V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->onWebContentsFocused()V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->onWebContentsLostFocus()V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->primaryMainDocumentElementAvailable()V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->renderFrameCreated(Lorg/chromium/content_public/browser/GlobalRenderFrameHostId;)V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->wasHidden()V
-HSPLorg/chromium/content_public/browser/WebContentsObserver;->wasShown()V
-Lorg/chromium/device/battery/BatteryMonitorFactory;
-HSPLorg/chromium/device/battery/BatteryMonitorFactory;-><init>()V
-HSPLorg/chromium/device/battery/BatteryMonitorFactory;->createImpl()Lorg/chromium/mojo/bindings/Interface;
-Lorg/chromium/device/battery/BatteryMonitorFactory$1;
-HSPLorg/chromium/device/battery/BatteryMonitorFactory$1;-><init>(Lorg/chromium/device/battery/BatteryMonitorFactory;)V
-HSPLorg/chromium/device/battery/BatteryMonitorFactory$1;->onBatteryStatusChanged(Lorg/chromium/device/mojom/BatteryStatus;)V
-Lorg/chromium/device/battery/BatteryMonitorImpl;
-HSPLorg/chromium/device/battery/BatteryMonitorImpl;-><init>(Lorg/chromium/device/battery/BatteryMonitorFactory;)V
-HSPLorg/chromium/device/battery/BatteryMonitorImpl;->queryNextStatus(Lorg/chromium/device/mojom/BatteryMonitor_Internal$BatteryMonitorQueryNextStatusResponseParamsProxyToResponder;)V
-Lorg/chromium/device/battery/BatteryStatusManager;
-HSPLorg/chromium/device/battery/BatteryStatusManager;-><init>(Lorg/chromium/device/battery/BatteryMonitorFactory$1;)V
-Lorg/chromium/device/battery/BatteryStatusManager$1;
-HSPLorg/chromium/device/battery/BatteryStatusManager$1;-><init>(Lorg/chromium/device/battery/BatteryStatusManager;)V
-HSPLorg/chromium/device/battery/BatteryStatusManager$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-Lorg/chromium/device/battery/BatteryStatusManager$2;
-HSPLorg/chromium/device/battery/BatteryStatusManager$2;-><init>(Lorg/chromium/device/battery/BatteryStatusManager;Lorg/chromium/device/mojom/BatteryStatus;)V
-HSPLorg/chromium/device/battery/BatteryStatusManager$2;->doInBackground()Ljava/lang/Object;
-HSPLorg/chromium/device/battery/BatteryStatusManager$2;->onPostExecute(Ljava/lang/Object;)V
-Lorg/chromium/device/battery/BatteryStatusManager$AndroidBatteryManagerWrapper;
-HSPLorg/chromium/device/battery/BatteryStatusManager$AndroidBatteryManagerWrapper;-><init>(Landroid/os/BatteryManager;)V
-Lorg/chromium/device/geolocation/LocationProviderFactory;
-HSPLorg/chromium/device/geolocation/LocationProviderFactory;->useGmsCoreLocationProvider()V
-Lorg/chromium/device/mojom/BatteryMonitor;
-Lorg/chromium/device/mojom/BatteryMonitor_Internal;
-Lorg/chromium/device/mojom/BatteryMonitor_Internal$1;
-HSPLorg/chromium/device/mojom/BatteryMonitor_Internal$1;-><init>()V
-HSPLorg/chromium/device/mojom/BatteryMonitor_Internal$1;->buildStub(Lorg/chromium/mojo/system/Core;Lorg/chromium/mojo/bindings/Interface;)Lorg/chromium/mojo/bindings/Interface$Stub;
-HSPLorg/chromium/device/mojom/BatteryMonitor_Internal$1;->getName()Ljava/lang/String;
-Lorg/chromium/device/mojom/BatteryMonitor_Internal$BatteryMonitorQueryNextStatusParams;
-Lorg/chromium/device/mojom/BatteryMonitor_Internal$BatteryMonitorQueryNextStatusResponseParams;
-HSPLorg/chromium/device/mojom/BatteryMonitor_Internal$BatteryMonitorQueryNextStatusResponseParams;-><init>(I)V
-HSPLorg/chromium/device/mojom/BatteryMonitor_Internal$BatteryMonitorQueryNextStatusResponseParams;->encode(Lorg/chromium/mojo/bindings/Encoder;)V
-Lorg/chromium/device/mojom/BatteryMonitor_Internal$BatteryMonitorQueryNextStatusResponseParamsProxyToResponder;
-HSPLorg/chromium/device/mojom/BatteryMonitor_Internal$BatteryMonitorQueryNextStatusResponseParamsProxyToResponder;-><init>(Lorg/chromium/mojo/system/Core;Lorg/chromium/mojo/bindings/MessageReceiver;J)V
-HSPLorg/chromium/device/mojom/BatteryMonitor_Internal$BatteryMonitorQueryNextStatusResponseParamsProxyToResponder;->call(Ljava/lang/Object;)V
-Lorg/chromium/device/mojom/BatteryMonitor_Internal$Stub;
-HSPLorg/chromium/device/mojom/BatteryMonitor_Internal$Stub;-><init>(Lorg/chromium/mojo/system/Core;Lorg/chromium/device/mojom/BatteryMonitor;)V
-HSPLorg/chromium/device/mojom/BatteryMonitor_Internal$Stub;->acceptWithResponder(Lorg/chromium/mojo/bindings/Message;Lorg/chromium/mojo/bindings/MessageReceiver;)Z
-Lorg/chromium/device/mojom/BatteryStatus;
-HSPLorg/chromium/device/mojom/BatteryStatus;-><init>(I)V
-HSPLorg/chromium/device/mojom/BatteryStatus;->encode(Lorg/chromium/mojo/bindings/Encoder;)V
-Lorg/chromium/device/mojom/NfcProvider_Internal;
-Lorg/chromium/device/mojom/NfcProvider_Internal$1;
-HSPLorg/chromium/device/mojom/NfcProvider_Internal$1;-><init>()V
-HSPLorg/chromium/device/mojom/NfcProvider_Internal$1;->getName()Ljava/lang/String;
-Lorg/chromium/device/mojom/VibrationManager_Internal;
-Lorg/chromium/device/mojom/VibrationManager_Internal$1;
-HSPLorg/chromium/device/mojom/VibrationManager_Internal$1;-><init>()V
-HSPLorg/chromium/device/mojom/VibrationManager_Internal$1;->getName()Ljava/lang/String;
-Lorg/chromium/device/nfc/NfcDelegate;
-Lorg/chromium/device/nfc/NfcProviderImpl$Factory;
-HSPLorg/chromium/device/nfc/NfcProviderImpl$Factory;-><init>(Lorg/chromium/device/nfc/NfcDelegate;)V
-Lorg/chromium/device/time_zone_monitor/TimeZoneMonitor;
-HSPLorg/chromium/device/time_zone_monitor/TimeZoneMonitor;-><init>(J)V
-HSPLorg/chromium/device/time_zone_monitor/TimeZoneMonitor;->getInstance(J)Lorg/chromium/device/time_zone_monitor/TimeZoneMonitor;
-Lorg/chromium/device/time_zone_monitor/TimeZoneMonitor$1;
-HSPLorg/chromium/device/time_zone_monitor/TimeZoneMonitor$1;-><init>(Lorg/chromium/device/time_zone_monitor/TimeZoneMonitor;)V
-Lorg/chromium/device/vibration/VibrationManagerImpl$Factory;
-HSPLorg/chromium/device/vibration/VibrationManagerImpl$Factory;-><init>()V
-Lorg/chromium/media/AudioDeviceListener;
-HSPLorg/chromium/media/AudioDeviceListener;-><init>(Lorg/chromium/media/AudioDeviceSelector$Devices;)V
-HSPLorg/chromium/media/AudioDeviceListener;->hasUsbAudio()Z
-HSPLorg/chromium/media/AudioDeviceListener;->init(Z)V
-Lorg/chromium/media/AudioDeviceListener$1;
-HSPLorg/chromium/media/AudioDeviceListener$1;-><init>(Lorg/chromium/media/AudioDeviceListener;I)V
-Lorg/chromium/media/AudioDeviceSelector;
-HSPLorg/chromium/media/AudioDeviceSelector;-><init>(Landroid/media/AudioManager;)V
-HSPLorg/chromium/media/AudioDeviceSelector;->maybeUpdateSelectedDevice()V
-Lorg/chromium/media/AudioDeviceSelector$Devices;
-HSPLorg/chromium/media/AudioDeviceSelector$Devices;-><init>(Lorg/chromium/media/AudioDeviceSelector;)V
-HSPLorg/chromium/media/AudioDeviceSelector$Devices;->setDeviceExistence(IZ)V
-Lorg/chromium/media/AudioDeviceSelectorPreS;
-HSPLorg/chromium/media/AudioDeviceSelectorPreS;-><init>(Landroid/media/AudioManager;)V
-HSPLorg/chromium/media/AudioDeviceSelectorPreS;->init()V
-HSPLorg/chromium/media/AudioDeviceSelectorPreS;->setDeviceExistence_Locked(IZ)V
-Lorg/chromium/media/AudioDeviceSelectorPreS$1;
-HSPLorg/chromium/media/AudioDeviceSelectorPreS$1;-><init>(Lorg/chromium/media/AudioDeviceSelectorPreS;)V
-HSPLorg/chromium/media/AudioDeviceSelectorPreS$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-Lorg/chromium/media/AudioManagerAndroid;
-HSPLorg/chromium/media/AudioManagerAndroid;-><init>(J)V
-HSPLorg/chromium/media/AudioManagerAndroid;->createAudioManagerAndroid(J)Lorg/chromium/media/AudioManagerAndroid;
-HSPLorg/chromium/media/AudioManagerAndroid;->init()V
-Lorg/chromium/media/CodecProfileLevelList$UnsupportedCodecProfileException;
-Lorg/chromium/media/MediaCodecUtil;
-HSPLorg/chromium/media/MediaCodecUtil;->isDecoderSupportedForDevice(Ljava/lang/String;)Z
-Lorg/chromium/mojo/bindings/BindingsHelper;
-HSPLorg/chromium/mojo/bindings/BindingsHelper;->isArrayNullable(I)Z
-Lorg/chromium/mojo/bindings/Callbacks$Callback1;
-Lorg/chromium/mojo/bindings/ConnectionErrorHandler;
-Lorg/chromium/mojo/bindings/Connector;
-HSPLorg/chromium/mojo/bindings/Connector;-><init>(Lorg/chromium/mojo/system/MessagePipeHandle;Lorg/chromium/mojo/system/impl/WatcherImpl;)V
-HSPLorg/chromium/mojo/bindings/Connector;->accept(Lorg/chromium/mojo/bindings/Message;)Z
-HSPLorg/chromium/mojo/bindings/Connector;->close()V
-HSPLorg/chromium/mojo/bindings/Connector;->readAndDispatchMessage(Lorg/chromium/mojo/system/MessagePipeHandle;Lorg/chromium/mojo/bindings/MessageReceiver;)Lorg/chromium/mojo/system/ResultAnd;
-Lorg/chromium/mojo/bindings/Connector$WatcherCallback;
-HSPLorg/chromium/mojo/bindings/Connector$WatcherCallback;-><init>(Lorg/chromium/mojo/bindings/Connector;)V
-HSPLorg/chromium/mojo/bindings/Connector$WatcherCallback;->onResult(I)V
-Lorg/chromium/mojo/bindings/DataHeader;
-HSPLorg/chromium/mojo/bindings/DataHeader;-><init>(II)V
-Lorg/chromium/mojo/bindings/Decoder;
-HSPLorg/chromium/mojo/bindings/Decoder;-><init>(Lorg/chromium/mojo/bindings/Message;)V
-HSPLorg/chromium/mojo/bindings/Decoder;-><init>(Lorg/chromium/mojo/bindings/Message;Lorg/chromium/mojo/bindings/Decoder$Validator;I)V
-HSPLorg/chromium/mojo/bindings/Decoder;->decreaseStackDepth()V
-HSPLorg/chromium/mojo/bindings/Decoder;->increaseStackDepth()V
-HSPLorg/chromium/mojo/bindings/Decoder;->readAndValidateDataHeader([Lorg/chromium/mojo/bindings/DataHeader;)Lorg/chromium/mojo/bindings/DataHeader;
-HSPLorg/chromium/mojo/bindings/Decoder;->readBytes(III)[B
-HSPLorg/chromium/mojo/bindings/Decoder;->readDataHeader()Lorg/chromium/mojo/bindings/DataHeader;
-HSPLorg/chromium/mojo/bindings/Decoder;->readDataHeaderAtOffset(IZ)Lorg/chromium/mojo/bindings/DataHeader;
-HSPLorg/chromium/mojo/bindings/Decoder;->readDataHeaderForArray(IJ)Lorg/chromium/mojo/bindings/DataHeader;
-HSPLorg/chromium/mojo/bindings/Decoder;->readInt(I)I
-HSPLorg/chromium/mojo/bindings/Decoder;->readLong(I)J
-HSPLorg/chromium/mojo/bindings/Decoder;->readPointer(IZ)Lorg/chromium/mojo/bindings/Decoder;
-HSPLorg/chromium/mojo/bindings/Decoder;->readString(IZ)Ljava/lang/String;
-HSPLorg/chromium/mojo/bindings/Decoder;->readUntypedHandle(IZ)Lorg/chromium/mojo/system/UntypedHandle;
-HSPLorg/chromium/mojo/bindings/Decoder;->validateBufferSize(II)V
-Lorg/chromium/mojo/bindings/Decoder$Validator;
-HSPLorg/chromium/mojo/bindings/Decoder$Validator;-><init>(IJ)V
-HSPLorg/chromium/mojo/bindings/Decoder$Validator;->claimMemory(JJ)V
-Lorg/chromium/mojo/bindings/DeserializationException;
-Lorg/chromium/mojo/bindings/Encoder;
-HSPLorg/chromium/mojo/bindings/Encoder;-><init>(Lorg/chromium/mojo/bindings/Encoder$EncoderState;)V
-HSPLorg/chromium/mojo/bindings/Encoder;-><init>(Lorg/chromium/mojo/system/Core;I)V
-HSPLorg/chromium/mojo/bindings/Encoder;->encode(II)V
-HSPLorg/chromium/mojo/bindings/Encoder;->encode(III[B)V
-HSPLorg/chromium/mojo/bindings/Encoder;->encode(IIZ)V
-HSPLorg/chromium/mojo/bindings/Encoder;->encode(IJ)V
-HSPLorg/chromium/mojo/bindings/Encoder;->encode(Ljava/lang/String;IZ)V
-HSPLorg/chromium/mojo/bindings/Encoder;->encode(Lorg/chromium/mojo/bindings/DataHeader;)V
-HSPLorg/chromium/mojo/bindings/Encoder;->encode(Lorg/chromium/mojo/bindings/Struct;IZ)V
-HSPLorg/chromium/mojo/bindings/Encoder;->encode(Lorg/chromium/mojo/system/Handle;IZ)V
-HSPLorg/chromium/mojo/bindings/Encoder;->encodePointerArray(II)Lorg/chromium/mojo/bindings/Encoder;
-HSPLorg/chromium/mojo/bindings/Encoder;->encoderForArray(IIII)Lorg/chromium/mojo/bindings/Encoder;
-HSPLorg/chromium/mojo/bindings/Encoder;->getEncoderAtDataOffset(Lorg/chromium/mojo/bindings/DataHeader;)Lorg/chromium/mojo/bindings/Encoder;
-HSPLorg/chromium/mojo/bindings/Encoder;->getMessage()Lorg/chromium/mojo/bindings/Message;
-Lorg/chromium/mojo/bindings/Encoder$EncoderState;
-HSPLorg/chromium/mojo/bindings/Encoder$EncoderState;-><init>(Lorg/chromium/mojo/system/Core;I)V
-Lorg/chromium/mojo/bindings/ExecutorFactory;
-HSPLorg/chromium/mojo/bindings/ExecutorFactory;->getExecutorForCurrentThread(Lorg/chromium/mojo/system/Core;)Ljava/util/concurrent/Executor;
-Lorg/chromium/mojo/bindings/ExecutorFactory$PipedExecutor;
-HSPLorg/chromium/mojo/bindings/ExecutorFactory$PipedExecutor;-><init>(Lorg/chromium/mojo/system/Core;)V
-HSPLorg/chromium/mojo/bindings/ExecutorFactory$PipedExecutor;->execute(Ljava/lang/Runnable;)V
-HSPLorg/chromium/mojo/bindings/ExecutorFactory$PipedExecutor;->onResult(I)V
-Lorg/chromium/mojo/bindings/HandleOwner;
-Lorg/chromium/mojo/bindings/Interface;
-Lorg/chromium/mojo/bindings/Interface$Manager;
-HSPLorg/chromium/mojo/bindings/Interface$Manager;-><init>()V
-HSPLorg/chromium/mojo/bindings/Interface$Manager;->bind(Lorg/chromium/mojo/bindings/Interface;Lorg/chromium/mojo/system/MessagePipeHandle;)Lorg/chromium/mojo/bindings/RouterImpl;
-Lorg/chromium/mojo/bindings/Interface$Stub;
-HSPLorg/chromium/mojo/bindings/Interface$Stub;-><init>(Lorg/chromium/mojo/system/Core;Lorg/chromium/mojo/bindings/Interface;)V
-HSPLorg/chromium/mojo/bindings/Interface$Stub;->close()V
-Lorg/chromium/mojo/bindings/Message;
-HSPLorg/chromium/mojo/bindings/Message;-><init>(Ljava/nio/ByteBuffer;Ljava/util/List;)V
-HSPLorg/chromium/mojo/bindings/Message;->asServiceMessage()Lorg/chromium/mojo/bindings/ServiceMessage;
-Lorg/chromium/mojo/bindings/MessageHeader;
-HSPLorg/chromium/mojo/bindings/MessageHeader;-><init>(IIJ)V
-HSPLorg/chromium/mojo/bindings/MessageHeader;-><init>(Lorg/chromium/mojo/bindings/Message;)V
-HSPLorg/chromium/mojo/bindings/MessageHeader;->hasFlag(I)Z
-HSPLorg/chromium/mojo/bindings/MessageHeader;->validateHeader(I)Z
-Lorg/chromium/mojo/bindings/MessageReceiver;
-Lorg/chromium/mojo/bindings/MessageReceiverWithResponder;
-Lorg/chromium/mojo/bindings/Router;
-Lorg/chromium/mojo/bindings/RouterImpl;
-HSPLorg/chromium/mojo/bindings/RouterImpl;-><init>(Lorg/chromium/mojo/system/MessagePipeHandle;)V
-HSPLorg/chromium/mojo/bindings/RouterImpl;->accept(Lorg/chromium/mojo/bindings/Message;)Z
-HSPLorg/chromium/mojo/bindings/RouterImpl;->start()V
-Lorg/chromium/mojo/bindings/RouterImpl$HandleIncomingMessageThunk;
-HSPLorg/chromium/mojo/bindings/RouterImpl$HandleIncomingMessageThunk;-><init>(Lorg/chromium/mojo/bindings/RouterImpl;)V
-HSPLorg/chromium/mojo/bindings/RouterImpl$HandleIncomingMessageThunk;->accept(Lorg/chromium/mojo/bindings/Message;)Z
-HSPLorg/chromium/mojo/bindings/RouterImpl$HandleIncomingMessageThunk;->close()V
-Lorg/chromium/mojo/bindings/RouterImpl$ResponderThunk;
-HSPLorg/chromium/mojo/bindings/RouterImpl$ResponderThunk;-><init>(Lorg/chromium/mojo/bindings/RouterImpl;)V
-HSPLorg/chromium/mojo/bindings/RouterImpl$ResponderThunk;->accept(Lorg/chromium/mojo/bindings/Message;)Z
-HSPLorg/chromium/mojo/bindings/RouterImpl$ResponderThunk;->finalize()V
-Lorg/chromium/mojo/bindings/ServiceMessage;
-HSPLorg/chromium/mojo/bindings/ServiceMessage;-><init>(Lorg/chromium/mojo/bindings/Message;Lorg/chromium/mojo/bindings/MessageHeader;)V
-HSPLorg/chromium/mojo/bindings/ServiceMessage;->getPayload()Lorg/chromium/mojo/bindings/Message;
-Lorg/chromium/mojo/bindings/Struct;
-HSPLorg/chromium/mojo/bindings/Struct;-><init>(I)V
-HSPLorg/chromium/mojo/bindings/Struct;->serializeWithHeader(Lorg/chromium/mojo/system/Core;Lorg/chromium/mojo/bindings/MessageHeader;)Lorg/chromium/mojo/bindings/ServiceMessage;
-Lorg/chromium/mojo/system/Core;
-Lorg/chromium/mojo/system/Core$HandleSignals;
-HSPLorg/chromium/mojo/system/Core$HandleSignals;-><init>()V
-Lorg/chromium/mojo/system/DataPipe$ConsumerHandle;
-Lorg/chromium/mojo/system/DataPipe$ProducerHandle;
-Lorg/chromium/mojo/system/Flags;
-HSPLorg/chromium/mojo/system/Flags;-><init>()V
-Lorg/chromium/mojo/system/Handle;
-Lorg/chromium/mojo/system/InvalidHandle;
-HSPLorg/chromium/mojo/system/InvalidHandle;-><init>()V
-Lorg/chromium/mojo/system/MessagePipeHandle;
-Lorg/chromium/mojo/system/MessagePipeHandle$CreateFlags;
-HSPLorg/chromium/mojo/system/MessagePipeHandle$CreateFlags;-><init>()V
-Lorg/chromium/mojo/system/MessagePipeHandle$CreateOptions;
-HSPLorg/chromium/mojo/system/MessagePipeHandle$CreateOptions;-><init>()V
-Lorg/chromium/mojo/system/MessagePipeHandle$ReadFlags;
-HSPLorg/chromium/mojo/system/MessagePipeHandle$ReadFlags;-><init>()V
-Lorg/chromium/mojo/system/MessagePipeHandle$ReadMessageResult;
-HSPLorg/chromium/mojo/system/MessagePipeHandle$ReadMessageResult;-><init>()V
-Lorg/chromium/mojo/system/MessagePipeHandle$WriteFlags;
-HSPLorg/chromium/mojo/system/MessagePipeHandle$WriteFlags;-><init>()V
-Lorg/chromium/mojo/system/MojoException;
-HSPLorg/chromium/mojo/system/MojoException;-><init>(I)V
-Lorg/chromium/mojo/system/Pair;
-HSPLorg/chromium/mojo/system/Pair;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
-Lorg/chromium/mojo/system/ResultAnd;
-HSPLorg/chromium/mojo/system/ResultAnd;-><init>(ILjava/lang/Object;)V
-Lorg/chromium/mojo/system/SharedBufferHandle;
-Lorg/chromium/mojo/system/UntypedHandle;
-Lorg/chromium/mojo/system/Watcher$Callback;
-Lorg/chromium/mojo/system/impl/CoreImpl;
-HSPLorg/chromium/mojo/system/impl/CoreImpl;-><init>()V
-HSPLorg/chromium/mojo/system/impl/CoreImpl;->allocateDirectBuffer(I)Ljava/nio/ByteBuffer;
-HSPLorg/chromium/mojo/system/impl/CoreImpl;->createMessagePipe(Lorg/chromium/mojo/system/MessagePipeHandle$CreateOptions;)Lorg/chromium/mojo/system/Pair;
-HSPLorg/chromium/mojo/system/impl/CoreImpl;->newNativeCreationResult(IJJ)Lorg/chromium/mojo/system/ResultAnd;
-HSPLorg/chromium/mojo/system/impl/CoreImpl;->newReadMessageResult(I[B[J)Lorg/chromium/mojo/system/ResultAnd;
-Lorg/chromium/mojo/system/impl/CoreImpl$LazyHolder;
-Lorg/chromium/mojo/system/impl/CoreImpl$RawHandlePair;
-HSPLorg/chromium/mojo/system/impl/CoreImpl$RawHandlePair;-><init>(Ljava/lang/Long;Ljava/lang/Long;)V
-Lorg/chromium/mojo/system/impl/HandleBase;
-HSPLorg/chromium/mojo/system/impl/HandleBase;-><init>(Lorg/chromium/mojo/system/impl/CoreImpl;J)V
-HSPLorg/chromium/mojo/system/impl/HandleBase;-><init>(Lorg/chromium/mojo/system/impl/HandleBase;)V
-HSPLorg/chromium/mojo/system/impl/HandleBase;->close()V
-HSPLorg/chromium/mojo/system/impl/HandleBase;->finalize()V
-HSPLorg/chromium/mojo/system/impl/HandleBase;->getCore()Lorg/chromium/mojo/system/Core;
-HSPLorg/chromium/mojo/system/impl/HandleBase;->isValid()Z
-HSPLorg/chromium/mojo/system/impl/HandleBase;->releaseNativeHandle()J
-HSPLorg/chromium/mojo/system/impl/HandleBase;->toUntypedHandle()Lorg/chromium/mojo/system/UntypedHandle;
-Lorg/chromium/mojo/system/impl/MessagePipeHandleImpl;
-HSPLorg/chromium/mojo/system/impl/MessagePipeHandleImpl;-><init>(Lorg/chromium/mojo/system/impl/CoreImpl;J)V
-HSPLorg/chromium/mojo/system/impl/MessagePipeHandleImpl;-><init>(Lorg/chromium/mojo/system/impl/HandleBase;)V
-HSPLorg/chromium/mojo/system/impl/MessagePipeHandleImpl;->readMessage()Lorg/chromium/mojo/system/ResultAnd;
-HSPLorg/chromium/mojo/system/impl/MessagePipeHandleImpl;->writeMessage(Ljava/nio/ByteBuffer;Ljava/util/List;)V
-Lorg/chromium/mojo/system/impl/UntypedHandleImpl;
-HSPLorg/chromium/mojo/system/impl/UntypedHandleImpl;-><init>(Lorg/chromium/mojo/system/impl/CoreImpl;J)V
-HSPLorg/chromium/mojo/system/impl/UntypedHandleImpl;-><init>(Lorg/chromium/mojo/system/impl/HandleBase;)V
-HSPLorg/chromium/mojo/system/impl/UntypedHandleImpl;->toMessagePipeHandle()Lorg/chromium/mojo/system/MessagePipeHandle;
-Lorg/chromium/mojo/system/impl/WatcherImpl;
-HSPLorg/chromium/mojo/system/impl/WatcherImpl;-><init>()V
-HSPLorg/chromium/mojo/system/impl/WatcherImpl;->onHandleReady(I)V
-HSPLorg/chromium/mojo/system/impl/WatcherImpl;->start(Lorg/chromium/mojo/system/Handle;Lorg/chromium/mojo/system/Core$HandleSignals;Lorg/chromium/mojo/system/Watcher$Callback;)V
-Lorg/chromium/mojo_base/mojom/ReadOnlyFile;
-HSPLorg/chromium/mojo_base/mojom/ReadOnlyFile;-><init>(I)V
-HSPLorg/chromium/mojo_base/mojom/ReadOnlyFile;->encode(Lorg/chromium/mojo/bindings/Encoder;)V
-Lorg/chromium/net/AndroidCertVerifyResult;
-HSPLorg/chromium/net/AndroidCertVerifyResult;-><init>(Ljava/util/List;Z)V
-HSPLorg/chromium/net/AndroidCertVerifyResult;->getCertificateChainEncoded()[[B
-HSPLorg/chromium/net/AndroidCertVerifyResult;->getStatus()I
-HSPLorg/chromium/net/AndroidCertVerifyResult;->isIssuedByKnownRoot()Z
-Lorg/chromium/net/AndroidNetworkLibrary;
-HSPLorg/chromium/net/AndroidNetworkLibrary;->getCurrentDnsStatus()Lorg/chromium/net/DnsStatus;
-HSPLorg/chromium/net/AndroidNetworkLibrary;->getDnsStatus(Landroid/net/Network;)Lorg/chromium/net/DnsStatus;
-HSPLorg/chromium/net/AndroidNetworkLibrary;->verifyServerCertificates([[BLjava/lang/String;Ljava/lang/String;)Lorg/chromium/net/AndroidCertVerifyResult;
-Lorg/chromium/net/DnsStatus;
-HSPLorg/chromium/net/DnsStatus;-><init>(Ljava/util/List;ZLjava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/net/DnsStatus;->getDnsServers()[[B
-HSPLorg/chromium/net/DnsStatus;->getPrivateDnsActive()Z
-HSPLorg/chromium/net/DnsStatus;->getPrivateDnsServerName()Ljava/lang/String;
-HSPLorg/chromium/net/DnsStatus;->getSearchDomains()Ljava/lang/String;
-Lorg/chromium/net/NetworkActiveNotifier;
-HSPLorg/chromium/net/NetworkActiveNotifier;-><init>(J)V
-HSPLorg/chromium/net/NetworkActiveNotifier;->build(J)Lorg/chromium/net/NetworkActiveNotifier;
-Lorg/chromium/net/NetworkChangeNotifier;
-HSPLorg/chromium/net/NetworkChangeNotifier;-><init>()V
-HSPLorg/chromium/net/NetworkChangeNotifier;->addNativeObserver(J)V
-HSPLorg/chromium/net/NetworkChangeNotifier;->getCurrentConnectionCost()I
-HSPLorg/chromium/net/NetworkChangeNotifier;->getCurrentConnectionSubtype()I
-HSPLorg/chromium/net/NetworkChangeNotifier;->getCurrentConnectionType()I
-HSPLorg/chromium/net/NetworkChangeNotifier;->getCurrentDefaultNetId()J
-HSPLorg/chromium/net/NetworkChangeNotifier;->getCurrentNetworksAndTypes()[J
-HSPLorg/chromium/net/NetworkChangeNotifier;->init()Lorg/chromium/net/NetworkChangeNotifier;
-HSPLorg/chromium/net/NetworkChangeNotifier;->notifyObserversOfConnectionCostChange(I)V
-HSPLorg/chromium/net/NetworkChangeNotifier;->notifyObserversOfConnectionSubtypeChange(I)V
-HSPLorg/chromium/net/NetworkChangeNotifier;->notifyObserversOfConnectionTypeChange(IJ)V
-HSPLorg/chromium/net/NetworkChangeNotifier;->notifyObserversOfNetworkConnect(IJ)V
-HSPLorg/chromium/net/NetworkChangeNotifier;->registerNetworkCallbackFailed()Z
-HSPLorg/chromium/net/NetworkChangeNotifier;->removeConnectionTypeObserver(Lorg/chromium/net/NetworkChangeNotifier$ConnectionTypeObserver;)V
-HSPLorg/chromium/net/NetworkChangeNotifier;->setAutoDetectConnectivityState(Z)V
-Lorg/chromium/net/NetworkChangeNotifier$1;
-HSPLorg/chromium/net/NetworkChangeNotifier$1;-><init>(Lorg/chromium/net/NetworkChangeNotifier;)V
-HSPLorg/chromium/net/NetworkChangeNotifier$1;->onNetworkConnect(IJ)V
-Lorg/chromium/net/NetworkChangeNotifier$ConnectionTypeObserver;
-Lorg/chromium/net/NetworkChangeNotifierAutoDetect;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect;->-$$Nest$smconvertToConnectionType(II)I
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect;-><init>(Lorg/chromium/net/NetworkChangeNotifierAutoDetect$Observer;Lorg/chromium/net/NetworkChangeNotifierAutoDetect$RegistrationPolicy;)V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect;->connectionTypeChangedTo(Lorg/chromium/net/NetworkChangeNotifierAutoDetect$NetworkState;)V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect;->getAllNetworksFiltered(Lorg/chromium/net/NetworkChangeNotifierAutoDetect$ConnectivityManagerDelegate;Landroid/net/Network;)[Landroid/net/Network;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect;->getCurrentNetworkState()Lorg/chromium/net/NetworkChangeNotifierAutoDetect$NetworkState;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect;->runOnThread(Ljava/lang/Runnable;)V
-Lorg/chromium/net/NetworkChangeNotifierAutoDetect$ConnectivityManagerDelegate;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$ConnectivityManagerDelegate;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$ConnectivityManagerDelegate;->getConnectionType(Landroid/net/Network;)I
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$ConnectivityManagerDelegate;->getDefaultNetwork()Landroid/net/Network;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$ConnectivityManagerDelegate;->getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$ConnectivityManagerDelegate;->getNetworkInfo(Landroid/net/Network;)Landroid/net/NetworkInfo;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$ConnectivityManagerDelegate;->getRawNetworkInfo(Landroid/net/Network;)Landroid/net/NetworkInfo;
-Lorg/chromium/net/NetworkChangeNotifierAutoDetect$DefaultNetworkCallback;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$DefaultNetworkCallback;-><init>(Lorg/chromium/net/NetworkChangeNotifierAutoDetect;)V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$DefaultNetworkCallback;->onAvailable(Landroid/net/Network;)V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$DefaultNetworkCallback;->onLinkPropertiesChanged(Landroid/net/Network;Landroid/net/LinkProperties;)V
-Lorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback;-><init>(Lorg/chromium/net/NetworkChangeNotifierAutoDetect;)V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback;->ignoreConnectedNetwork(Landroid/net/Network;Landroid/net/NetworkCapabilities;)Z
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback;->onAvailable(Landroid/net/Network;)V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback;->onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V
-Lorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback$1;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback$1;-><init>(Lorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback;JIZ)V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback$1;->run()V
-Lorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback$2;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback$2;-><init>(Lorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback;JI)V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$MyNetworkCallback$2;->run()V
-Lorg/chromium/net/NetworkChangeNotifierAutoDetect$NetworkConnectivityIntentFilter;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$NetworkConnectivityIntentFilter;-><init>()V
-Lorg/chromium/net/NetworkChangeNotifierAutoDetect$NetworkState;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$NetworkState;-><init>(ZIIZLjava/lang/String;ZLjava/lang/String;)V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$NetworkState;->getConnectionSubtype()I
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$NetworkState;->getConnectionType()I
-Lorg/chromium/net/NetworkChangeNotifierAutoDetect$Observer;
-Lorg/chromium/net/NetworkChangeNotifierAutoDetect$RegistrationPolicy;
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$RegistrationPolicy;-><init>()V
-HSPLorg/chromium/net/NetworkChangeNotifierAutoDetect$RegistrationPolicy;->register$1()V
-Lorg/chromium/net/NetworkTrafficAnnotationTag;
-HSPLorg/chromium/net/NetworkTrafficAnnotationTag;-><init>(Ljava/lang/String;)V
-Lorg/chromium/net/ProxyBroadcastReceiver;
-HSPLorg/chromium/net/ProxyBroadcastReceiver;-><init>(Lorg/chromium/net/ProxyChangeListener;)V
-Lorg/chromium/net/ProxyChangeListener;
-HSPLorg/chromium/net/ProxyChangeListener;-><init>()V
-HSPLorg/chromium/net/ProxyChangeListener;->create()Lorg/chromium/net/ProxyChangeListener;
-HSPLorg/chromium/net/ProxyChangeListener;->getProperty(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/net/ProxyChangeListener;->registerBroadcastReceiver()V
-HSPLorg/chromium/net/ProxyChangeListener;->start(J)V
-Lorg/chromium/net/ProxyChangeListener$ProxyReceiver;
-HSPLorg/chromium/net/ProxyChangeListener$ProxyReceiver;-><init>(Lorg/chromium/net/ProxyChangeListener;)V
-Lorg/chromium/net/RegistrationPolicyAlwaysRegister;
-HSPLorg/chromium/net/RegistrationPolicyAlwaysRegister;-><init>()V
-HSPLorg/chromium/net/RegistrationPolicyAlwaysRegister;->init(Lorg/chromium/net/NetworkChangeNotifierAutoDetect;)V
-Lorg/chromium/net/RegistrationPolicyApplicationStatus;
-HSPLorg/chromium/net/RegistrationPolicyApplicationStatus;-><init>()V
-HSPLorg/chromium/net/RegistrationPolicyApplicationStatus;->init(Lorg/chromium/net/NetworkChangeNotifierAutoDetect;)V
-HSPLorg/chromium/net/RegistrationPolicyApplicationStatus;->onApplicationStateChange(I)V
-Lorg/chromium/net/X509Util;
-HSPLorg/chromium/net/X509Util;->createCertificateFromBytes([B)Ljava/security/cert/X509Certificate;
-HSPLorg/chromium/net/X509Util;->createTrustManager(Ljava/security/KeyStore;)Landroid/net/http/X509TrustManagerExtensions;
-HSPLorg/chromium/net/X509Util;->ensureInitializedLocked()V
-HSPLorg/chromium/net/X509Util;->isKnownRoot(Ljava/security/cert/X509Certificate;)Z
-HSPLorg/chromium/net/X509Util;->verifyKeyUsage(Ljava/security/cert/X509Certificate;)Z
-HSPLorg/chromium/net/X509Util;->verifyServerCertificates([[BLjava/lang/String;Ljava/lang/String;)Lorg/chromium/net/AndroidCertVerifyResult;
-Lorg/chromium/net/X509Util$TrustStorageListener;
-HSPLorg/chromium/net/X509Util$TrustStorageListener;-><init>()V
-Lorg/chromium/service_manager/mojom/InterfaceProvider;
-Lorg/chromium/service_manager/mojom/InterfaceProvider_Internal$InterfaceProviderGetInterfaceParams;
-HSPLorg/chromium/service_manager/mojom/InterfaceProvider_Internal$InterfaceProviderGetInterfaceParams;-><init>(I)V
-HSPLorg/chromium/service_manager/mojom/InterfaceProvider_Internal$InterfaceProviderGetInterfaceParams;->deserialize(Lorg/chromium/mojo/bindings/Message;)Lorg/chromium/service_manager/mojom/InterfaceProvider_Internal$InterfaceProviderGetInterfaceParams;
-Lorg/chromium/service_manager/mojom/InterfaceProvider_Internal$Stub;
-HSPLorg/chromium/service_manager/mojom/InterfaceProvider_Internal$Stub;-><init>(Lorg/chromium/mojo/system/Core;Lorg/chromium/service_manager/mojom/InterfaceProvider;)V
-HSPLorg/chromium/service_manager/mojom/InterfaceProvider_Internal$Stub;->accept(Lorg/chromium/mojo/bindings/Message;)Z
-Lorg/chromium/services/device/InterfaceRegistrar;
-HSPLorg/chromium/services/device/InterfaceRegistrar;->createInterfaceRegistryForContext(JLorg/chromium/device/nfc/NfcDelegate;)V
-Lorg/chromium/services/media_session/MediaImage;
-Lorg/chromium/services/media_session/MediaMetadata;
-HSPLorg/chromium/services/media_session/MediaMetadata;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLorg/chromium/services/media_session/MediaMetadata;->create(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/chromium/services/media_session/MediaMetadata;
-Lorg/chromium/services/service_manager/InterfaceFactory;
-Lorg/chromium/services/service_manager/InterfaceRegistry;
-HSPLorg/chromium/services/service_manager/InterfaceRegistry;-><init>()V
-HSPLorg/chromium/services/service_manager/InterfaceRegistry;->addInterface(Lorg/chromium/mojo/bindings/Interface$Manager;Lorg/chromium/services/service_manager/InterfaceFactory;)V
-HSPLorg/chromium/services/service_manager/InterfaceRegistry;->create(Lorg/chromium/mojo/system/impl/MessagePipeHandleImpl;)Lorg/chromium/services/service_manager/InterfaceRegistry;
-HSPLorg/chromium/services/service_manager/InterfaceRegistry;->getInterface(Ljava/lang/String;Lorg/chromium/mojo/system/MessagePipeHandle;)V
-Lorg/chromium/services/service_manager/InterfaceRegistry$InterfaceBinder;
-HSPLorg/chromium/services/service_manager/InterfaceRegistry$InterfaceBinder;-><init>(Lorg/chromium/mojo/bindings/Interface$Manager;Lorg/chromium/services/service_manager/InterfaceFactory;)V
-Lorg/chromium/third_party/android/swiperefresh/CircleImageView;
-HSPLorg/chromium/third_party/android/swiperefresh/CircleImageView;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/third_party/android/swiperefresh/CircleImageView;->setBackgroundColor(I)V
-Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable;
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable;-><init>(Landroid/content/Context;Landroid/view/View;)V
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable;->getIntrinsicHeight()I
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable;->getIntrinsicWidth()I
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable;->getOpacity()I
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable;->setAlpha(I)V
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable;->stop()V
-Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$1;
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$1;-><init>(Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable;Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$Ring;)V
-Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$2;
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$2;-><init>(Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable;Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$Ring;)V
-Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$3;
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$3;-><init>(Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable;)V
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$3;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V
-Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$Ring;
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$Ring;-><init>(Lorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$3;)V
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$Ring;->invalidateSelf()V
-HSPLorg/chromium/third_party/android/swiperefresh/MaterialProgressDrawable$Ring;->setColorIndex(I)V
-Lorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout;
-HSPLorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout;-><init>(Landroid/content/Context;)V
-HSPLorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout;->bringChildToFront(Landroid/view/View;)V
-HSPLorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout;->reset()V
-HSPLorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout;->setRefreshing(ZZ)V
-HSPLorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout;->setTargetOffsetTopAndBottom(I)V
-Lorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout$1;
-HSPLorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout$1;-><init>(Lorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout;I)V
-Lorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout$2;
-HSPLorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout$2;-><init>(Lorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout;I)V
-Lorg/chromium/third_party/android/swiperefresh/SwipeRefreshLayout$OnRefreshListener;
-Lorg/chromium/ui/AsyncViewProvider;
-HSPLorg/chromium/ui/AsyncViewProvider;-><init>(Lorg/chromium/ui/AsyncViewStub;I)V
-HSPLorg/chromium/ui/AsyncViewProvider;->whenLoaded(Lorg/chromium/base/Callback;)V
-Lorg/chromium/ui/AsyncViewProvider$$ExternalSyntheticLambda0;
-HSPLorg/chromium/ui/AsyncViewProvider$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/ui/AsyncViewProvider;Lorg/chromium/base/Callback;)V
-Lorg/chromium/ui/AsyncViewStub;
-HSPLorg/chromium/ui/AsyncViewStub;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Lorg/chromium/ui/KeyboardVisibilityDelegate;
-HSPLorg/chromium/ui/KeyboardVisibilityDelegate;-><init>()V
-HSPLorg/chromium/ui/KeyboardVisibilityDelegate;->addKeyboardVisibilityListener(Lorg/chromium/ui/KeyboardVisibilityDelegate$KeyboardVisibilityListener;)V
-HSPLorg/chromium/ui/KeyboardVisibilityDelegate;->calculateKeyboardHeight(Landroid/view/View;)I
-HSPLorg/chromium/ui/KeyboardVisibilityDelegate;->removeKeyboardVisibilityListener(Lorg/chromium/ui/KeyboardVisibilityDelegate$KeyboardVisibilityListener;)V
-Lorg/chromium/ui/KeyboardVisibilityDelegate$KeyboardVisibilityListener;
-Lorg/chromium/ui/OverscrollRefreshHandler;
-Lorg/chromium/ui/UiUtils;
-HSPLorg/chromium/ui/UiUtils;->getDirectoryForImageCapture(Landroid/content/Context;)Ljava/io/File;
-HSPLorg/chromium/ui/UiUtils;->getTintedDrawable(Landroid/content/Context;ILandroid/content/res/ColorStateList;)Landroid/graphics/drawable/Drawable;
-HSPLorg/chromium/ui/UiUtils;->insertView(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/View;Z)I
-HSPLorg/chromium/ui/UiUtils;->isSystemUiThemingDisabled()Z
-HSPLorg/chromium/ui/UiUtils;->removeViewFromParent(Landroid/view/View;)V
-HSPLorg/chromium/ui/UiUtils;->setNavigationBarIconColor(Landroid/view/View;Z)V
-Lorg/chromium/ui/ViewProvider;
-Lorg/chromium/ui/accessibility/AccessibilityState;
-HSPLorg/chromium/ui/accessibility/AccessibilityState;->getAccessibilityServiceCapabilitiesMask()I
-HSPLorg/chromium/ui/accessibility/AccessibilityState;->getAccessibilityServiceEventTypeMask()I
-HSPLorg/chromium/ui/accessibility/AccessibilityState;->getAccessibilityServiceFeedbackTypeMask()I
-HSPLorg/chromium/ui/accessibility/AccessibilityState;->getAccessibilityServiceFlagsMask()I
-HSPLorg/chromium/ui/accessibility/AccessibilityState;->getAccessibilityServiceIds()[Ljava/lang/String;
-HSPLorg/chromium/ui/accessibility/AccessibilityState;->isScreenReaderEnabled()Z
-HSPLorg/chromium/ui/accessibility/AccessibilityState;->registerObservers()V
-HSPLorg/chromium/ui/accessibility/AccessibilityState;->updateAccessibilityServices()V
-Lorg/chromium/ui/accessibility/AccessibilityState$$ExternalSyntheticLambda1;
-HSPLorg/chromium/ui/accessibility/AccessibilityState$$ExternalSyntheticLambda1;-><init>(I)V
-Lorg/chromium/ui/accessibility/AccessibilityState$Listener;
-Lorg/chromium/ui/accessibility/AccessibilityState$ServicesObserver;
-HSPLorg/chromium/ui/accessibility/AccessibilityState$ServicesObserver;-><init>(Landroid/os/Handler;Lorg/chromium/ui/accessibility/AccessibilityState$$ExternalSyntheticLambda1;)V
-Lorg/chromium/ui/accessibility/AccessibilityState$State;
-HSPLorg/chromium/ui/accessibility/AccessibilityState$State;-><init>(ZZZZZ)V
-Lorg/chromium/ui/base/ActivityIntentRequestTrackerDelegate;
-HSPLorg/chromium/ui/base/ActivityIntentRequestTrackerDelegate;-><init>(Landroid/app/Activity;)V
-Lorg/chromium/ui/base/ActivityKeyboardVisibilityDelegate;
-HSPLorg/chromium/ui/base/ActivityKeyboardVisibilityDelegate;-><init>(Ljava/lang/ref/WeakReference;)V
-HSPLorg/chromium/ui/base/ActivityKeyboardVisibilityDelegate;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-HSPLorg/chromium/ui/base/ActivityKeyboardVisibilityDelegate;->registerKeyboardVisibilityCallbacks()V
-HSPLorg/chromium/ui/base/ActivityKeyboardVisibilityDelegate;->unregisterKeyboardVisibilityCallbacks()V
-Lorg/chromium/ui/base/ActivityWindowAndroid;
-HSPLorg/chromium/ui/base/ActivityWindowAndroid;-><init>(Landroid/content/Context;Lorg/chromium/chrome/browser/init/SingleWindowKeyboardVisibilityDelegate;Lorg/chromium/ui/base/IntentRequestTrackerImpl;)V
-HSPLorg/chromium/ui/base/ActivityWindowAndroid;-><init>(Landroid/content/Context;ZLorg/chromium/ui/permissions/ActivityAndroidPermissionDelegate;Lorg/chromium/ui/base/ActivityKeyboardVisibilityDelegate;Lorg/chromium/ui/base/IntentRequestTrackerImpl;)V
-HSPLorg/chromium/ui/base/ActivityWindowAndroid;->getActivity()Lorg/chromium/ui/base/ImmutableWeakReference;
-HSPLorg/chromium/ui/base/ActivityWindowAndroid;->getActivityState()I
-HSPLorg/chromium/ui/base/ActivityWindowAndroid;->onActivityStateChange(Landroid/app/Activity;I)V
-HSPLorg/chromium/ui/base/ActivityWindowAndroid;->onWindowFocusChanged(Landroid/app/Activity;Z)V
-Lorg/chromium/ui/base/ApplicationViewportInsetSupplier;
-HSPLorg/chromium/ui/base/ApplicationViewportInsetSupplier;-><init>()V
-HSPLorg/chromium/ui/base/ApplicationViewportInsetSupplier;->computeInset()V
-Lorg/chromium/ui/base/ApplicationViewportInsetSupplier$$ExternalSyntheticLambda0;
-HSPLorg/chromium/ui/base/ApplicationViewportInsetSupplier$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/ui/base/ApplicationViewportInsetSupplier;)V
-Lorg/chromium/ui/base/Clipboard;
-HSPLorg/chromium/ui/base/Clipboard;-><init>()V
-HSPLorg/chromium/ui/base/Clipboard;->getInstance()Lorg/chromium/ui/base/Clipboard;
-HSPLorg/chromium/ui/base/Clipboard;->setNativePtr(J)V
-Lorg/chromium/ui/base/ClipboardImpl;
-HSPLorg/chromium/ui/base/ClipboardImpl;-><init>(Landroid/content/ClipboardManager;)V
-HSPLorg/chromium/ui/base/ClipboardImpl;->getImageUriIfSharedByThisApp()Landroid/net/Uri;
-HSPLorg/chromium/ui/base/ClipboardImpl;->onWindowFocusChanged(Z)V
-HSPLorg/chromium/ui/base/ClipboardImpl;->setImageFileProvider(Lorg/chromium/components/browser_ui/share/ClipboardImageFileProvider;)V
-Lorg/chromium/ui/base/DeviceFormFactor;
-HSPLorg/chromium/ui/base/DeviceFormFactor;->isNonMultiDisplayContextOnTablet(Landroid/content/Context;)Z
-HSPLorg/chromium/ui/base/DeviceFormFactor;->isTablet()Z
-HSPLorg/chromium/ui/base/DeviceFormFactor;->isWindowOnTablet(Lorg/chromium/ui/base/WindowAndroid;)Z
-Lorg/chromium/ui/base/EventOffsetHandler;
-HSPLorg/chromium/ui/base/EventOffsetHandler;-><init>(Lorg/chromium/chrome/browser/compositor/CompositorViewHolder$1;)V
-Lorg/chromium/ui/base/ImmutableWeakReference;
-HSPLorg/chromium/ui/base/ImmutableWeakReference;-><init>(Ljava/lang/Object;)V
-Lorg/chromium/ui/base/IntentRequestTracker$Delegate;
-Lorg/chromium/ui/base/IntentRequestTrackerImpl;
-HSPLorg/chromium/ui/base/IntentRequestTrackerImpl;-><init>(Lorg/chromium/ui/base/ActivityIntentRequestTrackerDelegate;)V
-Lorg/chromium/ui/base/LocalizationUtils;
-HSPLorg/chromium/ui/base/LocalizationUtils;->isLayoutRtl()Z
-Lorg/chromium/ui/base/PhotoPickerListener;
-Lorg/chromium/ui/base/ResourceBundle;
-HSPLorg/chromium/ui/base/ResourceBundle;->getLocalePakResourcePath(Ljava/lang/String;ZZ)Ljava/lang/String;
-Lorg/chromium/ui/base/SelectFileDialog;
-Lorg/chromium/ui/base/SelectFileDialog$$ExternalSyntheticLambda5;
-HSPLorg/chromium/ui/base/SelectFileDialog$$ExternalSyntheticLambda5;-><init>()V
-HSPLorg/chromium/ui/base/SelectFileDialog$$ExternalSyntheticLambda5;->run()V
-Lorg/chromium/ui/base/TouchDevice;
-HSPLorg/chromium/ui/base/TouchDevice;->availablePointerAndHoverTypes()[I
-HSPLorg/chromium/ui/base/TouchDevice;->hasSource(II)Z
-HSPLorg/chromium/ui/base/TouchDevice;->maxTouchPoints()I
-Lorg/chromium/ui/base/ViewAndroidDelegate;
-HSPLorg/chromium/ui/base/ViewAndroidDelegate;-><init>(Landroid/view/ViewGroup;)V
-HSPLorg/chromium/ui/base/ViewAndroidDelegate;->getContainerView()Landroid/view/View;
-HSPLorg/chromium/ui/base/ViewAndroidDelegate;->getDisplayFeature()[I
-HSPLorg/chromium/ui/base/ViewAndroidDelegate;->hasFocus()Z
-Lorg/chromium/ui/base/ViewAndroidDelegate$VerticalScrollDirectionChangeListener;
-Lorg/chromium/ui/base/ViewUtils;
-HSPLorg/chromium/ui/base/ViewUtils;->dpToPx(Landroid/content/Context;F)I
-HSPLorg/chromium/ui/base/ViewUtils;->getRelativeDrawPosition(Landroid/view/View;Landroid/view/View;[I)V
-HSPLorg/chromium/ui/base/ViewUtils;->getRelativeLayoutPosition(Landroid/view/View;Landroid/view/View;[I)V
-HSPLorg/chromium/ui/base/ViewUtils;->translateCanvasToView(Landroid/view/View;Landroid/view/View;Landroid/graphics/Canvas;)V
-Lorg/chromium/ui/base/WindowAndroid;
-HSPLorg/chromium/ui/base/WindowAndroid;-><init>(Landroid/content/Context;Lorg/chromium/ui/base/IntentRequestTrackerImpl;)V
-HSPLorg/chromium/ui/base/WindowAndroid;-><init>(Landroid/content/Context;Lorg/chromium/ui/display/DisplayAndroid;)V
-HSPLorg/chromium/ui/base/WindowAndroid;->clearNativePointer()V
-HSPLorg/chromium/ui/base/WindowAndroid;->destroy()V
-HSPLorg/chromium/ui/base/WindowAndroid;->doSetPreferredRefreshRate(F)V
-HSPLorg/chromium/ui/base/WindowAndroid;->getNativePointer()J
-HSPLorg/chromium/ui/base/WindowAndroid;->getOverlayTransform()I
-HSPLorg/chromium/ui/base/WindowAndroid;->getRefreshRate()F
-HSPLorg/chromium/ui/base/WindowAndroid;->getSupportedRefreshRates()[F
-HSPLorg/chromium/ui/base/WindowAndroid;->getWindow()Landroid/view/Window;
-HSPLorg/chromium/ui/base/WindowAndroid;->hasPermission(Ljava/lang/String;)Z
-HSPLorg/chromium/ui/base/WindowAndroid;->recomputeSupportedRefreshRates()V
-HSPLorg/chromium/ui/base/WindowAndroid;->refreshWillNotDraw()V
-HSPLorg/chromium/ui/base/WindowAndroid;->setPreferredRefreshRate(F)V
-Lorg/chromium/ui/base/WindowAndroid$ActivityStateObserver;
-Lorg/chromium/ui/base/WindowAndroid$IntentCallback;
-Lorg/chromium/ui/base/WindowAndroid$SelectionHandlesObserver;
-Lorg/chromium/ui/base/WindowAndroid$TouchExplorationMonitor;
-HSPLorg/chromium/ui/base/WindowAndroid$TouchExplorationMonitor;-><init>(Lorg/chromium/ui/base/ActivityWindowAndroid;)V
-Lorg/chromium/ui/base/WindowAndroid$TouchExplorationMonitor$1;
-HSPLorg/chromium/ui/base/WindowAndroid$TouchExplorationMonitor$1;-><init>(Lorg/chromium/ui/base/WindowAndroid$TouchExplorationMonitor;)V
-Lorg/chromium/ui/base/WindowDelegate;
-HSPLorg/chromium/ui/base/WindowDelegate;-><init>(Landroid/view/Window;)V
-Lorg/chromium/ui/display/DisplayAndroid;
-HSPLorg/chromium/ui/display/DisplayAndroid;-><init>(I)V
-HSPLorg/chromium/ui/display/DisplayAndroid;->getNonMultiDisplay(Landroid/content/Context;)Lorg/chromium/ui/display/DisplayAndroid;
-HSPLorg/chromium/ui/display/DisplayAndroid;->getObservers()[Lorg/chromium/ui/display/DisplayAndroid$DisplayAndroidObserver;
-HSPLorg/chromium/ui/display/DisplayAndroid;->update(Landroid/graphics/Point;Ljava/lang/Float;Ljava/lang/Float;Ljava/lang/Float;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Float;Landroid/view/Display$Mode;Ljava/util/List;)V
-Lorg/chromium/ui/display/DisplayAndroid$DisplayAndroidObserver;
-HSPLorg/chromium/ui/display/DisplayAndroid$DisplayAndroidObserver;->onDIPScaleChanged(F)V
-Lorg/chromium/ui/display/DisplayAndroidManager;
-HSPLorg/chromium/ui/display/DisplayAndroidManager;-><init>()V
-HSPLorg/chromium/ui/display/DisplayAndroidManager;->addDisplay(Landroid/view/Display;)Lorg/chromium/ui/display/PhysicalDisplayAndroid;
-HSPLorg/chromium/ui/display/DisplayAndroidManager;->getDefaultDisplayForContext(Landroid/content/Context;)Landroid/view/Display;
-HSPLorg/chromium/ui/display/DisplayAndroidManager;->getInstance()Lorg/chromium/ui/display/DisplayAndroidManager;
-HSPLorg/chromium/ui/display/DisplayAndroidManager;->onNativeSideCreated(J)V
-HSPLorg/chromium/ui/display/DisplayAndroidManager;->updateDisplayOnNativeSide(Lorg/chromium/ui/display/DisplayAndroid;)V
-Lorg/chromium/ui/display/DisplayAndroidManager$DisplayListenerBackend;
-HSPLorg/chromium/ui/display/DisplayAndroidManager$DisplayListenerBackend;-><init>(Lorg/chromium/ui/display/DisplayAndroidManager;)V
-Lorg/chromium/ui/display/PhysicalDisplayAndroid;
-HSPLorg/chromium/ui/display/PhysicalDisplayAndroid;-><init>(Landroid/view/Display;)V
-HSPLorg/chromium/ui/display/PhysicalDisplayAndroid;->updateCommon(Landroid/graphics/Point;FFFLandroid/view/Display;)V
-HSPLorg/chromium/ui/display/PhysicalDisplayAndroid;->updateFromDisplay(Landroid/view/Display;)V
-Lorg/chromium/ui/dragdrop/DragAndDropBrowserDelegate;
-Lorg/chromium/ui/dragdrop/DragAndDropDelegate;
-HSPLorg/chromium/ui/dragdrop/DragAndDropDelegate;->isDragAndDropSupportedForOs()Z
-Lorg/chromium/ui/dragdrop/DragAndDropDelegateImpl;
-HSPLorg/chromium/ui/dragdrop/DragAndDropDelegateImpl;-><init>()V
-Lorg/chromium/ui/dragdrop/DragStateTracker;
-Lorg/chromium/ui/dragdrop/DropDataContentProvider;
-HSPLorg/chromium/ui/dragdrop/DropDataContentProvider;-><init>()V
-HSPLorg/chromium/ui/dragdrop/DropDataContentProvider;->call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
-HSPLorg/chromium/ui/dragdrop/DropDataContentProvider;->onCreate()Z
-Lorg/chromium/ui/dragdrop/DropDataProviderImpl;
-HSPLorg/chromium/ui/dragdrop/DropDataProviderImpl;-><init>()V
-Lorg/chromium/ui/dragdrop/DropDataProviderImpl$DropPipeDataWriter;
-HSPLorg/chromium/ui/dragdrop/DropDataProviderImpl$DropPipeDataWriter;-><init>()V
-Lorg/chromium/ui/events/devices/InputDeviceObserver;
-HSPLorg/chromium/ui/events/devices/InputDeviceObserver;-><init>()V
-HSPLorg/chromium/ui/events/devices/InputDeviceObserver;->addObserver()V
-HSPLorg/chromium/ui/events/devices/InputDeviceObserver;->removeObserver()V
-Lorg/chromium/ui/gfx/Animation;
-HSPLorg/chromium/ui/gfx/Animation;->prefersReducedMotion()Z
-Lorg/chromium/ui/gfx/BitmapHelper;
-HSPLorg/chromium/ui/gfx/BitmapHelper;->getByteCount(Landroid/graphics/Bitmap;)I
-Lorg/chromium/ui/gfx/ViewConfigurationHelper;
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper;-><init>()V
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper;->createWithListener()Lorg/chromium/ui/gfx/ViewConfigurationHelper;
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper;->getDoubleTapSlop()F
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper;->getDoubleTapTimeout()I
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper;->getLongPressTimeout()I
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper;->getMaximumFlingVelocity()F
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper;->getMinScalingSpan()F
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper;->getMinimumFlingVelocity()F
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper;->getTapTimeout()I
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper;->getTouchSlop()F
-Lorg/chromium/ui/gfx/ViewConfigurationHelper$1;
-HSPLorg/chromium/ui/gfx/ViewConfigurationHelper$1;-><init>(Lorg/chromium/ui/gfx/ViewConfigurationHelper;)V
-Lorg/chromium/ui/interpolators/BakedBezierInterpolator;
-HSPLorg/chromium/ui/interpolators/BakedBezierInterpolator;-><init>([F)V
-HSPLorg/chromium/ui/interpolators/BakedBezierInterpolator;->getInterpolation(F)F
-Lorg/chromium/ui/modaldialog/ModalDialogManager;
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager;-><init>(Lorg/chromium/components/browser_ui/modaldialog/AppModalPresenter;)V
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager;->destroy()V
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager;->dismissDialogsOfType(I)V
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager;->dismissPendingDialogsOfType(II)V
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager;->isShowing()Z
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager;->resumeType(II)V
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager;->resumeTypeInternal(I)V
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager;->showNextDialog()V
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager;->suspendType(I)I
-Lorg/chromium/ui/modaldialog/ModalDialogManager$$ExternalSyntheticLambda1;
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/ui/modaldialog/ModalDialogManager;I)V
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager$$ExternalSyntheticLambda1;->run()V
-Lorg/chromium/ui/modaldialog/ModalDialogManager$ModalDialogManagerObserver;
-Lorg/chromium/ui/modaldialog/ModalDialogManager$Presenter;
-HSPLorg/chromium/ui/modaldialog/ModalDialogManager$Presenter;-><init>()V
-Lorg/chromium/ui/modaldialog/ModalDialogManagerHolder;
-Lorg/chromium/ui/modaldialog/ModalDialogProperties$Controller;
-Lorg/chromium/ui/modaldialog/PendingDialogContainer;
-HSPLorg/chromium/ui/modaldialog/PendingDialogContainer;-><init>()V
-Lorg/chromium/ui/modelutil/LazyConstructionPropertyMcp;
-HSPLorg/chromium/ui/modelutil/LazyConstructionPropertyMcp;-><init>(Lorg/chromium/ui/modelutil/PropertyModel;Ljava/lang/Object;Lorg/chromium/ui/modelutil/LazyConstructionPropertyMcp$$ExternalSyntheticLambda0;Lorg/chromium/ui/ViewProvider;Lorg/chromium/ui/modelutil/PropertyModelChangeProcessor$ViewBinder;)V
-HSPLorg/chromium/ui/modelutil/LazyConstructionPropertyMcp;->onPropertyChanged(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;)V
-Lorg/chromium/ui/modelutil/LazyConstructionPropertyMcp$$ExternalSyntheticLambda0;
-HSPLorg/chromium/ui/modelutil/LazyConstructionPropertyMcp$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/ui/modelutil/PropertyModel$WritableBooleanPropertyKey;)V
-Lorg/chromium/ui/modelutil/LazyConstructionPropertyMcp$$ExternalSyntheticLambda1;
-HSPLorg/chromium/ui/modelutil/LazyConstructionPropertyMcp$$ExternalSyntheticLambda1;-><init>(Lorg/chromium/ui/modelutil/LazyConstructionPropertyMcp;)V
-Lorg/chromium/ui/modelutil/ListModel;
-HSPLorg/chromium/ui/modelutil/ListModel;-><init>()V
-Lorg/chromium/ui/modelutil/ListModelBase;
-HSPLorg/chromium/ui/modelutil/ListModelBase;-><init>()V
-HSPLorg/chromium/ui/modelutil/ListModelBase;->set(Ljava/util/List;)V
-HSPLorg/chromium/ui/modelutil/ListModelBase;->size()I
-Lorg/chromium/ui/modelutil/ListObservable;
-Lorg/chromium/ui/modelutil/ListObservable$ListObserver;
-Lorg/chromium/ui/modelutil/ListObservableImpl;
-HSPLorg/chromium/ui/modelutil/ListObservableImpl;-><init>()V
-HSPLorg/chromium/ui/modelutil/ListObservableImpl;->addObserver(Lorg/chromium/ui/modelutil/ListObservable$ListObserver;)V
-Lorg/chromium/ui/modelutil/MVCListAdapter$ModelList;
-HSPLorg/chromium/ui/modelutil/MVCListAdapter$ModelList;-><init>()V
-Lorg/chromium/ui/modelutil/MVCListAdapter$ViewBuilder;
-Lorg/chromium/ui/modelutil/ModelListPropertyChangeFilter;
-HSPLorg/chromium/ui/modelutil/ModelListPropertyChangeFilter;-><init>(Lorg/chromium/chrome/browser/tasks/tab_management/TabStripSnapshotter$$ExternalSyntheticLambda0;Lorg/chromium/chrome/browser/tasks/tab_management/TabListModel;Ljava/util/HashSet;)V
-HSPLorg/chromium/ui/modelutil/ModelListPropertyChangeFilter;->onItemRangeInserted(Lorg/chromium/ui/modelutil/ListObservable;II)V
-HSPLorg/chromium/ui/modelutil/ModelListPropertyChangeFilter;->prunePropertyModels(Ljava/util/Set;)V
-Lorg/chromium/ui/modelutil/PropertyModel;
-HSPLorg/chromium/ui/modelutil/PropertyModel;-><init>(Ljava/util/List;)V
-HSPLorg/chromium/ui/modelutil/PropertyModel;-><init>(Ljava/util/Map;)V
-HSPLorg/chromium/ui/modelutil/PropertyModel;-><init>([Lorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;)V
-HSPLorg/chromium/ui/modelutil/PropertyModel;->buildData([Lorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;)Ljava/util/HashMap;
-HSPLorg/chromium/ui/modelutil/PropertyModel;->concatKeys([Lorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;[Lorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;)[Lorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;
-HSPLorg/chromium/ui/modelutil/PropertyModel;->get(Lorg/chromium/ui/modelutil/PropertyModel$ReadableIntPropertyKey;)I
-HSPLorg/chromium/ui/modelutil/PropertyModel;->get(Lorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;)F
-HSPLorg/chromium/ui/modelutil/PropertyModel;->get(Lorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;)Ljava/lang/Object;
-HSPLorg/chromium/ui/modelutil/PropertyModel;->get(Lorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;)Z
-HSPLorg/chromium/ui/modelutil/PropertyModel;->getAllSetProperties()Ljava/util/ArrayList;
-HSPLorg/chromium/ui/modelutil/PropertyModel;->set(Lorg/chromium/ui/modelutil/PropertyModel$WritableBooleanPropertyKey;Z)V
-HSPLorg/chromium/ui/modelutil/PropertyModel;->set(Lorg/chromium/ui/modelutil/PropertyModel$WritableIntPropertyKey;I)V
-HSPLorg/chromium/ui/modelutil/PropertyModel;->set(Lorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;F)V
-HSPLorg/chromium/ui/modelutil/PropertyModel;->set(Lorg/chromium/ui/modelutil/PropertyModel$WritableObjectPropertyKey;Ljava/lang/Object;)V
-Lorg/chromium/ui/modelutil/PropertyModel$BooleanContainer;
-HSPLorg/chromium/ui/modelutil/PropertyModel$BooleanContainer;-><init>()V
-Lorg/chromium/ui/modelutil/PropertyModel$Builder;
-HSPLorg/chromium/ui/modelutil/PropertyModel$Builder;-><init>([Lorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;)V
-HSPLorg/chromium/ui/modelutil/PropertyModel$Builder;->build()Lorg/chromium/ui/modelutil/PropertyModel;
-HSPLorg/chromium/ui/modelutil/PropertyModel$Builder;->with(Lorg/chromium/ui/modelutil/PropertyModel$ReadableIntPropertyKey;I)V
-HSPLorg/chromium/ui/modelutil/PropertyModel$Builder;->with(Lorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;F)V
-HSPLorg/chromium/ui/modelutil/PropertyModel$Builder;->with(Lorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;Ljava/lang/Object;)V
-HSPLorg/chromium/ui/modelutil/PropertyModel$Builder;->with(Lorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;Z)V
-Lorg/chromium/ui/modelutil/PropertyModel$FloatContainer;
-HSPLorg/chromium/ui/modelutil/PropertyModel$FloatContainer;-><init>()V
-Lorg/chromium/ui/modelutil/PropertyModel$IntContainer;
-HSPLorg/chromium/ui/modelutil/PropertyModel$IntContainer;-><init>()V
-Lorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;
-HSPLorg/chromium/ui/modelutil/PropertyModel$NamedPropertyKey;-><init>(Ljava/lang/String;)V
-Lorg/chromium/ui/modelutil/PropertyModel$ObjectContainer;
-HSPLorg/chromium/ui/modelutil/PropertyModel$ObjectContainer;-><init>()V
-Lorg/chromium/ui/modelutil/PropertyModel$ReadableIntPropertyKey;
-HSPLorg/chromium/ui/modelutil/PropertyModel$ReadableIntPropertyKey;-><init>()V
-HSPLorg/chromium/ui/modelutil/PropertyModel$ReadableIntPropertyKey;-><init>(Ljava/lang/String;)V
-Lorg/chromium/ui/modelutil/PropertyModel$ValueContainer;
-HSPLorg/chromium/ui/modelutil/PropertyModel$ValueContainer;-><init>()V
-Lorg/chromium/ui/modelutil/PropertyModel$WritableBooleanPropertyKey;
-HSPLorg/chromium/ui/modelutil/PropertyModel$WritableBooleanPropertyKey;-><init>()V
-HSPLorg/chromium/ui/modelutil/PropertyModel$WritableBooleanPropertyKey;-><init>(Ljava/lang/String;)V
-Lorg/chromium/ui/modelutil/PropertyModel$WritableIntPropertyKey;
-HSPLorg/chromium/ui/modelutil/PropertyModel$WritableIntPropertyKey;-><init>()V
-HSPLorg/chromium/ui/modelutil/PropertyModel$WritableIntPropertyKey;-><init>(Ljava/lang/String;)V
-Lorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;
-HSPLorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;-><init>(I)V
-HSPLorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;-><init>(II)V
-HSPLorg/chromium/ui/modelutil/PropertyModel$WritableLongPropertyKey;-><init>(Ljava/lang/String;)V
-Lorg/chromium/ui/modelutil/PropertyModel$WritableObjectPropertyKey;
-HSPLorg/chromium/ui/modelutil/PropertyModel$WritableObjectPropertyKey;-><init>()V
-HSPLorg/chromium/ui/modelutil/PropertyModel$WritableObjectPropertyKey;-><init>(Ljava/lang/String;Z)V
-Lorg/chromium/ui/modelutil/PropertyModelChangeProcessor;
-HSPLorg/chromium/ui/modelutil/PropertyModelChangeProcessor;-><init>(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Lorg/chromium/ui/modelutil/PropertyModelChangeProcessor$ViewBinder;Z)V
-HSPLorg/chromium/ui/modelutil/PropertyModelChangeProcessor;->create(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;Lorg/chromium/ui/modelutil/PropertyModelChangeProcessor$ViewBinder;)Lorg/chromium/ui/modelutil/PropertyModelChangeProcessor;
-HSPLorg/chromium/ui/modelutil/PropertyModelChangeProcessor;->destroy()V
-Lorg/chromium/ui/modelutil/PropertyModelChangeProcessor$$ExternalSyntheticLambda0;
-HSPLorg/chromium/ui/modelutil/PropertyModelChangeProcessor$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/ui/modelutil/PropertyModelChangeProcessor;)V
-HSPLorg/chromium/ui/modelutil/PropertyModelChangeProcessor$$ExternalSyntheticLambda0;->onPropertyChanged(Lorg/chromium/ui/modelutil/PropertyObservable;Ljava/lang/Object;)V
-Lorg/chromium/ui/modelutil/PropertyModelChangeProcessor$ViewBinder;
-Lorg/chromium/ui/modelutil/PropertyObservable;
-HSPLorg/chromium/ui/modelutil/PropertyObservable;-><init>()V
-HSPLorg/chromium/ui/modelutil/PropertyObservable;->addObserver(Lorg/chromium/ui/modelutil/PropertyObservable$PropertyObserver;)V
-HSPLorg/chromium/ui/modelutil/PropertyObservable;->notifyPropertyChanged(Ljava/lang/Object;)V
-HSPLorg/chromium/ui/modelutil/PropertyObservable;->removeObserver(Lorg/chromium/ui/modelutil/PropertyObservable$PropertyObserver;)V
-Lorg/chromium/ui/modelutil/PropertyObservable$PropertyObserver;
-Lorg/chromium/ui/modelutil/SimpleList;
-Lorg/chromium/ui/modelutil/SimpleRecyclerViewAdapter;
-HSPLorg/chromium/ui/modelutil/SimpleRecyclerViewAdapter;-><init>(Lorg/chromium/ui/modelutil/MVCListAdapter$ModelList;)V
-HSPLorg/chromium/ui/modelutil/SimpleRecyclerViewAdapter;->getItemCount()I
-HSPLorg/chromium/ui/modelutil/SimpleRecyclerViewAdapter;->registerType(ILorg/chromium/ui/modelutil/MVCListAdapter$ViewBuilder;Lorg/chromium/ui/modelutil/PropertyModelChangeProcessor$ViewBinder;)V
-Lorg/chromium/ui/modelutil/SimpleRecyclerViewAdapter$1;
-HSPLorg/chromium/ui/modelutil/SimpleRecyclerViewAdapter$1;-><init>(Lorg/chromium/ui/modelutil/SimpleRecyclerViewAdapter;)V
-Lorg/chromium/ui/permissions/ActivityAndroidPermissionDelegate;
-HSPLorg/chromium/ui/permissions/ActivityAndroidPermissionDelegate;-><init>(Ljava/lang/ref/WeakReference;)V
-HSPLorg/chromium/ui/permissions/ActivityAndroidPermissionDelegate;->hasPermission(Ljava/lang/String;)Z
-Lorg/chromium/ui/permissions/AndroidPermissionDelegate;
-Lorg/chromium/ui/permissions/PermissionPrefs;
-HSPLorg/chromium/ui/permissions/PermissionPrefs;->getPermissionWasDeniedKey(Ljava/lang/String;)Ljava/lang/String;
-HSPLorg/chromium/ui/permissions/PermissionPrefs;->normalizePermissionName(Ljava/lang/String;)Ljava/lang/String;
-Lorg/chromium/ui/resources/LayoutResource;
-HSPLorg/chromium/ui/resources/LayoutResource;-><init>(FLorg/chromium/ui/resources/Resource;)V
-Lorg/chromium/ui/resources/Resource;
-Lorg/chromium/ui/resources/ResourceFactory;
-HSPLorg/chromium/ui/resources/ResourceFactory;->createBitmapResource(Lorg/chromium/ui/resources/statics/NinePatchData;)J
-Lorg/chromium/ui/resources/ResourceLoader;
-HSPLorg/chromium/ui/resources/ResourceLoader;-><init>(ILorg/chromium/ui/resources/ResourceLoader$ResourceLoaderCallback;)V
-HSPLorg/chromium/ui/resources/ResourceLoader;->notifyLoadFinished(ILorg/chromium/ui/resources/Resource;)V
-Lorg/chromium/ui/resources/ResourceLoader$ResourceLoaderCallback;
-Lorg/chromium/ui/resources/ResourceManager;
-HSPLorg/chromium/ui/resources/ResourceManager;-><init>(Landroid/content/res/Resources;IJ)V
-HSPLorg/chromium/ui/resources/ResourceManager;->create(Lorg/chromium/ui/base/WindowAndroid;J)Lorg/chromium/ui/resources/ResourceManager;
-HSPLorg/chromium/ui/resources/ResourceManager;->destroy()V
-HSPLorg/chromium/ui/resources/ResourceManager;->getDynamicResourceLoader()Lorg/chromium/ui/resources/dynamics/DynamicResourceLoader;
-HSPLorg/chromium/ui/resources/ResourceManager;->getNativePtr()J
-HSPLorg/chromium/ui/resources/ResourceManager;->preloadResources(I[I[I)V
-HSPLorg/chromium/ui/resources/ResourceManager;->resourceRequested(II)V
-Lorg/chromium/ui/resources/async/AsyncPreloadResourceLoader;
-HSPLorg/chromium/ui/resources/async/AsyncPreloadResourceLoader;-><init>(ILorg/chromium/ui/resources/ResourceLoader$ResourceLoaderCallback;Lorg/chromium/ui/resources/async/AsyncPreloadResourceLoader$ResourceCreator;)V
-HSPLorg/chromium/ui/resources/async/AsyncPreloadResourceLoader;->loadResource(I)V
-Lorg/chromium/ui/resources/async/AsyncPreloadResourceLoader$AsyncLoadTask;
-Lorg/chromium/ui/resources/async/AsyncPreloadResourceLoader$ResourceCreator;
-Lorg/chromium/ui/resources/dynamics/CaptureObserver;
-Lorg/chromium/ui/resources/dynamics/CaptureUtils;
-HSPLorg/chromium/ui/resources/dynamics/CaptureUtils;->captureCommon(Landroid/graphics/Canvas;Landroid/view/View;Landroid/graphics/Rect;FZLorg/chromium/ui/resources/dynamics/CaptureObserver;)Z
-Lorg/chromium/ui/resources/dynamics/DynamicResource;
-Lorg/chromium/ui/resources/dynamics/DynamicResourceLoader;
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceLoader;-><init>(ILorg/chromium/ui/resources/ResourceLoader$ResourceLoaderCallback;)V
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceLoader;->loadResource(I)V
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceLoader;->registerResource(ILorg/chromium/ui/resources/dynamics/DynamicResource;)V
-Lorg/chromium/ui/resources/dynamics/DynamicResourceLoader$$ExternalSyntheticLambda0;
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceLoader$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/ui/resources/dynamics/DynamicResourceLoader;I)V
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceLoader$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/ui/resources/dynamics/DynamicResourceLoader$DynamicResourceHolder;
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceLoader$DynamicResourceHolder;-><init>(Lorg/chromium/ui/resources/dynamics/DynamicResource;Lorg/chromium/ui/resources/dynamics/DynamicResourceLoader$$ExternalSyntheticLambda0;)V
-Lorg/chromium/ui/resources/dynamics/DynamicResourceSnapshot;
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceSnapshot;-><init>(Landroid/graphics/Bitmap;ZLandroid/graphics/Rect;J)V
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceSnapshot;->createNativeResource()J
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceSnapshot;->getBitmap()Landroid/graphics/Bitmap;
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceSnapshot;->getBitmapSize()Landroid/graphics/Rect;
-HSPLorg/chromium/ui/resources/dynamics/DynamicResourceSnapshot;->getNinePatchData()Lorg/chromium/ui/resources/statics/NinePatchData;
-Lorg/chromium/ui/resources/dynamics/SoftwareDraw;
-HSPLorg/chromium/ui/resources/dynamics/SoftwareDraw;-><init>()V
-HSPLorg/chromium/ui/resources/dynamics/SoftwareDraw;->dropCachedBitmap()V
-HSPLorg/chromium/ui/resources/dynamics/SoftwareDraw;->onViewSizeChange(Landroid/view/View;F)V
-HSPLorg/chromium/ui/resources/dynamics/SoftwareDraw;->shouldRemoveResourceOnNullBitmap()Z
-HSPLorg/chromium/ui/resources/dynamics/SoftwareDraw;->startBitmapCapture(Landroid/view/View;Landroid/graphics/Rect;FLorg/chromium/ui/resources/dynamics/CaptureObserver;Lorg/chromium/ui/resources/dynamics/ViewResourceAdapter$$ExternalSyntheticLambda0;)Z
-Lorg/chromium/ui/resources/dynamics/ViewResourceAdapter;
-HSPLorg/chromium/ui/resources/dynamics/ViewResourceAdapter;-><init>(Landroid/view/View;Z)V
-HSPLorg/chromium/ui/resources/dynamics/ViewResourceAdapter;->addOnResourceReadyCallback(Lorg/chromium/base/Callback;)V
-HSPLorg/chromium/ui/resources/dynamics/ViewResourceAdapter;->invalidate(Landroid/graphics/Rect;)V
-HSPLorg/chromium/ui/resources/dynamics/ViewResourceAdapter;->isDirty()Z
-HSPLorg/chromium/ui/resources/dynamics/ViewResourceAdapter;->onLayoutChange(Landroid/view/View;IIIIIIII)V
-HSPLorg/chromium/ui/resources/dynamics/ViewResourceAdapter;->onResourceRequested()V
-HSPLorg/chromium/ui/resources/dynamics/ViewResourceAdapter;->triggerBitmapCapture()V
-Lorg/chromium/ui/resources/dynamics/ViewResourceAdapter$$ExternalSyntheticLambda0;
-HSPLorg/chromium/ui/resources/dynamics/ViewResourceAdapter$$ExternalSyntheticLambda0;-><init>(Lorg/chromium/ui/resources/dynamics/ViewResourceAdapter;)V
-HSPLorg/chromium/ui/resources/dynamics/ViewResourceAdapter$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V
-Lorg/chromium/ui/resources/dynamics/ViewResourceAdapter$CaptureMechanism;
-Lorg/chromium/ui/resources/statics/NinePatchData;
-HSPLorg/chromium/ui/resources/statics/NinePatchData;-><init>(IILandroid/graphics/Rect;[I[I)V
-Lorg/chromium/ui/resources/statics/StaticResource;
-HSPLorg/chromium/ui/resources/statics/StaticResource;-><init>(Landroid/graphics/Bitmap;)V
-HSPLorg/chromium/ui/resources/statics/StaticResource;->createNativeResource()J
-HSPLorg/chromium/ui/resources/statics/StaticResource;->getBitmap()Landroid/graphics/Bitmap;
-HSPLorg/chromium/ui/resources/statics/StaticResource;->getBitmapSize()Landroid/graphics/Rect;
-HSPLorg/chromium/ui/resources/statics/StaticResource;->getNinePatchData()Lorg/chromium/ui/resources/statics/NinePatchData;
-Lorg/chromium/ui/resources/statics/StaticResourceLoader;
-HSPLorg/chromium/ui/resources/statics/StaticResourceLoader;-><init>(Lorg/chromium/ui/resources/ResourceLoader$ResourceLoaderCallback;Landroid/content/res/Resources;)V
-Lorg/chromium/ui/resources/statics/StaticResourceLoader$1;
-HSPLorg/chromium/ui/resources/statics/StaticResourceLoader$1;-><init>(Landroid/content/res/Resources;)V
-HSPLorg/chromium/ui/resources/statics/StaticResourceLoader$1;->create(I)Lorg/chromium/ui/resources/statics/StaticResource;
-Lorg/chromium/ui/resources/system/SystemResourceLoader;
-HSPLorg/chromium/ui/resources/system/SystemResourceLoader;-><init>(Lorg/chromium/ui/resources/ResourceLoader$ResourceLoaderCallback;I)V
-Lorg/chromium/ui/resources/system/SystemResourceLoader$1;
-HSPLorg/chromium/ui/resources/system/SystemResourceLoader$1;-><init>(I)V
-Lorg/chromium/ui/util/AccessibilityUtil;
-HSPLorg/chromium/ui/util/AccessibilityUtil;-><init>()V
-HSPLorg/chromium/ui/util/AccessibilityUtil;->addObserver(Lorg/chromium/ui/util/AccessibilityUtil$Observer;)V
-HSPLorg/chromium/ui/util/AccessibilityUtil;->getAccessibilityManager()Landroid/view/accessibility/AccessibilityManager;
-HSPLorg/chromium/ui/util/AccessibilityUtil;->updateIsAccessibilityEnabledAndNotify()V
-Lorg/chromium/ui/util/AccessibilityUtil$ModeChangeHandler;
-HSPLorg/chromium/ui/util/AccessibilityUtil$ModeChangeHandler;-><init>(Lorg/chromium/ui/util/AccessibilityUtil;)V
-Lorg/chromium/ui/util/AccessibilityUtil$Observer;
-Lorg/chromium/ui/util/ColorUtils;
-HSPLorg/chromium/ui/util/ColorUtils;->getColorWithOverlay(IIFZ)I
-HSPLorg/chromium/ui/util/ColorUtils;->getLightnessForColor(I)F
-HSPLorg/chromium/ui/util/ColorUtils;->inNightMode(Landroid/content/Context;)Z
-HSPLorg/chromium/ui/util/ColorUtils;->shouldUseLightForegroundOnBackground(I)Z
-HSPLorg/chromium/ui/util/ColorUtils;->shouldUseOpaqueTextboxBackground(I)Z
-Lorg/chromium/ui/util/TokenHolder;
-HSPLorg/chromium/ui/util/TokenHolder;-><init>(Ljava/lang/Runnable;)V
-HSPLorg/chromium/ui/util/TokenHolder;->acquireToken()I
-HSPLorg/chromium/ui/util/TokenHolder;->hasTokens()Z
-HSPLorg/chromium/ui/util/TokenHolder;->releaseToken(I)V
-Lorg/chromium/ui/widget/AnchoredPopupWindow$LayoutObserver;
-Lorg/chromium/ui/widget/ButtonCompat;
-HSPLorg/chromium/ui/widget/ButtonCompat;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/ui/widget/ButtonCompat;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-Lorg/chromium/ui/widget/ChromeImageButton;
-HSPLorg/chromium/ui/widget/ChromeImageButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/ui/widget/ChromeImageButton;->onFinishInflate()V
-Lorg/chromium/ui/widget/ChromeImageView;
-HSPLorg/chromium/ui/widget/ChromeImageView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-Lorg/chromium/ui/widget/LoadingView;
-HSPLorg/chromium/ui/widget/LoadingView;-><init>(Landroid/content/Context;)V
-Lorg/chromium/ui/widget/LoadingView$1;
-HSPLorg/chromium/ui/widget/LoadingView$1;-><init>(Lorg/chromium/ui/widget/LoadingView;I)V
-Lorg/chromium/ui/widget/OptimizedFrameLayout;
-HSPLorg/chromium/ui/widget/OptimizedFrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HSPLorg/chromium/ui/widget/OptimizedFrameLayout;->onMeasure(II)V
-Lorg/chromium/ui/widget/OptimizedFrameLayout$MeasurementState;
-HSPLorg/chromium/ui/widget/OptimizedFrameLayout$MeasurementState;-><init>(Landroid/view/View;II)V
-Lorg/chromium/ui/widget/RectProvider;
-HSPLorg/chromium/ui/widget/RectProvider;-><init>()V
-Lorg/chromium/ui/widget/RippleBackgroundHelper;
-HSPLorg/chromium/ui/widget/RippleBackgroundHelper;-><init>(Landroid/view/View;II[FIII)V
-HSPLorg/chromium/ui/widget/RippleBackgroundHelper;->setBackgroundColor(Landroid/content/res/ColorStateList;)V
-Lorg/chromium/ui/widget/Toast;
-Lorg/chromium/ui/widget/ViewRectProvider;
-HSPLorg/chromium/ui/widget/ViewRectProvider;-><init>(Landroid/view/View;)V
-Lorg/chromium/url/GURL;
-HSPLorg/chromium/url/GURL;-><init>()V
-HSPLorg/chromium/url/GURL;-><init>(Ljava/lang/String;)V
-HSPLorg/chromium/url/GURL;->deserialize(Ljava/lang/String;)Lorg/chromium/url/GURL;
-HSPLorg/chromium/url/GURL;->deserializeLatestVersionOnly(Ljava/lang/String;)Lorg/chromium/url/GURL;
-HSPLorg/chromium/url/GURL;->emptyGURL()Lorg/chromium/url/GURL;
-HSPLorg/chromium/url/GURL;->ensureNativeInitializedForGURL()V
-HSPLorg/chromium/url/GURL;->equals(Ljava/lang/Object;)Z
-HSPLorg/chromium/url/GURL;->getComponent(II)Ljava/lang/String;
-HSPLorg/chromium/url/GURL;->getHost()Ljava/lang/String;
-HSPLorg/chromium/url/GURL;->getOrigin()Lorg/chromium/url/GURL;
-HSPLorg/chromium/url/GURL;->getScheme()Ljava/lang/String;
-HSPLorg/chromium/url/GURL;->getSpec()Ljava/lang/String;
-HSPLorg/chromium/url/GURL;->init(Ljava/lang/String;ZLorg/chromium/url/Parsed;)V
-HSPLorg/chromium/url/GURL;->isEmpty()Z
-HSPLorg/chromium/url/GURL;->isEmptyOrInvalid(Lorg/chromium/url/GURL;)Z
-HSPLorg/chromium/url/GURL;->serialize()Ljava/lang/String;
-HSPLorg/chromium/url/GURL;->toNativeGURL()J
-Lorg/chromium/url/GURL$BadSerializerVersionException;
-Lorg/chromium/url/GURL$Holder;
-Lorg/chromium/url/Origin;
-HSPLorg/chromium/url/Origin;-><init>(Ljava/lang/String;Ljava/lang/String;SZJJ)V
-HSPLorg/chromium/url/Origin;->toNativeOrigin()J
-Lorg/chromium/url/Parsed;
-HSPLorg/chromium/url/Parsed;-><init>(IIIIIIIIIIIIIIIIZLorg/chromium/url/Parsed;)V
-HSPLorg/chromium/url/Parsed;->deserialize(I[Ljava/lang/String;)Lorg/chromium/url/Parsed;
-HSPLorg/chromium/url/Parsed;->serialize()Ljava/lang/String;
-HSPLorg/chromium/url/Parsed;->toNativeParsed()J
\ No newline at end of file
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 54d6ed0..735c62b1 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -173,6 +173,7 @@
   "java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory.java",
   "java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeNativeBackgroundTaskDelegate.java",
   "java/src/org/chromium/chrome/browser/background_task_scheduler/ProxyNativeTask.java",
+  "java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java",
   "java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java",
   "java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java",
   "java/src/org/chromium/chrome/browser/bookmarks/BookmarkFeatures.java",
@@ -989,6 +990,7 @@
   "java/src/org/chromium/chrome/browser/settings/MainSettings.java",
   "java/src/org/chromium/chrome/browser/settings/SettingsActivity.java",
   "java/src/org/chromium/chrome/browser/settings/SettingsLauncherImpl.java",
+  "java/src/org/chromium/chrome/browser/share/ChromeCustomShareAction.java",
   "java/src/org/chromium/chrome/browser/share/LensUtils.java",
   "java/src/org/chromium/chrome/browser/share/ShareButtonController.java",
   "java/src/org/chromium/chrome/browser/share/ShareDelegateImpl.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index dda22e83..2c1be0a 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -42,6 +42,7 @@
   "junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java",
   "junit/src/org/chromium/chrome/browser/base/DexFixerTest.java",
   "junit/src/org/chromium/chrome/browser/base/SplitPreloaderTest.java",
+  "junit/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonControllerUnitTest.java",
   "junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java",
   "junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java",
   "junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerViewBinderTest.java",
@@ -250,6 +251,7 @@
   "junit/src/org/chromium/chrome/browser/share/LensUtilsTest.java",
   "junit/src/org/chromium/chrome/browser/share/ShareButtonControllerUnitTest.java",
   "junit/src/org/chromium/chrome/browser/share/ShareDelegateImplUnitTest.java",
+  "junit/src/org/chromium/chrome/browser/share/ShareHelperMultiInstanceUnitTest.java",
   "junit/src/org/chromium/chrome/browser/share/ShareHelperUnitTest.java",
   "junit/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandlerTest.java",
   "junit/src/org/chromium/chrome/browser/signin/SigninBridgeTest.java",
diff --git a/chrome/android/expectations/trichrome_chrome_bundle.arm.libs_and_assets.expected b/chrome/android/expectations/trichrome_chrome_bundle.arm.libs_and_assets.expected
index 9b77ed9..a57a100 100644
--- a/chrome/android/expectations/trichrome_chrome_bundle.arm.libs_and_assets.expected
+++ b/chrome/android/expectations/trichrome_chrome_bundle.arm.libs_and_assets.expected
@@ -1,7 +1,5 @@
 apk_path=lib/armeabi-v7a/libchromium_android_linker.so, compress=False, alignment=4096
 apk_path=assets/chrome_100_percent.pak, compress=False, alignment=4
-apk_path=assets/dexopt/baseline.prof, compress=True, alignment=0
-apk_path=assets/dexopt/baseline.profm, compress=True, alignment=0
 apk_path=assets/locales/af.pak, compress=False, alignment=4
 apk_path=assets/locales/am.pak, compress=False, alignment=4
 apk_path=assets/locales/ar.pak, compress=False, alignment=4
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java
index b5a67e8c..f7d0758c5 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java
@@ -146,7 +146,6 @@
     @MediumTest
     @Feature({"StartSurface"})
     @CommandLineFlags.Add({START_SURFACE_TEST_SINGLE_ENABLED_PARAMS})
-    @DisabledTest(message = "https://crbug.com/1395518")
     public void testShow_SingleAsTabSwitcher() {
         if (mImmediateReturn) {
             StartSurfaceTestUtils.waitForStartSurfaceVisible(mLayoutChangedCallbackHelper,
@@ -158,6 +157,7 @@
             }
             // Single surface is shown as homepage. Clicks "more_tabs" button to get into tab
             // switcher.
+            onViewWaiting(withId(R.id.primary_tasks_surface_view));
             StartSurfaceTestUtils.clickTabSwitcherButton(mActivityTestRule.getActivity());
         } else {
             TabUiTestHelper.enterTabSwitcher(mActivityTestRule.getActivity());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 86aa2fb..d20b4f7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -608,7 +608,6 @@
                     boolean hasNextTab = !(getTabModelSelector().getTotalTabCount() == 0
                             || (!getTabModelSelector().isIncognitoSelected()
                                     && getTabModelSelector().getModel(false).getCount() == 0));
-
                     boolean multiWindowActive =
                             MultiWindowUtils.getInstance().areMultipleChromeInstancesRunning(
                                     ChromeTabbedActivity.this)
@@ -655,7 +654,7 @@
                         && getTabModelSelector().getModel(false).getCount() == 0));
 
         if (!overviewVisible && !hasNextTab) {
-            mLayoutManager.showLayout(LayoutType.TAB_SWITCHER, false);
+            mLayoutManager.showLayout(LayoutType.TAB_SWITCHER, true);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/video_tutorials/VideoPlayerActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/video_tutorials/VideoPlayerActivity.java
index aaf218b..2b8b7fb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/video_tutorials/VideoPlayerActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/video_tutorials/VideoPlayerActivity.java
@@ -16,6 +16,7 @@
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.SynchronousInitializationActivity;
 import org.chromium.chrome.browser.WebContentsFactory;
+import org.chromium.chrome.browser.back_press.BackPressManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.video_tutorials.FeatureType;
 import org.chromium.chrome.browser.video_tutorials.Tutorial;
@@ -59,7 +60,10 @@
         int featureType =
                 IntentUtils.safeGetIntExtra(getIntent(), EXTRA_VIDEO_TUTORIAL, FeatureType.INVALID);
         videoTutorialService.getTutorial(featureType, mCoordinator::playVideoTutorial);
-        BackPressHelper.create(this, getOnBackPressedDispatcher(), mCoordinator::onBackPressed);
+        if (!BackPressManager.isSecondaryActivityEnabled()) {
+            // See comments in VideoPlayerMediator#handleBackPressed.
+            BackPressHelper.create(this, getOnBackPressedDispatcher(), mCoordinator::onBackPressed);
+        }
     }
 
     private Pair<WebContents, ContentView> createWebContents() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java
new file mode 100644
index 0000000..36b1474
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonController.java
@@ -0,0 +1,53 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.bookmarks;
+
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.view.View;
+
+import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.base.supplier.Supplier;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.toolbar.BaseButtonDataProvider;
+import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarButtonVariant;
+import org.chromium.components.feature_engagement.Tracker;
+
+/**
+ *  Defines a toolbar button to add the current web page to bookmarks.
+ */
+public class AddToBookmarksToolbarButtonController extends BaseButtonDataProvider {
+    private final Supplier<TabBookmarker> mTabBookmarkerSupplier;
+    private final Supplier<Tracker> mTrackerSupplier;
+
+    /**
+     * Creates a new instance of {@code AddToBookmarksToolbarButtonController}
+     * @param activeTabSupplier Supplier for the current active tab.
+     * @param buttonDrawable Drawable for the button icon.
+     * @param contentDescription String for the button's content description.
+     * @param tabBookmarkerSupplier Supplier of a {@code TabBookmarker} instance.
+     * @param trackerSupplier Supplier for the current profile tracker. Used for IPH.
+     */
+    public AddToBookmarksToolbarButtonController(Supplier<Tab> activeTabSupplier,
+            Drawable buttonDrawable, String contentDescription,
+            Supplier<TabBookmarker> tabBookmarkerSupplier, Supplier<Tracker> trackerSupplier) {
+        super(activeTabSupplier, /* modalDialogManager = */ null, buttonDrawable,
+                contentDescription,
+                /* actionChipLabelResId = */ Resources.ID_NULL, /* supportsTinting = */ true,
+                /* iphCommandBuilder = */ null, AdaptiveToolbarButtonVariant.ADD_TO_BOOKMARKS);
+        mTabBookmarkerSupplier = tabBookmarkerSupplier;
+        mTrackerSupplier = trackerSupplier;
+    }
+
+    @Override
+    public void onClick(View view) {
+        if (!mTabBookmarkerSupplier.hasValue() || !mActiveTabSupplier.hasValue()) return;
+
+        // TODO: Record IPH event using mTrackerSupplier.
+
+        RecordUserAction.record("MobileTopToolbarAddToBookmarksButton");
+        mTabBookmarkerSupplier.get().addOrEditBookmark(mActiveTabSupplier.get());
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
index 3ccee25..661e207 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -56,6 +56,7 @@
 import org.chromium.chrome.browser.browserservices.PostMessageHandler;
 import org.chromium.chrome.browser.browserservices.SessionDataHolder;
 import org.chromium.chrome.browser.browserservices.SessionHandler;
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ActivityLayoutState;
 import org.chromium.chrome.browser.customtabs.features.sessionrestore.SessionRestoreManager;
 import org.chromium.chrome.browser.customtabs.features.sessionrestore.SessionRestoreManagerImpl;
 import org.chromium.chrome.browser.device.DeviceClassManager;
@@ -171,6 +172,19 @@
     private static final String ON_RESIZED_CALLBACK = "onResized";
     private static final String ON_RESIZED_SIZE_EXTRA = "size";
 
+    @VisibleForTesting
+    static final String ON_ACTIVITY_LAYOUT_CALLBACK = "onActivityLayout";
+    @VisibleForTesting
+    static final String ON_ACTIVITY_LAYOUT_LEFT_EXTRA = "left";
+    @VisibleForTesting
+    static final String ON_ACTIVITY_LAYOUT_TOP_EXTRA = "top";
+    @VisibleForTesting
+    static final String ON_ACTIVITY_LAYOUT_RIGHT_EXTRA = "right";
+    @VisibleForTesting
+    static final String ON_ACTIVITY_LAYOUT_BOTTOM_EXTRA = "bottom";
+    @VisibleForTesting
+    static final String ON_ACTIVITY_LAYOUT_STATE_EXTRA = "state";
+
     private static final String ON_VERTICAL_SCROLL_EVENT_CALLBACK = "onVerticalScrollEvent";
     private static final String ON_VERTICAL_SCROLL_EVENT_IS_DIRECTION_UP_EXTRA = "isDirectionUp";
     private static final String ON_GREATEST_SCROLL_PERCENTAGE_INCREASED_CALLBACK =
@@ -1238,6 +1252,28 @@
     }
 
     /**
+     * Called when the Custom Tab's layout has changed.
+     * @param left The left coordinate of the custom tab window in pixels
+     * @param top The top coordinate of the custom tab window in pixels
+     * @param right The right coordinate of the custom tab window in pixels
+     * @param bottom The bottom coordinate of the custom tab window in pixels
+     * @param state The current layout state in which the Custom Tab is displayed.
+     */
+    public void onActivityLayout(@Nullable CustomTabsSessionToken session, int left, int top,
+            int right, int bottom, @ActivityLayoutState int state) {
+        Bundle args = new Bundle();
+        args.putInt(ON_ACTIVITY_LAYOUT_LEFT_EXTRA, left);
+        args.putInt(ON_ACTIVITY_LAYOUT_TOP_EXTRA, top);
+        args.putInt(ON_ACTIVITY_LAYOUT_RIGHT_EXTRA, right);
+        args.putInt(ON_ACTIVITY_LAYOUT_BOTTOM_EXTRA, bottom);
+        args.putInt(ON_ACTIVITY_LAYOUT_STATE_EXTRA, state);
+
+        if (safeExtraCallback(session, ON_ACTIVITY_LAYOUT_CALLBACK, args) && mLogRequests) {
+            logCallback("extraCallback(" + ON_ACTIVITY_LAYOUT_CALLBACK + ")", args);
+        }
+    }
+
+    /**
      * Notifies the application of a vertical scroll event, i.e. when a scroll started or changed
      * direction.
      *
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/CustomTabHeightStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/CustomTabHeightStrategy.java
index 3c3c110..d992de173 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/CustomTabHeightStrategy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/CustomTabHeightStrategy.java
@@ -11,6 +11,7 @@
 import androidx.annotation.Px;
 import androidx.browser.customtabs.CustomTabsSessionToken;
 
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ActivityLayoutState;
 import org.chromium.chrome.browser.customtabs.CustomTabsConnection;
 import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar;
 import org.chromium.chrome.browser.findinpage.FindToolbarObserver;
@@ -28,6 +29,13 @@
         void onResized(int height, int width);
     }
 
+    /** A callback to be called once the Custom Tab's layout has changed. */
+    interface OnActivityLayoutCallback {
+        /** The Custom Tab's layout has changed. */
+        void onActivityLayout(
+                int left, int top, int right, int bottom, @ActivityLayoutState int state);
+    }
+
     public static CustomTabHeightStrategy createStrategy(Activity activity, @Px int initialHeight,
             @Px int initialWidth, int breakPointDp, boolean isPartialCustomTabFixedHeight,
             CustomTabsConnection connection, @Nullable CustomTabsSessionToken session,
@@ -44,6 +52,9 @@
                     breakPointDp, isPartialCustomTabFixedHeight,
                     (height, width)
                             -> connection.onResized(session, height, width),
+                    (left, top, right, bottom, state)
+                            -> connection.onActivityLayout(
+                                    session, left, top, right, bottom, state),
                     lifecycleDispatcher, fullscreenManager, isTablet, interactWithBackground,
                     showMaximizeButton, decorationType, sideSheetPosition, sideSheetAnimation);
         } else {
@@ -51,6 +62,9 @@
                     isPartialCustomTabFixedHeight,
                     (height, width)
                             -> connection.onResized(session, height, width),
+                    (left, top, right, bottom, state)
+                            -> connection.onActivityLayout(
+                                    session, left, top, right, bottom, state),
                     lifecycleDispatcher, fullscreenManager, isTablet, interactWithBackground, false,
                     new PartialCustomTabHandleStrategyFactory());
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBaseStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBaseStrategy.java
index dfd412f3..3edb104c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBaseStrategy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBaseStrategy.java
@@ -6,6 +6,8 @@
 
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ValueAnimator;
@@ -29,7 +31,9 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ActivityLayoutState;
 import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
 import org.chromium.chrome.browser.fullscreen.FullscreenOptions;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
@@ -47,6 +51,7 @@
         extends CustomTabHeightStrategy implements FullscreenManager.Observer {
     protected final Activity mActivity;
     protected final OnResizedCallback mOnResizedCallback;
+    protected final OnActivityLayoutCallback mOnActivityLayoutCallback;
     protected final FullscreenManager mFullscreenManager;
     protected final boolean mIsTablet;
     protected final boolean mInteractWithBackground;
@@ -103,10 +108,12 @@
     }
 
     public PartialCustomTabBaseStrategy(Activity activity, OnResizedCallback onResizedCallback,
-            FullscreenManager fullscreenManager, boolean isTablet, boolean interactWithBackground,
+            OnActivityLayoutCallback onActivityLayoutCallback, FullscreenManager fullscreenManager,
+            boolean isTablet, boolean interactWithBackground,
             PartialCustomTabHandleStrategyFactory handleStrategyFactory) {
         mActivity = activity;
         mOnResizedCallback = onResizedCallback;
+        mOnActivityLayoutCallback = onActivityLayoutCallback;
         mIsTablet = isTablet;
         mInteractWithBackground = interactWithBackground;
 
@@ -212,6 +219,15 @@
 
     protected void maybeInvokeResizeCallback() {
         WindowManager.LayoutParams attrs = mActivity.getWindow().getAttributes();
+
+        if (ChromeFeatureList.sCctResizableSideSheet.isEnabled()) {
+            // onActivityLayout should be called before onResized and only when the PCCT is created
+            // or its size has changed.
+            if (mHeight != attrs.height || mWidth != attrs.width) {
+                invokeActivityLayoutCallback();
+            }
+        }
+
         if (isFullHeight() || isFullscreen()) {
             mOnResizedCallback.onResized(mDisplayHeight, mDisplayWidth);
             mHeight = mDisplayHeight;
@@ -225,9 +241,33 @@
         }
     }
 
+    protected void invokeActivityLayoutCallback() {
+        @ActivityLayoutState
+        int activityLayoutState = getActivityLayoutState();
+
+        // If we are in full screen then we manually need to set the values as we are using
+        // MATCH_PARENT which has the value -1.
+        int left = 0;
+        int top = 0;
+        int right = mDisplayWidth;
+        int bottom = mDisplayHeight;
+        if (activityLayoutState != ACTIVITY_LAYOUT_STATE_FULL_SCREEN) {
+            WindowManager.LayoutParams attrs = mActivity.getWindow().getAttributes();
+            left = attrs.x;
+            top = attrs.y;
+            right = left + attrs.width;
+            bottom = top + attrs.height;
+        }
+
+        mOnActivityLayoutCallback.onActivityLayout(left, top, right, bottom, activityLayoutState);
+    }
+
     @PartialCustomTabType
     public abstract int getStrategyType();
 
+    @ActivityLayoutState
+    protected abstract int getActivityLayoutState();
+
     protected abstract void updatePosition();
 
     protected abstract int getHandleHeight();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java
index e3617f1..b280cdf7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java
@@ -6,6 +6,10 @@
 
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET_MAXIMIZED;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
+
 import android.animation.Animator;
 import android.animation.Animator.AnimatorListener;
 import android.animation.AnimatorListenerAdapter;
@@ -36,6 +40,7 @@
 import org.chromium.base.SysUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ActivityLayoutState;
 import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
@@ -129,11 +134,12 @@
 
     public PartialCustomTabBottomSheetStrategy(Activity activity, @Px int initialHeight,
             boolean isFixedHeight, OnResizedCallback onResizedCallback,
+            OnActivityLayoutCallback onActivityLayoutCallback,
             ActivityLifecycleDispatcher lifecycleDispatcher, FullscreenManager fullscreenManager,
             boolean isTablet, boolean interactWithBackground, boolean startMaximized,
             PartialCustomTabHandleStrategyFactory handleStrategyFactory) {
-        super(activity, onResizedCallback, fullscreenManager, isTablet, interactWithBackground,
-                handleStrategyFactory);
+        super(activity, onResizedCallback, onActivityLayoutCallback, fullscreenManager, isTablet,
+                interactWithBackground, handleStrategyFactory);
 
         int animTime = mActivity.getResources().getInteger(android.R.integer.config_mediumAnimTime);
         mTabAnimator = new TabAnimator(this, animTime, this::onMoveEnd);
@@ -291,6 +297,18 @@
     }
 
     @Override
+    @ActivityLayoutState
+    protected int getActivityLayoutState() {
+        if (isFullscreen()) {
+            return ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
+        } else if (isMaximized()) {
+            return ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET_MAXIMIZED;
+        } else {
+            return ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET;
+        }
+    }
+
+    @Override
     protected void adjustCornerRadius(GradientDrawable d, int radius) {
         d.mutate();
         d.setCornerRadii(new float[] {radius, radius, radius, radius, 0, 0, 0, 0});
@@ -397,10 +415,19 @@
 
         int density = (int) (mActivity.getResources().getDisplayMetrics().density);
         WindowManager.LayoutParams attrs = mActivity.getWindow().getAttributes();
-        if (isLandscapeMaxWidth(width)) {
-            width = BOTTOM_SHEET_MAX_WIDTH_DP_LANDSCAPE * density;
+        if (isFullHeight() || isFullscreen()) {
+            attrs.width = MATCH_PARENT;
+            attrs.x = 0;
+        } else {
+            int x = 0;
+            if (isLandscapeMaxWidth(width)) {
+                width = BOTTOM_SHEET_MAX_WIDTH_DP_LANDSCAPE * density;
+                x = (mDisplayWidth - width) / 2;
+            }
+            attrs.width = width;
+            attrs.x = x;
         }
-        attrs.width = width;
+
         mActivity.getWindow().setAttributes(attrs);
     }
 
@@ -415,9 +442,11 @@
         }
 
         if (ChromeFeatureList.sCctResizableSideSheet.isEnabled()) {
-            attrs.x = 0;
+            attrs.gravity = Gravity.TOP | Gravity.START;
+        } else {
+            attrs.gravity = Gravity.TOP;
         }
-        attrs.gravity = Gravity.TOP;
+
         mActivity.getWindow().setAttributes(attrs);
     }
 
@@ -787,6 +816,7 @@
         // Enter fullscreen i.e. (x, y, height, width) = (0, 0, MATCH_PARENT, MATCH_PARENT)
         assert isFullscreen() : "Fullscreen mode should be on";
         positionAtHeight(/*height=*/0); // |height| is not used
+        positionAtWidth(/*width=*/0); // |width| is not used
         setTopMargins(0, 0);
         maybeInvokeResizeCallback();
     }
@@ -817,6 +847,7 @@
     // Restore the window upon exiting fullscreen.
     private void restoreWindow() {
         initializeHeight();
+        positionAtWidth(mVersionCompat.getDisplayWidth());
         updateShadowOffset();
         maybeInvokeResizeCallback();
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManager.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManager.java
index 012b6ed6..ff48286b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManager.java
@@ -45,6 +45,7 @@
     private final @Px int mUnclampedInitialWidth;
     private final boolean mIsFixedHeight;
     private final OnResizedCallback mOnResizedCallback;
+    private final OnActivityLayoutCallback mOnActivityLayoutCallback;
     private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
     private final FullscreenManager mFullscreenManager;
     private final boolean mIsTablet;
@@ -72,16 +73,17 @@
 
     public PartialCustomTabDisplayManager(Activity activity, @Px int initialHeight,
             @Px int initialWidth, int breakPointDp, boolean isFixedHeight,
-            OnResizedCallback onResizedCallback, ActivityLifecycleDispatcher lifecycleDispatcher,
-            FullscreenManager fullscreenManager, boolean isTablet, boolean interactWithBackground,
-            boolean showMaximizeButton, int decorationType, int sideSheetPosition,
-            int sideSheetAnimation) {
+            OnResizedCallback onResizedCallback, OnActivityLayoutCallback onActivityLayoutCallback,
+            ActivityLifecycleDispatcher lifecycleDispatcher, FullscreenManager fullscreenManager,
+            boolean isTablet, boolean interactWithBackground, boolean showMaximizeButton,
+            int decorationType, int sideSheetPosition, int sideSheetAnimation) {
         mActivity = activity;
         mUnclampedInitialHeight = initialHeight;
         mUnclampedInitialWidth = initialWidth;
         mBreakPointDp = breakPointDp;
         mIsFixedHeight = isFixedHeight;
         mOnResizedCallback = onResizedCallback;
+        mOnActivityLayoutCallback = onActivityLayoutCallback;
         mFullscreenManager = fullscreenManager;
         mIsTablet = isTablet;
         mInteractWithBackground = interactWithBackground;
@@ -287,20 +289,21 @@
         switch (type) {
             case PartialCustomTabType.BOTTOM_SHEET: {
                 return new PartialCustomTabBottomSheetStrategy(mActivity, mUnclampedInitialHeight,
-                        mIsFixedHeight, mOnResizedCallback, mActivityLifecycleDispatcher,
-                        mFullscreenManager, mIsTablet, mInteractWithBackground, maximized,
-                        mHandleStrategyFactory);
+                        mIsFixedHeight, mOnResizedCallback, mOnActivityLayoutCallback,
+                        mActivityLifecycleDispatcher, mFullscreenManager, mIsTablet,
+                        mInteractWithBackground, maximized, mHandleStrategyFactory);
             }
             case PartialCustomTabType.SIDE_SHEET: {
                 return new PartialCustomTabSideSheetStrategy(mActivity, mUnclampedInitialWidth,
-                        mOnResizedCallback, mFullscreenManager, mIsTablet, mInteractWithBackground,
-                        mShowMaximizeButton, maximized, sideSheetPosition, sideSheetAnimation,
-                        mHandleStrategyFactory, mDecorationType);
+                        mOnResizedCallback, mOnActivityLayoutCallback, mFullscreenManager,
+                        mIsTablet, mInteractWithBackground, mShowMaximizeButton, maximized,
+                        sideSheetPosition, sideSheetAnimation, mHandleStrategyFactory,
+                        mDecorationType);
             }
             case PartialCustomTabType.FULL_SIZE: {
                 return new PartialCustomTabFullSizeStrategy(mActivity, mOnResizedCallback,
-                        mFullscreenManager, mIsTablet, mInteractWithBackground,
-                        mHandleStrategyFactory);
+                        mOnActivityLayoutCallback, mFullscreenManager, mIsTablet,
+                        mInteractWithBackground, mHandleStrategyFactory);
             }
             default: {
                 assert false : "Partial Custom Tab type not supported: " + type;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategy.java
index 134cd57..135319b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategy.java
@@ -6,6 +6,8 @@
 
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
+
 import android.app.Activity;
 import android.graphics.drawable.GradientDrawable;
 import android.view.Gravity;
@@ -15,6 +17,7 @@
 
 import androidx.annotation.Px;
 
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ActivityLayoutState;
 import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar;
 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
 
@@ -25,10 +28,11 @@
 public class PartialCustomTabFullSizeStrategy extends PartialCustomTabBaseStrategy {
     public PartialCustomTabFullSizeStrategy(Activity activity,
             CustomTabHeightStrategy.OnResizedCallback onResizedCallback,
+            CustomTabHeightStrategy.OnActivityLayoutCallback onActivityLayoutCallback,
             FullscreenManager fullscreenManager, boolean isTablet, boolean interactWithBackground,
             PartialCustomTabHandleStrategyFactory handleStrategyFactory) {
-        super(activity, onResizedCallback, fullscreenManager, isTablet, interactWithBackground,
-                handleStrategyFactory);
+        super(activity, onResizedCallback, onActivityLayoutCallback, fullscreenManager, isTablet,
+                interactWithBackground, handleStrategyFactory);
 
         mPositionUpdater = this::updatePosition;
 
@@ -57,7 +61,7 @@
 
         initializeSize();
         updateShadowOffset();
-        // TODO(crbug.com/1406107): Check if we should invoke the resize callback
+        maybeInvokeResizeCallback();
     }
 
     @Override
@@ -87,6 +91,12 @@
     }
 
     @Override
+    @ActivityLayoutState
+    protected int getActivityLayoutState() {
+        return ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
+    }
+
+    @Override
     protected void adjustCornerRadius(GradientDrawable d, int radius) {}
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java
index 0e9dcc7..231a3c00 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java
@@ -6,6 +6,9 @@
 
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_SIDE_SHEET;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED;
 import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_SIDE_SHEET_DECORATION_TYPE_DIVIDER;
 import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_SIDE_SHEET_DECORATION_TYPE_NONE;
 
@@ -26,6 +29,7 @@
 import org.chromium.base.MathUtils;
 import org.chromium.base.SysUtils;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ActivityLayoutState;
 import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider;
 import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar;
 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
@@ -49,11 +53,12 @@
 
     public PartialCustomTabSideSheetStrategy(Activity activity, @Px int initialWidth,
             CustomTabHeightStrategy.OnResizedCallback onResizedCallback,
+            CustomTabHeightStrategy.OnActivityLayoutCallback onActivityLayoutCallback,
             FullscreenManager fullscreenManager, boolean isTablet, boolean interactWithBackground,
             boolean showMaximizeButton, boolean startMaximized, int position, int slideInBehavior,
             PartialCustomTabHandleStrategyFactory handleStrategyFactory, int decorationType) {
-        super(activity, onResizedCallback, fullscreenManager, isTablet, interactWithBackground,
-                handleStrategyFactory);
+        super(activity, onResizedCallback, onActivityLayoutCallback, fullscreenManager, isTablet,
+                interactWithBackground, handleStrategyFactory);
 
         mUnclampedInitialWidth = initialWidth;
         mShowMaximizeButton = showMaximizeButton;
@@ -250,6 +255,18 @@
         mVersionCompat.setImeStateCallback(null);
     }
 
+    @Override
+    @ActivityLayoutState
+    protected int getActivityLayoutState() {
+        if (isFullscreen()) {
+            return ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
+        } else if (isMaximized()) {
+            return ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED;
+        } else {
+            return ACTIVITY_LAYOUT_STATE_SIDE_SHEET;
+        }
+    }
+
     // ValueAnimator used when no animation should run. Simply lets the animator listener
     // receive only the final value to skip the animation effect.
     private static class NoAnimator extends ValueAnimator {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
index c24d54a..9f11709 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -105,7 +105,6 @@
 import org.chromium.components.version_info.VersionConstants;
 import org.chromium.components.version_info.VersionInfo;
 import org.chromium.components.webapps.AppBannerManager;
-import org.chromium.content_public.browser.BrowserTaskExecutor;
 import org.chromium.content_public.browser.ChildProcessLauncherHelper;
 import org.chromium.content_public.browser.ContactsPicker;
 import org.chromium.content_public.browser.ContactsPickerListener;
@@ -176,8 +175,6 @@
      * Performs the shared class initialization.
      */
     protected void handlePreNativeInitialization() {
-        BrowserTaskExecutor.register();
-
         Context application = ContextUtils.getApplicationContext();
 
         // Initialize the AccountManagerFacade with the correct AccountManagerDelegate. Must be done
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
index 5414b47..ba88b55 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
@@ -39,6 +39,7 @@
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.LaunchIntentDispatcher;
 import org.chromium.chrome.browser.accessibility.settings.ChromeAccessibilitySettingsDelegate;
+import org.chromium.chrome.browser.back_press.BackPressManager;
 import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataFragmentBasic;
 import org.chromium.chrome.browser.feedback.FragmentHelpAndFeedbackLauncher;
 import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncherImpl;
@@ -80,6 +81,7 @@
 import org.chromium.components.browser_ui.util.TraceEventVectorDrawableCompat;
 import org.chromium.components.browser_ui.widget.displaystyle.UiConfig;
 import org.chromium.components.browser_ui.widget.displaystyle.ViewResizer;
+import org.chromium.components.browser_ui.widget.gesture.BackPressHandler;
 import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
 import org.chromium.ui.KeyboardVisibilityDelegate;
 import org.chromium.ui.UiUtils;
@@ -97,18 +99,6 @@
  */
 public class SettingsActivity extends ChromeBaseAppCompatActivity
         implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback, SnackbarManageable {
-    /**
-     * Preference fragments may implement this interface to intercept "Back" button taps in this
-     * activity.
-     */
-    public interface OnBackPressedListener {
-        /**
-         * Called when the user taps "Back".
-         * @return Whether "Back" button was handled by the fragment. If this method returns false,
-         *         the activity should handle the event itself.
-         */
-        boolean onBackPressed();
-    }
     @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
     public static final String EXTRA_SHOW_FRAGMENT = "show_fragment";
     static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = "show_fragment_args";
@@ -186,7 +176,6 @@
 
         setStatusBarColor();
         initBottomSheet();
-        BackPressHelper.create(this, getOnBackPressedDispatcher(), this::handleBackPressed);
     }
 
     @Override
@@ -320,6 +309,7 @@
             ((PrivacySandboxSettingsBaseFragment) fragment)
                     .setSnackbarManager(getSnackbarManager());
         }
+        initBackPressHandler();
     }
 
     @Override
@@ -403,11 +393,18 @@
         return super.onOptionsItemSelected(item);
     }
 
-    private boolean handleBackPressed() {
+    private void initBackPressHandler() {
         Fragment activeFragment = getMainFragment();
-        if (!(activeFragment instanceof OnBackPressedListener)) return false;
-        OnBackPressedListener listener = (OnBackPressedListener) activeFragment;
-        return listener.onBackPressed();
+        if (BackPressManager.isSecondaryActivityEnabled()) {
+            if (activeFragment instanceof BackPressHandler) {
+                BackPressHelper.create(activeFragment.getViewLifecycleOwner(),
+                        getOnBackPressedDispatcher(), (BackPressHandler) activeFragment);
+            }
+        } else if (activeFragment instanceof BackPressHelper.ObsoleteBackPressedHandler) {
+            BackPressHelper.create(activeFragment.getViewLifecycleOwner(),
+                    getOnBackPressedDispatcher(),
+                    (BackPressHelper.ObsoleteBackPressedHandler) activeFragment);
+        }
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ChromeCustomShareAction.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ChromeCustomShareAction.java
new file mode 100644
index 0000000..d9f75784
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ChromeCustomShareAction.java
@@ -0,0 +1,58 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.share;
+
+import android.graphics.drawable.Icon;
+
+import java.util.List;
+
+/**
+ * Helper class used to deliver custom action to {@link ShareHelper}.
+ */
+public class ChromeCustomShareAction {
+    /**
+     * Provider interface that wants to provide Share Actions.
+     */
+    public interface Provider {
+        /**
+         * Get a map of actions to the parcel to be used as custom actions sent to Android share
+         * sheet.
+         *
+         * The key for the map is a string identifier of an action; if a custom action is chosen in
+         * share sheet, the corresponding runnable will be called.
+         */
+        List<ChromeCustomShareAction> getCustomActions();
+    }
+
+    /**
+     * Identifier for the custom action.
+     */
+    public final String key;
+    /**
+     * Icon used for the custom action.
+     */
+    public final Icon icon;
+    /**
+     * Label used below the icon for custom actions.
+     */
+    public final String label;
+    /**
+     * Action when custom action is selected.
+     */
+    public final Runnable runnable;
+
+    /**
+     * @param key Identifier for the custom action.
+     * @param icon Icon used for the custom action.
+     * @param label Label used below the icon for custom actions.
+     * @param runnable Action when custom action is selected.
+     */
+    public ChromeCustomShareAction(String key, Icon icon, String label, Runnable runnable) {
+        this.key = key;
+        this.icon = icon;
+        this.label = label;
+        this.runnable = runnable;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
index 64fb988..eae1f69 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
@@ -4,14 +4,19 @@
 
 package org.chromium.chrome.browser.share;
 
+import android.app.Activity;
+import android.app.PendingIntent;
 import android.content.ComponentName;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ResolveInfo;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
 import android.os.Parcelable;
+import android.text.TextUtils;
 import android.util.Pair;
 
 import androidx.annotation.NonNull;
@@ -21,6 +26,8 @@
 import androidx.core.os.BuildCompat;
 
 import org.chromium.base.ContextUtils;
+import org.chromium.base.IntentUtils;
+import org.chromium.base.Log;
 import org.chromium.base.PackageManagerUtils;
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.metrics.RecordHistogram;
@@ -32,15 +39,26 @@
 import org.chromium.components.browser_ui.share.ShareParams.TargetChosenCallback;
 import org.chromium.ui.base.WindowAndroid;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * A helper class that provides additional Chrome-specific share functionality.
  */
 public class ShareHelper extends org.chromium.components.browser_ui.share.ShareHelper {
+    private static final String TAG = "AndroidShare";
     // TODO(https://crbug.com/1420388): Remove when Android OS provides this string.
     private static final String INTENT_EXTRA_CHOOSER_CUSTOM_ACTIONS =
             "android.intent.extra.CHOOSER_CUSTOM_ACTIONS";
+    // A generous number used to allocate requestCode for pending intent used by custom actions.
+    private static final int MAX_CUSTOM_ACTION_SUPPORTED = 10;
+    private static final int CUSTOM_ACTION_REQUEST_CODE_BASE = 112;
+    @VisibleForTesting
+    static final String EXTRA_SHARE_CUSTOM_ACTION = "EXTRA_SHARE_CUSTOM_ACTION";
 
     private ShareHelper() {}
 
@@ -61,13 +79,13 @@
      * @param params The share parameters.
      * @param profile The profile last shared component will be saved to, if |saveLastUsed| is set.
      * @param saveLastUsed True if the chosen share component should be saved for future reuse.
-     * @param customActions List of custom actions for Android share sheet.
+     * @param customActionProvider List of custom actions for Android share sheet.
      */
     @OptIn(markerClass = BuildCompat.PrereleaseSdkCheck.class)
     public static void shareWithSystemShareSheetUi(ShareParams params, @Nullable Profile profile,
-            boolean saveLastUsed, @Nullable List<Parcelable> customActions) {
-        assert (customActions == null || customActions.isEmpty() || BuildCompat.isAtLeastU())
-            : "Custom action is not supported on below U.";
+            boolean saveLastUsed, @Nullable ChromeCustomShareAction.Provider customActionProvider) {
+        assert (customActionProvider == null || ChooserActionHelper.isSupported())
+            : "Custom action is not supported.";
 
         recordShareSource(ShareSourceAndroid.ANDROID_SHARE_SHEET);
         if (saveLastUsed) {
@@ -75,7 +93,7 @@
         }
         Intent intent = getShareIntent(params);
 
-        sendChooserIntent(params.getWindow(), intent, params.getCallback(), customActions);
+        sendChooserIntent(params.getWindow(), intent, params.getCallback(), customActionProvider);
     }
 
     /**
@@ -218,8 +236,9 @@
     }
 
     private static void sendChooserIntent(WindowAndroid window, Intent sharingIntent,
-            @Nullable TargetChosenCallback callback, List<Parcelable> chooserActions) {
-        new CustomActionChosenReceiver(callback, chooserActions)
+            @Nullable TargetChosenCallback callback,
+            ChromeCustomShareAction.Provider customActions) {
+        new CustomActionChosenReceiver(callback, customActions)
                 .sendChooserIntent(window, sharingIntent);
     }
 
@@ -227,12 +246,13 @@
      * Helper class for injecting extras into the sharing intents.
      */
     private static class CustomActionChosenReceiver extends TargetChosenReceiver {
-        private final List<Parcelable> mChooserActions;
+        private final ChromeCustomShareAction.Provider mCustomActionProvider;
+        private final Map<String, Runnable> mActionsMap = new HashMap<>();
 
         protected CustomActionChosenReceiver(@Nullable TargetChosenCallback callback,
-                @Nullable List<Parcelable> chooserActions) {
+                @Nullable ChromeCustomShareAction.Provider customActionProvider) {
             super(callback);
-            mChooserActions = chooserActions;
+            mCustomActionProvider = customActionProvider;
         }
 
         // Override so this file can have access to call this protected method.
@@ -242,16 +262,52 @@
         }
 
         @Override
-        protected Intent getChooserIntent(
-                WindowAndroid window, Intent sharingIntent, String targetChosenAction) {
-            Intent chooserIntent =
-                    super.getChooserIntent(window, sharingIntent, targetChosenAction);
-            if (mChooserActions != null) {
-                Parcelable[] customActions = mChooserActions.toArray(new Parcelable[0]);
-                chooserIntent.putExtra(INTENT_EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions);
+        protected Intent getChooserIntent(WindowAndroid window, Intent sharingIntent) {
+            Intent chooserIntent = super.getChooserIntent(window, sharingIntent);
+            if (mCustomActionProvider == null) return chooserIntent;
+
+            List<ChromeCustomShareAction> chromeCustomShareActions =
+                    mCustomActionProvider.getCustomActions();
+            assert chromeCustomShareActions.size() <= MAX_CUSTOM_ACTION_SUPPORTED
+                : "Max number of actions supported:"
+                  + MAX_CUSTOM_ACTION_SUPPORTED;
+
+            List<Parcelable> chooserActions = new ArrayList<>();
+            Activity activity = window.getActivity().get();
+
+            // Use different request code to avoid pending intent don't collision.
+            int requestCode = activity.getTaskId() * MAX_CUSTOM_ACTION_SUPPORTED
+                    + CUSTOM_ACTION_REQUEST_CODE_BASE;
+            for (var action : chromeCustomShareActions) {
+                Intent sendBackIntent = createSendBackIntentWithFilteredAction();
+                sendBackIntent.putExtra(EXTRA_SHARE_CUSTOM_ACTION, action.key);
+                // Make custom action immutable, since it doesn't need change any chooser component.
+                PendingIntent pendingIntent =
+                        PendingIntent.getBroadcast(activity, requestCode++, sendBackIntent,
+                                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
+                                        | PendingIntent.FLAG_IMMUTABLE);
+
+                Parcelable chooserAction = ChooserActionHelper.newChooserAction(
+                        action.icon, action.label, pendingIntent);
+                mActionsMap.put(action.key, action.runnable);
+
+                chooserActions.add(chooserAction);
             }
+
+            Parcelable[] customActions = chooserActions.toArray(new Parcelable[0]);
+            chooserIntent.putExtra(INTENT_EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions);
+
             return chooserIntent;
         }
+
+        @Override
+        protected void onReceiveInternal(Context context, Intent intent) {
+            String action = IntentUtils.safeGetStringExtra(intent, EXTRA_SHARE_CUSTOM_ACTION);
+            if (!TextUtils.isEmpty(action)) {
+                assert mActionsMap.get(action) != null : "Action <" + action + "> does not exists.";
+                mActionsMap.get(action).run();
+            }
+        }
     }
 
     /**
@@ -270,7 +326,9 @@
 
         @Override
         public void onTargetChosen(ComponentName chosenComponent) {
-            setLastShareComponentName(mProfile, chosenComponent);
+            if (chosenComponent != null) {
+                setLastShareComponentName(mProfile, chosenComponent);
+            }
             if (mOriginalCallback != null) mOriginalCallback.onTargetChosen(chosenComponent);
         }
 
@@ -279,4 +337,42 @@
             if (mOriginalCallback != null) mOriginalCallback.onCancel();
         }
     }
+
+    /**
+     * Helper class used to build Android custom action.
+     */
+    // TODO(https://crbug.com/1420388): Replace calls with Android OS chooser actions.
+    @VisibleForTesting
+    public static class ChooserActionHelper {
+        /**
+         * Try to query if the builder class exists.
+         */
+        @SuppressWarnings("PrivateApi")
+        static boolean isSupported() {
+            try {
+                Class.forName("android.service.chooser.ChooserAction$Builder");
+                return true;
+            } catch (ClassNotFoundException e) {
+                return false;
+            }
+        }
+
+        @SuppressWarnings("PrivateApi")
+        static Parcelable newChooserAction(Icon icon, String name, PendingIntent action) {
+            Parcelable parcelable = null;
+            try {
+                Class<?> chooserActionBuilderClass =
+                        Class.forName("android.service.chooser.ChooserAction$Builder");
+                Constructor<?> ctor = chooserActionBuilderClass.getConstructor(
+                        Icon.class, CharSequence.class, PendingIntent.class);
+                Object builder = ctor.newInstance(icon, name, action);
+                parcelable =
+                        (Parcelable) chooserActionBuilderClass.getMethod("build").invoke(builder);
+            } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException
+                    | InvocationTargetException | InstantiationException e) {
+                Log.w(TAG, "Building ChooserAction failed.", e);
+            }
+            return parcelable;
+        }
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/ManageSyncSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/ManageSyncSettings.java
index 1ae949f9..73254f3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/ManageSyncSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/ManageSyncSettings.java
@@ -35,13 +35,13 @@
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.AppHooks;
+import org.chromium.chrome.browser.BackPressHelper;
 import org.chromium.chrome.browser.SyncFirstSetupCompleteSource;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.feedback.FragmentHelpAndFeedbackLauncher;
 import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncher;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate;
-import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.services.SigninManager;
 import org.chromium.chrome.browser.signin.services.UnifiedConsentServiceBridge;
@@ -76,7 +76,7 @@
 public class ManageSyncSettings extends PreferenceFragmentCompat
         implements PassphraseDialogFragment.Listener, PassphraseCreationDialogFragment.Listener,
                    PassphraseTypeDialogFragment.Listener, Preference.OnPreferenceChangeListener,
-                   SyncService.SyncStateChangedListener, SettingsActivity.OnBackPressedListener,
+                   SyncService.SyncStateChangedListener, BackPressHelper.ObsoleteBackPressedHandler,
                    Listener, SyncErrorCardPreference.SyncErrorCardPreferenceListener,
                    FragmentHelpAndFeedbackLauncher {
     private static final String IS_FROM_SIGNIN_SCREEN = "ManageSyncSettings.isFromSigninScreen";
@@ -656,6 +656,8 @@
 
     @Override
     public boolean onBackPressed() {
+        // TODO(crbug.com/1406012): Remove these metrics or introduce new metrics in other lifecycle
+        //                          hooks because this method never consumes back event.
         if (mIsFromSigninScreen) {
             RecordUserAction.record("Signin_Signin_BackOnAdvancedSyncSettings");
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
index 0db5e39..acabeafa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
@@ -7,6 +7,7 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.os.Build;
+import android.text.TextUtils;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
@@ -61,8 +62,10 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Locale;
+import java.util.Set;
 
 /**
  * Utilities for requesting desktop sites support.
@@ -99,6 +102,8 @@
     static final int DEFAULT_GLOBAL_SETTING_DEFAULT_ON_MEMORY_LIMIT_THRESHOLD_MB = 0;
     static final String PARAM_SHOW_MESSAGE_ON_GLOBAL_SETTING_DEFAULT_ON =
             "show_message_on_default_on";
+    static final String PARAM_GLOBAL_SETTING_DEFAULT_ON_MANUFACTURER_LIST =
+            "default_on_manufacturer_list";
 
     static final String PARAM_GLOBAL_SETTING_OPT_IN_ENABLED = "show_opt_in_message";
     static final String PARAM_GLOBAL_SETTING_OPT_IN_DISPLAY_SIZE_MIN_THRESHOLD_INCHES =
@@ -115,6 +120,8 @@
     static final String PARAM_GLOBAL_SETTING_OPT_IN_MEMORY_LIMIT = "opt_in_memory_limit";
     static final int DEFAULT_GLOBAL_SETTING_OPT_IN_MEMORY_LIMIT_THRESHOLD_MB = 0;
 
+    static Set<String> sDefaultEnabledManufacturerAllowlist;
+
     // Note: these values must match the UserAgentRequestType enum in enums.xml.
     @IntDef({UserAgentRequestType.REQUEST_DESKTOP, UserAgentRequestType.REQUEST_MOBILE})
     @Retention(RetentionPolicy.SOURCE)
@@ -394,6 +401,20 @@
             return false;
         }
 
+        if (sDefaultEnabledManufacturerAllowlist == null) {
+            sDefaultEnabledManufacturerAllowlist = new HashSet<>();
+            String allowListStr = ChromeFeatureList.getFieldTrialParamByFeature(
+                    feature, PARAM_GLOBAL_SETTING_DEFAULT_ON_MANUFACTURER_LIST);
+            if (!TextUtils.isEmpty(allowListStr)) {
+                Collections.addAll(sDefaultEnabledManufacturerAllowlist, allowListStr.split(","));
+            }
+        }
+        if (!sDefaultEnabledManufacturerAllowlist.isEmpty()
+                && !sDefaultEnabledManufacturerAllowlist.contains(
+                        Build.MANUFACTURER.toLowerCase(Locale.US))) {
+            return false;
+        }
+
         SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getInstance();
         double screenSizeThreshold = ChromeFeatureList.getFieldTrialParamByFeatureAsDouble(feature,
                 PARAM_GLOBAL_SETTING_DEFAULT_ON_DISPLAY_SIZE_THRESHOLD_INCHES,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
index f33f6a4..a3bc4f78 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
@@ -330,7 +330,8 @@
         mTabsToRestore = new ArrayDeque<>();
         mTabIdsToRestore = new HashSet<>();
         mObservers = new ObserverList<>();
-        TaskTraits taskTraits = TaskTraits.USER_BLOCKING_MAY_BLOCK;
+        @TaskTraits
+        int taskTraits = TaskTraits.USER_BLOCKING_MAY_BLOCK;
         mSequencedTaskRunner = PostTask.createSequencedTaskRunner(taskTraits);
         mPrefetchTabListToMergeTasks = new ArrayList<>();
         mMergedFileNames = new HashSet<>();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonControllerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonControllerUnitTest.java
new file mode 100644
index 0000000..bc32a1b
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/AddToBookmarksToolbarButtonControllerUnitTest.java
@@ -0,0 +1,102 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.bookmarks;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.Features;
+import org.chromium.base.test.util.Features.EnableFeatures;
+import org.chromium.base.test.util.UserActionTester;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.toolbar.ButtonData;
+import org.chromium.components.feature_engagement.Tracker;
+import org.chromium.content_public.browser.WebContents;
+
+/** Unit tests for {@link AddToBookmarksToolbarButtonController} */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+@EnableFeatures({ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_V2})
+public class AddToBookmarksToolbarButtonControllerUnitTest {
+    @Rule
+    public TestRule mProcessor = new Features.JUnitProcessor();
+
+    @Mock
+    private WebContents mWebContents;
+    @Mock
+    private Tab mTab;
+    @Mock
+    private Drawable mDrawable;
+    @Mock
+    private Tracker mTracker;
+    @Mock
+    private TabBookmarker mTabBookmarker;
+    @Mock
+    private Resources mResources;
+    @Mock
+    private Context mContext;
+
+    private UserActionTester mActionTester;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mActionTester = new UserActionTester();
+
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mTab.getContext()).thenReturn(mContext);
+        when(mTab.getWebContents()).thenReturn(mWebContents);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        mActionTester.tearDown();
+    }
+
+    @Test
+    public void testButtonData() {
+        AddToBookmarksToolbarButtonController addToBookmarksToolbarButtonController =
+                new AddToBookmarksToolbarButtonController(()
+                                                                  -> mTab,
+                        mDrawable, "Translate button description",
+                        () -> mTabBookmarker, () -> mTracker);
+        ButtonData buttonData = addToBookmarksToolbarButtonController.get(mTab);
+
+        Assert.assertTrue(buttonData.canShow());
+        Assert.assertTrue(buttonData.isEnabled());
+        Assert.assertNotNull(buttonData.getButtonSpec());
+    }
+
+    @Test
+    public void testOnClick() {
+        AddToBookmarksToolbarButtonController addToBookmarksToolbarButtonController =
+                new AddToBookmarksToolbarButtonController(()
+                                                                  -> mTab,
+                        mDrawable, "Translate button description",
+                        () -> mTabBookmarker, () -> mTracker);
+        addToBookmarksToolbarButtonController.onClick(null);
+
+        Assert.assertEquals(
+                1, mActionTester.getActionCount("MobileTopToolbarAddToBookmarksButton"));
+        verify(mTabBookmarker).addOrEditBookmark(mTab);
+    }
+}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionUnitTest.java
index f46de158..8f22025 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionUnitTest.java
@@ -7,15 +7,27 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.refEq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET;
+import static org.chromium.chrome.browser.customtabs.CustomTabsConnection.ON_ACTIVITY_LAYOUT_BOTTOM_EXTRA;
+import static org.chromium.chrome.browser.customtabs.CustomTabsConnection.ON_ACTIVITY_LAYOUT_CALLBACK;
+import static org.chromium.chrome.browser.customtabs.CustomTabsConnection.ON_ACTIVITY_LAYOUT_LEFT_EXTRA;
+import static org.chromium.chrome.browser.customtabs.CustomTabsConnection.ON_ACTIVITY_LAYOUT_RIGHT_EXTRA;
+import static org.chromium.chrome.browser.customtabs.CustomTabsConnection.ON_ACTIVITY_LAYOUT_STATE_EXTRA;
+import static org.chromium.chrome.browser.customtabs.CustomTabsConnection.ON_ACTIVITY_LAYOUT_TOP_EXTRA;
 
 import android.app.PendingIntent;
 import android.content.Intent;
 import android.os.Bundle;
+import android.os.Process;
 
+import androidx.browser.customtabs.CustomTabsCallback;
 import androidx.browser.customtabs.CustomTabsSessionToken;
 
 import org.junit.After;
@@ -26,9 +38,11 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.shadows.ShadowProcess;
 
 import org.chromium.base.task.TaskTraits;
 import org.chromium.base.task.test.ShadowPostTask;
@@ -56,11 +70,14 @@
     private SessionHandler mSessionHandler;
     @Mock
     private CustomTabsSessionToken mSession;
+    @Mock
+    private CustomTabsCallback mCallback;
 
     private static final ArrayList<String> REALTIME_SIGNALS_AND_BRANDING =
             new ArrayList<String>(List.of(ChromeFeatureList.CCT_REAL_TIME_ENGAGEMENT_SIGNALS,
                     ChromeFeatureList.CCT_BRAND_TRANSPARENCY));
     private CustomTabsConnection mConnection;
+    private int mUid = Process.myUid();
 
     @Implements(UmaSessionStats.class)
     public static class ShadowUmaSessionStats {
@@ -80,7 +97,7 @@
         MockitoAnnotations.initMocks(this);
         ShadowPostTask.setTestImpl(new TestImpl() {
             @Override
-            public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+            public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
                 task.run();
             }
         });
@@ -236,5 +253,33 @@
                 .updateSecondaryToolbarSwipeUpPendingIntent(eq(pendingIntent));
     }
 
+    @Test
+    @EnableFeatures({ChromeFeatureList.CCT_RESIZABLE_SIDE_SHEET})
+    public void onActivityLayout_CallbackIsCalledForNamedMethod() {
+        int uid = 123;
+        int left = 0;
+        int top = 0;
+        int right = 100;
+        int bottom = 200;
+
+        when(mSession.getCallback()).thenReturn(mCallback);
+        ShadowProcess.setUid(uid);
+
+        Bundle bundle = new Bundle();
+        bundle.putInt(ON_ACTIVITY_LAYOUT_LEFT_EXTRA, left);
+        bundle.putInt(ON_ACTIVITY_LAYOUT_TOP_EXTRA, top);
+        bundle.putInt(ON_ACTIVITY_LAYOUT_RIGHT_EXTRA, right);
+        bundle.putInt(ON_ACTIVITY_LAYOUT_BOTTOM_EXTRA, bottom);
+        bundle.putInt(ON_ACTIVITY_LAYOUT_STATE_EXTRA, ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET);
+
+        shadowOf(RuntimeEnvironment.getApplication().getApplicationContext().getPackageManager())
+                .setPackagesForUid(uid, "test.package.name");
+        mConnection.mClientManager.newSession(mSession, uid, null, null, null);
+        mConnection.onActivityLayout(
+                mSession, left, top, right, bottom, ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET);
+
+        verify(mCallback).extraCallback(eq(ON_ACTIVITY_LAYOUT_CALLBACK), refEq(bundle));
+    }
+
     // TODO(https://crrev.com/c/4118209) Add more tests for Feature enabling/disabling.
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationControllerTest.java
index c01b25b..6e24317 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationControllerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityNavigationControllerTest.java
@@ -60,7 +60,7 @@
     public void setUp() {
         ShadowPostTask.setTestImpl(new ShadowPostTask.TestImpl() {
             @Override
-            public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {}
+            public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {}
         });
         MockitoAnnotations.initMocks(this);
         mNavigationController = env.createNavigationController(mTabController);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategyTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategyTest.java
index 4bddee1..3637b15 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategyTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategyTest.java
@@ -19,6 +19,9 @@
 import static org.mockito.Mockito.when;
 import static org.robolectric.Shadows.shadowOf;
 
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET_MAXIMIZED;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
 import static org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabBottomSheetStrategy.BOTTOM_SHEET_MAX_WIDTH_DP_LANDSCAPE;
 import static org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabTestRule.DEVICE_HEIGHT;
 import static org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabTestRule.DEVICE_WIDTH;
@@ -33,7 +36,6 @@
 import android.os.Build;
 import android.os.Looper;
 import android.os.SystemClock;
-import android.util.DisplayMetrics;
 import android.view.MotionEvent;
 import android.view.Surface;
 import android.view.View;
@@ -79,7 +81,6 @@
     public final PartialCustomTabTestRule mPCCTTestRule = new PartialCustomTabTestRule();
 
     private static final int INITIAL_HEIGHT = DEVICE_HEIGHT / 2 - NAVBAR_HEIGHT;
-    private static final int MULTIWINDOW_HEIGHT = FULL_HEIGHT / 2;
 
     private static final int FIND_TOOLBAR_COLOR = 3755;
     private static final int PCCT_TOOLBAR_COLOR = 12111;
@@ -89,8 +90,9 @@
     private PartialCustomTabBottomSheetStrategy createPcctBackgroundDisabled() {
         PartialCustomTabBottomSheetStrategy pcct = new PartialCustomTabBottomSheetStrategy(
                 mPCCTTestRule.mActivity, 500, false, mPCCTTestRule.mOnResizedCallback,
-                mPCCTTestRule.mActivityLifecycleDispatcher, mPCCTTestRule.mFullscreenManager, false,
-                false, /*startMaximized=*/false, mPCCTTestRule.mHandleStrategyFactory);
+                mPCCTTestRule.mOnActivityLayoutCallback, mPCCTTestRule.mActivityLifecycleDispatcher,
+                mPCCTTestRule.mFullscreenManager, false, false, /*startMaximized=*/false,
+                mPCCTTestRule.mHandleStrategyFactory);
         pcct.setMockViewForTesting(mPCCTTestRule.mNavbar, mPCCTTestRule.mSpinnerView,
                 mPCCTTestRule.mSpinner, mPCCTTestRule.mToolbarView,
                 mPCCTTestRule.mToolbarCoordinator, mPCCTTestRule.mHandleStrategyFactory);
@@ -105,8 +107,9 @@
             int heightPx, boolean isFixedHeight) {
         PartialCustomTabBottomSheetStrategy pcct = new PartialCustomTabBottomSheetStrategy(
                 mPCCTTestRule.mActivity, heightPx, isFixedHeight, mPCCTTestRule.mOnResizedCallback,
-                mPCCTTestRule.mActivityLifecycleDispatcher, mPCCTTestRule.mFullscreenManager, false,
-                true, /*startMaxmized=*/false, mPCCTTestRule.mHandleStrategyFactory);
+                mPCCTTestRule.mOnActivityLayoutCallback, mPCCTTestRule.mActivityLifecycleDispatcher,
+                mPCCTTestRule.mFullscreenManager, false, true, /*startMaxmized=*/false,
+                mPCCTTestRule.mHandleStrategyFactory);
         pcct.setMockViewForTesting(mPCCTTestRule.mNavbar, mPCCTTestRule.mSpinnerView,
                 mPCCTTestRule.mSpinner, mPCCTTestRule.mToolbarView,
                 mPCCTTestRule.mToolbarCoordinator, mPCCTTestRule.mHandleStrategyFactory);
@@ -597,9 +600,14 @@
     }
 
     @Test
+    @Features.EnableFeatures({ChromeFeatureList.CCT_RESIZABLE_SIDE_SHEET})
     public void expandToFullHeightOnShowingKeyboard() {
         PartialCustomTabBottomSheetStrategy strategy = createPcctAtHeight(500);
-        assertEquals(1, mPCCTTestRule.mAttributeResults.size());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
+
         assertTabIsAtInitialPos(mPCCTTestRule.mAttributeResults.get(0));
         int expected = PartialCustomTabBottomSheetStrategy.ResizeType.AUTO_EXPANSION;
         var histogramExpansion =
@@ -617,6 +625,11 @@
         histogramExpansion.assertExpected("ResizeType.AUTO_EXPANSION should be recorded once.");
         PartialCustomTabTestRule.waitForAnimationToFinish();
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(FULL_HEIGHT), anyInt());
+        clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(0), eq(DEVICE_WIDTH), eq(DEVICE_HEIGHT - NAVBAR_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET_MAXIMIZED));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
@@ -830,6 +843,7 @@
     }
 
     @Test
+    @Features.EnableFeatures({ChromeFeatureList.CCT_RESIZABLE_SIDE_SHEET})
     public void callbackWhenHeightResized() {
         PartialCustomTabBottomSheetStrategy strategy = createPcctAtHeight(500);
         assertTabIsAtInitialPos(mPCCTTestRule.mAttributeResults.get(0));
@@ -869,18 +883,7 @@
 
     @Test
     public void verifyNavigationBarHeightInMultiWindowMode() {
-        mPCCTTestRule.mMetrics = new DisplayMetrics();
-        mPCCTTestRule.mMetrics.widthPixels = DEVICE_WIDTH;
-        mPCCTTestRule.mMetrics.heightPixels = MULTIWINDOW_HEIGHT;
-        doAnswer(invocation -> {
-            DisplayMetrics displayMetrics = invocation.getArgument(0);
-            displayMetrics.setTo(mPCCTTestRule.mMetrics);
-            return null;
-        })
-                .when(mPCCTTestRule.mDisplay)
-                .getMetrics(any(DisplayMetrics.class));
-        mPCCTTestRule.mDisplaySize.y = MULTIWINDOW_HEIGHT;
-        when(mPCCTTestRule.mContentFrame.getHeight()).thenReturn(MULTIWINDOW_HEIGHT);
+        mPCCTTestRule.setupDisplayMetricsInMultiWindowMode();
         MultiWindowUtils.getInstance().setIsInMultiWindowModeForTesting(true);
         PartialCustomTabBottomSheetStrategy strategy = createPcctAtHeight(500);
         assertEquals(0, strategy.getNavbarHeightForTesting());
@@ -905,8 +908,14 @@
     }
 
     @Test
+    @Features.EnableFeatures({ChromeFeatureList.CCT_RESIZABLE_SIDE_SHEET})
     public void enterAndExitHtmlFullscreen() {
         PartialCustomTabBottomSheetStrategy strategy = createPcctAtHeight(500);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
+
         assertFalse(getWindowAttributes().isFullscreen());
         int height = getWindowAttributes().height;
         doReturn(47)
@@ -917,10 +926,15 @@
 
         mFullscreen = true;
         strategy.onEnterFullscreen(null, null);
+        PartialCustomTabTestRule.waitForAnimationToFinish();
         assertTrue(getWindowAttributes().isFullscreen());
         assertEquals("Shadow should be removed.", 0, strategy.getShadowOffsetForTesting());
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(DEVICE_HEIGHT), eq(DEVICE_WIDTH));
         clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(0), eq(DEVICE_WIDTH), eq(DEVICE_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_FULL_SCREEN));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         mFullscreen = false;
         strategy.onExitFullscreen(null);
@@ -929,6 +943,12 @@
         assertEquals(height, getWindowAttributes().height);
         assertNotEquals("Shadow should be restored.", 0, strategy.getShadowOffsetForTesting());
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(height), anyInt());
+        clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(DEVICE_HEIGHT - INITIAL_HEIGHT - NAVBAR_HEIGHT),
+                        eq(DEVICE_WIDTH), eq(DEVICE_HEIGHT - NAVBAR_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
@@ -1130,8 +1150,14 @@
     }
 
     @Test
+    @Features.EnableFeatures({ChromeFeatureList.CCT_RESIZABLE_SIDE_SHEET})
     public void expandToFullHeightOnFindInPage() {
+        mPCCTTestRule.configPortraitMode();
         PartialCustomTabBottomSheetStrategy strategy = createPcctAtHeight(800);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
         doReturn(mPCCTTestRule.mDragBarBackground).when(mPCCTTestRule.mDragBar).getBackground();
         int expected = PartialCustomTabBottomSheetStrategy.ResizeType.AUTO_EXPANSION;
         var histogramExpansion =
@@ -1143,6 +1169,10 @@
         histogramExpansion.assertExpected("ResizeType.AUTO_EXPANSION should be recorded once.");
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(FULL_HEIGHT), anyInt());
         clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(0), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET_MAXIMIZED));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         expected = PartialCustomTabBottomSheetStrategy.ResizeType.AUTO_MINIMIZATION;
         var histogramMinimization =
@@ -1154,5 +1184,11 @@
         histogramMinimization.assertExpected(
                 "ResizeType.AUTO_MINIMIZATION should be recorded once.");
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(INITIAL_HEIGHT), anyInt());
+        clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(DEVICE_HEIGHT - INITIAL_HEIGHT - NAVBAR_HEIGHT),
+                        eq(DEVICE_WIDTH), eq(DEVICE_HEIGHT - NAVBAR_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManagerTest.java
index abab15a..e454aa4 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManagerTest.java
@@ -7,8 +7,17 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_SIDE_SHEET;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED;
 import static org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider.ACTIVITY_SIDE_SHEET_POSITION_END;
 import static org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider.ACTIVITY_SIDE_SHEET_SLIDE_IN_FROM_SIDE;
 
@@ -64,9 +73,10 @@
             @Px int heightPx, @Px int widthPx, int breakPointDp) {
         PartialCustomTabDisplayManager displayManager = new PartialCustomTabDisplayManager(
                 mPCCTTestRule.mActivity, heightPx, widthPx, breakPointDp, false,
-                mPCCTTestRule.mOnResizedCallback, mPCCTTestRule.mActivityLifecycleDispatcher,
-                mPCCTTestRule.mFullscreenManager, false, true, /*showMaximizeButton=*/true, 0,
-                ACTIVITY_SIDE_SHEET_POSITION_END, ACTIVITY_SIDE_SHEET_SLIDE_IN_FROM_SIDE);
+                mPCCTTestRule.mOnResizedCallback, mPCCTTestRule.mOnActivityLayoutCallback,
+                mPCCTTestRule.mActivityLifecycleDispatcher, mPCCTTestRule.mFullscreenManager, false,
+                true, /*showMaximizeButton=*/true, 0, ACTIVITY_SIDE_SHEET_POSITION_END,
+                ACTIVITY_SIDE_SHEET_SLIDE_IN_FROM_SIDE);
         var sizeStrategyCreator = displayManager.getSizeStrategyCreatorForTesting();
         SizeStrategyCreator testSizeStrategyCreator =
                 (type, maximized, sideSheetPosition, sideSheetAnimation) -> {
@@ -151,6 +161,10 @@
     public void transitionFromBottomSheetToSideSheetWhenOrientationChangedToLandscape() {
         mPCCTTestRule.configPortraitMode();
         PartialCustomTabDisplayManager displayManager = createPcctDisplayManager();
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         assertEquals("Bottom-Sheet should be the active strategy",
                 PartialCustomTabType.BOTTOM_SHEET, displayManager.getActiveStrategyType());
@@ -161,6 +175,11 @@
 
         assertEquals("Side-Sheet should be the active strategy", PartialCustomTabType.SIDE_SHEET,
                 displayManager.getActiveStrategyType());
+
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
@@ -172,6 +191,10 @@
 
         assertEquals("Bottom-Sheet should be the active strategy",
                 PartialCustomTabType.BOTTOM_SHEET, displayManager.getActiveStrategyType());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
         mPCCTTestRule.configLandscapeMode();
         displayManager.onConfigurationChanged(mPCCTTestRule.mConfiguration);
 
@@ -182,6 +205,10 @@
                 (int) (mPCCTTestRule.getWindowAttributes().width));
         assertEquals("Bottom-Sheet should be the active strategy",
                 PartialCustomTabType.BOTTOM_SHEET, displayManager.getActiveStrategyType());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
@@ -192,6 +219,10 @@
 
         assertEquals("Bottom-Sheet should be the active strategy",
                 PartialCustomTabType.BOTTOM_SHEET, displayManager.getActiveStrategyType());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
         mPCCTTestRule.configLandscapeMode();
         displayManager.onConfigurationChanged(mPCCTTestRule.mConfiguration);
 
@@ -202,6 +233,10 @@
                 (int) (mPCCTTestRule.getWindowAttributes().width));
         assertEquals("Bottom-Sheet should be the active strategy",
                 PartialCustomTabType.BOTTOM_SHEET, displayManager.getActiveStrategyType());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
@@ -211,6 +246,10 @@
 
         assertEquals("Side-Sheet should be the active strategy", PartialCustomTabType.SIDE_SHEET,
                 displayManager.getActiveStrategyType());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
         mPCCTTestRule.configPortraitMode();
         displayManager.onConfigurationChanged(mPCCTTestRule.mConfiguration);
 
@@ -218,6 +257,10 @@
 
         assertEquals("Bottom-Sheet should be the active strategy",
                 PartialCustomTabType.BOTTOM_SHEET, displayManager.getActiveStrategyType());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
@@ -227,15 +270,26 @@
 
         assertEquals("Bottom-Sheet should be the active strategy",
                 PartialCustomTabType.BOTTOM_SHEET, displayManager.getActiveStrategyType());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
         displayManager.onConfigurationChanged(mPCCTTestRule.mConfiguration);
         assertEquals("Bottom-Sheet should be the active strategy",
                 PartialCustomTabType.BOTTOM_SHEET, displayManager.getActiveStrategyType());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback, never())
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
     }
 
     @Test
     public void rotateInFullscreenMode() {
         mPCCTTestRule.configLandscapeMode();
         PartialCustomTabDisplayManager displayManager = createPcctDisplayManager();
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         displayManager.onConfigurationChanged(mPCCTTestRule.mConfiguration);
         var attrs = mPCCTTestRule.getWindowAttributes();
@@ -243,7 +297,15 @@
         int width = attrs.width;
 
         mFullscreen = true;
+        displayManager.getSizeStrategyForTesting().setFullscreenSupplierForTesting(
+                () -> mFullscreen);
+
         displayManager.getSizeStrategyForTesting().onEnterFullscreen(null, null);
+        assertTrue(mPCCTTestRule.getWindowAttributes().isFullscreen());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_FULL_SCREEN));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         mPCCTTestRule.configPortraitMode();
         displayManager.onConfigurationChanged(mPCCTTestRule.mConfiguration);
@@ -267,12 +329,20 @@
         assertFalse("Should not be in fulllscreen.", attrs.isFullscreen());
         assertEquals("Height should be restored.", height, attrs.height);
         assertEquals("Width should be restored.", width, attrs.width);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
     public void rotateInMaximizeMode() {
         mPCCTTestRule.configLandscapeMode();
         PartialCustomTabDisplayManager displayManager = createPcctDisplayManager();
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         var attrs = mPCCTTestRule.getWindowAttributes();
         int height = attrs.height;
@@ -280,9 +350,14 @@
 
         var sideSheetStrategy = displayManager.getSizeStrategyForTesting();
         ((PartialCustomTabSideSheetStrategy) sideSheetStrategy).toggleMaximize(true);
-
+        PartialCustomTabTestRule.waitForAnimationToFinish();
         assertTrue("Should be in maximized state.", sideSheetStrategy.isMaximized());
 
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
+
         mPCCTTestRule.configPortraitMode();
         displayManager.onConfigurationChanged(mPCCTTestRule.mConfiguration);
         PartialCustomTabTestRule.waitForAnimationToFinish();
@@ -292,6 +367,10 @@
         var bottomSheetStrategy = displayManager.getSizeStrategyForTesting();
         assertFalse(
                 "Bottom sheet must start in initial height.", bottomSheetStrategy.isMaximized());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         mPCCTTestRule.configLandscapeMode();
         displayManager.onConfigurationChanged(mPCCTTestRule.mConfiguration);
@@ -300,6 +379,10 @@
 
         // When coming back to SideSheet strategy, the last state should be restored.
         assertTrue("Side sheet must start in minimized state.", sideSheetStrategy.isMaximized());
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         ((PartialCustomTabSideSheetStrategy) sideSheetStrategy).toggleMaximize(true);
         PartialCustomTabTestRule.waitForAnimationToFinish();
@@ -308,6 +391,10 @@
         assertFalse("Should not be in maximized state.", sideSheetStrategy.isMaximized());
         assertEquals("Height should be restored.", height, attrs.height);
         assertEquals("Width should be restored.", width, attrs.width);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategyTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategyTest.java
index 54d9ac8..d1c03f3 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategyTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategyTest.java
@@ -7,6 +7,14 @@
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.verify;
+
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
+import static org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabTestRule.DEVICE_WIDTH;
+import static org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabTestRule.DEVICE_WIDTH_LANDSCAPE;
+import static org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabTestRule.MULTIWINDOW_HEIGHT;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -35,10 +43,10 @@
     public final PartialCustomTabTestRule mPCCTTestRule = new PartialCustomTabTestRule();
 
     private PartialCustomTabFullSizeStrategy createPcctFullSizeStrategy() {
-        PartialCustomTabFullSizeStrategy pcct =
-                new PartialCustomTabFullSizeStrategy(mPCCTTestRule.mActivity,
-                        mPCCTTestRule.mOnResizedCallback, mPCCTTestRule.mFullscreenManager, false,
-                        true, mPCCTTestRule.mHandleStrategyFactory);
+        PartialCustomTabFullSizeStrategy pcct = new PartialCustomTabFullSizeStrategy(
+                mPCCTTestRule.mActivity, mPCCTTestRule.mOnResizedCallback,
+                mPCCTTestRule.mOnActivityLayoutCallback, mPCCTTestRule.mFullscreenManager, false,
+                true, mPCCTTestRule.mHandleStrategyFactory);
         pcct.setMockViewForTesting(mPCCTTestRule.mCoordinatorLayout, mPCCTTestRule.mToolbarView,
                 mPCCTTestRule.mToolbarCoordinator);
         return pcct;
@@ -47,7 +55,9 @@
     @Test
     public void create_fullSizeStrategyInMultiWindowLandscape() {
         mPCCTTestRule.configLandscapeMode();
+        mPCCTTestRule.setupDisplayMetricsInMultiWindowMode();
         MultiWindowUtils.getInstance().setIsInMultiWindowModeForTesting(true);
+
         PartialCustomTabFullSizeStrategy strategy = createPcctFullSizeStrategy();
 
         assertEquals("Full-Size PCCT should be created",
@@ -57,12 +67,18 @@
                 mPCCTTestRule.mAttributeResults.get(0).height);
         assertEquals("Full-Size has wrong width", MATCH_PARENT,
                 mPCCTTestRule.mAttributeResults.get(0).width);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(0), eq(DEVICE_WIDTH_LANDSCAPE), eq(MULTIWINDOW_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_FULL_SCREEN));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
     public void create_fullSizeStrategyInMultiWindowPortrait() {
         mPCCTTestRule.configPortraitMode();
+        mPCCTTestRule.setupDisplayMetricsInMultiWindowMode();
         MultiWindowUtils.getInstance().setIsInMultiWindowModeForTesting(true);
+
         PartialCustomTabFullSizeStrategy strategy = createPcctFullSizeStrategy();
 
         assertEquals("Full-Size PCCT should be created",
@@ -72,5 +88,9 @@
                 mPCCTTestRule.mAttributeResults.get(0).height);
         assertEquals("Full-Size has wrong width", MATCH_PARENT,
                 mPCCTTestRule.mAttributeResults.get(0).width);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(0), eq(DEVICE_WIDTH), eq(MULTIWINDOW_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_FULL_SCREEN));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 }
\ No newline at end of file
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabHandleStrategyFactoryTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabHandleStrategyFactoryTest.java
index 30bc347..7707e10 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabHandleStrategyFactoryTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabHandleStrategyFactoryTest.java
@@ -47,4 +47,12 @@
 
         assertNotNull("The handle strategy for bottom-sheet should not be null", handleStrategy);
     }
+
+    @Test
+    public void create_PartialCustomTabHandleStrategyForFullSize() {
+        PartialCustomTabHandleStrategyFactory factory = new PartialCustomTabHandleStrategyFactory();
+        var handleStrategy = factory.create(PartialCustomTabType.FULL_SIZE, null, null, null, null);
+
+        assertNull("The handle strategy for full-size should be null", handleStrategy);
+    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategyTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategyTest.java
index a2adf7cb..9dbf2b6 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategyTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategyTest.java
@@ -8,11 +8,15 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
 
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_FULL_SCREEN;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_SIDE_SHEET;
+import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED;
 import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_SIDE_SHEET_DECORATION_TYPE_DEFAULT;
 import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_SIDE_SHEET_DECORATION_TYPE_DIVIDER;
 import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ACTIVITY_SIDE_SHEET_DECORATION_TYPE_NONE;
@@ -25,6 +29,7 @@
 import static org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabTestRule.DEVICE_WIDTH;
 import static org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabTestRule.DEVICE_WIDTH_LANDSCAPE;
 import static org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabTestRule.FULL_HEIGHT;
+import static org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabTestRule.NAVBAR_HEIGHT;
 
 import android.os.Build;
 import android.view.View;
@@ -85,11 +90,12 @@
 
     private PartialCustomTabSideSheetStrategy createPcctSideSheetStrategy(
             @Px int widthPx, int position, int decorationType) {
-        PartialCustomTabSideSheetStrategy pcct = new PartialCustomTabSideSheetStrategy(
-                mPCCTTestRule.mActivity, widthPx, mPCCTTestRule.mOnResizedCallback,
-                mPCCTTestRule.mFullscreenManager, false, true, /*showMaximizedButton=*/true,
-                /*startMaximized=*/false, position, ACTIVITY_SIDE_SHEET_SLIDE_IN_DEFAULT,
-                mPCCTTestRule.mHandleStrategyFactory, decorationType);
+        PartialCustomTabSideSheetStrategy pcct =
+                new PartialCustomTabSideSheetStrategy(mPCCTTestRule.mActivity, widthPx,
+                        mPCCTTestRule.mOnResizedCallback, mPCCTTestRule.mOnActivityLayoutCallback,
+                        mPCCTTestRule.mFullscreenManager, false, true, /*showMaximizedButton=*/true,
+                        /*startMaximized=*/false, position, ACTIVITY_SIDE_SHEET_SLIDE_IN_DEFAULT,
+                        mPCCTTestRule.mHandleStrategyFactory, decorationType);
         pcct.setMockViewForTesting(mPCCTTestRule.mCoordinatorLayout, mPCCTTestRule.mToolbarView,
                 mPCCTTestRule.mToolbarCoordinator);
         return pcct;
@@ -314,6 +320,10 @@
                 .when(mPCCTTestRule.mResources)
                 .getDimensionPixelSize(eq(org.chromium.chrome.R.dimen.custom_tabs_shadow_offset));
         var strategy = createPcctSideSheetStrategy(1000);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
         assertFalse(getWindowAttributes().isFullscreen());
         int height = getWindowAttributes().height;
         int width = getWindowAttributes().width;
@@ -327,6 +337,10 @@
         assertEquals("Shadow should be removed.", 0, mPCCTTestRule.mLayoutParams.leftMargin);
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(DEVICE_HEIGHT), eq(DEVICE_WIDTH));
         clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(0), eq(DEVICE_WIDTH), eq(DEVICE_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_FULL_SCREEN));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         mFullscreen = false;
         strategy.onExitFullscreen(null);
@@ -336,11 +350,20 @@
         assertEquals(width, getWindowAttributes().width);
         assertNotEquals("Shadow should be restored.", 0, mPCCTTestRule.mLayoutParams.leftMargin);
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(height), eq(width));
+        clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(DEVICE_WIDTH - width), eq(0), eq(DEVICE_WIDTH),
+                        eq(DEVICE_HEIGHT - NAVBAR_HEIGHT), eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
     public void enterAndExitMaximizeMode() {
         var strategy = createPcctSideSheetStrategy(700);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
         assertFalse(getWindowAttributes().isFullscreen());
         int height = getWindowAttributes().height;
         int width = getWindowAttributes().width;
@@ -349,21 +372,40 @@
         PartialCustomTabTestRule.waitForAnimationToFinish();
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(FULL_HEIGHT), eq(DEVICE_WIDTH));
         clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(0), eq(DEVICE_WIDTH), eq(DEVICE_HEIGHT - NAVBAR_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         strategy.toggleMaximize(true);
         PartialCustomTabTestRule.waitForAnimationToFinish();
         assertEquals(height, getWindowAttributes().height);
         assertEquals(width, getWindowAttributes().width);
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(height), eq(width));
+        clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(DEVICE_WIDTH - width), eq(0), eq(DEVICE_WIDTH),
+                        eq(DEVICE_HEIGHT - NAVBAR_HEIGHT), eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
     public void toggleMaximizeNoAnimation() {
         var strategy = createPcctSideSheetStrategy(700);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
+
         int height = getWindowAttributes().height;
         int width = getWindowAttributes().width;
         strategy.toggleMaximize(/*animation=*/false);
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(FULL_HEIGHT), eq(DEVICE_WIDTH));
+        clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(0), eq(DEVICE_WIDTH), eq(DEVICE_HEIGHT - NAVBAR_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         strategy.toggleMaximize(/*animation=*/false);
         // Even without animation, we still need to wait for task to be idle, since we post
@@ -372,23 +414,37 @@
         assertEquals(height, getWindowAttributes().height);
         assertEquals(width, getWindowAttributes().width);
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(height), eq(width));
+        clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(DEVICE_WIDTH - width), eq(0), eq(DEVICE_WIDTH),
+                        eq(DEVICE_HEIGHT - NAVBAR_HEIGHT), eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
     public void maximizeAndFullscreen() {
         // Ensure maximize -> fullscreen enter/exit -> comes back to maximize mode
         var strategy = createPcctSideSheetStrategy(700);
-        strategy.setFullscreenSupplierForTesting(() -> mFullscreen);
-        int height = getWindowAttributes().height;
-        int width = getWindowAttributes().width;
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(anyInt(), anyInt(), anyInt(), anyInt(),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
+        strategy.setFullscreenSupplierForTesting(() -> mFullscreen);
         strategy.toggleMaximize(true);
+
         PartialCustomTabTestRule.waitForAnimationToFinish();
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(FULL_HEIGHT), eq(DEVICE_WIDTH));
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(0), eq(DEVICE_WIDTH), eq(DEVICE_HEIGHT - NAVBAR_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED));
+
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         mFullscreen = true;
         strategy.onEnterFullscreen(null, null);
         clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
 
         // Verify we get a single resize callback invocation when exiting fullscreen and restoring
         // maximize mode.
@@ -396,6 +452,11 @@
         strategy.onExitFullscreen(null);
         PartialCustomTabTestRule.waitForAnimationToFinish();
         verify(mPCCTTestRule.mOnResizedCallback).onResized(eq(FULL_HEIGHT), eq(DEVICE_WIDTH));
+        clearInvocations(mPCCTTestRule.mOnResizedCallback);
+        verify(mPCCTTestRule.mOnActivityLayoutCallback)
+                .onActivityLayout(eq(0), eq(0), eq(DEVICE_WIDTH), eq(DEVICE_HEIGHT - NAVBAR_HEIGHT),
+                        eq(ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED));
+        clearInvocations(mPCCTTestRule.mOnActivityLayoutCallback);
     }
 
     @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTestRule.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTestRule.java
index 2900f6b..202fd60a 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTestRule.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTestRule.java
@@ -71,6 +71,7 @@
     static final int NAVBAR_HEIGHT = 160;
     static final int STATUS_BAR_HEIGHT = 68;
     static final int FULL_HEIGHT = DEVICE_HEIGHT - NAVBAR_HEIGHT;
+    static final int MULTIWINDOW_HEIGHT = FULL_HEIGHT / 2;
 
     @Mock
     Activity mActivity;
@@ -92,6 +93,8 @@
     @Mock
     CustomTabHeightStrategy.OnResizedCallback mOnResizedCallback;
     @Mock
+    CustomTabHeightStrategy.OnActivityLayoutCallback mOnActivityLayoutCallback;
+    @Mock
     ViewGroup mCoordinatorLayout;
     @Mock
     ViewGroup mContentFrame;
@@ -262,6 +265,21 @@
         return mAttributeResults.get(mAttributeResults.size() - 1);
     }
 
+    public void setupDisplayMetricsInMultiWindowMode() {
+        mMetrics = new DisplayMetrics();
+        mMetrics.widthPixels = DEVICE_WIDTH;
+        mMetrics.heightPixels = MULTIWINDOW_HEIGHT;
+        doAnswer(invocation -> {
+            DisplayMetrics displayMetrics = invocation.getArgument(0);
+            displayMetrics.setTo(mMetrics);
+            return null;
+        })
+                .when(mDisplay)
+                .getMetrics(any(DisplayMetrics.class));
+        mDisplaySize.y = MULTIWINDOW_HEIGHT;
+        when(mContentFrame.getHeight()).thenReturn(MULTIWINDOW_HEIGHT);
+    }
+
     @Override
     public Statement apply(Statement statement, Description description) {
         return new Statement() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/sessionrestore/SessionRestoreManagerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/sessionrestore/SessionRestoreManagerUnitTest.java
index e651c56..7509c556 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/sessionrestore/SessionRestoreManagerUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/sessionrestore/SessionRestoreManagerUnitTest.java
@@ -79,7 +79,7 @@
             final Handler mHandler = new Handler(Looper.getMainLooper());
 
             @Override
-            public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+            public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
                 mHandler.postDelayed(task, delay);
             }
         });
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java
index 22053ecd..41a87780 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java
@@ -129,7 +129,7 @@
     public void setup() {
         ShadowPostTask.setTestImpl(new TestImpl() {
             @Override
-            public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+            public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
                 new Handler(Looper.getMainLooper()).postDelayed(task, delay);
             }
         });
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollectorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollectorTest.java
index 8d769de..5c39001 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollectorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollectorTest.java
@@ -125,7 +125,6 @@
 
     @After
     public void tearDown() {
-        ThreadUtils.setUiThread(null);
         IdentityServicesProvider.setInstanceForTests(null);
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
index 92a80456..f7478ef 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
@@ -62,7 +62,7 @@
         UmaRecorderHolder.resetForTesting();
         ShadowPostTask.setTestImpl(new ShadowPostTask.TestImpl() {
             @Override
-            public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+            public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
                 if (!mPauseDuringPostTask) {
                     task.run();
                 } else {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/settings/SettingsActivityUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/SettingsActivityUnitTest.java
index d20467e3f..ccabe972 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/settings/SettingsActivityUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/SettingsActivityUnitTest.java
@@ -16,6 +16,7 @@
 import androidx.test.core.app.ActivityScenario;
 
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -29,12 +30,18 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.chrome.browser.flags.CachedFeatureFlags;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.profiles.ProfileManagerUtils;
 import org.chromium.chrome.browser.settings.SettingsActivityUnitTest.ShadowProfileManagerUtils;
 import org.chromium.components.browser_ui.settings.CustomDividerFragment;
 import org.chromium.components.browser_ui.settings.PaddedDividerItemDecoration;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+
+import java.util.Map;
+import java.util.concurrent.TimeoutException;
 
 /**
  * Unit tests for {@link SettingsActivity}.
@@ -86,6 +93,29 @@
     }
 
     @Test
+    public void testBackPress() throws TimeoutException {
+        CachedFeatureFlags.setFeaturesForTesting(
+                Map.of(ChromeFeatureList.BACK_GESTURE_REFACTOR_ACTIVITY, true));
+        launchSettingsActivity(TestSettingsFragment.class.getName());
+        assertTrue("SettingsActivity is using a wrong fragment.",
+                mSettingsActivity.getMainFragment() instanceof TestSettingsFragment);
+        TestSettingsFragment mainFragment =
+                (TestSettingsFragment) mSettingsActivity.getMainFragment();
+        mainFragment.getHandleBackPressChangedSupplier().set(true);
+        Assert.assertTrue("TestSettingsFragment will handle back press",
+                mSettingsActivity.getOnBackPressedDispatcher().hasEnabledCallbacks());
+
+        // Simulate back press.
+        TestThreadUtils.runOnUiThreadBlocking(
+                mSettingsActivity.getOnBackPressedDispatcher()::onBackPressed);
+        mainFragment.getBackPressCallback().waitForFirst();
+
+        mainFragment.getHandleBackPressChangedSupplier().set(false);
+        Assert.assertFalse("TestSettingsFragment will not handle back press",
+                mSettingsActivity.getOnBackPressedDispatcher().hasEnabledCallbacks());
+    }
+
+    @Test
     @Config(qualifiers = "w720dp-h1024dp")
     public void addPaddingToContentOnWideDisplay() {
         launchSettingsActivity(TestSettingsFragment.class.getName());
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareHelperMultiInstanceUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareHelperMultiInstanceUnitTest.java
new file mode 100644
index 0000000..968fa2bb
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareHelperMultiInstanceUnitTest.java
@@ -0,0 +1,260 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.share;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.content.IntentSender.SendIntentException;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.Lifecycle.State;
+import androidx.test.core.app.ActivityScenario;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Spy;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowActivity;
+import org.robolectric.shadows.ShadowActivity.IntentForResult;
+import org.robolectric.shadows.ShadowLooper;
+import org.robolectric.shadows.ShadowPendingIntent;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
+import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
+import org.chromium.components.browser_ui.share.ShareParams;
+import org.chromium.components.browser_ui.share.ShareParams.TargetChosenCallback;
+import org.chromium.ui.base.ActivityWindowAndroid;
+import org.chromium.ui.base.IntentRequestTracker;
+import org.chromium.ui.base.TestActivity;
+import org.chromium.ui.base.WindowAndroid;
+
+/**
+ * Robolectric test testing share functionality in multi-instance scenarios. Focusing testing
+ * whether related broadcast receivers are registered / unregistered correctly in multi-instance
+ * mode.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(shadows = {ShadowPendingIntent.class, ShadowActivity.class})
+public class ShareHelperMultiInstanceUnitTest {
+    private static final ComponentName COMPONENT_NAME_1 = new ComponentName("package", "one");
+    private static final ComponentName COMPONENT_NAME_2 = new ComponentName("package", "two");
+
+    private SingleWindowTestInstance mWindowFoo;
+    private SingleWindowTestInstance mWindowBar;
+
+    @Before
+    public void setup() {
+        mWindowFoo = new SingleWindowTestInstance(1);
+        mWindowBar = new SingleWindowTestInstance(2);
+    }
+
+    @After
+    public void tearDown() {
+        mWindowBar.closeWindow();
+        mWindowFoo.closeWindow();
+        SharedPreferencesManager.getInstance().removeKey(
+                ChromePreferenceKeys.SHARING_LAST_SHARED_COMPONENT_NAME);
+    }
+
+    @Test
+    public void shareInTwoWindow_FinishInOrder() throws SendIntentException {
+        mWindowFoo.startShare().verifyCallbackNotCalled();
+        mWindowBar.startShare().verifyCallbackNotCalled();
+        mWindowFoo.completeShareWithComponent(COMPONENT_NAME_1).verifyCallbackState();
+        mWindowBar.verifyCallbackNotCalled()
+                .completeShareWithComponent(COMPONENT_NAME_2)
+                .verifyCallbackState();
+        assertLastComponentRecorded(COMPONENT_NAME_2);
+    }
+
+    @Test
+    public void shareInTwoWindow_FinishInReverseOrder() throws SendIntentException {
+        mWindowFoo.startShare();
+        mWindowBar.startShare()
+                .verifyCallbackNotCalled()
+                .completeShareWithComponent(COMPONENT_NAME_2)
+                .verifyCallbackState();
+        mWindowFoo.verifyCallbackNotCalled()
+                .completeShareWithComponent(COMPONENT_NAME_1)
+                .verifyCallbackState();
+        assertLastComponentRecorded(COMPONENT_NAME_1);
+    }
+
+    @Test
+    public void shareInTwoWindow_FinishFirstThenCancelSecond() throws SendIntentException {
+        mWindowFoo.startShare();
+        mWindowBar.startShare();
+        mWindowFoo.completeShareWithComponent(COMPONENT_NAME_1).verifyCallbackState();
+        mWindowBar.cancelShare().verifyCallbackState();
+        assertLastComponentRecorded(COMPONENT_NAME_1);
+    }
+
+    @Test
+    public void shareInTwoWindow_FinishSecondThenCancelFirst() throws SendIntentException {
+        mWindowFoo.startShare();
+        mWindowBar.startShare().completeShareWithComponent(COMPONENT_NAME_2).verifyCallbackState();
+        mWindowFoo.cancelShare().verifyCallbackState();
+
+        assertLastComponentRecorded(COMPONENT_NAME_2);
+    }
+
+    @Test
+    public void shareInTwoWindow_CancelFirstFinishSecond() throws SendIntentException {
+        mWindowFoo.startShare();
+        mWindowBar.startShare();
+        mWindowFoo.cancelShare().verifyCallbackState();
+        mWindowBar.completeShareWithComponent(COMPONENT_NAME_2).verifyCallbackState();
+
+        assertLastComponentRecorded(COMPONENT_NAME_2);
+    }
+
+    @Test
+    public void shareInTwoWindow_KillFirstWindowThenCompleteSecond() throws SendIntentException {
+        mWindowFoo.startShare();
+        mWindowBar.startShare();
+        mWindowFoo.closeWindow();
+        mWindowBar.verifyCallbackNotCalled()
+                .completeShareWithComponent(COMPONENT_NAME_2)
+                .verifyCallbackState()
+                .closeWindow();
+        assertLastComponentRecorded(COMPONENT_NAME_2);
+    }
+
+    @Test
+    public void shareInTwoWindow_KillSecondWindowThenCompleteFirst() throws SendIntentException {
+        mWindowFoo.startShare();
+        mWindowBar.startShare().closeWindow();
+        mWindowFoo.verifyCallbackNotCalled()
+                .completeShareWithComponent(COMPONENT_NAME_1)
+                .verifyCallbackState()
+                .closeWindow();
+        assertLastComponentRecorded(COMPONENT_NAME_1);
+    }
+
+    private void assertLastComponentRecorded(ComponentName expected) {
+        assertEquals("Last saved component name is different.", expected,
+                ShareHelper.getLastShareComponentName());
+    }
+
+    private static class TestTargetChosenCallback implements TargetChosenCallback {
+        public boolean onTargetChosenCalled;
+        public boolean onCancelCalled;
+
+        @Override
+        public void onTargetChosen(ComponentName chosenComponent) {
+            onTargetChosenCalled = true;
+        }
+
+        @Override
+        public void onCancel() {
+            onCancelCalled = true;
+        }
+
+        public boolean isValid() {
+            return (onTargetChosenCalled || onCancelCalled)
+                    && (onTargetChosenCalled ^ onCancelCalled);
+        }
+    }
+
+    /**
+     * Class that simulate the share journey.
+     */
+    private static class SingleWindowTestInstance {
+        private final ActivityScenario<TestActivity> mActivityScenario;
+        private final WindowAndroid mWindow;
+        private final IntentRequestTracker mIntentRequestTracker;
+        private final TestTargetChosenCallback mCallback = new TestTargetChosenCallback();
+
+        @Spy
+        private TestActivity mActivity;
+        @Nullable
+        private IntentForResult mShareIntent;
+        private boolean mClosed;
+
+        public SingleWindowTestInstance(int taskId) {
+            mActivityScenario = ActivityScenario.launch(TestActivity.class)
+                                        .onActivity(activity -> mActivity = spy(activity))
+                                        .moveToState(State.STARTED);
+            doReturn(taskId).when(mActivity).getTaskId();
+            mIntentRequestTracker = IntentRequestTracker.createFromActivity(mActivity);
+            mWindow = new ActivityWindowAndroid(mActivity, false, mIntentRequestTracker);
+        }
+
+        public SingleWindowTestInstance startShare() {
+            ShareHelper.shareWithSystemShareSheetUi(getTextParams(), null, true);
+            ShadowLooper.idleMainLooper();
+
+            mShareIntent = Shadows.shadowOf(mActivity).peekNextStartedActivityForResult();
+            assertNotNull("Share activity is not launched.", mShareIntent);
+            return this;
+        }
+
+        public SingleWindowTestInstance completeShareWithComponent(ComponentName componentName)
+                throws SendIntentException {
+            assert mShareIntent != null;
+            Intent sendBackIntent =
+                    new Intent().putExtra(Intent.EXTRA_CHOSEN_COMPONENT, componentName);
+            IntentSender sender = mShareIntent.intent.getParcelableExtra(
+                    Intent.EXTRA_CHOSEN_COMPONENT_INTENT_SENDER);
+            sender.sendIntent(mActivity.getApplicationContext(), Activity.RESULT_OK, sendBackIntent,
+                    null, null);
+            ShadowLooper.idleMainLooper();
+            return this;
+        }
+
+        public SingleWindowTestInstance cancelShare() throws SendIntentException {
+            assert mShareIntent != null;
+
+            mIntentRequestTracker.onActivityResult(
+                    mShareIntent.requestCode, Activity.RESULT_CANCELED, null);
+            ShadowLooper.idleMainLooper();
+            return this;
+        }
+
+        public SingleWindowTestInstance verifyCallbackNotCalled() {
+            assertFalse("Callback should not be called.",
+                    mCallback.onTargetChosenCalled || mCallback.onCancelCalled);
+            return this;
+        }
+
+        public SingleWindowTestInstance verifyCallbackState() {
+            assertTrue("Callback is not in a valid state when share ends.", mCallback.isValid());
+            verify(mActivity).unregisterReceiver(any());
+            return this;
+        }
+
+        public void closeWindow() {
+            if (mClosed) return;
+
+            mClosed = true;
+            mWindow.destroy();
+            mActivity.finish();
+            mActivityScenario.close();
+        }
+
+        private ShareParams getTextParams() {
+            return new ShareParams.Builder(mWindow, "title", "")
+                    .setText("text")
+                    .setCallback(mCallback)
+                    .setBypassFixingDomDistillerUrl(true)
+                    .build();
+        }
+    }
+}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareHelperUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareHelperUnitTest.java
index a456efd..c50970e 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareHelperUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareHelperUnitTest.java
@@ -15,6 +15,8 @@
 import android.content.Intent;
 import android.content.IntentSender;
 import android.content.IntentSender.SendIntentException;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Looper;
@@ -38,6 +40,7 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.IntentUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.Features;
 import org.chromium.base.test.util.Matchers;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -59,6 +62,11 @@
 @Config(shadows = {ShadowPendingIntent.class})
 @Features.DisableFeatures(ChromeFeatureList.CHROME_SHARING_HUB_LAUNCH_ADJACENT)
 public class ShareHelperUnitTest {
+    private static final String INTENT_EXTRA_CHOOSER_CUSTOM_ACTIONS =
+            "android.intent.extra.CHOOSER_CUSTOM_ACTIONS";
+    private static final String KEY_CHOOSER_ACTION_ICON = "icon";
+    private static final String KEY_CHOOSER_ACTION_NAME = "name";
+    private static final String KEY_CHOOSER_ACTION_ACTION = "action";
     private static final String IMAGE_URI = "file://path/to/image.png";
     private static final ComponentName TEST_COMPONENT_NAME_1 =
             new ComponentName("test.package.one", "test.class.name.one");
@@ -82,7 +90,6 @@
 
     @After
     public void tearDown() {
-        TargetChosenReceiver.resetForTesting();
         SharedPreferencesManager.getInstance().removeKey(
                 ChromePreferenceKeys.SHARING_LAST_SHARED_COMPONENT_NAME);
         mWindow.destroy();
@@ -208,24 +215,6 @@
     }
 
     @Test
-    @Config(shadows = ShadowBuildCompatForU.class)
-    public void shareWithCustomActions() {
-        // A simple way to mock if correct parcels are attached to the chooser intent.
-        // In production, the array of parcelable is not necessary a "Bundle".
-        Parcelable parcel = new Bundle();
-        List<Parcelable> listOfActions = List.of(parcel);
-
-        ShareHelper.shareWithSystemShareSheetUi(emptyShareParams(), null, false, listOfActions);
-
-        Intent nextIntent = Shadows.shadowOf(mActivity).peekNextStartedActivity();
-        assertNotNull("Shared intent is null.", nextIntent);
-        assertEquals(
-                "Intent is not a chooser intent.", Intent.ACTION_CHOOSER, nextIntent.getAction());
-        assertNotNull("Custom actions are not attached.",
-                nextIntent.getParcelableArrayExtra("android.intent.extra.CHOOSER_CUSTOM_ACTIONS"));
-    }
-
-    @Test
     public void doNotTrustIntentWithoutTrustedExtra() throws CanceledException {
         ShareHelper.shareWithSystemShareSheetUi(emptyShareParams(), null, true);
 
@@ -235,8 +224,8 @@
         String packageName = ContextUtils.getApplicationContext().getPackageName();
         Intent untrustedIntent = new Intent();
         untrustedIntent.setPackage(packageName);
-        untrustedIntent.setAction(
-                packageName + "/" + TargetChosenReceiver.class.getName() + "_ACTION");
+        untrustedIntent.setAction(packageName + "/" + TargetChosenReceiver.class.getName()
+                + mActivity.getTaskId() + "_ACTION");
         untrustedIntent.putExtra(Intent.EXTRA_CHOSEN_COMPONENT, TEST_COMPONENT_NAME_2);
 
         PendingIntent
@@ -256,6 +245,34 @@
         assertLastComponentNameRecorded(TEST_COMPONENT_NAME_2);
     }
 
+    @Test
+    @Config(shadows = {ShadowBuildCompatForU.class, ShadowChooserActionHelper.class})
+    public void shareWithCustomActions() throws SendIntentException {
+        String actionKey = "key";
+        CallbackHelper callbackHelper = new CallbackHelper();
+        ChromeCustomShareAction.Provider provider =
+                new SingleCustomActionProvider(actionKey, callbackHelper);
+
+        ShareHelper.shareWithSystemShareSheetUi(emptyShareParams(), null, false, provider);
+
+        Intent nextIntent = Shadows.shadowOf(mActivity).peekNextStartedActivity();
+        assertNotNull("Shared intent is null.", nextIntent);
+        assertEquals(
+                "Intent is not a chooser intent.", Intent.ACTION_CHOOSER, nextIntent.getAction());
+        assertNotNull("Custom actions are not attached.",
+                nextIntent.getParcelableArrayExtra("android.intent.extra.CHOOSER_CUSTOM_ACTIONS"));
+
+        selectCustomActionFromChooserIntent(nextIntent, actionKey);
+        assertEquals("Custom action callback not called.", 1, callbackHelper.getCallCount());
+    }
+
+    @Test(expected = AssertionError.class)
+    public void customActionShouldNotUsedWhenNotSupported() {
+        ChromeCustomShareAction.Provider provider =
+                new SingleCustomActionProvider("key", new CallbackHelper());
+        ShareHelper.shareWithSystemShareSheetUi(emptyShareParams(), null, false, provider);
+    }
+
     private void selectComponentFromChooserIntent(Intent chooserIntent, ComponentName componentName)
             throws SendIntentException {
         Intent sendBackIntent = new Intent().putExtra(Intent.EXTRA_CHOSEN_COMPONENT, componentName);
@@ -266,6 +283,17 @@
         Shadows.shadowOf(Looper.getMainLooper()).idle();
     }
 
+    private void selectCustomActionFromChooserIntent(Intent chooserIntent, String action)
+            throws SendIntentException {
+        Intent sendBackIntent =
+                new Intent().putExtra(ShareHelper.EXTRA_SHARE_CUSTOM_ACTION, action);
+        IntentSender sender =
+                chooserIntent.getParcelableExtra(Intent.EXTRA_CHOSEN_COMPONENT_INTENT_SENDER);
+        sender.sendIntent(ContextUtils.getApplicationContext(), Activity.RESULT_OK, sendBackIntent,
+                null, null);
+        Shadows.shadowOf(Looper.getMainLooper()).idle();
+    }
+
     private void assertLastComponentNameRecorded(ComponentName name) {
         assertThat("Last shared component name not match.", ShareHelper.getLastShareComponentName(),
                 Matchers.is(name));
@@ -275,6 +303,23 @@
         return new ShareParams.Builder(mWindow, "", "").build();
     }
 
+    private static class SingleCustomActionProvider implements ChromeCustomShareAction.Provider {
+        private final CallbackHelper mCallbackHelper;
+        private final String mActionKey;
+
+        SingleCustomActionProvider(String actionKey, CallbackHelper callbackHelper) {
+            mCallbackHelper = callbackHelper;
+            mActionKey = actionKey;
+        }
+
+        @Override
+        public List<ChromeCustomShareAction> getCustomActions() {
+            return List.of(new ChromeCustomShareAction(mActionKey,
+                    Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)),
+                    "label", mCallbackHelper::notifyCalled));
+        }
+    }
+
     // Work around shadow to assume runtime is at least U.
     // TODO(https://crbug.com/1420388): Switch to @Config(sdk=34) this once API 34 exists.
     @Implements(BuildCompat.class)
@@ -284,4 +329,24 @@
             return true;
         }
     }
+
+    /**
+     * Test implementation to build a ChooserAction.
+     */
+    @Implements(ShareHelper.ChooserActionHelper.class)
+    static class ShadowChooserActionHelper {
+        @Implementation
+        protected static boolean isSupported() {
+            return true;
+        }
+
+        @Implementation
+        protected static Parcelable newChooserAction(Icon icon, String name, PendingIntent action) {
+            Bundle bundle = new Bundle();
+            bundle.putParcelable(KEY_CHOOSER_ACTION_ICON, icon);
+            bundle.putString(KEY_CHOOSER_ACTION_NAME, name);
+            bundle.putParcelable(KEY_CHOOSER_ACTION_ACTION, action);
+            return bundle;
+        }
+    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java
index e6fe9bd..70273af 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java
@@ -71,7 +71,7 @@
         private final List<Runnable> mRunnables = new ArrayList<>();
 
         @Override
-        public void postDelayedTask(TaskTraits traits, Runnable task, long delay) {
+        public void postDelayedTask(@TaskTraits int traits, Runnable task, long delay) {
             mRunnables.add(task);
         }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java
index 80cb69a..246efc7 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java
@@ -35,6 +35,7 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.shadows.ShadowBuild;
 import org.robolectric.util.ReflectionHelpers;
 
 import org.chromium.base.FeatureList;
@@ -292,6 +293,7 @@
             mSharedPreferencesManager.removeKey(
                     ChromePreferenceKeys.DESKTOP_SITE_EXCEPTIONS_DOWNGRADE_GLOBAL_SETTING_ENABLED);
         }
+        RequestDesktopUtils.sDefaultEnabledManufacturerAllowlist = null;
         TrackerFactory.setTrackerForTests(null);
     }
 
@@ -524,6 +526,47 @@
     }
 
     @Test
+    public void testShouldDefaultEnableGlobalSetting_withManufacturerInAllowList() {
+        Map<String, String> params = new HashMap<>();
+        params.put(RequestDesktopUtils.PARAM_GLOBAL_SETTING_DEFAULT_ON_MANUFACTURER_LIST,
+                "google,samsung");
+        enableFeatureWithParams(ChromeFeatureList.REQUEST_DESKTOP_SITE_DEFAULTS, params, true);
+        ShadowBuild.setManufacturer("google");
+        boolean shouldDefaultEnable = RequestDesktopUtils.shouldDefaultEnableGlobalSetting(
+                RequestDesktopUtils.DEFAULT_GLOBAL_SETTING_DEFAULT_ON_DISPLAY_SIZE_THRESHOLD_INCHES,
+                mActivity);
+        Assert.assertTrue(
+                "Desktop site global setting should be default-enabled", shouldDefaultEnable);
+    }
+
+    @Test
+    public void testShouldDefaultEnableGlobalSetting_withManufacturerInAllowListWithSmallDisplay() {
+        Map<String, String> params = new HashMap<>();
+        params.put(RequestDesktopUtils.PARAM_GLOBAL_SETTING_DEFAULT_ON_MANUFACTURER_LIST,
+                "google,samsung");
+        enableFeatureWithParams(ChromeFeatureList.REQUEST_DESKTOP_SITE_DEFAULTS, params, true);
+        ShadowBuild.setManufacturer("google");
+        boolean shouldDefaultEnable =
+                RequestDesktopUtils.shouldDefaultEnableGlobalSetting(7, mActivity);
+        Assert.assertFalse(
+                "Desktop site global setting should not be default-enabled", shouldDefaultEnable);
+    }
+
+    @Test
+    public void testShouldDefaultEnableGlobalSetting_withManufacturerNotInAllowList() {
+        Map<String, String> params = new HashMap<>();
+        params.put(RequestDesktopUtils.PARAM_GLOBAL_SETTING_DEFAULT_ON_MANUFACTURER_LIST,
+                "google,samsung");
+        enableFeatureWithParams(ChromeFeatureList.REQUEST_DESKTOP_SITE_DEFAULTS, params, true);
+        ShadowBuild.setManufacturer("invalid");
+        boolean shouldDefaultEnable = RequestDesktopUtils.shouldDefaultEnableGlobalSetting(
+                RequestDesktopUtils.DEFAULT_GLOBAL_SETTING_DEFAULT_ON_DISPLAY_SIZE_THRESHOLD_INCHES,
+                mActivity);
+        Assert.assertFalse(
+                "Desktop site global setting should not be default-enabled", shouldDefaultEnable);
+    }
+
+    @Test
     public void testMaybeRegisterSyntheticFieldTrials_DefaultOnEnabled12Inches() {
         RequestDesktopUtils.maybeRegisterSyntheticFieldTrials(false, 12.0, 0, false);
         Assert.assertEquals("Trial name is incorrect.", "RequestDesktopSiteDefaultsSynthetic",
diff --git a/chrome/android/modules/chrome_bundle_tmpl.gni b/chrome/android/modules/chrome_bundle_tmpl.gni
index 40f565c..1d18e0c8 100644
--- a/chrome/android/modules/chrome_bundle_tmpl.gni
+++ b/chrome/android/modules/chrome_bundle_tmpl.gni
@@ -185,7 +185,6 @@
                            [
                              "add_view_trace_events",
                              "base_module_target",
-                             "baseline_profile_path",
                              "bundle_name",
                              "compress_shared_libraries",
                              "enable_lint",
diff --git a/chrome/android/monochrome/scripts/monochrome_apk_checker_test.py b/chrome/android/monochrome/scripts/monochrome_apk_checker_test.py
index 32b0869..1c65e4cb 100644
--- a/chrome/android/monochrome/scripts/monochrome_apk_checker_test.py
+++ b/chrome/android/monochrome/scripts/monochrome_apk_checker_test.py
@@ -32,8 +32,6 @@
     r'res/.*-v1\d/.*\.xml',
     r'res/.*-v2[0-3]/.*\.xml',
     r'META-INF/.*',
-    r'assets/dexopt/baseline.prof',
-    r'assets/dexopt/baseline.profm',
     r'assets/metaresources.arsc',
     r'assets/AndroidManifest.xml')
 
diff --git a/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClient.java b/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClient.java
index 6f0a62a8..edc85df 100644
--- a/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClient.java
+++ b/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClient.java
@@ -52,14 +52,14 @@
     /** Manages connections between the browser application and WebAPK Identity services. */
     private WebApkServiceConnectionManager mConnectionManager;
 
-    public static WebApkIdentityServiceClient getInstance(TaskTraits uiThreadTaskTraits) {
+    public static WebApkIdentityServiceClient getInstance(@TaskTraits int uiThreadTaskTraits) {
         if (sInstance == null) {
             sInstance = new WebApkIdentityServiceClient(uiThreadTaskTraits);
         }
         return sInstance;
     }
 
-    private WebApkIdentityServiceClient(TaskTraits uiThreadTaskTraits) {
+    private WebApkIdentityServiceClient(@TaskTraits int uiThreadTaskTraits) {
         mConnectionManager = new WebApkServiceConnectionManager(
                 uiThreadTaskTraits, null /* category */, ACTION_WEBAPK_IDENTITY_SERVICE);
     }
diff --git a/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManager.java b/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManager.java
index 2fab627c4..41b54567 100644
--- a/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManager.java
+++ b/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManager.java
@@ -90,7 +90,7 @@
     /** The action of the service to connect to. */
     private String mAction;
 
-    private TaskTraits mUiThreadTaskTraits;
+    private @TaskTraits int mUiThreadTaskTraits;
 
     private TaskRunner mTaskRunner;
 
@@ -101,7 +101,7 @@
     private HashMap<String, Connection> mConnections = new HashMap<>();
 
     public WebApkServiceConnectionManager(
-            TaskTraits uiThreadTaskTraits, String category, String action) {
+            @TaskTraits int uiThreadTaskTraits, String category, String action) {
         mUiThreadTaskTraits = uiThreadTaskTraits;
         mCategory = category;
         mAction = action;
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 6ebe9e4..4c933db 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -2553,6 +2553,46 @@
     You'll still be able to use this <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> after that time, but it will no longer get automatic software and security updates
   </message>
 
+  <!-- EOL Incentive Offer Notification Strings -->
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER" desc="Notification title shown to offer a dollar amount discount on a new chromebook, to incentivize the user to upgrade.">
+    Save &#36;50 or more on a new Chromebook, when you upgrade today
+  </message>
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER_WITH_WARNING_EXPIRING_SOON" desc="Notification title to inform user that updates end soon on this device, and to show an offer for buying a new Chromebook.">
+    Security updates end soon. Save &#36;50 or more on a new Chromebook.
+  </message>
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER_WITH_WARNING_EXPIRED" desc="Notification title to inform user that updates have ended on this device, and to show an offer for buying a new Chromebook.">
+    Security updates have ended. Save &#36;50 or more on a new Chromebook.
+  </message>
+
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRING_SOON" desc="Notification message shown to inform the user that this device will soon no longer receive the latest software updates, and that the user can upgrade to a new chromebook using an offer.">
+    You will stop getting security updates for this Chromebook in <ph name="MONTH_AND_YEAR">$1<ex>June 2023</ex></ph>. Time to upgrade for the latest security and software. Offer terms apply.
+  </message>
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRED" desc="Notification message shown to inform the user that this device will longer receive the latest software updates, and that the user can upgrade to get updates using an offer.">
+    Your Chromebook is no longer receiving security updates. Time to upgrade for the latest security and software. Offer terms apply.
+  </message>
+
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_SHOP_BUTTON" desc="The first button label shown in the end of life offer notification to open a link to shop for chromebooks.">
+    Shop Now
+  </message>
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_ABOUT_BUTTON" desc="The second button label shown in the end of life offer notification to learn more about device software updates.">
+    About Updates
+  </message>
+
+  <!-- EOL Incentive No Offer Notification Strings -->
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_NO_OFFER_EXPIRING_SOON" desc="Notification title to inform user that updates end soon and to get a new chromebook.">
+    Security updates end soon. Upgrade to a new Chromebook.
+  </message>
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_NO_OFFER_EXPIRED" desc="Notification title to inform user that updates have ended and to get a new chromebook.">
+    Security updates have ended. Upgrade to a new Chromebook.
+  </message>
+
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_NO_OFFER_EXPIRING_SOON" desc="Notification message shown to inform the user that this device will soon no longer receive the latest software updates, and that the user can upgrade their device to get updates.">
+    You will stop getting security and software updates for this Chromebook in <ph name="MONTH_AND_YEAR">$1<ex>June 2023</ex></ph>. Upgrade your Chromebook for the best experience.
+  </message>
+  <message name="IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_NO_OFFER_EXPIRED" desc="Notification message shown to inform the user that this device is longer receiving the latest software updates, and that the user can upgrade their device to get updates.">
+    Your Chromebook is no longer receiving security and software updates. Upgrade your Chromebook for the best experience.
+  </message>
+
   <!-- TPM Firmware Update Notification Strings -->
   <message name="IDS_TPM_FIRMWARE_UPDATE_NOTIFICATION_TITLE" desc="Notification title shown to inform the user that there is a pending TPM firmware update for the device.">
     Security upgrade available
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_NO_OFFER_EXPIRED.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_NO_OFFER_EXPIRED.png.sha1
new file mode 100644
index 0000000..d5b79637
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_NO_OFFER_EXPIRED.png.sha1
@@ -0,0 +1 @@
+063f23067bb5527fc8db205c0fb6f16d7ad1e5d6
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_NO_OFFER_EXPIRING_SOON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_NO_OFFER_EXPIRING_SOON.png.sha1
new file mode 100644
index 0000000..f7baec6f
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_NO_OFFER_EXPIRING_SOON.png.sha1
@@ -0,0 +1 @@
+4fd29ee1668e39ed7730f763b3d099d6c173ba61
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRED.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRED.png.sha1
new file mode 100644
index 0000000..8650bc3
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRED.png.sha1
@@ -0,0 +1 @@
+b7db8f8223b093048d1ea872fd1615188083ece7
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRING_SOON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRING_SOON.png.sha1
new file mode 100644
index 0000000..329b7c2
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRING_SOON.png.sha1
@@ -0,0 +1 @@
+386f0131542abb3cef3d2c824a6bc05ca9701db1
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_ABOUT_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_ABOUT_BUTTON.png.sha1
new file mode 100644
index 0000000..8650bc3
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_ABOUT_BUTTON.png.sha1
@@ -0,0 +1 @@
+b7db8f8223b093048d1ea872fd1615188083ece7
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_SHOP_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_SHOP_BUTTON.png.sha1
new file mode 100644
index 0000000..8650bc3
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_SHOP_BUTTON.png.sha1
@@ -0,0 +1 @@
+b7db8f8223b093048d1ea872fd1615188083ece7
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_NO_OFFER_EXPIRED.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_NO_OFFER_EXPIRED.png.sha1
new file mode 100644
index 0000000..d5b79637
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_NO_OFFER_EXPIRED.png.sha1
@@ -0,0 +1 @@
+063f23067bb5527fc8db205c0fb6f16d7ad1e5d6
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_NO_OFFER_EXPIRING_SOON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_NO_OFFER_EXPIRING_SOON.png.sha1
new file mode 100644
index 0000000..f7baec6f
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_NO_OFFER_EXPIRING_SOON.png.sha1
@@ -0,0 +1 @@
+4fd29ee1668e39ed7730f763b3d099d6c173ba61
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER.png.sha1
new file mode 100644
index 0000000..2d2da76
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER.png.sha1
@@ -0,0 +1 @@
+51853888565146c2046688ab6f575d2553af0f67
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER_WITH_WARNING_EXPIRED.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER_WITH_WARNING_EXPIRED.png.sha1
new file mode 100644
index 0000000..8650bc3
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER_WITH_WARNING_EXPIRED.png.sha1
@@ -0,0 +1 @@
+b7db8f8223b093048d1ea872fd1615188083ece7
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER_WITH_WARNING_EXPIRING_SOON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER_WITH_WARNING_EXPIRING_SOON.png.sha1
new file mode 100644
index 0000000..329b7c2
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER_WITH_WARNING_EXPIRING_SOON.png.sha1
@@ -0,0 +1 @@
+386f0131542abb3cef3d2c824a6bc05ca9701db1
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 37370f9..fa97ab7 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -2600,6 +2600,14 @@
                desc="Tooltip label for the button to open all downloads">
         Show all downloads in a new tab
       </message>
+      <message name="IDS_DOWNLOAD_BUBBLE_PROMO"
+               desc="Text for the in-product-help bubble shown for the download bubble.">
+        Manage files as they download, and open them when they’re done
+      </message>
+      <message name="IDS_DOWNLOAD_BUBBLE_PROMO_TITLE"
+               desc="Title for the in-product-help bubble shown for the download bubble.">
+        Find your downloads here
+      </message>
       <message name="IDS_DOWNLOAD_BUBBLE_DOWNLOAD_STATUS_MESSAGE_WITH_SEPARATOR"
                desc="The download status and message are separated by a symbol, in this case bullet •, with a white space before it and a white space after it. If the bullet • resembles another symbol in the language, please translate the bullet • as a symbol (A) that is not easily mistaken for a number or letter in the language and (B) that is typically used to separate elements.">
         <ph name="STATUS">$1<ex>100/120 MB</ex></ph> • <ph name="MESSAGE">$2<ex>Opening in 10 seconds...</ex></ph>
@@ -12116,9 +12124,21 @@
       <message name="IDS_MANAGE_PASSWORDS_EDIT_NOTE_TOOLTIP" desc="The tooltip of a button that is used in the credential details view of the password management bubble for editing the note attached to the password.">
         Edit note
       </message>
+      <message name="IDS_MANAGE_PASSWORDS_NOTE_ACCESSIBLE_NAME" desc="Name used by screen readers for the password note label in the credential details view of the password management bubble.">
+        Note: <ph name="NOTE">$1<ex>note</ex></ph>
+      </message>
+      <message name="IDS_MANAGE_PASSWORDS_NOTE_TEXTFIELD" is_accessibility_with_no_ui="true" desc="Name used by screen readers for the note text field in the credential details view of the password management bubble.">
+        Note
+      </message>
       <message name="IDS_MANAGE_PASSWORDS_UPDATE" desc="The text of the button to update the credential details in the password management bubble.">
         Update
       </message>
+      <message name="IDS_MANAGE_PASSWORDS_USERNAME_ACCESSIBLE_NAME" desc="Name used by screen readers for the username label in the credential details view of the password management bubble.">
+        Username: <ph name="USERNAME">$1<ex>user@gmail.com</ex></ph>
+      </message>
+      <message name="IDS_MANAGE_PASSWORDS_USERNAME_TEXTFIELD" is_accessibility_with_no_ui="true" desc="Name used by screen readers for the username text field in the credential details view of the password management bubble.">
+        Username
+      </message>
 
       <message name="IDS_MANAGE_PASSWORDS_AUTO_SIGNIN_TITLE_MD" desc="The title of the auto-signin toast in Material Design mode.">
         Signing in as
diff --git a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_PROMO.png.sha1 b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_PROMO.png.sha1
new file mode 100644
index 0000000..1ed1a08e0
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_PROMO.png.sha1
@@ -0,0 +1 @@
+e5a44dca8f367ded27bae3496678fdcd48d5322b
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_PROMO_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_PROMO_TITLE.png.sha1
new file mode 100644
index 0000000..1ed1a08e0
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_BUBBLE_PROMO_TITLE.png.sha1
@@ -0,0 +1 @@
+e5a44dca8f367ded27bae3496678fdcd48d5322b
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_MANAGE_PASSWORDS_NOTE_ACCESSIBLE_NAME.png.sha1 b/chrome/app/generated_resources_grd/IDS_MANAGE_PASSWORDS_NOTE_ACCESSIBLE_NAME.png.sha1
new file mode 100644
index 0000000..7cd3b72
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_MANAGE_PASSWORDS_NOTE_ACCESSIBLE_NAME.png.sha1
@@ -0,0 +1 @@
+9e03ed7296967f21ec953abb9c21a43ec6a59ad6
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_MANAGE_PASSWORDS_USERNAME_ACCESSIBLE_NAME.png.sha1 b/chrome/app/generated_resources_grd/IDS_MANAGE_PASSWORDS_USERNAME_ACCESSIBLE_NAME.png.sha1
new file mode 100644
index 0000000..ce7ba36
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_MANAGE_PASSWORDS_USERNAME_ACCESSIBLE_NAME.png.sha1
@@ -0,0 +1 @@
+aacb61b61ab8a8db1fd2d12d288a770721108efe
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index 966514d..7efd8fe 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -4664,6 +4664,10 @@
   <message name="IDS_SETTINGS_KEYBOARD_REMAP_RESTORE_BUTTON_LABEL" translateable="false" desc="In Keyboard remap keys subpage, the restore defaults button label.">
     Restore defaults
   </message>
+  <message name="IDS_SETTINGS_KEYBOARD_NO_KEYBOARDS_HELP_MESSAGE" translateable="false" desc="In Keyboard remap keys subpage, the message that notifies users that no keyboards are connected.">
+    No keyboard detected
+  </message>
+
   <!-- Device Keyboard page (OS settings) -->
   <message name="IDS_SETTINGS_KEYBOARD_TITLE" desc="In Device Settings, the title of the keyboard settings subpage.">
     Keyboard
diff --git a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java
index 419e715c..ad3fe46 100644
--- a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java
+++ b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java
@@ -138,6 +138,37 @@
     public static final int ACTIVITY_SIDE_SHEET_DECORATION_TYPE_DIVIDER = 3;
     public static final int ACTIVITY_SIDE_SHEET_DECORATION_TYPE_MAX = 3;
 
+    @IntDef({ACTIVITY_LAYOUT_STATE_NONE, ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET,
+            ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET_MAXIMIZED, ACTIVITY_LAYOUT_STATE_SIDE_SHEET,
+            ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED, ACTIVITY_LAYOUT_STATE_FULL_SCREEN})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ActivityLayoutState {}
+    /**
+     * The activity's layout state is unknown.
+     */
+    public static final int ACTIVITY_LAYOUT_STATE_NONE = 0;
+    /**
+     * The activity is being displayed as a bottom-sheet at its initial height.
+     */
+    public static final int ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET = 1;
+    /**
+     * The activity is being displayed as a bottom-sheet at its maximized height.
+     */
+    public static final int ACTIVITY_LAYOUT_STATE_BOTTOM_SHEET_MAXIMIZED = 2;
+    /**
+     * The activity is being displayed as a side-sheet at its initial width.
+     */
+    public static final int ACTIVITY_LAYOUT_STATE_SIDE_SHEET = 3;
+    /**
+     * The activity is being displayed as a side-sheet at its maximized width.
+     */
+    public static final int ACTIVITY_LAYOUT_STATE_SIDE_SHEET_MAXIMIZED = 4;
+    /**
+     * The activity is being displayed over the whole window.
+     */
+    public static final int ACTIVITY_LAYOUT_STATE_FULL_SCREEN = 5;
+    public static final int ACTIVITY_LAYOUT_STATE_MAX = 5;
+
     /**
      * @return The type of the Activity;
      */
diff --git a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingCheckerUnitTest.java b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingCheckerUnitTest.java
index 2a64f7f..f3c65fb 100644
--- a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingCheckerUnitTest.java
+++ b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingCheckerUnitTest.java
@@ -75,7 +75,7 @@
             final Handler mHandler = new Handler(Looper.getMainLooper());
 
             @Override
-            public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+            public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
                 mHandler.postDelayed(task, delay);
             }
         });
diff --git a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingControllerUnitTest.java b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingControllerUnitTest.java
index 3d7cd1dd..d85cc1b 100644
--- a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingControllerUnitTest.java
+++ b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingControllerUnitTest.java
@@ -74,7 +74,7 @@
             final Handler mHandler = new Handler(Looper.getMainLooper());
 
             @Override
-            public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+            public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
                 mHandler.postDelayed(task, delay);
             }
         };
diff --git a/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java b/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java
index 03214f4..cd428f4e 100644
--- a/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java
+++ b/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java
@@ -214,6 +214,28 @@
                 Log.w(TAG,
                         "onGreatestScrollPercentageIncreased: scrollPercentage = "
                                 + args.getInt("scrollPercentage"));
+                // CustomTabsConnection#ON_RESIZED_CALLBACK
+            } else if (callbackName.equals("onResized")) {
+                // CustomTabsConnection#ON_RESIZED_SIZE_EXTRA
+                Log.w(TAG, "onResized: size = " + args.getInt("size"));
+                // CustomTabsConnection#ON_ACTIVITY_LAYOUT_CALLBACK
+            } else if (callbackName.equals("onActivityLayout")) {
+                Log.w(TAG,
+                        "onActivityLayout:"
+                                // CustomTabsConnection#ON_ACTIVITY_LAYOUT_LEFT_EXTRA
+                                + " left = "
+                                + args.getInt("left")
+                                // CustomTabsConnection#ON_ACTIVITY_LAYOUT_TOP_EXTRA
+                                + " top = "
+                                + args.getInt("top")
+                                // CustomTabsConnection#ON_ACTIVITY_LAYOUT_RIGHT_EXTRA
+                                + " right = "
+                                + args.getInt("right")
+                                // CustomTabsConnection#ON_ACTIVITY_LAYOUT_BOTTOM_EXTRA
+                                + " bottom = "
+                                + args.getInt("bottom")
+                                // CustomTabsConnection#ON_ACTIVITY_LAYOUT_STATE_EXTRA
+                                + " state = " + args.getInt("state"));
             }
         }
     }
diff --git a/chrome/browser/apps/app_deduplication_service/app_deduplication_service.cc b/chrome/browser/apps/app_deduplication_service/app_deduplication_service.cc
index 2a5c511..68f3aee 100644
--- a/chrome/browser/apps/app_deduplication_service/app_deduplication_service.cc
+++ b/chrome/browser/apps/app_deduplication_service/app_deduplication_service.cc
@@ -5,6 +5,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/check_is_test.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/functional/callback_helpers.h"
@@ -234,8 +235,18 @@
 }
 
 void AppDeduplicationService::GetDeduplicateDataFromServer() {
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory =
+      profile_->GetURLLoaderFactory();
+  if (!url_loader_factory.get()) {
+    // `url_loader_factory` should only be null if we are in a non-dedupe
+    // related test. Tests that use profile builder to create their profile
+    // won't have `url_loader_factory` set up by default, so we bypass dedupes
+    // code being called for those tests.
+    CHECK_IS_TEST();
+    return;
+  }
   server_connector_->GetDeduplicateAppsFromServer(
-      profile_->GetURLLoaderFactory(),
+      url_loader_factory,
       base::BindOnce(
           &AppDeduplicationService::OnGetDeduplicateDataFromServerCompleted,
           weak_ptr_factory_.GetWeakPtr()));
diff --git a/chrome/browser/apps/app_service/publishers/bruschetta_apps.cc b/chrome/browser/apps/app_service/publishers/bruschetta_apps.cc
index e48443d1..ee7ce64 100644
--- a/chrome/browser/apps/app_service/publishers/bruschetta_apps.cc
+++ b/chrome/browser/apps/app_service/publishers/bruschetta_apps.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "ash/public/cpp/app_menu_constants.h"
+#include "base/functional/callback_helpers.h"
 #include "chrome/browser/apps/app_service/app_launch_params.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/menu_util.h"
@@ -17,13 +18,20 @@
 #include "chrome/browser/ash/bruschetta/bruschetta_service.h"
 #include "chrome/browser/ash/bruschetta/bruschetta_util.h"
 #include "chrome/browser/ash/crostini/crostini_manager.h"
+#include "chrome/browser/ash/crostini/crostini_util.h"
+#include "chrome/browser/ash/file_manager/fileapi_util.h"
+#include "chrome/browser/ash/file_manager/path_util.h"
 #include "chrome/browser/ash/guest_os/guest_os_registry_service.h"
+#include "chrome/browser/ash/guest_os/guest_os_session_tracker.h"
+#include "chrome/browser/ash/guest_os/guest_os_share_path.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h"
 #include "chrome/browser/ui/ash/shelf/shelf_spinner_controller.h"
 #include "chrome/browser/ui/ash/shelf/shelf_spinner_item_controller.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/services/app_service/public/cpp/app_types.h"
+#include "components/services/app_service/public/cpp/intent.h"
+#include "storage/browser/file_system/file_system_context.h"
 
 namespace apps {
 
@@ -36,39 +44,110 @@
   }
 }
 
+// It's safe to remove a non-existent spinner.
 void RemoveSpinner(const std::string& app_id) {
   if (auto* chrome_controller = ChromeShelfController::instance()) {
     chrome_controller->GetShelfSpinnerController()->CloseSpinner(app_id);
   }
 }
 
+void OnLaunchFailed(const std::string& app_id,
+                    LaunchCallback callback,
+                    const std::string& reason) {
+  LOG(ERROR) << "Failed to launch Bruschetta app " << app_id << ": " << reason;
+  RemoveSpinner(app_id);
+  std::move(callback).Run(ConvertBoolToLaunchResult(false));
+}
+
+void OnSharePathForLaunchApplication(
+    Profile* profile,
+    const std::string& app_id,
+    guest_os::GuestOsRegistryService::Registration registration,
+    const guest_os::GuestId container_id,
+    const std::vector<std::string>& args,
+    LaunchCallback callback,
+    bool success,
+    const std::string& failure_reason) {
+  if (!success) {
+    OnLaunchFailed(app_id, std::move(callback),
+                   "Failed to share paths with Bruschetta: " + failure_reason);
+    return;
+  }
+  // TODO(b/265601951): Factor this out of CrostiniManager.
+  crostini::CrostiniManager::GetForProfile(profile)->LaunchContainerApplication(
+      container_id, registration.DesktopFileId(), args, registration.IsScaled(),
+      base::BindOnce(
+          [](const std::string& app_id, LaunchCallback callback, bool success,
+             const std::string& failure_reason) {
+            if (!success) {
+              OnLaunchFailed(app_id, std::move(callback), failure_reason);
+              return;
+            }
+            RemoveSpinner(app_id);
+            std::move(callback).Run(ConvertBoolToLaunchResult(success));
+          },
+          app_id, std::move(callback)));
+}
+
 void LaunchApplication(
     Profile* profile,
     const std::string& app_id,
     guest_os::GuestOsRegistryService::Registration registration,
-    int64_t display_id) {
+    int64_t display_id,
+    const std::vector<crostini::LaunchArg> args,
+    LaunchCallback callback) {
   // TODO(b/265601951): Handle window permissions. Crostini uses
   // AppServiceAppWindowCrostiniTracker::OnAppLaunchRequested for this.
-  // TODO(b/245412929): Share paths to files.
+
   const guest_os::GuestId container_id(registration.VmType(),
                                        registration.VmName(),
                                        registration.ContainerName());
 
-  std::vector<std::string> files;
-  // TODO(b/265601951): Factor this out of CrostiniManager.
-  crostini::CrostiniManager::GetForProfile(profile)->LaunchContainerApplication(
-      container_id, registration.DesktopFileId(), files,
-      registration.IsScaled(),
-      base::BindOnce(
-          [](const std::string& app_id, bool success,
-             const std::string& failure_reason) {
-            if (!success) {
-              LOG(ERROR) << "Failed to launch Bruschetta app " << app_id << ": "
-                         << failure_reason;
-            }
-            RemoveSpinner(app_id);
-          },
-          app_id));
+  // TODO(b/265601951): Consider factoring SharePath code against
+  // crostini_util.cc LaunchApplication.
+  auto* share_path = guest_os::GuestOsSharePath::GetForProfile(profile);
+  const std::string& vm_name = registration.VmName();
+  auto vm_info =
+      guest_os::GuestOsSessionTracker::GetForProfile(profile)->GetVmInfo(
+          vm_name);
+  if (!vm_info) {
+    OnLaunchFailed(app_id, std::move(callback),
+                   "Bruschetta VM not running: " + vm_name);
+    return;
+  }
+
+  // Share any paths not in Bruschetta.
+  std::vector<base::FilePath> paths_to_share;
+  std::vector<std::string> launch_args;
+  launch_args.reserve(args.size());
+  for (const auto& arg : args) {
+    if (absl::holds_alternative<std::string>(arg)) {
+      launch_args.push_back(absl::get<std::string>(arg));
+      continue;
+    }
+    const storage::FileSystemURL& url = absl::get<storage::FileSystemURL>(arg);
+    base::FilePath path;
+    if (!file_manager::util::ConvertFileSystemURLToPathInsideVM(
+            profile, url, bruschetta::BruschettaChromeOSBaseDirectory(),
+            /*map_crostini_home=*/false, &path)) {
+      OnLaunchFailed(app_id, std::move(callback),
+                     "Cannot share file with Bruschetta: " + url.DebugString());
+      return;
+    }
+    if (url.mount_filesystem_id() !=
+            file_manager::util::GetGuestOsMountPointName(profile,
+                                                         container_id) &&
+        !share_path->IsPathShared(vm_name, url.path())) {
+      paths_to_share.push_back(url.path());
+    }
+    launch_args.push_back(path.value());
+  }
+
+  share_path->SharePaths(
+      vm_name, vm_info->seneschal_server_handle(), std::move(paths_to_share),
+      base::BindOnce(OnSharePathForLaunchApplication, profile, app_id,
+                     std::move(registration), std::move(container_id),
+                     std::move(launch_args), std::move(callback)));
 }
 
 }  // namespace
@@ -104,17 +183,44 @@
                             int32_t event_flags,
                             LaunchSource launch_source,
                             WindowInfoPtr window_info) {
+  LaunchAppWithIntent(app_id, event_flags, /*intent=*/nullptr, launch_source,
+                      std::move(window_info), /*callback=*/base::DoNothing());
+}
+
+void BruschettaApps::LaunchAppWithIntent(const std::string& app_id,
+                                         int32_t event_flags,
+                                         IntentPtr intent,
+                                         LaunchSource launch_source,
+                                         WindowInfoPtr window_info,
+                                         LaunchCallback callback) {
+  // TODO(b/265601951): Consider factoring args code against
+  // CrostiniApps::LaunchAppWithIntent.
+
+  // Retrieve URLs from the files in the intent.
+  std::vector<crostini::LaunchArg> args;
+  if (intent && intent->files.size() > 0) {
+    args.reserve(intent->files.size());
+    storage::FileSystemContext* file_system_context =
+        file_manager::util::GetFileManagerFileSystemContext(profile());
+    for (auto& file : intent->files) {
+      args.emplace_back(
+          file_system_context->CrackURLInFirstPartyContext(file->url));
+    }
+  }
+
   const int64_t display_id =
       window_info ? window_info->display_id : display::kInvalidDisplayId;
+
   absl::optional<guest_os::GuestOsRegistryService::Registration> registration =
       registry()->GetRegistration(app_id);
   if (!registration) {
     // TODO(b/247638226): RecordAppLaunchHistogram(kUnknown) to collect usage
     // stats for failed launches.
-    LOG(ERROR) << "BruschettaApps::Launch called with an unknown app_id: "
-               << app_id;
+    OnLaunchFailed(app_id, std::move(callback),
+                   "Unknown Bruschetta app_id: " + app_id);
     return;
   }
+
   // TODO(b/247638226): RecordAppLaunchHistogram(kRegisteredApp) to collect
   // usage stats for successful launches.
 
@@ -127,24 +233,28 @@
       bruschetta::BruschettaService::GetForProfile(profile())->GetLauncher(
           vm_name);
   if (!launcher) {
-    LOG(ERROR) << "Unknown Bruschetta VM name: " << vm_name;
+    OnLaunchFailed(app_id, std::move(callback),
+                   "Unknown Bruschetta VM name: " + vm_name);
     return;
   }
   AddSpinner(app_id);
   launcher->EnsureRunning(base::BindOnce(
       [](Profile* profile, const std::string& app_id,
          guest_os::GuestOsRegistryService::Registration registration,
-         int64_t display_id, const std::string& vm_name,
+         int64_t display_id, const std::vector<crostini::LaunchArg> args,
+         const std::string& vm_name, LaunchCallback callback,
          bruschetta::BruschettaResult result) {
         if (result != bruschetta::BruschettaResult::kSuccess) {
-          LOG(ERROR) << "Failed to start Bruschetta VM " << vm_name << ": "
-                     << bruschetta::BruschettaResultString(result);
-          RemoveSpinner(app_id);
+          OnLaunchFailed(app_id, std::move(callback),
+                         "Failed to start Bruschetta VM " + vm_name + ": " +
+                             bruschetta::BruschettaResultString(result));
           return;
         }
-        LaunchApplication(profile, app_id, std::move(registration), display_id);
+        LaunchApplication(profile, app_id, std::move(registration), display_id,
+                          std::move(args), std::move(callback));
       },
-      profile(), app_id, std::move(registration.value()), display_id, vm_name));
+      profile(), app_id, std::move(registration.value()), display_id,
+      std::move(args), vm_name, std::move(callback)));
 }
 
 void BruschettaApps::LaunchAppWithParams(AppLaunchParams&& params,
@@ -156,7 +266,6 @@
     const guest_os::GuestOsRegistryService::Registration& registration,
     App* app) {
   // TODO(b/247638042): Implement IsUninstallable and use it here.
-  // TODO(b/245412929): Implement intent filter and use it here.
 }
 
 void BruschettaApps::GetMenuModel(
diff --git a/chrome/browser/apps/app_service/publishers/bruschetta_apps.h b/chrome/browser/apps/app_service/publishers/bruschetta_apps.h
index 736c3e48..cc97a1c 100644
--- a/chrome/browser/apps/app_service/publishers/bruschetta_apps.h
+++ b/chrome/browser/apps/app_service/publishers/bruschetta_apps.h
@@ -44,6 +44,12 @@
               int32_t event_flags,
               LaunchSource launch_source,
               WindowInfoPtr window_info) override;
+  void LaunchAppWithIntent(const std::string& app_id,
+                           int32_t event_flags,
+                           IntentPtr intent,
+                           LaunchSource launch_source,
+                           WindowInfoPtr window_info,
+                           LaunchCallback callback) override;
   void LaunchAppWithParams(AppLaunchParams&& params,
                            LaunchCallback callback) override;
   void GetMenuModel(const std::string& app_id,
diff --git a/chrome/browser/apps/app_service/publishers/bruschetta_apps_unittest.cc b/chrome/browser/apps/app_service/publishers/bruschetta_apps_unittest.cc
index 4dc2006d..6c90e04 100644
--- a/chrome/browser/apps/app_service/publishers/bruschetta_apps_unittest.cc
+++ b/chrome/browser/apps/app_service/publishers/bruschetta_apps_unittest.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/ash/bruschetta/fake_bruschetta_launcher.h"
 #include "chrome/browser/ash/guest_os/dbus_test_helper.h"
 #include "chrome/browser/ash/guest_os/guest_os_registry_service_factory.h"
+#include "chrome/browser/ash/guest_os/guest_os_session_tracker.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/test/base/testing_profile.h"
@@ -48,6 +49,9 @@
         guest_os::GuestOsRegistryServiceFactory::GetForProfile(profile_.get());
     scoped_feature_list_.InitAndEnableFeature(ash::features::kBruschetta);
     bruschetta::BruschettaServiceFactory::EnableForTesting(profile_.get());
+    const guest_os::GuestId id(bruschetta::kBruschettaVmName, "test_container");
+    guest_os::GuestOsSessionTracker::GetForProfile(profile_.get())
+        ->AddGuestForTesting(id);
   }
 
   void TearDown() override { profile_.reset(); }
diff --git a/chrome/browser/apps/app_service/publishers/crostini_apps.cc b/chrome/browser/apps/app_service/publishers/crostini_apps.cc
index b855265..ebe4b2f 100644
--- a/chrome/browser/apps/app_service/publishers/crostini_apps.cc
+++ b/chrome/browser/apps/app_service/publishers/crostini_apps.cc
@@ -7,26 +7,20 @@
 #include <utility>
 #include <vector>
 
-#include "ash/constants/ash_features.h"
 #include "ash/public/cpp/app_menu_constants.h"
 #include "chrome/browser/apps/app_service/app_launch_params.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
-#include "chrome/browser/apps/app_service/intent_util.h"
 #include "chrome/browser/apps/app_service/launch_utils.h"
 #include "chrome/browser/apps/app_service/menu_util.h"
 #include "chrome/browser/ash/crostini/crostini_features.h"
 #include "chrome/browser/ash/crostini/crostini_package_service.h"
 #include "chrome/browser/ash/crostini/crostini_util.h"
 #include "chrome/browser/ash/file_manager/fileapi_util.h"
-#include "chrome/browser/ash/guest_os/guest_os_mime_types_service.h"
-#include "chrome/browser/ash/guest_os/guest_os_mime_types_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/grit/chrome_unscaled_resources.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/services/app_service/public/cpp/app_types.h"
 #include "components/services/app_service/public/cpp/intent.h"
-#include "components/services/app_service/public/cpp/intent_filter.h"
-#include "components/services/app_service/public/cpp/intent_util.h"
 #include "storage/browser/file_system/file_system_context.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
@@ -39,10 +33,6 @@
 
 namespace {
 
-const char kTextPlainMimeType[] = "text/plain";
-const char kTextTypeMimeType[] = "text/";
-const char kTextWildcardMimeType[] = "text/*";
-
 bool ShouldShowDisplayDensityMenuItem(const std::string& app_id,
                                       apps::MenuType menu_type,
                                       int64_t display_id) {
@@ -60,52 +50,6 @@
   return d.device_scale_factor() != 1.0;
 }
 
-// Create a file intent filter with mime type conditions for App Service.
-apps::IntentFilters CreateIntentFilterForCrostini(
-    const guest_os::GuestOsMimeTypesService* mime_types_service,
-    const guest_os::GuestOsRegistryService::Registration& registration) {
-  const std::set<std::string> mime_types_set = registration.MimeTypes();
-  if (mime_types_set.empty()) {
-    return {};
-  }
-
-  // When a file has a mime type that Files App can't recognise but Crostini can
-  // (e.g. a proprietary file type), we should look at the file extensions that
-  // the app can support. We find these extension types by checking what
-  // extensions correspond to the app's supported mime types.
-  std::vector<std::string> extension_types;
-  if (ash::features::ShouldGuestOsFileTasksUseAppService()) {
-    extension_types = mime_types_service->GetExtensionTypesFromMimeTypes(
-        mime_types_set, registration.VmName(), registration.ContainerName());
-  }
-  std::vector<std::string> mime_types(mime_types_set.begin(),
-                                      mime_types_set.end());
-
-  // If we see that the app supports the text/plain mime-type, then the app
-  // supports all files with type text/*, as per xdg spec.
-  // https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html.
-  // In this case, remove all mime types that begin with "text/" and replace
-  // them with a single "text/*" mime type.
-  if (base::Contains(mime_types, kTextPlainMimeType)) {
-    mime_types.erase(std::remove_if(mime_types.begin(), mime_types.end(),
-                                    [](const std::string& mime) {
-                                      return mime.find(kTextTypeMimeType) !=
-                                             std::string::npos;
-                                    }),
-                     mime_types.end());
-    mime_types.push_back(kTextWildcardMimeType);
-  }
-
-  apps::IntentFilters intent_filters;
-  intent_filters.push_back(apps_util::CreateFileFilter(
-      {apps_util::kIntentActionView}, mime_types, extension_types,
-      // TODO(crbug/1349974): Remove activity_name when default file handling
-      // preferences for Files App are migrated.
-      /*activity_name=*/apps_util::kGuestOsActivityName));
-
-  return intent_filters;
-}
-
 }  // namespace
 
 namespace apps {
@@ -258,12 +202,6 @@
   app->allow_uninstall =
       crostini::IsUninstallable(profile(), registration.app_id());
 
-  app->handles_intents = true;
-  const guest_os::GuestOsMimeTypesService* mime_types_service =
-      guest_os::GuestOsMimeTypesServiceFactory::GetForProfile(profile());
-  app->intent_filters =
-      CreateIntentFilterForCrostini(mime_types_service, registration);
-
   // TODO(crbug.com/1253250): Add other fields for the App struct.
 }
 
diff --git a/chrome/browser/apps/app_service/publishers/crostini_apps_unittest.cc b/chrome/browser/apps/app_service/publishers/crostini_apps_unittest.cc
index 052caac..246668a 100644
--- a/chrome/browser/apps/app_service/publishers/crostini_apps_unittest.cc
+++ b/chrome/browser/apps/app_service/publishers/crostini_apps_unittest.cc
@@ -6,24 +6,16 @@
 
 #include <vector>
 
-#include "ash/constants/ash_features.h"
-#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/ash/crostini/crostini_test_helper.h"
-#include "chrome/browser/ash/guest_os/guest_os_mime_types_service.h"
-#include "chrome/browser/ash/guest_os/guest_os_mime_types_service_factory.h"
 #include "chrome/browser/ash/guest_os/guest_os_registry_service_factory.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chromeos/ash/components/dbus/cicerone/cicerone_client.h"
-#include "chromeos/ash/components/dbus/dbus_thread_manager.h"
-#include "components/prefs/scoped_user_pref_update.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
 #include "components/services/app_service/public/cpp/app_types.h"
 #include "components/services/app_service/public/cpp/app_update.h"
-#include "components/services/app_service/public/cpp/intent_filter.h"
-#include "components/services/app_service/public/cpp/intent_util.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -40,10 +32,6 @@
 
   TestingProfile* profile() { return profile_.get(); }
 
-  guest_os::GuestOsMimeTypesService* mime_types_service() {
-    return mime_types_service_;
-  }
-
   void SetUp() override {
     ash::CiceroneClient::InitializeFake();
     profile_ = std::make_unique<TestingProfile>();
@@ -52,8 +40,6 @@
     test_helper_ =
         std::make_unique<crostini::CrostiniTestHelper>(profile_.get());
     test_helper()->ReInitializeAppServiceIntegration();
-    mime_types_service_ =
-        guest_os::GuestOsMimeTypesServiceFactory::GetForProfile(profile());
   }
 
   void TearDown() override {
@@ -62,87 +48,34 @@
     ash::CiceroneClient::Shutdown();
   }
 
-  // Set up the test Crostini app for our desired mime types.
-  std::string AddCrostiniAppWithMimeTypes(std::string app_id,
-                                          std::string app_name,
-                                          std::vector<std::string> mime_types) {
+  // Adds a test Crostini app and returns its app_id.
+  std::string AddCrostiniApp(std::string desktop_file_id,
+                             std::string app_name) {
     vm_tools::apps::App app;
-    for (std::string mime_type : mime_types) {
-      app.add_mime_types(mime_type);
-    }
-    app.set_desktop_file_id(app_id);
+    app.set_desktop_file_id(desktop_file_id);
     vm_tools::apps::App::LocaleString::Entry* entry =
         app.mutable_name()->add_values();
     entry->set_locale(std::string());
     entry->set_value(app_name);
     test_helper()->AddApp(app);
-
     return crostini::CrostiniTestHelper::GenerateAppId(
         app.desktop_file_id(), crostini::kCrostiniDefaultVmName,
         crostini::kCrostiniDefaultContainerName);
   }
 
-  // Get the registered intent filter for the app in App Service.
-  std::vector<std::unique_ptr<IntentFilter>> GetIntentFiltersForApp(
-      std::string app_id) {
-    std::vector<std::unique_ptr<IntentFilter>> intent_filters;
-    app_service_proxy()->AppRegistryCache().ForOneApp(
-        app_id, [&intent_filters](const AppUpdate& update) {
-          for (auto& intent_filter : update.IntentFilters()) {
-            intent_filters.push_back(std::move(intent_filter));
-          }
-        });
-    return intent_filters;
-  }
-
  private:
   content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<TestingProfile> profile_;
   std::unique_ptr<crostini::CrostiniTestHelper> test_helper_;
   AppServiceProxy* app_service_proxy_ = nullptr;
-  guest_os::GuestOsMimeTypesService* mime_types_service_;
 };
 
-TEST_F(CrostiniAppsTest, AppServiceHasCrostiniIntentFilters) {
-  std::vector<std::string> mime_types = {"text/csv", "text/html"};
-
-  std::string app_id =
-      AddCrostiniAppWithMimeTypes("app_id", "app_name", mime_types);
-  std::vector<std::unique_ptr<IntentFilter>> intent_filters =
-      GetIntentFiltersForApp(app_id);
-
-  ASSERT_EQ(intent_filters.size(), 1U);
-  EXPECT_EQ(intent_filters[0]->conditions.size(), 2U);
-
-  // Check that the filter has the correct action type.
-  {
-    const Condition* condition = intent_filters[0]->conditions[0].get();
-    ASSERT_EQ(condition->condition_type, ConditionType::kAction);
-    EXPECT_EQ(condition->condition_values.size(), 1U);
-    ASSERT_EQ(condition->condition_values[0]->match_type,
-              PatternMatchType::kLiteral);
-    ASSERT_EQ(condition->condition_values[0]->value,
-              apps_util::kIntentActionView);
-  }
-
-  // Check that the filter has all our mime types. Realistically, the filter
-  // would also have the extension equivalents of the mime types too if there
-  // were mime/ extension mappings in prefs.
-  {
-    const Condition* condition = intent_filters[0]->conditions[1].get();
-    ASSERT_EQ(condition->condition_type, ConditionType::kFile);
-    EXPECT_EQ(condition->condition_values.size(), 2U);
-    ASSERT_EQ(condition->condition_values[0]->value, mime_types[0]);
-    ASSERT_EQ(condition->condition_values[1]->value, mime_types[1]);
-  }
-}
-
 TEST_F(CrostiniAppsTest, AppReadinessUpdatesWhenCrostiniDisabled) {
   // Install a Crostini app.
-  std::string app_id = AddCrostiniAppWithMimeTypes("app_id", "app_name", {});
+  const std::string app_id = AddCrostiniApp("desktop_file_id", "app_name");
 
   // Check that the app is ready.
-  apps::Readiness readiness_before;
+  apps::Readiness readiness_before = Readiness::kUnknown;
   app_service_proxy()->AppRegistryCache().ForOneApp(
       app_id, [&readiness_before](const AppUpdate& update) {
         readiness_before = update.Readiness();
@@ -163,90 +96,4 @@
   ASSERT_EQ(readiness_after, Readiness::kUninstalledByUser);
 }
 
-TEST_F(CrostiniAppsTest, CrostiniIntentFilterHasExtensionsFromPrefs) {
-  base::test::ScopedFeatureList scoped_feature_list{
-      ash::features::kGuestOsFileTasksUseAppService};
-
-  std::string mime_type = "test/mime1";
-  std::string extension = "test_extension";
-
-  // Update dictionary to map the extension to mime type.
-  vm_tools::apps::MimeTypes mime_types_list;
-  mime_types_list.set_vm_name("termina");
-  mime_types_list.set_container_name("penguin");
-  (*mime_types_list.mutable_mime_type_mappings())[extension] = mime_type;
-  mime_types_service()->UpdateMimeTypes(mime_types_list);
-
-  // Create Crostini app and get its registered intent filters.
-  std::string app_id =
-      AddCrostiniAppWithMimeTypes("app_id", "app_name", {mime_type});
-  std::vector<std::unique_ptr<IntentFilter>> intent_filters =
-      GetIntentFiltersForApp(app_id);
-
-  EXPECT_EQ(intent_filters.size(), 1U);
-  std::unique_ptr<IntentFilter> intent_filter = std::move(intent_filters[0]);
-  EXPECT_EQ(intent_filter->conditions.size(), 2U);
-
-  // Check that the filter has the correct action type.
-  {
-    const Condition* condition = intent_filter->conditions[0].get();
-    ASSERT_EQ(condition->condition_type, ConditionType::kAction);
-    EXPECT_EQ(condition->condition_values.size(), 1U);
-    ASSERT_EQ(condition->condition_values[0]->match_type,
-              PatternMatchType::kLiteral);
-    ASSERT_EQ(condition->condition_values[0]->value,
-              apps_util::kIntentActionView);
-  }
-
-  // Check that the filter has both mime type and its extension equivalent based
-  // on what is recorded in prefs for GuestOS mime types.
-  {
-    const Condition* condition = intent_filter->conditions[1].get();
-    ASSERT_EQ(condition->condition_type, ConditionType::kFile);
-    EXPECT_EQ(condition->condition_values.size(), 2U);
-    ASSERT_EQ(condition->condition_values[0]->value, mime_type);
-    ASSERT_EQ(condition->condition_values[0]->match_type,
-              PatternMatchType::kMimeType);
-    ASSERT_EQ(condition->condition_values[1]->value, extension);
-    ASSERT_EQ(condition->condition_values[1]->match_type,
-              PatternMatchType::kFileExtension);
-  }
-}
-
-TEST_F(CrostiniAppsTest, IntentFilterWithTextPlainAddsTextWildcardMimeType) {
-  std::string normal_app_id = AddCrostiniAppWithMimeTypes(
-      "normal_app_id", "normal_app_name", {"text/csv"});
-  std::vector<std::unique_ptr<IntentFilter>> intent_filters =
-      GetIntentFiltersForApp(normal_app_id);
-
-  EXPECT_EQ(intent_filters.size(), 1U);
-  EXPECT_EQ(intent_filters[0]->conditions.size(), 2U);
-
-  // Check that the filter is unchanged because there isn't a "text/plain"
-  // mime type condition.
-  {
-    const Condition* condition = intent_filters[0]->conditions[1].get();
-    ASSERT_EQ(condition->condition_type, ConditionType::kFile);
-    EXPECT_EQ(condition->condition_values.size(), 1U);
-    ASSERT_EQ(condition->condition_values[0]->value, "text/csv");
-  }
-
-  std::string many_mimes_app_id = AddCrostiniAppWithMimeTypes(
-      "many_mimes_app_id", "many_mimes_app_name",
-      {"text/plain", "text/csv", "text/javascript", "video/mp4"});
-  intent_filters = GetIntentFiltersForApp(many_mimes_app_id);
-
-  EXPECT_EQ(intent_filters.size(), 1U);
-  EXPECT_EQ(intent_filters[0]->conditions.size(), 2U);
-
-  // Check that the filter has "text/*" to replace all the text mime types.
-  {
-    const Condition* condition = intent_filters[0]->conditions[1].get();
-    ASSERT_EQ(condition->condition_type, ConditionType::kFile);
-    EXPECT_EQ(condition->condition_values.size(), 2U);
-    ASSERT_EQ(condition->condition_values[0]->value, "video/mp4");
-    ASSERT_EQ(condition->condition_values[1]->value, "text/*");
-  }
-}
-
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/publishers/guest_os_apps.cc b/chrome/browser/apps/app_service/publishers/guest_os_apps.cc
index 048fd01..870fda6 100644
--- a/chrome/browser/apps/app_service/publishers/guest_os_apps.cc
+++ b/chrome/browser/apps/app_service/publishers/guest_os_apps.cc
@@ -7,12 +7,15 @@
 #include <utility>
 #include <vector>
 
+#include "ash/constants/ash_features.h"
 #include "base/check_is_test.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_base.h"
+#include "chrome/browser/apps/app_service/intent_util.h"
 #include "chrome/browser/ash/guest_os/guest_os_registry_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/services/app_service/public/cpp/app_types.h"
+#include "components/services/app_service/public/cpp/intent_util.h"
 
 namespace apps {
 
@@ -116,7 +119,13 @@
   app->show_in_shelf = show;
   app->show_in_management = false;
   app->allow_uninstall = false;
-  app->handles_intents = false;
+
+  // Add intent filters based on file extensions.
+  app->handles_intents = true;
+  const guest_os::GuestOsMimeTypesService* mime_types_service =
+      guest_os::GuestOsMimeTypesServiceFactory::GetForProfile(profile());
+  app->intent_filters =
+      CreateIntentFilterForAppService(mime_types_service, registration);
 
   // Allow subclasses of GuestOSApps to modify app.
   CreateAppOverrides(registration, app.get());
@@ -124,4 +133,48 @@
   return app;
 }
 
+apps::IntentFilters CreateIntentFilterForAppService(
+    const guest_os::GuestOsMimeTypesService* mime_types_service,
+    const guest_os::GuestOsRegistryService::Registration& registration) {
+  const std::set<std::string> mime_types_set = registration.MimeTypes();
+  if (mime_types_set.empty()) {
+    return {};
+  }
+
+  // When a file has a mime type that Files App can't recognise but the guest
+  // can (e.g. a proprietary file type), we should look at the file extensions
+  // that the app can support. We find these extension types by checking what
+  // extensions correspond to the app's supported mime types.
+  std::vector<std::string> extension_types;
+  if (ash::features::ShouldGuestOsFileTasksUseAppService()) {
+    extension_types = mime_types_service->GetExtensionTypesFromMimeTypes(
+        mime_types_set, registration.VmName(), registration.ContainerName());
+  }
+  std::vector<std::string> mime_types(mime_types_set.begin(),
+                                      mime_types_set.end());
+
+  // If we see that the app supports the text/plain mime-type, then the app
+  // supports all files with type text/*, as per xdg spec.
+  // https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html.
+  // In this case, remove all mime types that begin with "text/" and replace
+  // them with a single "text/*" mime type.
+  if (base::Contains(mime_types, "text/plain")) {
+    mime_types.erase(std::remove_if(mime_types.begin(), mime_types.end(),
+                                    [](const std::string& s) {
+                                      return base::StartsWith(s, "text/");
+                                    }),
+                     mime_types.end());
+    mime_types.push_back("text/*");
+  }
+
+  apps::IntentFilters intent_filters;
+  intent_filters.push_back(apps_util::CreateFileFilter(
+      {apps_util::kIntentActionView}, mime_types, extension_types,
+      // TODO(crbug/1349974): Remove activity_name when default file handling
+      // preferences for Files App are migrated.
+      /*activity_name=*/apps_util::kGuestOsActivityName));
+
+  return intent_filters;
+}
+
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/publishers/guest_os_apps.h b/chrome/browser/apps/app_service/publishers/guest_os_apps.h
index c2c0a5a9..8cfd31f7 100644
--- a/chrome/browser/apps/app_service/publishers/guest_os_apps.h
+++ b/chrome/browser/apps/app_service/publishers/guest_os_apps.h
@@ -13,6 +13,8 @@
 #include "chrome/browser/apps/app_service/app_icon/icon_key_util.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_forward.h"
 #include "chrome/browser/apps/app_service/publishers/app_publisher.h"
+#include "chrome/browser/ash/guest_os/guest_os_mime_types_service.h"
+#include "chrome/browser/ash/guest_os/guest_os_mime_types_service_factory.h"
 #include "chrome/browser/ash/guest_os/guest_os_registry_service.h"
 #include "chrome/browser/ash/guest_os/public/types.h"
 #include "components/keyed_service/core/keyed_service.h"
@@ -88,6 +90,11 @@
   apps_util::IncrementingIconKeyFactory icon_key_factory_;
 };
 
+// Create a file intent filter with mime type conditions for App Service.
+apps::IntentFilters CreateIntentFilterForAppService(
+    const guest_os::GuestOsMimeTypesService* mime_types_service,
+    const guest_os::GuestOsRegistryService::Registration& registration);
+
 }  // namespace apps
 
 #endif  // CHROME_BROWSER_APPS_APP_SERVICE_PUBLISHERS_GUEST_OS_APPS_H_
diff --git a/chrome/browser/apps/app_service/publishers/guest_os_apps_unittest.cc b/chrome/browser/apps/app_service/publishers/guest_os_apps_unittest.cc
index 67aad82..9081f71 100644
--- a/chrome/browser/apps/app_service/publishers/guest_os_apps_unittest.cc
+++ b/chrome/browser/apps/app_service/publishers/guest_os_apps_unittest.cc
@@ -17,6 +17,7 @@
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
 #include "components/services/app_service/public/cpp/app_types.h"
 #include "components/services/app_service/public/cpp/app_update.h"
+#include "components/services/app_service/public/cpp/intent_util.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -62,6 +63,8 @@
   GuestOSAppsTest()
       : task_environment_(content::BrowserTaskEnvironment::REAL_IO_THREAD) {}
 
+  TestingProfile* profile() { return profile_.get(); }
+
   AppServiceProxy* app_service_proxy() { return app_service_proxy_; }
 
   guest_os::GuestOsRegistryService* registry() { return registry_.get(); }
@@ -72,48 +75,86 @@
     web_app::test::AwaitStartWebAppProviderAndSubsystems(profile_.get());
     registry_ =
         guest_os::GuestOsRegistryServiceFactory::GetForProfile(profile_.get());
+    publisher_ = std::make_unique<TestPublisher>(app_service_proxy());
+    publisher_->InitializeForTesting();
   }
 
-  void TearDown() override { profile_.reset(); }
+  void TearDown() override {
+    // TestPublisher must be torn down before TestingProfile because the latter
+    // destroys the GuestOsRegistryService.
+    publisher_.reset();
+    profile_.reset();
+  }
+
+  // Adds the app to the registry and returns its app_id.
+  std::string AddApp(const vm_tools::apps::App& app) {
+    // Update the ApplicationList, this calls through GuestOSApps::CreateApp.
+    vm_tools::apps::ApplicationList app_list;
+    app_list.set_vm_name(bruschetta::kBruschettaVmName);
+    app_list.set_container_name("test_container");
+    *app_list.add_apps() = app;
+    registry()->UpdateApplicationList(app_list);
+    return registry()->GenerateAppId(app.desktop_file_id(),
+                                     bruschetta::kBruschettaVmName,
+                                     app_list.container_name());
+  }
+
+  // Adds an app with the specified mime_types and returns its app_id.
+  std::string AddAppWithMimeTypes(const std::string& desktop_file_id,
+                                  const std::string& app_name,
+                                  const std::vector<std::string>& mime_types) {
+    vm_tools::apps::App app;
+    for (std::string mime_type : mime_types) {
+      app.add_mime_types(mime_type);
+    }
+    app.set_desktop_file_id(desktop_file_id);
+    vm_tools::apps::App::LocaleString::Entry* entry =
+        app.mutable_name()->add_values();
+    entry->set_locale(std::string());
+    entry->set_value(app_name);
+    return AddApp(app);
+  }
+
+  // Get the registered intent filters for the given app_id.
+  std::vector<std::unique_ptr<IntentFilter>> GetIntentFiltersForApp(
+      const std::string& app_id) {
+    std::vector<std::unique_ptr<IntentFilter>> intent_filters;
+    app_service_proxy()->AppRegistryCache().ForOneApp(
+        app_id, [&intent_filters](const AppUpdate& update) {
+          for (auto& intent_filter : update.IntentFilters()) {
+            intent_filters.push_back(std::move(intent_filter));
+          }
+        });
+    return intent_filters;
+  }
 
  private:
   content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<TestingProfile> profile_;
   base::raw_ptr<AppServiceProxy> app_service_proxy_ = nullptr;
   base::raw_ptr<guest_os::GuestOsRegistryService> registry_ = nullptr;
+  std::unique_ptr<TestPublisher> publisher_;
 };
 
 TEST_F(GuestOSAppsTest, CreateApp) {
-  // Create the test publisher and register it.
-  auto pub = std::make_unique<TestPublisher>(app_service_proxy());
-  pub->InitializeForTesting();
-
   // Create a test app.
   vm_tools::apps::App app;
   app.add_mime_types("text/plain");
-  app.set_desktop_file_id("app_id");
+  app.set_desktop_file_id("desktop_file_id");
   vm_tools::apps::App::LocaleString::Entry* entry =
       app.mutable_name()->add_values();
   entry->set_value("app_name");
-
-  // Update the ApplicationList, this calls through GuestOSApps::CreateApp.
-  vm_tools::apps::ApplicationList app_list;
-  app_list.set_vm_name(bruschetta::kBruschettaVmName);
-  app_list.set_container_name("test_container");
-  *app_list.add_apps() = app;
-  registry()->UpdateApplicationList(app_list);
+  const std::string app_id = AddApp(app);
 
   // Get the AppUpdate from the registry and check its contents.
-  std::string id = registry()->GenerateAppId(
-      "app_id", bruschetta::kBruschettaVmName, "test_container");
   bool seen = false;
   app_service_proxy()->AppRegistryCache().ForOneApp(
-      id, [&seen](const AppUpdate& update) {
+      app_id, [&seen](const AppUpdate& update) {
         seen = true;
         EXPECT_EQ(update.AppType(), AppType::kBruschetta);
         EXPECT_EQ(update.Readiness(), Readiness::kReady);
         EXPECT_EQ(update.Name(), "override_name")
-            << "CreateAppOverrides should change the name.";
+            << "CreateAppOverrides should have changed the name.";
         EXPECT_EQ(update.InstallReason(), InstallReason::kUser);
         EXPECT_EQ(update.InstallSource(), InstallSource::kUnknown);
         EXPECT_TRUE(update.IconKey().has_value());
@@ -124,4 +165,123 @@
   EXPECT_TRUE(seen) << "Couldn't find test app in registry.";
 }
 
+TEST_F(GuestOSAppsTest, AppServiceHasIntentFilters) {
+  const std::vector<std::string> mime_types = {"text/csv", "text/html"};
+  const std::string app_id =
+      AddAppWithMimeTypes("desktop_file_id", "app_name", mime_types);
+  const std::vector<std::unique_ptr<IntentFilter>> intent_filters =
+      GetIntentFiltersForApp(app_id);
+
+  ASSERT_EQ(intent_filters.size(), 1U);
+  EXPECT_EQ(intent_filters[0]->conditions.size(), 2U);
+
+  // Check that the filter has the correct action type.
+  {
+    const Condition* condition = intent_filters[0]->conditions[0].get();
+    ASSERT_EQ(condition->condition_type, ConditionType::kAction);
+    EXPECT_EQ(condition->condition_values.size(), 1U);
+    ASSERT_EQ(condition->condition_values[0]->match_type,
+              PatternMatchType::kLiteral);
+    ASSERT_EQ(condition->condition_values[0]->value,
+              apps_util::kIntentActionView);
+  }
+
+  // Check that the filter has all our mime types. Realistically, the filter
+  // would also have the extension equivalents of the mime types too if there
+  // were mime/ extension mappings in prefs.
+  {
+    const Condition* condition = intent_filters[0]->conditions[1].get();
+    ASSERT_EQ(condition->condition_type, ConditionType::kFile);
+    EXPECT_EQ(condition->condition_values.size(), 2U);
+    ASSERT_EQ(condition->condition_values[0]->value, mime_types[0]);
+    ASSERT_EQ(condition->condition_values[1]->value, mime_types[1]);
+  }
+}
+
+TEST_F(GuestOSAppsTest, IntentFilterWithTextPlainAddsTextWildcardMimeType) {
+  {
+    const std::string normal_app_id = AddAppWithMimeTypes(
+        "normal_desktop_file_id", "normal_app_name", {"text/csv"});
+    const std::vector<std::unique_ptr<IntentFilter>> intent_filters =
+        GetIntentFiltersForApp(normal_app_id);
+
+    EXPECT_EQ(intent_filters.size(), 1U);
+    EXPECT_EQ(intent_filters[0]->conditions.size(), 2U);
+
+    // Check that the filter is unchanged because there isn't a "text/plain"
+    // mime type condition.
+    const Condition* condition = intent_filters[0]->conditions[1].get();
+    ASSERT_EQ(condition->condition_type, ConditionType::kFile);
+    EXPECT_EQ(condition->condition_values.size(), 1U);
+    ASSERT_EQ(condition->condition_values[0]->value, "text/csv");
+  }
+
+  {
+    const std::string many_mimes_app_id = AddAppWithMimeTypes(
+        "many_mimes_desktop_file_id", "many_mimes_app_name",
+        {"text/plain", "text/csv", "text/javascript", "video/mp4"});
+    const std::vector<std::unique_ptr<IntentFilter>> intent_filters =
+        GetIntentFiltersForApp(many_mimes_app_id);
+
+    EXPECT_EQ(intent_filters.size(), 1U);
+    EXPECT_EQ(intent_filters[0]->conditions.size(), 2U);
+
+    // Check that the filter has "text/*" to replace all the text mime types.
+    const Condition* condition = intent_filters[0]->conditions[1].get();
+    ASSERT_EQ(condition->condition_type, ConditionType::kFile);
+    EXPECT_EQ(condition->condition_values.size(), 2U);
+    ASSERT_EQ(condition->condition_values[0]->value, "video/mp4");
+    ASSERT_EQ(condition->condition_values[1]->value, "text/*");
+  }
+}
+
+TEST_F(GuestOSAppsTest, IntentFilterHasExtensionsFromPrefs) {
+  const std::string mime_type = "test/mime1";
+  const std::string extension = "test_extension";
+
+  // Update the mime_types_service to map the extension to the mime type.
+  vm_tools::apps::MimeTypes mime_types_list;
+  mime_types_list.set_vm_name(bruschetta::kBruschettaVmName);
+  mime_types_list.set_container_name("test_container");
+  (*mime_types_list.mutable_mime_type_mappings())[extension] = mime_type;
+  auto* mime_types_service =
+      guest_os::GuestOsMimeTypesServiceFactory::GetForProfile(profile());
+  mime_types_service->UpdateMimeTypes(mime_types_list);
+
+  // Create app and get its registered intent filters.
+  const std::string app_id =
+      AddAppWithMimeTypes("desktop_file_id", "app_name", {mime_type});
+  std::vector<std::unique_ptr<IntentFilter>> intent_filters =
+      GetIntentFiltersForApp(app_id);
+
+  ASSERT_EQ(intent_filters.size(), 1U);
+  std::unique_ptr<IntentFilter> intent_filter = std::move(intent_filters[0]);
+  ASSERT_EQ(intent_filter->conditions.size(), 2U);
+
+  // Check that the filter has the correct action type.
+  {
+    const Condition* condition = intent_filter->conditions[0].get();
+    EXPECT_EQ(condition->condition_type, ConditionType::kAction);
+    ASSERT_EQ(condition->condition_values.size(), 1U);
+    EXPECT_EQ(condition->condition_values[0]->match_type,
+              PatternMatchType::kLiteral);
+    EXPECT_EQ(condition->condition_values[0]->value,
+              apps_util::kIntentActionView);
+  }
+
+  // Check that the filter has both mime type and its extension equivalent based
+  // on what is recorded in prefs for GuestOS mime types.
+  {
+    const Condition* condition = intent_filter->conditions[1].get();
+    EXPECT_EQ(condition->condition_type, ConditionType::kFile);
+    ASSERT_EQ(condition->condition_values.size(), 2U);
+    EXPECT_EQ(condition->condition_values[0]->value, mime_type);
+    EXPECT_EQ(condition->condition_values[0]->match_type,
+              PatternMatchType::kMimeType);
+    EXPECT_EQ(condition->condition_values[1]->value, extension);
+    EXPECT_EQ(condition->condition_values[1]->match_type,
+              PatternMatchType::kFileExtension);
+  }
+}
+
 }  // namespace apps
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
index bec680a7..aab4970 100644
--- a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
+++ b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
@@ -1369,8 +1369,9 @@
 AppShimManager::ProfileState* AppShimManager::GetOrCreateProfileState(
     Profile* profile,
     const web_app::AppId& app_id) {
-  if (web_app::AppShimLaunchDisabled())
+  if (web_app::AppShimCreationAndLaunchDisabledForTest()) {
     return nullptr;
+  }
 
   const bool is_multi_profile = delegate_->AppIsMultiProfile(profile, app_id);
   const base::FilePath profile_path =
diff --git a/chrome/browser/apps/platform_apps/app_shim_interactive_uitest_mac.mm b/chrome/browser/apps/platform_apps/app_shim_interactive_uitest_mac.mm
index b23ebc61..abe4ccaf 100644
--- a/chrome/browser/apps/platform_apps/app_shim_interactive_uitest_mac.mm
+++ b/chrome/browser/apps/platform_apps/app_shim_interactive_uitest_mac.mm
@@ -10,7 +10,6 @@
 
 #include "apps/app_lifetime_monitor_factory.h"
 #include "apps/switches.h"
-#include "base/auto_reset.h"
 #include "base/functional/bind.h"
 #include "base/mac/foundation_util.h"
 #import "base/mac/launch_application.h"
@@ -67,8 +66,7 @@
   // Type of app to install, when invoking InstallAppWithShim().
   enum AppType { APP_TYPE_PACKAGED, APP_TYPE_HOSTED };
 
-  AppShimInteractiveTest()
-      : auto_reset_(&g_app_shims_allow_update_and_launch_in_tests, true) {}
+  AppShimInteractiveTest() = default;
 
   // Install a test app of |type| and reliably wait for its app shim to be
   // created on disk. Sets |shim_path_|.
@@ -77,10 +75,6 @@
 
  protected:
   base::FilePath shim_path_;
-
- private:
-  // Temporarily enable app shims.
-  base::AutoReset<bool> auto_reset_;
 };
 
 // Watches for an app shim to connect.
@@ -292,8 +286,7 @@
   shim_path_ = GetAppShimPath(profile(), app);
   EXPECT_FALSE(base::PathExists(shim_path_));
 
-  // To create a shim in a test, instead call UpdateAllShortcuts, which has been
-  // blessed by g_app_shims_allow_update_and_launch_in_tests.
+  // To create a shim in a test, instead call UpdateAllShortcuts.
   base::RunLoop run_loop;
   web_app::UpdateAllShortcuts(std::u16string(), profile(), app,
                               run_loop.QuitClosure());
diff --git a/chrome/browser/ash/app_list/app_list_client_impl.cc b/chrome/browser/ash/app_list/app_list_client_impl.cc
index e00fd682..2c67efe 100644
--- a/chrome/browser/ash/app_list/app_list_client_impl.cc
+++ b/chrome/browser/ash/app_list/app_list_client_impl.cc
@@ -9,13 +9,17 @@
 #include <utility>
 #include <vector>
 
+#include "ash/app_list/app_list_view_delegate.h"
+#include "ash/public/cpp/app_list/app_list_client.h"
 #include "ash/public/cpp/app_list/app_list_controller.h"
 #include "ash/public/cpp/app_list/app_list_types.h"
 #include "ash/public/cpp/new_window_delegate.h"
 #include "ash/public/cpp/tablet_mode.h"
 #include "ash/shell.h"
 #include "ash/system/federated/federated_service_controller_impl.h"
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
+#include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
@@ -32,6 +36,7 @@
 #include "chrome/browser/ash/app_list/search/search_controller_factory.h"
 #include "chrome/browser/ash/crosapi/browser_util.h"
 #include "chrome/browser/ash/crosapi/url_handler_ash.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
@@ -47,6 +52,8 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
 #include "chromeos/crosapi/cpp/gurl_os_handler_utils.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/feature_engagement/public/tracker.h"
 #include "components/session_manager/core/session_manager.h"
 #include "ui/base/page_transition_types.h"
 #include "ui/display/types/display_constants.h"
@@ -117,6 +124,21 @@
   }
 }
 
+class ScopedIphSessionImpl : public ash::ScopedIphSession {
+ public:
+  explicit ScopedIphSessionImpl(raw_ptr<feature_engagement::Tracker> tracker,
+                                const base::Feature& iph_feature)
+      : tracker_(tracker), iph_feature_(iph_feature) {
+    CHECK(tracker_);
+  }
+
+  ~ScopedIphSessionImpl() override { tracker_->Dismissed(iph_feature_); }
+
+ private:
+  raw_ptr<feature_engagement::Tracker> tracker_;
+  const base::Feature& iph_feature_;
+};
+
 }  // namespace
 
 AppListClientImpl::AppListClientImpl()
@@ -527,6 +549,7 @@
 
   SetUpSearchUI();
   OnTemplateURLServiceChanged();
+  QueryWouldTriggerLauncherSearchIph();
 }
 
 void AppListClientImpl::SetUpSearchUI() {
@@ -668,6 +691,36 @@
   return app_list_notifier_.get();
 }
 
+void AppListClientImpl::QueryWouldTriggerLauncherSearchIph() {
+  // This can be called before a `Profile` is set to `AppListClientImpl`. If a
+  // `Profile` is not set yet, return here. `AppListClientImpl::SetProfile` will
+  // call this method once a `Profile` is set.
+  if (!current_model_updater_) {
+    return;
+  }
+
+  current_model_updater_->QueryWouldTriggerLauncherSearchIph();
+}
+
+std::unique_ptr<ash::ScopedIphSession>
+AppListClientImpl::CreateLauncherSearchIphSession() {
+  if (profile_ == nullptr) {
+    return nullptr;
+  }
+
+  raw_ptr<feature_engagement::Tracker> tracker =
+      feature_engagement::TrackerFactory::GetForBrowserContext(profile_);
+  if (!tracker->ShouldTriggerHelpUI(
+          feature_engagement::kIPHLauncherSearchHelpUiFeature)) {
+    return nullptr;
+  }
+
+  // If we call `ShouldTriggerHelpUI` above, we must show an IPH, i.e. we must
+  // return `ScopedIphSessionImpl`.
+  return std::make_unique<ScopedIphSessionImpl>(
+      tracker, feature_engagement::kIPHLauncherSearchHelpUiFeature);
+}
+
 void AppListClientImpl::LoadIcon(int profile_id, const std::string& app_id) {
   auto* requested_model_updater = profile_model_mappings_[profile_id];
   if (requested_model_updater != current_model_updater_ ||
diff --git a/chrome/browser/ash/app_list/app_list_client_impl.h b/chrome/browser/ash/app_list/app_list_client_impl.h
index 19f2f00..97cafd51 100644
--- a/chrome/browser/ash/app_list/app_list_client_impl.h
+++ b/chrome/browser/ash/app_list/app_list_client_impl.h
@@ -20,6 +20,7 @@
 #include "base/scoped_observation.h"
 #include "base/time/time.h"
 #include "chrome/browser/ash/app_list/app_list_controller_delegate.h"
+#include "components/feature_engagement/public/tracker.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/search_engines/template_url_service_observer.h"
 #include "components/session_manager/core/session_manager_observer.h"
@@ -104,6 +105,9 @@
       const std::string& setting_name,
       const std::map<std::string, int>& values) override;
   ash::AppListNotifier* GetNotifier() override;
+  void QueryWouldTriggerLauncherSearchIph() override;
+  std::unique_ptr<ash::ScopedIphSession> CreateLauncherSearchIphSession()
+      override;
   void LoadIcon(int profile_id, const std::string& app_id) override;
   ash::AppListSortOrder GetPermanentSortingOrder() const override;
 
diff --git a/chrome/browser/ash/app_list/app_list_model_updater.h b/chrome/browser/ash/app_list/app_list_model_updater.h
index 4341c93..d0e50a0 100644
--- a/chrome/browser/ash/app_list/app_list_model_updater.h
+++ b/chrome/browser/ash/app_list/app_list_model_updater.h
@@ -120,6 +120,7 @@
   virtual size_t BadgedItemCount() = 0;
   // For SearchModel:
   virtual bool SearchEngineIsGoogle() = 0;
+  virtual void QueryWouldTriggerLauncherSearchIph() = 0;
 
   // Notifies when the app list gets hidden.
   virtual void OnAppListHidden() = 0;
diff --git a/chrome/browser/ash/app_list/chrome_app_list_model_updater.cc b/chrome/browser/ash/app_list/chrome_app_list_model_updater.cc
index 5bc7fcc..929ea05 100644
--- a/chrome/browser/ash/app_list/chrome_app_list_model_updater.cc
+++ b/chrome/browser/ash/app_list/chrome_app_list_model_updater.cc
@@ -15,6 +15,7 @@
 #include "ash/public/cpp/app_list/app_list_controller.h"
 #include "ash/public/cpp/app_list/app_list_metrics.h"
 #include "ash/public/cpp/tablet_mode.h"
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/app_list/app_list_controller_delegate.h"
@@ -24,6 +25,10 @@
 #include "chrome/browser/ash/app_list/reorder/app_list_reorder_core.h"
 #include "chrome/browser/ash/app_list/reorder/app_list_reorder_delegate.h"
 #include "chrome/browser/ash/app_list/search/chrome_search_result.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/feature_engagement/public/tracker.h"
 #include "extensions/common/constants.h"
 #include "ui/base/models/menu_model.h"
 
@@ -283,6 +288,44 @@
   search_model_.SetSearchEngineIsGoogle(is_google);
 }
 
+void ChromeAppListModelUpdater::QueryWouldTriggerLauncherSearchIph() {
+  raw_ptr<feature_engagement::Tracker> tracker =
+      feature_engagement::TrackerFactory::GetForBrowserContext(profile_);
+  if (!tracker) {
+    // Set false as a fail-safe behavior.
+    search_model_.SetWouldTriggerLauncherSearchIph(false);
+    return;
+  }
+
+  // `AddOnInitializedCallback` will call the callback immediately if it's
+  // already initialized.
+  tracker->AddOnInitializedCallback(base::BindOnce(
+      &ChromeAppListModelUpdater::OnFeatureEngagementTrackerInitialized,
+      weak_ptr_factory_.GetWeakPtr()));
+}
+
+void ChromeAppListModelUpdater::OnFeatureEngagementTrackerInitialized(
+    bool success) {
+  if (!success) {
+    // Set false as a fail-safe behavior.
+    search_model_.SetWouldTriggerLauncherSearchIph(false);
+    return;
+  }
+
+  // To be on a safer side, query tracker instance again to minimize the
+  // duration of holding a tracker object.
+  raw_ptr<feature_engagement::Tracker> tracker =
+      feature_engagement::TrackerFactory::GetForBrowserContext(profile_);
+  if (!tracker) {
+    // Set false as a fail-safe behavior.
+    search_model_.SetWouldTriggerLauncherSearchIph(false);
+    return;
+  }
+
+  search_model_.SetWouldTriggerLauncherSearchIph(tracker->WouldTriggerHelpUI(
+      feature_engagement::kIPHLauncherSearchHelpUiFeature));
+}
+
 void ChromeAppListModelUpdater::PublishSearchResults(
     const std::vector<ChromeSearchResult*>& results,
     const std::vector<ash::AppListSearchResultCategory>& categories) {
diff --git a/chrome/browser/ash/app_list/chrome_app_list_model_updater.h b/chrome/browser/ash/app_list/chrome_app_list_model_updater.h
index 332a61f3..38cb761 100644
--- a/chrome/browser/ash/app_list/chrome_app_list_model_updater.h
+++ b/chrome/browser/ash/app_list/chrome_app_list_model_updater.h
@@ -53,6 +53,7 @@
   void RemoveItem(const std::string& id, bool is_uninstall) override;
   void SetStatus(ash::AppListModelStatus status) override;
   void SetSearchEngineIsGoogle(bool is_google) override;
+  void QueryWouldTriggerLauncherSearchIph() override;
   void PublishSearchResults(
       const std::vector<ChromeSearchResult*>& results,
       const std::vector<ash::AppListSearchResultCategory>& categories) override;
@@ -201,6 +202,8 @@
   // list is sorted by color.
   void MaybeUpdatePositionWhenIconColorChange(ash::AppListItemMetadata* data);
 
+  void OnFeatureEngagementTrackerInitialized(bool success);
+
   // Indicates the profile that the model updater is associated with.
   Profile* const profile_ = nullptr;
 
diff --git a/chrome/browser/ash/app_list/launcher_search_iph_browsertest.cc b/chrome/browser/ash/app_list/launcher_search_iph_browsertest.cc
new file mode 100644
index 0000000..82b1352
--- /dev/null
+++ b/chrome/browser/ash/app_list/launcher_search_iph_browsertest.cc
@@ -0,0 +1,181 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/app_list/app_list_public_test_util.h"
+#include "ash/app_list/views/launcher_search_iph_view.h"
+#include "ash/app_list/views/search_box_view.h"
+#include "ash/public/cpp/test/app_list_test_api.h"
+#include "base/command_line.h"
+#include "base/run_loop.h"
+#include "base/scoped_observation.h"
+#include "chrome/browser/ash/app_list/app_list_client_impl.h"
+#include "chrome/browser/ui/ash/assistant/assistant_test_mixin.h"
+#include "chrome/test/base/mixin_based_in_process_browser_test.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/feature_engagement/test/scoped_iph_feature_list.h"
+#include "content/public/test/browser_test.h"
+#include "ui/aura/window.h"
+#include "ui/events/test/event_generator.h"
+#include "ui/views/controls/button/image_button.h"
+#include "ui/views/view.h"
+#include "ui/views/view_observer.h"
+
+namespace {
+class ViewWaiter : public views::ViewObserver {
+ public:
+  ViewWaiter(raw_ptr<views::View> observed_view, int view_id)
+      : observed_view_(observed_view), view_id_(view_id) {}
+
+  void Run() {
+    if (observed_view_->GetViewByID(view_id_)) {
+      return;
+    }
+
+    scoped_observation_.Observe(observed_view_);
+    run_loop.Run();
+  }
+
+  void OnViewHierarchyChanged(
+      views::View* observed_view,
+      const views::ViewHierarchyChangedDetails& details) override {
+    if (observed_view_->GetViewByID(view_id_)) {
+      run_loop.Quit();
+    }
+  }
+
+ private:
+  raw_ptr<views::View> observed_view_;
+  int view_id_;
+  base::ScopedObservation<views::View, ViewWaiter> scoped_observation_{this};
+  base::RunLoop run_loop;
+};
+
+bool IsLauncherSearchIphViewVisible() {
+  raw_ptr<ash::SearchBoxView> search_box_view = ash::GetSearchBoxView();
+  if (!search_box_view) {
+    return false;
+  }
+
+  raw_ptr<views::View> launcher_search_iph_view =
+      search_box_view->GetViewByID(ash::LauncherSearchIphView::kViewId);
+  if (!launcher_search_iph_view) {
+    return false;
+  }
+
+  return launcher_search_iph_view->GetVisible();
+}
+}  // namespace
+
+class AppListIphBrowserTest : public MixinBasedInProcessBrowserTest {
+ protected:
+  ash::assistant::AssistantTestMixin assistant_test_mixin_{
+      &mixin_host_, this, embedded_test_server(),
+      ash::assistant::FakeS3Mode::kReplay, 1};
+};
+
+class AppListIphBrowerTestWithDemoMode : public AppListIphBrowserTest {
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    scoped_iph_feature_list_ =
+        std::make_unique<feature_engagement::test::ScopedIphFeatureList>();
+    scoped_iph_feature_list_->InitForDemo(
+        feature_engagement::kIPHLauncherSearchHelpUiFeature);
+
+    MixinBasedInProcessBrowserTest::SetUpCommandLine(command_line);
+  }
+
+ private:
+  std::unique_ptr<feature_engagement::test::ScopedIphFeatureList>
+      scoped_iph_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(AppListIphBrowserTest,
+                       LauncherSearchIphNotShownByDefault) {
+  raw_ptr<AppListClientImpl> client_impl = AppListClientImpl::GetInstance();
+  client_impl->UpdateProfile();
+
+  assistant_test_mixin_.StartAssistantAndWaitForReady();
+
+  client_impl->ShowAppList(ash::AppListShowSource::kSearchKey);
+  ash::AppListTestApi().WaitForBubbleWindow(
+      /*wait_for_opening_animation=*/false);
+  EXPECT_FALSE(IsLauncherSearchIphViewVisible());
+}
+
+IN_PROC_BROWSER_TEST_F(AppListIphBrowerTestWithDemoMode, LauncherSearchIph) {
+  raw_ptr<AppListClientImpl> client_impl = AppListClientImpl::GetInstance();
+  client_impl->UpdateProfile();
+
+  assistant_test_mixin_.StartAssistantAndWaitForReady();
+
+  client_impl->ShowAppList(ash::AppListShowSource::kSearchKey);
+  ash::AppListTestApi().WaitForBubbleWindow(
+      /*wait_for_opening_animation=*/false);
+  raw_ptr<ash::SearchBoxView> search_box_view = ash::GetSearchBoxView();
+  ASSERT_TRUE(search_box_view);
+  // There is an async call for checking IPH trigger condition.
+  ViewWaiter(search_box_view, ash::LauncherSearchIphView::kViewId).Run();
+  EXPECT_TRUE(IsLauncherSearchIphViewVisible());
+
+  // Dismiss the app list and show it again. IPH won't be shown this time. Note
+  // that this is IPH demo mode behavior.
+  client_impl->DismissView();
+  ASSERT_FALSE(client_impl->GetAppListWindow());
+
+  client_impl->ShowAppList(ash::AppListShowSource::kSearchKey);
+  ash::AppListTestApi().WaitForBubbleWindow(
+      /*wait_for_opening_animation=*/false);
+
+  EXPECT_FALSE(IsLauncherSearchIphViewVisible());
+}
+
+IN_PROC_BROWSER_TEST_F(AppListIphBrowerTestWithDemoMode,
+                       LauncherSearchIphSearch) {
+  raw_ptr<AppListClientImpl> client_impl = AppListClientImpl::GetInstance();
+  client_impl->UpdateProfile();
+
+  assistant_test_mixin_.StartAssistantAndWaitForReady();
+
+  client_impl->ShowAppList(ash::AppListShowSource::kSearchKey);
+  ash::AppListTestApi().WaitForBubbleWindow(
+      /*wait_for_opening_animation=*/false);
+  raw_ptr<ash::SearchBoxView> search_box_view = ash::GetSearchBoxView();
+  ASSERT_TRUE(search_box_view);
+  // There is an async call for checking IPH trigger condition.
+  ViewWaiter(search_box_view, ash::LauncherSearchIphView::kViewId).Run();
+  EXPECT_TRUE(IsLauncherSearchIphViewVisible());
+
+  // Do search and confirm that the IPH gets dismissed.
+  ash::AppListTestApi().SimulateSearch(u"Test");
+  EXPECT_FALSE(IsLauncherSearchIphViewVisible());
+}
+
+IN_PROC_BROWSER_TEST_F(AppListIphBrowerTestWithDemoMode,
+                       LauncherSearchIphAssistant) {
+  raw_ptr<AppListClientImpl> client_impl = AppListClientImpl::GetInstance();
+  client_impl->UpdateProfile();
+
+  assistant_test_mixin_.StartAssistantAndWaitForReady();
+
+  client_impl->ShowAppList(ash::AppListShowSource::kSearchKey);
+  ash::AppListTestApi().WaitForBubbleWindow(
+      /*wait_for_opening_animation=*/false);
+  raw_ptr<ash::SearchBoxView> search_box_view = ash::GetSearchBoxView();
+  ASSERT_TRUE(search_box_view);
+  // There is an async call for checking IPH trigger condition.
+  ViewWaiter(search_box_view, ash::LauncherSearchIphView::kViewId).Run();
+  EXPECT_TRUE(IsLauncherSearchIphViewVisible());
+
+  // Clicks Assistant button to open Assistant UI and confirm that IPH gets
+  // dismissed.
+  raw_ptr<views::ImageButton> assistant_button =
+      search_box_view->assistant_button();
+  ASSERT_TRUE(assistant_button);
+  ui::test::EventGenerator event_generator(
+      assistant_button->GetWidget()->GetNativeWindow()->GetRootWindow());
+  event_generator.MoveMouseToInHost(
+      assistant_button->GetBoundsInScreen().CenterPoint());
+  event_generator.ClickLeftButton();
+
+  EXPECT_FALSE(IsLauncherSearchIphViewVisible());
+}
diff --git a/chrome/browser/ash/app_list/test/fake_app_list_model_updater.cc b/chrome/browser/ash/app_list/test/fake_app_list_model_updater.cc
index e2d647d..a26d8d7 100644
--- a/chrome/browser/ash/app_list/test/fake_app_list_model_updater.cc
+++ b/chrome/browser/ash/app_list/test/fake_app_list_model_updater.cc
@@ -189,6 +189,8 @@
   return search_engine_is_google_;
 }
 
+void FakeAppListModelUpdater::QueryWouldTriggerLauncherSearchIph() {}
+
 void FakeAppListModelUpdater::PublishSearchResults(
     const std::vector<ChromeSearchResult*>& results,
     const std::vector<ash::AppListSearchResultCategory>& categories) {
diff --git a/chrome/browser/ash/app_list/test/fake_app_list_model_updater.h b/chrome/browser/ash/app_list/test/fake_app_list_model_updater.h
index dc13be8..d7baa125 100644
--- a/chrome/browser/ash/app_list/test/fake_app_list_model_updater.h
+++ b/chrome/browser/ash/app_list/test/fake_app_list_model_updater.h
@@ -70,6 +70,7 @@
 
   // For SearchModel:
   bool SearchEngineIsGoogle() override;
+  void QueryWouldTriggerLauncherSearchIph() override;
   const std::vector<ChromeSearchResult*>& search_results() const {
     return search_results_;
   }
diff --git a/chrome/browser/ash/arc/notification/arc_vm_data_migration_notifier_unittest.cc b/chrome/browser/ash/arc/notification/arc_vm_data_migration_notifier_unittest.cc
index 2a71365..9078407 100644
--- a/chrome/browser/ash/arc/notification/arc_vm_data_migration_notifier_unittest.cc
+++ b/chrome/browser/ash/arc/notification/arc_vm_data_migration_notifier_unittest.cc
@@ -10,6 +10,7 @@
 #include "ash/components/arc/session/arc_session_runner.h"
 #include "ash/components/arc/session/arc_vm_data_migration_status.h"
 #include "ash/components/arc/test/fake_arc_session.h"
+#include "ash/test/ash_test_base.h"
 #include "base/command_line.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ash/arc/session/arc_session_manager.h"
@@ -35,9 +36,11 @@
 
 constexpr char kNotificationId[] = "arc_vm_data_migration_notification";
 
-class ArcVmDataMigrationNotifierTest : public testing::Test {
+class ArcVmDataMigrationNotifierTest : public ash::AshTestBase {
  public:
-  ArcVmDataMigrationNotifierTest() {
+  ArcVmDataMigrationNotifierTest()
+      : ash::AshTestBase(std::unique_ptr<base::test::TaskEnvironment>(
+            std::make_unique<content::BrowserTaskEnvironment>())) {
     base::CommandLine::ForCurrentProcess()->InitFromArgv(
         {"", "--arc-availability=officially-supported", "--enable-arcvm"});
   }
@@ -50,6 +53,7 @@
       const ArcVmDataMigrationNotifierTest&) = delete;
 
   void SetUp() override {
+    ash::AshTestBase::SetUp();
     ash::ConciergeClient::InitializeFake();
     ArcSessionManager::SetUiEnabledForTesting(false);
     arc_session_manager_ =
@@ -88,6 +92,7 @@
     arc_vm_data_migration_notifier_.reset();
     arc_session_manager_.reset();
     ash::ConciergeClient::Shutdown();
+    ash::AshTestBase::TearDown();
   }
 
   ArcSessionManager* arc_session_manager() {
@@ -101,7 +106,6 @@
   TestingProfile* profile() { return testing_profile_; }
 
  private:
-  content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<ArcSessionManager> arc_session_manager_;
   std::unique_ptr<ArcVmDataMigrationNotifier> arc_vm_data_migration_notifier_;
   std::unique_ptr<TestingProfileManager> profile_manager_;
diff --git a/chrome/browser/ash/eol_notification.cc b/chrome/browser/ash/eol_notification.cc
index 29df0760..7e072ed2 100644
--- a/chrome/browser/ash/eol_notification.cc
+++ b/chrome/browser/ash/eol_notification.cc
@@ -17,6 +17,7 @@
 #include "base/time/default_clock.h"
 #include "base/time/time.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/ash/eol_incentive_util.h"
 #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
@@ -51,7 +52,7 @@
 
 // The first and second incentive notification button indices.
 constexpr int kButtonClaim = 0;
-constexpr int kButtonSilence = 1;
+constexpr int kButtonAboutUpdates = 1;
 
 // The number of days past the EOL within which the last incentive notification
 // is shown.
@@ -215,16 +216,24 @@
       dismiss_pref_ == prefs::kEolPassedFinalIncentiveDismissed) {
     switch (*button_index) {
       case kButtonClaim:
-        // TODO (b/271150076): Fetch and open link on button click.
+        // Open link for eol incentive notification.
+        NewWindowDelegate::GetPrimary()->OpenUrl(
+            GURL(features::kEolIncentiveParam.Get() ==
+                         features::EolIncentiveParam::kNoOffer
+                     ? chrome::kEolIncentiveNotificationNoOfferURL
+                     : chrome::kEolIncentiveNotificationOfferURL),
+            NewWindowDelegate::OpenUrlFrom::kUserInteraction,
+            NewWindowDelegate::Disposition::kNewForegroundTab);
         break;
-      case kButtonSilence:
-        // Close and do not show any eol notification again.
-        profile_->GetPrefs()->SetBoolean(
-            prefs::kEolIncentiveNotificationSilenced, true);
-        profile_->GetPrefs()->SetBoolean(prefs::kEolNotificationDismissed,
-                                         true);
+      case kButtonAboutUpdates:
+        // Open link to learn more about updates.
+        NewWindowDelegate::GetPrimary()->OpenUrl(
+            GURL(chrome::kEolNotificationURL),
+            NewWindowDelegate::OpenUrlFrom::kUserInteraction,
+            NewWindowDelegate::Disposition::kNewForegroundTab);
         break;
     }
+    profile_->GetPrefs()->SetBoolean(prefs::kEolNotificationDismissed, true);
   } else {
     switch (*button_index) {
       case BUTTON_MORE_INFO: {
@@ -260,11 +269,6 @@
   const base::TimeDelta time_to_eol = eol_date - now;
   const int days_to_eol = time_to_eol.InDays();
 
-  if (profile_->GetPrefs()->GetBoolean(
-          prefs::kEolIncentiveNotificationSilenced)) {
-    return;
-  }
-
   switch (incentive_type) {
     case eol_incentive_util::EolIncentiveType::kNone:
     case eol_incentive_util::EolIncentiveType::kEolPassed:
@@ -292,10 +296,12 @@
     return;
   }
 
-  ShowIncentiveNotification();
+  ShowIncentiveNotification(eol_date, incentive_type);
 }
 
-void EolNotification::ShowIncentiveNotification() {
+void EolNotification::ShowIncentiveNotification(
+    base::Time eol_date,
+    eol_incentive_util::EolIncentiveType incentive_type) {
   message_center::RichNotificationData data;
   ash::SystemNotificationBuilder notification_builder;
 
@@ -313,19 +319,78 @@
   data.image = gfx::Image(gfx::ImageSkiaOperations::CreateSuperimposedImage(
       background, incentive_image));
 
-  // TODO (b/271150076): Add localized string IDS once strings get finalized.
-  data.buttons.emplace_back(u"Claim Offer");
-  data.buttons.emplace_back(u"Don't Show This Again");
-  notification_builder.SetTitle(u"Don't miss out on new features")
-      .SetMessage(
-          u"This device will no longer get automatic software and security "
-          u"updates after Month Year. Update to a newer model to get future "
-          u"updates and get [offer].")
-      .SetCatalogName(NotificationCatalogName::kEOLIncentive);
+  features::EolIncentiveParam incentive_param =
+      ash::features::kEolIncentiveParam.Get();
+
+  switch (incentive_param) {
+    case features::EolIncentiveParam::kNoOffer:
+      data.buttons.emplace_back(GetStringUTF16(IDS_LEARN_MORE));
+
+      if (incentive_type ==
+          eol_incentive_util::EolIncentiveType::kEolApproaching) {
+        notification_builder
+            .SetTitle(GetStringUTF16(
+                IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_NO_OFFER_EXPIRING_SOON))
+            .SetMessageWithArgs(
+                IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_NO_OFFER_EXPIRING_SOON,
+                {TimeFormatMonthAndYearForTimeZone(eol_date,
+                                                   icu::TimeZone::getGMT())});
+      } else {
+        notification_builder
+            .SetTitle(GetStringUTF16(
+                IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_NO_OFFER_EXPIRED))
+            .SetMessage(GetStringUTF16(
+                IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_NO_OFFER_EXPIRED));
+      }
+      break;
+    case features::EolIncentiveParam::kOffer:
+      data.buttons.emplace_back(
+          GetStringUTF16(IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_SHOP_BUTTON));
+      data.buttons.emplace_back(
+          GetStringUTF16(IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_ABOUT_BUTTON));
+      notification_builder.SetTitle(
+          GetStringUTF16(IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER));
+
+      if (incentive_type ==
+          eol_incentive_util::EolIncentiveType::kEolApproaching) {
+        notification_builder.SetMessageWithArgs(
+            IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRING_SOON,
+            {TimeFormatMonthAndYearForTimeZone(eol_date,
+                                               icu::TimeZone::getGMT())});
+      } else {
+        notification_builder.SetMessage(GetStringUTF16(
+            IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRED));
+      }
+      break;
+    case features::EolIncentiveParam::kOfferWithWarning:
+      data.buttons.emplace_back(
+          GetStringUTF16(IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_SHOP_BUTTON));
+      data.buttons.emplace_back(
+          GetStringUTF16(IDS_EOL_INCENTIVE_NOTIFICATION_OFFER_ABOUT_BUTTON));
+
+      if (incentive_type ==
+          eol_incentive_util::EolIncentiveType::kEolApproaching) {
+        notification_builder
+            .SetTitle(GetStringUTF16(
+                IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER_WITH_WARNING_EXPIRING_SOON))
+            .SetMessageWithArgs(
+                IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRING_SOON,
+                {TimeFormatMonthAndYearForTimeZone(eol_date,
+                                                   icu::TimeZone::getGMT())});
+      } else {
+        notification_builder
+            .SetTitle(GetStringUTF16(
+                IDS_EOL_INCENTIVE_NOTIFICATION_TITLE_OFFER_WITH_WARNING_EXPIRED))
+            .SetMessage(GetStringUTF16(
+                IDS_EOL_INCENTIVE_NOTIFICATION_MESSAGE_OFFER_EXPIRED));
+      }
+      break;
+  }
 
   NotificationDisplayServiceFactory::GetForProfile(profile_)->Display(
       NotificationHandler::Type::TRANSIENT,
       notification_builder.SetId(kEolNotificationId)
+          .SetCatalogName(NotificationCatalogName::kEOLIncentive)
           .SetOriginUrl(GURL(kEolNotificationId))
           .SetOptionalFields(data)
           .SetDelegate(
@@ -343,8 +408,6 @@
       prefs::kEolApproachingIncentiveNotificationDismissed, false);
   profile_->GetPrefs()->SetBoolean(prefs::kEolPassedFinalIncentiveDismissed,
                                    false);
-  profile_->GetPrefs()->SetBoolean(prefs::kEolIncentiveNotificationSilenced,
-                                   false);
 }
 
 }  // namespace ash
diff --git a/chrome/browser/ash/eol_notification.h b/chrome/browser/ash/eol_notification.h
index a49e429..ec81aff 100644
--- a/chrome/browser/ash/eol_notification.h
+++ b/chrome/browser/ash/eol_notification.h
@@ -73,7 +73,9 @@
       eol_incentive_util::EolIncentiveType incentive_type);
 
   // Creates the EOL incentive notification.
-  void ShowIncentiveNotification();
+  void ShowIncentiveNotification(
+      base::Time eol_date,
+      eol_incentive_util::EolIncentiveType incentive_type);
 
   // Resets all notification dismissed prefs back to false.
   void ResetDismissedPrefs();
diff --git a/chrome/browser/ash/eol_notification_unittest.cc b/chrome/browser/ash/eol_notification_unittest.cc
index 209b2de..dace0af 100644
--- a/chrome/browser/ash/eol_notification_unittest.cc
+++ b/chrome/browser/ash/eol_notification_unittest.cc
@@ -381,15 +381,4 @@
       profile()->GetPrefs()->GetBoolean(prefs::kEolNotificationDismissed));
 }
 
-TEST_F(EolIncentiveNotificationTest, TestIncentiveSilenced) {
-  SetCurrentTimeToUtc("1 December 2023");
-  SetEolDateUtc("1 December 2023");
-  profile()->GetPrefs()->SetBoolean(prefs::kEolIncentiveNotificationSilenced,
-                                    true);
-
-  CheckEolInfo();
-  auto notification = tester_->GetNotification("chrome://product_eol");
-  ASSERT_FALSE(notification);
-}
-
 }  // namespace ash
diff --git a/chrome/browser/ash/events/event_rewriter_delegate_impl.cc b/chrome/browser/ash/events/event_rewriter_delegate_impl.cc
index dd5a550..2aa41d1 100644
--- a/chrome/browser/ash/events/event_rewriter_delegate_impl.cc
+++ b/chrome/browser/ash/events/event_rewriter_delegate_impl.cc
@@ -16,7 +16,9 @@
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/user_manager/user_manager.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/aura/client/aura_constants.h"
+#include "ui/chromeos/events/mojom/modifier_key.mojom-shared.h"
 #include "ui/message_center/message_center.h"
 
 namespace ash {
@@ -55,28 +57,49 @@
   return !suppress_modifier_key_rewrites_;
 }
 
-bool EventRewriterDelegateImpl::GetKeyboardRemappedPrefValue(
-    const std::string& pref_name,
-    int* value) const {
-  DCHECK(value);
-  // If we're at the login screen, try to get the pref from the global prefs
-  // dictionary.
-  if (LoginDisplayHost::default_host() &&
-      LoginDisplayHost::default_host()->GetKeyboardRemappedPrefValue(pref_name,
-                                                                     value)) {
-    return true;
-  }
-  const PrefService* pref_service = GetPrefService();
-  if (!pref_service)
-    return false;
-  const PrefService::Preference* preference =
-      pref_service->FindPreference(pref_name);
-  if (!preference)
-    return false;
+absl::optional<ui::mojom::ModifierKey>
+EventRewriterDelegateImpl::GetKeyboardRemappedModifierValue(
+    int device_id,
+    ui::mojom::ModifierKey modifier_key,
+    const std::string& pref_name) const {
+  // `modifier_key` and `device_id` are unused when the flag is disabled.
+  if (!ash::features::IsInputDeviceSettingsSplitEnabled()) {
+    // If we're at the login screen, try to get the pref from the global prefs
+    // dictionary.
+    int value;
+    if (LoginDisplayHost::default_host() &&
+        LoginDisplayHost::default_host()->GetKeyboardRemappedPrefValue(
+            pref_name, &value)) {
+      return static_cast<ui::mojom::ModifierKey>(value);
+    }
+    const PrefService* pref_service = GetPrefService();
+    if (!pref_service) {
+      return absl::nullopt;
+    }
+    const PrefService::Preference* preference =
+        pref_service->FindPreference(pref_name);
+    if (!preference) {
+      return absl::nullopt;
+    }
 
-  DCHECK_EQ(preference->GetType(), base::Value::Type::INTEGER);
-  *value = preference->GetValue()->GetInt();
-  return true;
+    DCHECK_EQ(preference->GetType(), base::Value::Type::INTEGER);
+    return static_cast<ui::mojom::ModifierKey>(
+        preference->GetValue()->GetInt());
+  }
+
+  // `pref_name` is unused when the flag is enabled.
+  const mojom::KeyboardSettings* settings =
+      input_device_settings_controller_->GetKeyboardSettings(device_id);
+  if (!settings) {
+    return modifier_key;
+  }
+
+  auto iter = settings->modifier_remappings.find(modifier_key);
+  if (iter == settings->modifier_remappings.end()) {
+    return modifier_key;
+  }
+
+  return iter->second;
 }
 
 bool EventRewriterDelegateImpl::TopRowKeysAreFunctionKeys(int device_id) const {
@@ -129,8 +152,17 @@
          active_window->GetProperty(kSearchKeyAcceleratorReservedKey);
 }
 
-bool EventRewriterDelegateImpl::RewriteMetaTopRowKeyComboEvents() const {
-  return !suppress_meta_top_row_key_rewrites_;
+bool EventRewriterDelegateImpl::RewriteMetaTopRowKeyComboEvents(
+    int device_id) const {
+  // When the flag is disabled, `device_id` is unused.
+  if (!ash::features::IsInputDeviceSettingsSplitEnabled()) {
+    return !suppress_meta_top_row_key_rewrites_;
+  }
+
+  const mojom::KeyboardSettings* settings =
+      input_device_settings_controller_->GetKeyboardSettings(device_id);
+  // TODO(dpad): Add metric for when settings are not able to be found.
+  return !(settings && settings->suppress_meta_fkey_rewrites);
 }
 
 void EventRewriterDelegateImpl::SuppressMetaTopRowKeyComboRewrites(
diff --git a/chrome/browser/ash/events/event_rewriter_delegate_impl.h b/chrome/browser/ash/events/event_rewriter_delegate_impl.h
index 50f1e9a..b30cad9 100644
--- a/chrome/browser/ash/events/event_rewriter_delegate_impl.h
+++ b/chrome/browser/ash/events/event_rewriter_delegate_impl.h
@@ -35,9 +35,11 @@
 
   // ui::EventRewriterChromeOS::Delegate:
   bool RewriteModifierKeys() override;
-  bool RewriteMetaTopRowKeyComboEvents() const override;
-  bool GetKeyboardRemappedPrefValue(const std::string& pref_name,
-                                    int* result) const override;
+  bool RewriteMetaTopRowKeyComboEvents(int device_id) const override;
+  absl::optional<ui::mojom::ModifierKey> GetKeyboardRemappedModifierValue(
+      int device_id,
+      ui::mojom::ModifierKey modifier_key,
+      const std::string& pref_name) const override;
   bool TopRowKeysAreFunctionKeys(int device_id) const override;
   bool IsExtensionCommandRegistered(ui::KeyboardCode key_code,
                                     int flags) const override;
diff --git a/chrome/browser/ash/events/event_rewriter_unittest.cc b/chrome/browser/ash/events/event_rewriter_unittest.cc
index 502f241..68590ae0 100644
--- a/chrome/browser/ash/events/event_rewriter_unittest.cc
+++ b/chrome/browser/ash/events/event_rewriter_unittest.cc
@@ -41,6 +41,7 @@
 #include "ui/base/ui_base_features.h"
 #include "ui/chromeos/events/event_rewriter_chromeos.h"
 #include "ui/chromeos/events/keyboard_capability.h"
+#include "ui/chromeos/events/mojom/modifier_key.mojom-shared.h"
 #include "ui/chromeos/events/mojom/modifier_key.mojom.h"
 #include "ui/chromeos/events/pref_names.h"
 #include "ui/events/devices/device_data_manager.h"
@@ -5332,7 +5333,7 @@
 
   void SetModifierRemapping(const std::string& pref_name,
                             ui::mojom::ModifierKey value) {
-    modifier_remapping_[pref_name] = static_cast<int>(value);
+    modifier_remapping_[pref_name] = value;
   }
 
   void RegisterExtensionShortcut(ui::KeyboardCode key_code, int flags) {
@@ -5360,17 +5361,19 @@
  private:
   // ui::EventRewriterChromeOS::Delegate:
   bool RewriteModifierKeys() override { return true; }
-  bool RewriteMetaTopRowKeyComboEvents() const override { return true; }
+  bool RewriteMetaTopRowKeyComboEvents(int device_id) const override {
+    return true;
+  }
 
-  bool GetKeyboardRemappedPrefValue(const std::string& pref_name,
-                                    int* value) const override {
+  absl::optional<ui::mojom::ModifierKey> GetKeyboardRemappedModifierValue(
+      int device_id,
+      ui::mojom::ModifierKey modifier_key,
+      const std::string& pref_name) const override {
     auto it = modifier_remapping_.find(pref_name);
     if (it == modifier_remapping_.end()) {
-      return false;
+      return absl::nullopt;
     }
-
-    *value = it->second;
-    return true;
+    return it->second;
   }
 
   bool TopRowKeysAreFunctionKeys(int device_id) const override { return false; }
@@ -5389,7 +5392,7 @@
   void SuppressModifierKeyRewrites(bool should_suppress) override {}
   void SuppressMetaTopRowKeyComboRewrites(bool should_suppress) override {}
 
-  std::map<std::string, int> modifier_remapping_;
+  std::map<std::string, ui::mojom::ModifierKey> modifier_remapping_;
   base::flat_set<ui::Accelerator> registered_extension_shortcuts_;
 };
 
@@ -5801,6 +5804,7 @@
       .WillRepeatedly(testing::Return(&settings));
 
   settings.top_row_are_fkeys = false;
+  settings.suppress_meta_fkey_rewrites = false;
   TestExternalGenericKeyboard(
       {{ui::ET_KEY_PRESSED,
         {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
@@ -5814,4 +5818,68 @@
         {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}}});
 }
 
+TEST_F(EventRewriterSettingsSplitTest, RewriteMetaTopRowKeyComboEvents) {
+  mojom::KeyboardSettings settings;
+  settings.top_row_are_fkeys = true;
+  EXPECT_CALL(*mock_controller_, GetKeyboardSettings(kKeyboardDeviceId))
+      .WillRepeatedly(testing::Return(&settings));
+
+  settings.suppress_meta_fkey_rewrites = false;
+  TestExternalGenericKeyboard(
+      {{ui::ET_KEY_PRESSED,
+        {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
+        {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
+         ui::DomKey::BROWSER_BACK}}});
+
+  settings.suppress_meta_fkey_rewrites = true;
+  TestExternalGenericKeyboard(
+      {{ui::ET_KEY_PRESSED,
+        {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
+        {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1}}});
+}
+
+TEST_F(EventRewriterSettingsSplitTest, ModifierRemapping) {
+  mojom::KeyboardSettings settings;
+  EXPECT_CALL(*mock_controller_, GetKeyboardSettings(kKeyboardDeviceId))
+      .WillRepeatedly(testing::Return(&settings));
+
+  settings.modifier_remappings = {
+      {ui::mojom::ModifierKey::kAlt, ui::mojom::ModifierKey::kControl},
+      {ui::mojom::ModifierKey::kMeta, ui::mojom::ModifierKey::kBackspace}};
+
+  // Test remapping modifier keys.
+  TestExternalGenericKeyboard({{ui::ET_KEY_PRESSED,
+                                {ui::VKEY_MENU, ui::DomCode::ALT_RIGHT,
+                                 ui::EF_ALT_DOWN, ui::DomKey::ALT},
+                                {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
+                                 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL}},
+                               {ui::ET_KEY_PRESSED,
+                                {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
+                                 ui::EF_COMMAND_DOWN, ui::DomKey::META},
+                                {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
+                                 ui::EF_NONE, ui::DomKey::BACKSPACE}},
+                               {ui::ET_KEY_PRESSED,
+                                {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
+                                 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL},
+                                {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
+                                 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL}}});
+
+  // Test remapping modifier flags.
+  TestExternalGenericKeyboard(
+      {{ui::ET_KEY_PRESSED,
+        {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
+         ui::DomKey::Constant<'a'>::Character},
+        {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
+         ui::DomKey::Constant<'a'>::Character}},
+       {ui::ET_KEY_PRESSED,
+        {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
+         ui::DomKey::Constant<'a'>::Character},
+        {ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
+         ui::DomKey::Constant<'a'>::Character}},
+       {ui::ET_KEY_PRESSED,
+        {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
+         ui::DomKey::Constant<'a'>::Character},
+        {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
+         ui::DomKey::Constant<'a'>::Character}}});
+}
 }  // namespace ash
diff --git a/chrome/browser/ash/file_manager/app_service_file_tasks.cc b/chrome/browser/ash/file_manager/app_service_file_tasks.cc
index 925871ee..ba8fedfb 100644
--- a/chrome/browser/ash/file_manager/app_service_file_tasks.cc
+++ b/chrome/browser/ash/file_manager/app_service_file_tasks.cc
@@ -92,6 +92,8 @@
       // because both are executed through App Service, which can tell the
       // difference itself.
       return TASK_TYPE_FILE_HANDLER;
+    case apps::AppType::kBruschetta:
+      return TASK_TYPE_BRUSCHETTA_APP;
     case apps::AppType::kCrostini:
       return TASK_TYPE_CROSTINI_APP;
     case apps::AppType::kPluginVm:
@@ -102,7 +104,6 @@
     case apps::AppType::kStandaloneBrowser:
     case apps::AppType::kRemote:
     case apps::AppType::kBorealis:
-    case apps::AppType::kBruschetta:
       return TASK_TYPE_UNKNOWN;
   }
 }
@@ -249,6 +250,7 @@
     supported_app_types.push_back(apps::AppType::kArc);
   }
   if (ash::features::ShouldGuestOsFileTasksUseAppService()) {
+    supported_app_types.push_back(apps::AppType::kBruschetta);
     supported_app_types.push_back(apps::AppType::kCrostini);
     supported_app_types.push_back(apps::AppType::kPluginVm);
   }
@@ -287,7 +289,8 @@
         continue;
     }
 
-    if ((app_type == apps::AppType::kCrostini ||
+    if ((app_type == apps::AppType::kBruschetta ||
+         app_type == apps::AppType::kCrostini ||
          app_type == apps::AppType::kPluginVm) &&
         !files_shareable_to_vm) {
       continue;
@@ -353,7 +356,8 @@
          (ash::features::ShouldArcFileTasksUseAppService() &&
           task.task_type == TASK_TYPE_ARC_APP) ||
          (ash::features::ShouldGuestOsFileTasksUseAppService() &&
-          (task.task_type == TASK_TYPE_CROSTINI_APP ||
+          (task.task_type == TASK_TYPE_BRUSCHETTA_APP ||
+           task.task_type == TASK_TYPE_CROSTINI_APP ||
            task.task_type == TASK_TYPE_PLUGIN_VM_APP)));
 
   apps::IntentPtr intent = std::make_unique<apps::Intent>(
diff --git a/chrome/browser/ash/file_manager/file_tasks.cc b/chrome/browser/ash/file_manager/file_tasks.cc
index cb513f3..64538e98 100644
--- a/chrome/browser/ash/file_manager/file_tasks.cc
+++ b/chrome/browser/ash/file_manager/file_tasks.cc
@@ -33,7 +33,6 @@
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/apps/app_service/metrics/app_platform_metrics.h"
 #include "chrome/browser/apps/app_service/metrics/app_service_metrics.h"
-#include "chrome/browser/ash/crostini/crostini_features.h"
 #include "chrome/browser/ash/drive/drive_integration_service.h"
 #include "chrome/browser/ash/drive/file_system_util.h"
 #include "chrome/browser/ash/file_manager/app_id.h"
@@ -120,6 +119,7 @@
 const char kFileBrowserHandlerTaskType[] = "file";
 const char kFileHandlerTaskType[] = "app";
 const char kArcAppTaskType[] = "arc";
+const char kBruschettaAppTaskType[] = "bruschetta";
 const char kCrostiniAppTaskType[] = "crostini";
 const char kPluginVmAppTaskType[] = "pluginvm";
 const char kWebAppTaskType[] = "web";
@@ -471,6 +471,8 @@
     return TASK_TYPE_FILE_HANDLER;
   if (str == kArcAppTaskType)
     return TASK_TYPE_ARC_APP;
+  if (str == kBruschettaAppTaskType)
+    return TASK_TYPE_BRUSCHETTA_APP;
   if (str == kCrostiniAppTaskType)
     return TASK_TYPE_CROSTINI_APP;
   if (str == kWebAppTaskType)
@@ -489,6 +491,8 @@
       return kFileHandlerTaskType;
     case TASK_TYPE_ARC_APP:
       return kArcAppTaskType;
+    case TASK_TYPE_BRUSCHETTA_APP:
+      return kBruschettaAppTaskType;
     case TASK_TYPE_CROSTINI_APP:
       return kCrostiniAppTaskType;
     case TASK_TYPE_WEB_APP:
@@ -800,7 +804,8 @@
       task.task_type == TASK_TYPE_WEB_APP ||
       task.task_type == TASK_TYPE_FILE_HANDLER ||
       (ash::features::ShouldGuestOsFileTasksUseAppService() &&
-       (task.task_type == TASK_TYPE_CROSTINI_APP ||
+       (task.task_type == TASK_TYPE_BRUSCHETTA_APP ||
+        task.task_type == TASK_TYPE_CROSTINI_APP ||
         task.task_type == TASK_TYPE_PLUGIN_VM_APP))) {
     // TODO(petermarshall): Implement GetProfileForExtensionTask in Lacros if
     // necessary, for Chrome Apps.
@@ -814,7 +819,8 @@
   }
 
   if (!ash::features::ShouldGuestOsFileTasksUseAppService() &&
-      (task.task_type == TASK_TYPE_CROSTINI_APP ||
+      (task.task_type == TASK_TYPE_BRUSCHETTA_APP ||
+       task.task_type == TASK_TYPE_CROSTINI_APP ||
        task.task_type == TASK_TYPE_PLUGIN_VM_APP)) {
     DCHECK_EQ(kGuestOsAppActionID, task.action_id);
     ExecuteGuestOsTask(profile, task, file_urls, std::move(done));
diff --git a/chrome/browser/ash/file_manager/file_tasks.h b/chrome/browser/ash/file_manager/file_tasks.h
index 075f389..0cfda659 100644
--- a/chrome/browser/ash/file_manager/file_tasks.h
+++ b/chrome/browser/ash/file_manager/file_tasks.h
@@ -143,6 +143,7 @@
   TASK_TYPE_CROSTINI_APP,
   TASK_TYPE_WEB_APP,
   TASK_TYPE_PLUGIN_VM_APP,
+  TASK_TYPE_BRUSCHETTA_APP,
   // The enum values must be kept in sync with FileManagerTaskType in
   // tools/metrics/histograms/enums.xml. Since enums for histograms are
   // append-only (for keeping the number consistent across versions), new values
diff --git a/chrome/browser/ash/file_manager/path_util.cc b/chrome/browser/ash/file_manager/path_util.cc
index 6f2fde5..9181cc4 100644
--- a/chrome/browser/ash/file_manager/path_util.cc
+++ b/chrome/browser/ash/file_manager/path_util.cc
@@ -36,6 +36,7 @@
 #include "chrome/browser/ash/fileapi/file_system_backend.h"
 #include "chrome/browser/ash/guest_os/guest_os_session_tracker.h"
 #include "chrome/browser/ash/guest_os/public/guest_os_mount_provider.h"
+#include "chrome/browser/ash/guest_os/public/guest_os_service.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/ash/smb_client/smb_service.h"
 #include "chrome/browser/ash/smb_client/smb_service_factory.h"
@@ -425,6 +426,29 @@
   return kAndroidFilesMountPointName;
 }
 
+// Returns true if |name| is a known Bruschetta mount point name (e.g. as
+// produced by GetGuestOsMountPointName), and populates |guest_id|.
+bool IsBruschettaMountPointName(const std::string& name,
+                                Profile* profile,
+                                guest_os::GuestId* guest_id) {
+  auto* service = guest_os::GuestOsService::GetForProfile(profile);
+  if (!service) {
+    return false;
+  }
+  auto* registry = service->MountProviderRegistry();
+  for (const auto id : registry->List()) {
+    auto* provider = registry->Get(id);
+    if (provider->vm_type() != vm_tools::apps::VmType::BRUSCHETTA) {
+      continue;
+    }
+    if (name == util::GetGuestOsMountPointName(profile, provider->GuestId())) {
+      *guest_id = provider->GuestId();
+      return true;
+    }
+  }
+  return false;
+}
+
 std::string GetCrostiniMountPointName(Profile* profile) {
   // crostini_<hash>_termina_penguin
   return base::JoinString(
@@ -499,6 +523,7 @@
   // If |map_crostini_home| is set, paths in crostini mount map to:
   //   /<home-directory>/path/to/file
   base::FilePath base_to_exclude(id);
+  guest_os::GuestId guest_id("", "");
   if (id == GetDownloadsMountPointName(profile)) {
     // MyFiles.
     *inside = vm_mount.Append(kFolderNameMyFiles);
@@ -550,6 +575,16 @@
     } else {
       *inside = vm_mount.Append(kCrostiniMapLinuxFiles);
     }
+  } else if (IsBruschettaMountPointName(id, profile, &guest_id)) {
+    // Bruschetta: use path to homedir, which is currently the empty string
+    // because sftp-server inside the VM runs in the homedir.
+    auto container_info =
+        guest_os::GuestOsSessionTracker::GetForProfile(profile)->GetInfo(
+            guest_id);
+    if (!container_info) {
+      return false;
+    }
+    *inside = container_info->homedir;
   } else if (file_system_url.type() == storage::kFileSystemTypeSmbFs) {
     // SMB. Do not assume the share is currently accessible via SmbService
     // as this function is called during unmount when SmbFsShare is
diff --git a/chrome/browser/ash/fusebox/fusebox_server.cc b/chrome/browser/ash/fusebox/fusebox_server.cc
index 1495c8da..60ae87a 100644
--- a/chrome/browser/ash/fusebox/fusebox_server.cc
+++ b/chrome/browser/ash/fusebox/fusebox_server.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ash/fusebox/fusebox_server.h"
 
+#include <fcntl.h>
 #include <sys/stat.h>
 #include <utility>
 
@@ -12,12 +13,14 @@
 #include "base/logging.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/thread_pool.h"
 #include "base/types/expected.h"
 #include "chrome/browser/ash/file_manager/fileapi_util.h"
 #include "chrome/browser/ash/file_manager/path_util.h"
+#include "chrome/browser/ash/fusebox/fusebox_copy_to_fd.h"
 #include "chrome/browser/ash/fusebox/fusebox_errno.h"
 #include "chrome/browser/ash/fusebox/fusebox_read_writer.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -59,13 +62,6 @@
                           file_manager::util::kFuseBoxSubdirPrefixMTP);
 }
 
-bool HaveSameSubdir(base::StringPiece src, base::StringPiece dst) {
-  size_t s = src.find('/');
-  size_t d = dst.find('/');
-  return (s != std::string::npos) && (d != std::string::npos) &&
-         (src.substr(0, s) == dst.substr(0, d));
-}
-
 std::pair<std::string, bool> ResolvePrefixMap(
     const fusebox::Server::PrefixMap& prefix_map,
     const std::string& s) {
@@ -320,13 +316,12 @@
           metadata_fields, std::move(outer_callback)));
 }
 
-void RunRenameCallback(
+void RunRenameCallbackPosixErrorCode(
     Server::RenameCallback callback,
     scoped_refptr<storage::FileSystemContext> fs_context,  // See § above.
-    base::File::Error error_code) {
+    int posix_error_code) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  int posix_error_code = FileErrorToErrno(error_code);
   if (posix_error_code) {
     RenameResponseProto response_proto;
     response_proto.set_posix_error_code(posix_error_code);
@@ -338,6 +333,14 @@
   std::move(callback).Run(response_proto);
 }
 
+void RunRenameCallbackBaseFileError(
+    Server::RenameCallback callback,
+    scoped_refptr<storage::FileSystemContext> fs_context,  // See § above.
+    base::File::Error error_code) {
+  RunRenameCallbackPosixErrorCode(std::move(callback), std::move(fs_context),
+                                  FileErrorToErrno(error_code));
+}
+
 void RunRmDirCallback(
     Server::RmDirCallback callback,
     scoped_refptr<storage::FileSystemContext> fs_context,  // See § above.
@@ -512,6 +515,80 @@
                          std::move(callback))));
 }
 
+void CrossFileSystemRenameCallback3(
+    scoped_refptr<storage::FileSystemContext> fs_context,
+    base::OnceCallback<void(int posix_error_code)> callback,
+    base::File::Error error_code) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+  std::move(callback).Run(FileErrorToErrno(error_code));
+}
+
+void CrossFileSystemRenameCallback2(
+    base::ScopedFD scoped_fd,
+    scoped_refptr<storage::FileSystemContext> fs_context,
+    const storage::FileSystemURL src_fs_url,
+    base::OnceCallback<void(int posix_error_code)> callback,
+    base::File::Error error_code) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+  if (error_code != base::File::FILE_OK) {
+    std::move(callback).Run(FileErrorToErrno(error_code));
+    return;
+  }
+
+  fs_context->operation_runner()->RemoveFile(
+      src_fs_url, base::BindOnce(&CrossFileSystemRenameCallback3, fs_context,
+                                 std::move(callback)));
+}
+
+void CrossFileSystemRenameCallback1(
+    scoped_refptr<storage::FileSystemContext> fs_context,
+    const storage::FileSystemURL src_fs_url,
+    const storage::FileSystemURL dst_fs_url,
+    base::OnceCallback<void(int posix_error_code)> callback,
+    base::expected<base::ScopedFD, int> result) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+  if (!result.has_value()) {
+    std::move(callback).Run(result.error());
+    return;
+  }
+
+  std::string fd_path =
+      base::StringPrintf("/proc/self/fd/%d", result.value().get());
+
+  fs_context->operation_runner()->CopyInForeignFile(
+      base::FilePath(fd_path), dst_fs_url,
+      base::BindOnce(&CrossFileSystemRenameCallback2, std::move(result.value()),
+                     fs_context, std::move(src_fs_url), std::move(callback)));
+}
+
+// Implement a cross-file-system rename (a move) as three steps:
+// 1. CopyToFileDescriptor, from src to an O_TMPFILE file.
+// 2. CopyInForeignFile, from the O_TMPFILE file to dst.
+// 3. RemoveFile, of the src. The base::ScopedFD destructor will delete (both
+//    in the C++ sense and in the file system sense) the O_TMPFILE file.
+void DoCrossFileSystemRename(
+    scoped_refptr<storage::FileSystemContext> fs_context,
+    std::string profile_path,
+    const storage::FileSystemURL src_fs_url,
+    const storage::FileSystemURL dst_fs_url,
+    base::OnceCallback<void(int posix_error_code)> callback) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+  base::ScopedFD temp_file(open(profile_path.c_str(),
+                                O_CLOEXEC | O_EXCL | O_TMPFILE | O_RDWR, 0600));
+  if (!temp_file.is_valid()) {
+    std::move(callback).Run(ENOSPC);
+    return;
+  }
+  CopyToFileDescriptor(
+      fs_context, src_fs_url, std::move(temp_file),
+      base::BindOnce(&CrossFileSystemRenameCallback1, fs_context, src_fs_url,
+                     std::move(dst_fs_url), std::move(callback)));
+}
+
 }  // namespace
 
 Server::FuseFileMapEntry::FuseFileMapEntry(
@@ -995,15 +1072,6 @@
   std::string dst_fs_url_as_string = request_proto.has_dst_file_system_url()
                                          ? request_proto.dst_file_system_url()
                                          : std::string();
-
-  // TODO(b/255703917): allow cross-subdir renames.
-  if (!HaveSameSubdir(src_fs_url_as_string, dst_fs_url_as_string)) {
-    RenameResponseProto response_proto;
-    response_proto.set_posix_error_code(EINVAL);
-    std::move(callback).Run(response_proto);
-    return;
-  }
-
   auto src_parsed =
       ParseFileSystemURL(moniker_map_, prefix_map_, src_fs_url_as_string);
   if (!src_parsed.has_value()) {
@@ -1032,8 +1100,49 @@
     return;
   }
 
-  auto outer_callback = base::BindPostTaskToCurrentDefault(base::BindOnce(
-      &RunRenameCallback, std::move(callback), src_parsed->fs_context));
+  // Use a temporary file (and CopyInForeignFile), for cross-file-system moves
+  // where the destination file system doesn't support incremental writes, but
+  // both source and destination are on Fusebox-served subdirs.
+  //
+  // Otherwise, the storage::FileSystemOperationRunner::Move call further below
+  // would require the various backends to support either src
+  // CreateSnapshotFile and dst CopyInForeignFile (when using
+  // storage::SnapshotCopyOrMoveImpl) or src CreateFileStreamReader and dst
+  // CreateFileStreamWriter (when using storage::StreamCopyOrMoveImpl).
+  //
+  // Care is needed to pick the right approach, based on both source and
+  // destination file system types, as many backends subclass (with stub
+  // methods to satisfy the C++ compiler) but don't completely satisfy the
+  // storage::AsyncFileUtil or ash::FileSystemBackendDelegate interfaces.
+  //
+  // As of March 2023, these below are all unimplemented, often but not always
+  // marked NOTIMPLEMENTED, NOTREACHED, or TODO:
+  //   - ArcDocumentsProviderAsyncFileUtil::CopyInForeignFile
+  //   - ArcDocumentsProviderAsyncFileUtil::CreateSnapshotFile
+  //   - MTPFileSystemBackendDelegate::CreateFileStreamWriter
+  //   - ProviderAsyncFileUtil::CopyInForeignFile
+  //   - ProviderAsyncFileUtil::CreateSnapshotFile
+  if (!src_parsed->fs_url.IsInSameFileSystem(dst_parsed->fs_url) &&
+      UseTempFile(dst_fs_url_as_string)) {
+    auto outer_callback = base::BindPostTaskToCurrentDefault(
+        base::BindOnce(&RunRenameCallbackPosixErrorCode, std::move(callback),
+                       src_parsed->fs_context));
+
+    content::GetIOThreadTaskRunner({})->PostTask(
+        FROM_HERE,
+        base::BindOnce(&DoCrossFileSystemRename, src_parsed->fs_context,
+                       std::string(ProfileManager::GetActiveUserProfile()
+                                       ->GetPath()
+                                       .AsUTF8Unsafe()),
+                       std::move(src_parsed->fs_url),
+                       std::move(dst_parsed->fs_url),
+                       std::move(outer_callback)));
+    return;
+  }
+
+  auto outer_callback = base::BindPostTaskToCurrentDefault(
+      base::BindOnce(&RunRenameCallbackBaseFileError, std::move(callback),
+                     src_parsed->fs_context));
 
   constexpr storage::FileSystemOperation::CopyOrMoveOptionSet options =
       storage::FileSystemOperation::CopyOrMoveOptionSet(
diff --git a/chrome/browser/ash/login/error_screens_histogram_helper.cc b/chrome/browser/ash/login/error_screens_histogram_helper.cc
index 64e517e..dcf41ea3 100644
--- a/chrome/browser/ash/login/error_screens_histogram_helper.cc
+++ b/chrome/browser/ash/login/error_screens_histogram_helper.cc
@@ -17,29 +17,24 @@
 const int kTimeMaxInMinutes = 3;
 const int kTimeBucketCount = 50;
 
-}  // namespace
-
-std::string ErrorScreensHistogramHelper::GetParentScreenString() {
-  switch (parent_screen_) {
-    case ErrorParentScreen::kEnrollment:
+std::string GetParentScreenString(
+    ErrorScreensHistogramHelper::ErrorParentScreen screen) {
+  switch (screen) {
+    case ErrorScreensHistogramHelper::ErrorParentScreen::kEnrollment:
       return "Enrollment";
-    case ErrorParentScreen::kSignin:
+    case ErrorScreensHistogramHelper::ErrorParentScreen::kSignin:
       return "Signin";
-    case ErrorParentScreen::kUpdate:
+    case ErrorScreensHistogramHelper::ErrorParentScreen::kUpdate:
       return "Update";
-    case ErrorParentScreen::kUpdateRequired:
+    case ErrorScreensHistogramHelper::ErrorParentScreen::kUpdateRequired:
       return "UpdateRequired";
-    case ErrorParentScreen::kUserCreation:
+    case ErrorScreensHistogramHelper::ErrorParentScreen::kUserCreation:
       return "UserCreation";
-    default:
-      NOTREACHED() << "Invalid ErrorParentScreen "
-                   << static_cast<int>(parent_screen_);
-      return std::string();
   }
 }
 
-std::string ErrorScreensHistogramHelper::GetLastErrorShownString() {
-  switch (last_error_shown_) {
+std::string GetErrorStateString(NetworkError::ErrorState state) {
+  switch (state) {
     case NetworkError::ERROR_STATE_PORTAL:
       return ".Portal";
     case NetworkError::ERROR_STATE_OFFLINE:
@@ -48,35 +43,46 @@
       return ".Proxy";
     case NetworkError::ERROR_STATE_AUTH_EXT_TIMEOUT:
       return ".AuthExtTimeout";
+    case NetworkError::ERROR_STATE_NONE:
+      return ".None";
     default:
-      NOTREACHED() << "Invalid ErrorState " << last_error_shown_;
+      NOTREACHED() << "Invalid ErrorState " << state;
       return std::string();
   }
 }
 
-void ErrorScreensHistogramHelper::StoreErrorScreenToHistogram() {
-  if (last_error_shown_ <= NetworkError::ERROR_STATE_UNKNOWN ||
-      last_error_shown_ > NetworkError::ERROR_STATE_NONE)
+void RecordErrorStateCountOnParentScreen(
+    NetworkError::ErrorState state,
+    ErrorScreensHistogramHelper::ErrorParentScreen screen) {
+  if (state <= NetworkError::ERROR_STATE_UNKNOWN ||
+      state > NetworkError::ERROR_STATE_NONE) {
     return;
+  }
+
   std::string histogram_name =
-      kOobeErrorScreensCounterPrefix + GetParentScreenString();
+      kOobeErrorScreensCounterPrefix + GetParentScreenString(screen);
   int boundary = NetworkError::ERROR_STATE_NONE + 1;
+
   // This comes from UMA_HISTOGRAM_ENUMERATION macros. Can't use it because of
   // non const histogram name.
   base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
       histogram_name, 1, boundary, boundary + 1,
       base::HistogramBase::kUmaTargetedHistogramFlag);
-  histogram->Add(last_error_shown_);
+  histogram->Add(state);
 }
 
-void ErrorScreensHistogramHelper::StoreTimeOnErrorScreenToHistogram(
-    const base::TimeDelta& time_delta) {
-  if (last_error_shown_ <= NetworkError::ERROR_STATE_UNKNOWN ||
-      last_error_shown_ > NetworkError::ERROR_STATE_NONE)
+void RecordErrorScreenTimeOnParentScreenWithLastError(
+    const base::TimeDelta& time_delta,
+    ErrorScreensHistogramHelper::ErrorParentScreen screen,
+    NetworkError::ErrorState state) {
+  if (state <= NetworkError::ERROR_STATE_UNKNOWN ||
+      state > NetworkError::ERROR_STATE_NONE) {
     return;
+  }
+
   std::string histogram_name = kOobeTimeSpentOnErrorScreensPrefix +
-                               GetParentScreenString() +
-                               GetLastErrorShownString();
+                               GetParentScreenString(screen) +
+                               GetErrorStateString(state);
 
   // This comes from UMA_HISTOGRAM_MEDIUM_TIMES macros. Can't use it because of
   // non const histogram name.
@@ -88,6 +94,8 @@
   histogram->AddTime(time_delta);
 }
 
+}  // namespace
+
 ErrorScreensHistogramHelper::ErrorScreensHistogramHelper(
     ErrorParentScreen parent_screen)
     : parent_screen_(parent_screen) {}
@@ -97,41 +105,43 @@
 }
 
 void ErrorScreensHistogramHelper::OnErrorShow(NetworkError::ErrorState error) {
-  OnErrorShowTime(error, base::Time::Now());
-}
-
-void ErrorScreensHistogramHelper::OnErrorShowTime(
-    NetworkError::ErrorState error,
-    base::Time now) {
+  // Don't record anything if the same error is shown.
+  if (last_error_shown_ == error) {
+    return;
+  }
+  // ERROR_STATE_NONE represents that the ErrorScreen was hidden or not shown.
+  // Start recording time at this point.
+  if (last_error_shown_ == NetworkError::ErrorState::ERROR_STATE_NONE) {
+    error_screen_start_time_ = base::Time::Now();
+  }
+  // New error state is shown so we want to record it.
   last_error_shown_ = error;
-  if (error_screen_start_time_.is_null())
-    error_screen_start_time_ = now;
-  StoreErrorScreenToHistogram();
+  RecordErrorStateCountOnParentScreen(last_error_shown_, parent_screen_);
 }
 
 void ErrorScreensHistogramHelper::OnErrorHide() {
-  OnErrorHideTime(base::Time::Now());
-}
-
-void ErrorScreensHistogramHelper::OnErrorHideTime(base::Time now) {
-  if (error_screen_start_time_.is_null())
+  if (error_screen_start_time_.is_null()) {
     return;
-  time_on_error_screens_ += now - error_screen_start_time_;
+  }
+  // Reset last error to represent that the ErrorScreen is hidden.
+  last_error_shown_ = NetworkError::ErrorState::ERROR_STATE_NONE;
+
+  // Increase the time spent on the ErrorScreen.
+  time_on_error_screens_ += base::Time::Now() - error_screen_start_time_;
   error_screen_start_time_ = base::Time();
 }
 
 ErrorScreensHistogramHelper::~ErrorScreensHistogramHelper() {
-  if (was_shown_) {
-    if (last_error_shown_ == NetworkError::ERROR_STATE_NONE) {
-      StoreErrorScreenToHistogram();
-    } else {
-      if (!error_screen_start_time_.is_null()) {
-        time_on_error_screens_ += base::Time::Now() - error_screen_start_time_;
-        error_screen_start_time_ = base::Time();
-      }
-      StoreTimeOnErrorScreenToHistogram(time_on_error_screens_);
-    }
+  if (!was_shown_) {
+    return;
   }
+
+  if (!error_screen_start_time_.is_null()) {
+    time_on_error_screens_ += base::Time::Now() - error_screen_start_time_;
+    error_screen_start_time_ = base::Time();
+  }
+  RecordErrorScreenTimeOnParentScreenWithLastError(
+      time_on_error_screens_, parent_screen_, last_error_shown_);
 }
 
 }  // namespace ash
diff --git a/chrome/browser/ash/login/error_screens_histogram_helper.h b/chrome/browser/ash/login/error_screens_histogram_helper.h
index 44096f1..f9ff238 100644
--- a/chrome/browser/ash/login/error_screens_histogram_helper.h
+++ b/chrome/browser/ash/login/error_screens_histogram_helper.h
@@ -11,10 +11,13 @@
 
 namespace ash {
 
-FORWARD_DECLARE_TEST(ErrorScreensHistogramHelperTest, TestShowHideTime);
-FORWARD_DECLARE_TEST(ErrorScreensHistogramHelperTest, TestShowHideShowHideTime);
-FORWARD_DECLARE_TEST(ErrorScreensHistogramHelperTest, TestShowShowHideTime);
-
+// This class helps to track time user has spent on the ErrorScreen while
+// going through `parent_screen`.
+//
+// This class records two histograms:
+//   1. OOBE.NetworkErrorShown.{parent_screen}
+//   2. OOBE.ErrorScreensTime.{parent_screen}.{error_state}
+//
 class ErrorScreensHistogramHelper {
  public:
   // The screens that were shown when the error occurred.
@@ -30,26 +33,16 @@
   };
 
   explicit ErrorScreensHistogramHelper(ErrorParentScreen parent_screen);
+  ErrorScreensHistogramHelper(const ErrorScreensHistogramHelper&) = delete;
+  ErrorScreensHistogramHelper& operator=(const ErrorScreensHistogramHelper&) =
+      delete;
+  ~ErrorScreensHistogramHelper();
+
   void OnScreenShow();
   void OnErrorShow(NetworkError::ErrorState error);
   void OnErrorHide();
-  ~ErrorScreensHistogramHelper();
 
  private:
-  FRIEND_TEST_ALL_PREFIXES(ErrorScreensHistogramHelperTest, TestShowHideTime);
-  FRIEND_TEST_ALL_PREFIXES(ErrorScreensHistogramHelperTest,
-                           TestShowHideShowHideTime);
-  FRIEND_TEST_ALL_PREFIXES(ErrorScreensHistogramHelperTest,
-                           TestShowShowHideTime);
-  // functions for testing.
-  void OnErrorShowTime(NetworkError::ErrorState error, base::Time now);
-  void OnErrorHideTime(base::Time now);
-
-  std::string GetParentScreenString();
-  std::string GetLastErrorShownString();
-  void StoreErrorScreenToHistogram();
-  void StoreTimeOnErrorScreenToHistogram(const base::TimeDelta& time_delta);
-
   bool was_shown_ = false;
   ErrorParentScreen parent_screen_;
   NetworkError::ErrorState last_error_shown_ = NetworkError::ERROR_STATE_NONE;
diff --git a/chrome/browser/ash/login/error_screens_histogram_helper_unittest.cc b/chrome/browser/ash/login/error_screens_histogram_helper_unittest.cc
index 2ebbfe6..eee1088 100644
--- a/chrome/browser/ash/login/error_screens_histogram_helper_unittest.cc
+++ b/chrome/browser/ash/login/error_screens_histogram_helper_unittest.cc
@@ -8,6 +8,8 @@
 
 #include "base/metrics/statistics_recorder.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/task_environment.h"
+#include "base/time/time.h"
 #include "chrome/browser/ash/login/screens/network_error.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -16,117 +18,130 @@
 
 namespace {
 
-constexpr char kErrorShownEnrollmentHistogram[] =
-    "OOBE.NetworkErrorShown.Enrollment";
 constexpr char kErrorShownSigninHistogram[] = "OOBE.NetworkErrorShown.Signin";
-constexpr char kErrorTimeEnrollmentPortalHistogram[] =
-    "OOBE.ErrorScreensTime.Enrollment.Portal";
-constexpr char kErrorTimeUserCreationProxyHistogram[] =
-    "OOBE.ErrorScreensTime.UserCreation.Proxy";
+constexpr char kErrorTimeSigninPortalHistogram[] =
+    "OOBE.ErrorScreensTime.Signin.Portal";
+constexpr char kErrorTimeSigninNoneHistogram[] =
+    "OOBE.ErrorScreensTime.Signin.None";
 
 }  // namespace
 
 class ErrorScreensHistogramHelperTest : public testing::Test {
- public:
-  void SetUp() override {
-    enrollment_helper = std::make_unique<ErrorScreensHistogramHelper>(
-        ErrorScreensHistogramHelper::ErrorParentScreen::kEnrollment);
-    signin_helper = std::make_unique<ErrorScreensHistogramHelper>(
-        ErrorScreensHistogramHelper::ErrorParentScreen::kSignin);
-    user_creation_helper = std::make_unique<ErrorScreensHistogramHelper>(
-        ErrorScreensHistogramHelper::ErrorParentScreen::kUserCreation);
+ protected:
+  // Fast forwards time by the specified amount.
+  void FastForwardTime(base::TimeDelta time) {
+    task_environment_.FastForwardBy(time);
   }
 
-  content::BrowserTaskEnvironment task_environment_;
   base::HistogramTester histograms_;
-  std::unique_ptr<ErrorScreensHistogramHelper> enrollment_helper;
+  // The implementation is same for different `parent_screen`s so it is
+  // sufficient to test a single one.
   std::unique_ptr<ErrorScreensHistogramHelper> signin_helper;
-  std::unique_ptr<ErrorScreensHistogramHelper> user_creation_helper;
+
+ private:
+  void SetUp() override {
+    signin_helper = std::make_unique<ErrorScreensHistogramHelper>(
+        ErrorScreensHistogramHelper::ErrorParentScreen::kSignin);
+  }
+
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
 };
 
 // No errors when screen was not shown.
 TEST_F(ErrorScreensHistogramHelperTest, DoesNotShowScreen) {
-  enrollment_helper.reset();
-  histograms_.ExpectTotalCount(kErrorShownEnrollmentHistogram, 0);
+  signin_helper.reset();
+  histograms_.ExpectTotalCount(kErrorShownSigninHistogram, 0);
 }
 
 // No errors when screen was shown and error was not.
 TEST_F(ErrorScreensHistogramHelperTest, ShowScreenWithoutError) {
-  enrollment_helper->OnScreenShow();
-  enrollment_helper.reset();
   signin_helper->OnScreenShow();
   signin_helper.reset();
-  histograms_.ExpectUniqueSample(kErrorShownEnrollmentHistogram,
-                                 NetworkError::ERROR_STATE_NONE, 1);
   histograms_.ExpectUniqueSample(kErrorShownSigninHistogram,
-                                 NetworkError::ERROR_STATE_NONE, 1);
+                                 NetworkError::ERROR_STATE_NONE, 0);
 }
 
 // Show 3 offline errors and 1 portal error. Make sure in time histograms logged
 // portal error only.
-TEST_F(ErrorScreensHistogramHelperTest, ShowScreenAndError) {
-  enrollment_helper->OnScreenShow();
+TEST_F(ErrorScreensHistogramHelperTest, ShowDifferentErrorsWithoutResolution) {
   signin_helper->OnScreenShow();
-  enrollment_helper->OnErrorShow(NetworkError::ERROR_STATE_OFFLINE);
-  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_PORTAL);
-  enrollment_helper->OnErrorShow(NetworkError::ERROR_STATE_OFFLINE);
-  enrollment_helper->OnErrorHide();
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_OFFLINE);
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_OFFLINE);
   signin_helper->OnErrorHide();
-  enrollment_helper->OnErrorShow(NetworkError::ERROR_STATE_OFFLINE);
-  histograms_.ExpectUniqueSample(kErrorShownEnrollmentHistogram,
-                                 NetworkError::ERROR_STATE_OFFLINE, 3);
-  histograms_.ExpectUniqueSample(kErrorShownSigninHistogram,
-                                 NetworkError::ERROR_STATE_PORTAL, 1);
-  enrollment_helper->OnErrorShow(NetworkError::ERROR_STATE_PORTAL);
-  histograms_.ExpectBucketCount(kErrorShownEnrollmentHistogram,
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_OFFLINE);
+  FastForwardTime(base::Milliseconds(1000));
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_PORTAL);
+  signin_helper.reset();
+  histograms_.ExpectBucketCount(kErrorShownSigninHistogram,
+                                NetworkError::ERROR_STATE_OFFLINE, 2);
+  histograms_.ExpectBucketCount(kErrorShownSigninHistogram,
                                 NetworkError::ERROR_STATE_PORTAL, 1);
-  histograms_.ExpectTotalCount(kErrorTimeEnrollmentPortalHistogram, 0);
-  enrollment_helper.reset();
-  histograms_.ExpectTotalCount(kErrorTimeEnrollmentPortalHistogram, 1);
+  histograms_.ExpectUniqueTimeSample(kErrorTimeSigninPortalHistogram,
+                                     base::Milliseconds(1000), 1);
 }
 
 // Show error and hide it after 1 sec.
 TEST_F(ErrorScreensHistogramHelperTest, TestShowHideTime) {
-  enrollment_helper->OnScreenShow();
   signin_helper->OnScreenShow();
-  base::Time now = base::Time::Now();
-  enrollment_helper->OnErrorShowTime(NetworkError::ERROR_STATE_PORTAL, now);
-  now += base::Milliseconds(1000);
-  enrollment_helper->OnErrorHideTime(now);
-  enrollment_helper.reset();
-  histograms_.ExpectUniqueSample(kErrorTimeEnrollmentPortalHistogram, 1000, 1);
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_OFFLINE);
+  FastForwardTime(base::Milliseconds(1000));
+  signin_helper->OnErrorHide();
+  signin_helper.reset();
+  histograms_.ExpectUniqueTimeSample(kErrorTimeSigninNoneHistogram,
+                                     base::Milliseconds(1000), 1);
+  histograms_.ExpectUniqueSample(kErrorShownSigninHistogram,
+                                 NetworkError::ERROR_STATE_OFFLINE, 1);
 }
 
 // Show, hide, show, hide error with 1 sec interval. Make sure time logged in
 // histogram is 2 sec.
 TEST_F(ErrorScreensHistogramHelperTest, TestShowHideShowHideTime) {
-  enrollment_helper->OnScreenShow();
   signin_helper->OnScreenShow();
-  base::Time now = base::Time::Now();
-  enrollment_helper->OnErrorShowTime(NetworkError::ERROR_STATE_PROXY, now);
-  now += base::Milliseconds(1000);
-  enrollment_helper->OnErrorHideTime(now);
-  now += base::Milliseconds(1000);
-  enrollment_helper->OnErrorShowTime(NetworkError::ERROR_STATE_PORTAL, now);
-  now += base::Milliseconds(1000);
-  enrollment_helper->OnErrorHideTime(now);
-  enrollment_helper.reset();
-  histograms_.ExpectUniqueSample(kErrorTimeEnrollmentPortalHistogram, 2000, 1);
+
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_PORTAL);
+  FastForwardTime(base::Milliseconds(1000));
+  signin_helper->OnErrorHide();
+
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_PORTAL);
+  FastForwardTime(base::Milliseconds(1000));
+  signin_helper->OnErrorHide();
+
+  FastForwardTime(base::Milliseconds(1000));
+  signin_helper.reset();
+  histograms_.ExpectUniqueSample(kErrorTimeSigninNoneHistogram, 2000, 1);
+  histograms_.ExpectUniqueSample(kErrorShownSigninHistogram,
+                                 NetworkError::ERROR_STATE_PORTAL, 2);
 }
 
 // Show, show, hide error with 1 sec interval. Make sure time logged in
 // histogram is 2 sec.
 TEST_F(ErrorScreensHistogramHelperTest, TestShowShowHideTime) {
-  user_creation_helper->OnScreenShow();
   signin_helper->OnScreenShow();
-  base::Time now = base::Time::Now();
-  user_creation_helper->OnErrorShowTime(NetworkError::ERROR_STATE_PORTAL, now);
-  now += base::Milliseconds(1000);
-  user_creation_helper->OnErrorShowTime(NetworkError::ERROR_STATE_PROXY, now);
-  now += base::Milliseconds(1000);
-  user_creation_helper->OnErrorHideTime(now);
-  user_creation_helper.reset();
-  histograms_.ExpectUniqueSample(kErrorTimeUserCreationProxyHistogram, 2000, 1);
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_PROXY);
+  FastForwardTime(base::Milliseconds(1000));
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_PORTAL);
+  FastForwardTime(base::Milliseconds(1000));
+  signin_helper->OnErrorHide();
+  signin_helper.reset();
+  histograms_.ExpectUniqueTimeSample(kErrorTimeSigninNoneHistogram,
+                                     base::Milliseconds(2000), 1);
+  histograms_.ExpectBucketCount(kErrorShownSigninHistogram,
+                                NetworkError::ERROR_STATE_PROXY, 1);
+  histograms_.ExpectBucketCount(kErrorShownSigninHistogram,
+                                NetworkError::ERROR_STATE_PORTAL, 1);
+}
+
+// Check that calling OnErrorShow with the same error doesn't change total
+// count.
+TEST_F(ErrorScreensHistogramHelperTest, TestShowCalledSeveralTimes) {
+  signin_helper->OnScreenShow();
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_OFFLINE);
+  FastForwardTime(base::Milliseconds(100));
+  signin_helper->OnErrorShow(NetworkError::ERROR_STATE_OFFLINE);
+  signin_helper.reset();
+  histograms_.ExpectUniqueSample(kErrorShownSigninHistogram,
+                                 NetworkError::ERROR_STATE_OFFLINE, 1);
 }
 
 }  // namespace ash
diff --git a/chrome/browser/ash/note_taking_controller_client.h b/chrome/browser/ash/note_taking_controller_client.h
index 3e35d4d..3e028ce 100644
--- a/chrome/browser/ash/note_taking_controller_client.h
+++ b/chrome/browser/ash/note_taking_controller_client.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_ASH_NOTE_TAKING_CONTROLLER_CLIENT_H_
 
 #include "ash/public/cpp/note_taking_client.h"
+#include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
 #include "chrome/browser/ash/note_taking_helper.h"
@@ -44,10 +45,10 @@
   void SetProfileByUser(const user_manager::User* user);
 
   // Unowned pointer to the note taking helper.
-  NoteTakingHelper* helper_;
+  raw_ptr<NoteTakingHelper> helper_ = nullptr;
 
   // Unowned pointer to the active profile.
-  Profile* profile_ = nullptr;
+  raw_ptr<Profile> profile_ = nullptr;
   base::ScopedObservation<Profile, ProfileObserver> profile_observation_{this};
 
   base::WeakPtrFactory<NoteTakingControllerClient> weak_ptr_factory_{this};
diff --git a/chrome/browser/ash/preferences.cc b/chrome/browser/ash/preferences.cc
index 40b61542..a502037 100644
--- a/chrome/browser/ash/preferences.cc
+++ b/chrome/browser/ash/preferences.cc
@@ -507,8 +507,6 @@
       ::prefs::kEolApproachingIncentiveNotificationDismissed, false);
   registry->RegisterBooleanPref(::prefs::kEolPassedFinalIncentiveDismissed,
                                 false);
-  registry->RegisterBooleanPref(::prefs::kEolIncentiveNotificationSilenced,
-                                false);
 
   registry->RegisterBooleanPref(::prefs::kCastReceiverEnabled, false);
   registry->RegisterBooleanPref(::prefs::kShowArcSettingsOnSessionStart, false);
diff --git a/chrome/browser/autofill/autofill_image_fetcher_impl.cc b/chrome/browser/autofill/autofill_image_fetcher_impl.cc
index 8a63494b..e044187f 100644
--- a/chrome/browser/autofill/autofill_image_fetcher_impl.cc
+++ b/chrome/browser/autofill/autofill_image_fetcher_impl.cc
@@ -142,7 +142,12 @@
   if (card_art_url ==
       GURL(
           "https://www.gstatic.com/autofill/virtualcard/icon/capitalone.png")) {
-    url = card_art_url;
+    url = base::FeatureList::IsEnabled(
+              features::kAutofillEnableNewCardArtAndNetworkImages)
+              ? GURL(
+                    "https://www.gstatic.com/autofill/virtualcard/icon/"
+                    "capitalone_40_24.png")
+              : card_art_url;
   } else {
     // A FIFE image fetching param suffix is appended to the URL. The image
     // should be center cropped and of Size(32, 20) unless the
diff --git a/chrome/browser/autofill/autofill_popup_controller_utils.cc b/chrome/browser/autofill/autofill_popup_controller_utils.cc
index 8ae2bb04..ad22f07 100644
--- a/chrome/browser/autofill/autofill_popup_controller_utils.cc
+++ b/chrome/browser/autofill/autofill_popup_controller_utils.cc
@@ -6,6 +6,7 @@
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
+#include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/grit/components_scaled_resources.h"
 #include "components/strings/grit/components_strings.h"
 
@@ -21,10 +22,12 @@
 constexpr int kResourceNotFoundId = 0;
 
 // Used to fetch the |icon_id| corresponding the the |name| resource.
-const struct {
+struct DataResources {
   const char* name;
   int icon_id;
-} kDataResources[] = {
+};
+
+DataResources kDataResources[] = {
     {kAmericanExpressCard, IDR_AUTOFILL_CC_AMEX},
     {kDinersCard, IDR_AUTOFILL_CC_DINERS},
     {kDiscoverCard, IDR_AUTOFILL_CC_DISCOVER},
@@ -52,6 +55,34 @@
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 };
 
+DataResources kNewCardArtAndNetworkDataResources[] = {
+    {kAmericanExpressCard, IDR_AUTOFILL_METADATA_CC_AMEX},
+    {kDinersCard, IDR_AUTOFILL_METADATA_CC_DINERS},
+    {kDiscoverCard, IDR_AUTOFILL_METADATA_CC_DISCOVER},
+    {kEloCard, IDR_AUTOFILL_CC_ELO},
+    {kGenericCard, IDR_AUTOFILL_METADATA_CC_GENERIC},
+    {kJCBCard, IDR_AUTOFILL_METADATA_CC_JCB},
+    {kMasterCard, IDR_AUTOFILL_METADATA_CC_MASTERCARD},
+    {kMirCard, IDR_AUTOFILL_METADATA_CC_MIR},
+    {kTroyCard, IDR_AUTOFILL_METADATA_CC_TROY},
+    {kUnionPay, IDR_AUTOFILL_METADATA_CC_UNIONPAY},
+    {kVisaCard, IDR_AUTOFILL_METADATA_CC_VISA},
+#if BUILDFLAG(IS_ANDROID)
+    {"httpWarning", IDR_ANDROID_AUTOFILL_HTTP_WARNING},
+    {"httpsInvalid", IDR_ANDROID_AUTOFILL_HTTPS_INVALID_WARNING},
+    {"scanCreditCardIcon", IDR_ANDROID_AUTOFILL_CC_SCAN_NEW},
+    {"settings", IDR_ANDROID_AUTOFILL_SETTINGS},
+    {"create", IDR_ANDROID_AUTOFILL_CREATE},
+    {"offerTag", IDR_ANDROID_AUTOFILL_OFFER_TAG_GREEN},
+#endif  // BUILDFLAG(IS_ANDROID)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+    {"googlePay", IDR_AUTOFILL_GOOGLE_PAY},
+#if !BUILDFLAG(IS_ANDROID)
+    {"googlePayDark", IDR_AUTOFILL_GOOGLE_PAY_DARK},
+#endif  // NOT OS_ANDROID
+#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+};
+
 }  // namespace
 
 int GetIconResourceID(const std::string& resource_name) {
@@ -61,7 +92,11 @@
   }
 #endif
   int result = kResourceNotFoundId;
-  for (const auto& kDataResource : kDataResources) {
+  for (const auto& kDataResource :
+       base::FeatureList::IsEnabled(
+           autofill::features::kAutofillEnableNewCardArtAndNetworkImages)
+           ? kNewCardArtAndNetworkDataResources
+           : kDataResources) {
     if (resource_name == kDataResource.name) {
       result = kDataResource.icon_id;
       break;
diff --git a/chrome/browser/browsing_data/browsing_data_model_browsertest.cc b/chrome/browser/browsing_data/browsing_data_model_browsertest.cc
index 41fc614..78d03405 100644
--- a/chrome/browser/browsing_data/browsing_data_model_browsertest.cc
+++ b/chrome/browser/browsing_data/browsing_data_model_browsertest.cc
@@ -11,6 +11,9 @@
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/web_applications/test/isolated_web_app_test_utils.h"
+#include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_info.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/browsing_data/content/browsing_data_model.h"
@@ -18,6 +21,7 @@
 #include "components/content_settings/browser/page_specific_content_settings.h"
 #include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/privacy_sandbox/privacy_sandbox_settings.h"
+#include "components/services/storage/public/mojom/local_storage_control.mojom.h"
 #include "components/services/storage/public/mojom/storage_usage_info.mojom.h"
 #include "components/services/storage/shared_storage/shared_storage_manager.h"
 #include "content/public/browser/attribution_data_model.h"
@@ -108,6 +112,17 @@
   EXPECT_EQ("Success", EvalJs(adapter, command));
 }
 
+void AddLocalStorageUsage(content::RenderFrameHost* render_frame_host,
+                          int size) {
+  auto command =
+      content::JsReplace("localStorage.setItem('key', '!'.repeat($1))", size);
+  EXPECT_TRUE(ExecJs(render_frame_host, command));
+  base::RunLoop run_loop;
+  render_frame_host->GetStoragePartition()->GetLocalStorageControl()->Flush(
+      run_loop.QuitClosure());
+  run_loop.Run();
+}
+
 void WaitForModelUpdate(BrowsingDataModel* model, size_t expected_size) {
   while (model->size() != expected_size) {
     base::RunLoop run_loop;
@@ -134,6 +149,8 @@
                 network::features::TrustTokenOriginTrialSpec::
                     kOriginTrialNotRequired)}}},
          {features::kPrivacySandboxAdsAPIsOverride, {}},
+         {features::kIsolatedWebApps, {}},
+         {features::kIsolatedWebAppDevMode, {}},
          {blink::features::kSharedStorageAPI, {}},
          {blink::features::kInterestGroupStorage, {}},
          {blink::features::kAdInterestGroupAPI, {}},
@@ -165,13 +182,13 @@
     base::test::TestFuture<std::unique_ptr<BrowsingDataModel>>
         browsing_data_model;
     BrowsingDataModel::BuildFromDisk(
-        browser()->profile()->GetDefaultStoragePartition(),
+        browser()->profile(),
         ChromeBrowsingDataModelDelegate::CreateForProfile(browser()->profile()),
         browsing_data_model.GetCallback());
     return browsing_data_model.Take();
   }
 
-  content::StoragePartition* storage_partition() {
+  content::StoragePartition* default_storage_partition() {
     return browser()->profile()->GetDefaultStoragePartition();
   }
 
@@ -193,7 +210,8 @@
 IN_PROC_BROWSER_TEST_F(BrowsingDataModelBrowserTest,
                        SharedStorageHandledCorrectly) {
   // Add origin shared storage.
-  auto* shared_storage_manager = storage_partition()->GetSharedStorageManager();
+  auto* shared_storage_manager =
+      default_storage_partition()->GetSharedStorageManager();
   ASSERT_NE(nullptr, shared_storage_manager);
 
   base::test::TestFuture<OperationResult> future;
@@ -483,3 +501,43 @@
   ValidateBrowsingDataEntries(allowed_browsing_data_model, {});
   ASSERT_EQ(allowed_browsing_data_model->size(), 0u);
 }
+
+IN_PROC_BROWSER_TEST_F(BrowsingDataModelBrowserTest,
+                       IsolatedWebAppUsageInDefaultStoragePartitionModel) {
+  // Check that no IWAs are installed at the beginning of the test.
+  std::unique_ptr<BrowsingDataModel> browsing_data_model =
+      BuildBrowsingDataModel();
+  ValidateBrowsingDataEntries(browsing_data_model.get(), {});
+  ASSERT_EQ(browsing_data_model->size(), 0u);
+
+  Profile* profile = browser()->profile();
+  auto dev_server = web_app::CreateAndStartDevServer(
+      FILE_PATH_LITERAL("web_apps/simple_isolated_app"));
+
+  auto iwa_url_info1 = web_app::InstallDevModeProxyIsolatedWebApp(
+      profile, dev_server->GetOrigin());
+  auto* iwa_frame1 =
+      web_app::OpenIsolatedWebApp(profile, iwa_url_info1.app_id());
+  AddLocalStorageUsage(iwa_frame1, 100);
+
+  auto iwa_url_info2 = web_app::InstallDevModeProxyIsolatedWebApp(
+      profile, dev_server->GetOrigin());
+  auto* iwa_frame2 =
+      web_app::OpenIsolatedWebApp(profile, iwa_url_info2.app_id());
+  AddLocalStorageUsage(iwa_frame2, 500);
+
+  browsing_data_model = BuildBrowsingDataModel();
+
+  ValidateBrowsingDataEntries(
+      browsing_data_model.get(),
+      {{iwa_url_info1.origin().host(),
+        iwa_url_info1.origin(),
+        {static_cast<BrowsingDataModel::StorageType>(
+             ChromeBrowsingDataModelDelegate::StorageType::kIsolatedWebApp),
+         /*storage_size=*/105, /*cookie_count=*/0}},
+       {iwa_url_info2.origin().host(),
+        iwa_url_info2.origin(),
+        {static_cast<BrowsingDataModel::StorageType>(
+             ChromeBrowsingDataModelDelegate::StorageType::kIsolatedWebApp),
+         /*storage_size=*/505, /*cookie_count=*/0}}});
+}
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_model_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_model_delegate.cc
index d4a6852..b6f804f 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_model_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_model_delegate.cc
@@ -4,14 +4,54 @@
 
 #include "chrome/browser/browsing_data/chrome_browsing_data_model_delegate.h"
 
+#include <memory>
+
 #include "chrome/browser/browsing_topics/browsing_topics_service_factory.h"
 #include "components/browsing_topics/browsing_topics_service.h"
 #include "components/content_settings/browser/page_specific_content_settings.h"
+#include "content/public/browser/storage_partition.h"
+#include "content/public/browser/storage_partition_config.h"
+#include "url/origin.h"
+
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/web_applications/web_app_command_scheduler.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#endif
+
+namespace {
+
+#if !BUILDFLAG(IS_ANDROID)
+std::vector<ChromeBrowsingDataModelDelegate::DelegateEntry>
+IsolatedWebAppBrowsingDataToDelegateEntries(
+    base::flat_map<url::Origin, int64_t> isolated_web_app_browsing_data) {
+  std::vector<ChromeBrowsingDataModelDelegate::DelegateEntry> entries;
+  for (auto const& [origin, size] : isolated_web_app_browsing_data) {
+    entries.emplace_back(
+        origin,
+        static_cast<BrowsingDataModel::StorageType>(
+            ChromeBrowsingDataModelDelegate::StorageType::kIsolatedWebApp),
+        size);
+  }
+  return entries;
+}
+#endif
+
+}  // namespace
 
 // static
 std::unique_ptr<ChromeBrowsingDataModelDelegate>
 ChromeBrowsingDataModelDelegate::CreateForProfile(Profile* profile) {
-  return std::make_unique<ChromeBrowsingDataModelDelegate>(profile);
+  return base::WrapUnique(new ChromeBrowsingDataModelDelegate(
+      profile, profile->GetDefaultStoragePartition()));
+}
+
+// static
+std::unique_ptr<ChromeBrowsingDataModelDelegate>
+ChromeBrowsingDataModelDelegate::CreateForStoragePartition(
+    Profile* profile,
+    content::StoragePartition* storage_partition) {
+  return base::WrapUnique(
+      new ChromeBrowsingDataModelDelegate(profile, storage_partition));
 }
 
 // static
@@ -26,15 +66,29 @@
 }
 
 ChromeBrowsingDataModelDelegate::ChromeBrowsingDataModelDelegate(
-    Profile* profile)
-    : profile_(profile) {}
+    Profile* profile,
+    content::StoragePartition* storage_partition)
+    : profile_(profile), storage_partition_(storage_partition) {}
 
 ChromeBrowsingDataModelDelegate::~ChromeBrowsingDataModelDelegate() = default;
 
 void ChromeBrowsingDataModelDelegate::GetAllDataKeys(
     base::OnceCallback<void(std::vector<DelegateEntry>)> callback) {
-  // TODO(crbug.com/1271155): Implement data retrieval for remaining data types.
+#if !BUILDFLAG(IS_ANDROID)
+  if (storage_partition_->GetConfig().is_default()) {
+    auto* web_app_provider = web_app::WebAppProvider::GetForWebApps(profile_);
+    DCHECK(web_app_provider);
+    web_app_provider->scheduler().GetIsolatedWebAppBrowsingData(
+        base::BindOnce(&IsolatedWebAppBrowsingDataToDelegateEntries)
+            .Then(std::move(callback)));
+  } else {
+    std::move(callback).Run({});
+  }
+#else
   std::move(callback).Run({});
+#endif
+
+  // TODO(crbug.com/1271155): Implement data retrieval for remaining data types.
 }
 
 void ChromeBrowsingDataModelDelegate::RemoveDataKey(
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_model_delegate.h b/chrome/browser/browsing_data/chrome_browsing_data_model_delegate.h
index 3c10c27..fd00460f 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_model_delegate.h
+++ b/chrome/browser/browsing_data/chrome_browsing_data_model_delegate.h
@@ -5,10 +5,16 @@
 #ifndef CHROME_BROWSER_BROWSING_DATA_CHROME_BROWSING_DATA_MODEL_DELEGATE_H_
 #define CHROME_BROWSER_BROWSING_DATA_CHROME_BROWSING_DATA_MODEL_DELEGATE_H_
 
+#include "base/containers/flat_map.h"
+#include "base/functional/callback.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/browsing_data/content/browsing_data_model.h"
 #include "content/public/browser/render_frame_host.h"
 
+namespace content {
+class StoragePartition;
+}  // namespace content
+
 class ChromeBrowsingDataModelDelegate : public BrowsingDataModel::Delegate {
  public:
   // Storage types which are represented by the model. Some types have
@@ -16,16 +22,22 @@
   // TODO(crbug.com/1271155): Complete implementations for all browsing data.
   enum class StorageType {
     kTopics = static_cast<int>(BrowsingDataModel::StorageType::kLastType) +
-              1,  // Not fetched from disk.
+              1,      // Not fetched from disk.
+    kIsolatedWebApp,  // Not yet deletable.
   };
 
-  static std::unique_ptr<ChromeBrowsingDataModelDelegate> CreateForProfile(
-      Profile* profile);
   static void BrowsingDataAccessed(content::RenderFrameHost* rfh,
                                    BrowsingDataModel::DataKey data_key,
                                    StorageType storage_type,
                                    bool blocked);
-  explicit ChromeBrowsingDataModelDelegate(Profile* profile);
+
+  static std::unique_ptr<ChromeBrowsingDataModelDelegate> CreateForProfile(
+      Profile* profile);
+
+  static std::unique_ptr<ChromeBrowsingDataModelDelegate>
+  CreateForStoragePartition(Profile* profile,
+                            content::StoragePartition* storage_partition);
+
   ~ChromeBrowsingDataModelDelegate() override;
 
   // BrowsingDataModel::Delegate:
@@ -36,7 +48,11 @@
                      base::OnceClosure callback) override;
 
  private:
+  ChromeBrowsingDataModelDelegate(Profile* profile,
+                                  content::StoragePartition* storage_partition);
+
   const raw_ptr<Profile> profile_;
+  const raw_ptr<content::StoragePartition> storage_partition_;
 };
 
 #endif  // CHROME_BROWSER_BROWSING_DATA_CHROME_BROWSING_DATA_MODEL_DELEGATE_H_
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index 3b931dd8..d7ca8af 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -977,12 +977,18 @@
       RegisterWebUIControllerInterfaceBinder<
           history_clusters::mojom::PageHandler, HistoryUI>(map);
     }
+  }
 
-    if (history_clusters_service->IsJourneysImagesEnabled()) {
-      RegisterWebUIControllerInterfaceBinder<
-          image_service::mojom::ImageServiceHandler, HistoryUI,
-          HistoryClustersSidePanelUI, NewTabPageUI>(map);
-    }
+  if ((history_clusters_service &&
+       history_clusters_service->IsJourneysEnabled() &&
+       history_clusters_service->IsJourneysImagesEnabled()) ||
+      base::FeatureList::IsEnabled(ntp_features::kNtpHistoryClustersModule) ||
+      base::FeatureList::IsEnabled(
+          ntp_features::kNtpHistoryClustersModuleLoad) ||
+      base::FeatureList::IsEnabled(features::kPowerBookmarksSidePanel)) {
+    RegisterWebUIControllerInterfaceBinder<
+        image_service::mojom::ImageServiceHandler, HistoryUI,
+        HistoryClustersSidePanelUI, NewTabPageUI, BookmarksSidePanelUI>(map);
   }
 
   RegisterWebUIControllerInterfaceBinder<
@@ -1057,10 +1063,6 @@
   RegisterWebUIControllerInterfaceBinder<
       shopping_list::mojom::ShoppingListHandlerFactory, BookmarksSidePanelUI>(
       map);
-  if (base::FeatureList::IsEnabled(features::kPowerBookmarksSidePanel)) {
-    RegisterWebUIControllerInterfaceBinder<
-        image_service::mojom::ImageServiceHandler, BookmarksSidePanelUI>(map);
-  }
 
   if (customize_chrome::IsSidePanelEnabled()) {
     RegisterWebUIControllerInterfaceBinder<
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 05ee5a2..6071b1f 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -7402,7 +7402,7 @@
     bool is_portal_state =
         ash::network_health::NetworkHealthManager::GetInstance()
             ->helper()
-            ->IsPortalState();
+            ->IsWiFiPortalState();
     alternative_error_page_override_info->alternative_error_page_params.Set(
         error_page::kIsPortalStateKey, base::Value(is_portal_state));
     return alternative_error_page_override_info;
diff --git a/chrome/browser/content_settings/page_specific_content_settings_delegate.cc b/chrome/browser/content_settings/page_specific_content_settings_delegate.cc
index fc14ee8..24649e5 100644
--- a/chrome/browser/content_settings/page_specific_content_settings_delegate.cc
+++ b/chrome/browser/content_settings/page_specific_content_settings_delegate.cc
@@ -126,8 +126,9 @@
 
 std::unique_ptr<BrowsingDataModel::Delegate>
 PageSpecificContentSettingsDelegate::CreateBrowsingDataModelDelegate() {
-  return ChromeBrowsingDataModelDelegate::CreateForProfile(
-      Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
+  return ChromeBrowsingDataModelDelegate::CreateForStoragePartition(
+      Profile::FromBrowserContext(web_contents()->GetBrowserContext()),
+      web_contents()->GetPrimaryMainFrame()->GetStoragePartition());
 }
 
 namespace {
diff --git a/chrome/browser/download/bubble/download_bubble_prefs.cc b/chrome/browser/download/bubble/download_bubble_prefs.cc
index d49cca2e..32cb5b9 100644
--- a/chrome/browser/download/bubble/download_bubble_prefs.cc
+++ b/chrome/browser/download/bubble/download_bubble_prefs.cc
@@ -64,9 +64,4 @@
   return profile->GetPrefs()->GetBoolean(prefs::kDownloadBubbleIphSuppression);
 }
 
-void SetShouldSuppressDownloadBubbleIph(Profile* profile, bool suppress) {
-  profile->GetPrefs()->SetBoolean(prefs::kDownloadBubbleIphSuppression,
-                                  suppress);
-}
-
 }  // namespace download
diff --git a/chrome/browser/download/bubble/download_bubble_prefs.h b/chrome/browser/download/bubble/download_bubble_prefs.h
index c93269b..fa8769903 100644
--- a/chrome/browser/download/bubble/download_bubble_prefs.h
+++ b/chrome/browser/download/bubble/download_bubble_prefs.h
@@ -23,9 +23,6 @@
 // Whether to suppress the download bubble IPH. This will be true for users
 // who have interacted with the download bubble prior to the IPH being added.
 bool ShouldSuppressDownloadBubbleIph(Profile* profile);
-// TODO(crbug.com/1420750): This setter is temporary and should be removed when
-// the IPH is implemented.
-void SetShouldSuppressDownloadBubbleIph(Profile* profile, bool suppress);
 
 }  // namespace download
 
diff --git a/chrome/browser/download/bubble/download_bubble_prefs_unittest.cc b/chrome/browser/download/bubble/download_bubble_prefs_unittest.cc
index 27467524..f625cf64 100644
--- a/chrome/browser/download/bubble/download_bubble_prefs_unittest.cc
+++ b/chrome/browser/download/bubble/download_bubble_prefs_unittest.cc
@@ -138,7 +138,9 @@
 TEST_F(DownloadBubblePrefsTest, ShouldSuppressIph) {
   // Test default value.
   EXPECT_FALSE(ShouldSuppressDownloadBubbleIph(profile_));
-  SetShouldSuppressDownloadBubbleIph(profile_, true);
+
+  // Test when user has previous interaction with the bubble.
+  profile_->GetPrefs()->SetBoolean(prefs::kDownloadBubbleIphSuppression, true);
   EXPECT_TRUE(ShouldSuppressDownloadBubbleIph(profile_));
 }
 
diff --git a/chrome/browser/download/bubble/download_bubble_ui_controller.cc b/chrome/browser/download/bubble/download_bubble_ui_controller.cc
index ec2339d..23166ba 100644
--- a/chrome/browser/download/bubble/download_bubble_ui_controller.cc
+++ b/chrome/browser/download/bubble/download_bubble_ui_controller.cc
@@ -23,6 +23,7 @@
 #include "chrome/browser/download/offline_item_model_manager.h"
 #include "chrome/browser/download/offline_item_model_manager_factory.h"
 #include "chrome/browser/download/offline_item_utils.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
 #include "chrome/browser/offline_items_collection/offline_content_aggregator_factory.h"
 #include "chrome/browser/profiles/profile_key.h"
 #include "chrome/browser/safe_browsing/download_protection/download_protection_service.h"
@@ -32,6 +33,7 @@
 #include "components/download/public/common/download_danger_type.h"
 #include "components/download/public/common/download_item.h"
 #include "components/download/public/common/download_stats.h"
+#include "components/feature_engagement/public/tracker.h"
 #include "components/offline_items_collection/core/offline_content_aggregator.h"
 #include "content/public/browser/download_manager.h"
 
@@ -605,6 +607,8 @@
 }
 
 void DownloadBubbleUIController::RecordDownloadBubbleInteraction() {
-  download::SetShouldSuppressDownloadBubbleIph(
-      browser_->profile()->GetOriginalProfile(), true);
+  feature_engagement::Tracker* tracker =
+      feature_engagement::TrackerFactory::GetForBrowserContext(
+          browser_->profile());
+  tracker->NotifyEvent("download_bubble_interaction");
 }
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index 07ab529..789638c 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/download/download_browsertest.h"
-
 #include <stdint.h>
 
 #include <algorithm>
@@ -45,6 +43,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/download/chrome_download_manager_delegate.h"
+#include "chrome/browser/download/download_browsertest_utils.h"
 #include "chrome/browser/download/download_commands.h"
 #include "chrome/browser/download/download_core_service.h"
 #include "chrome/browser/download/download_core_service_factory.h"
@@ -207,8 +206,6 @@
   base::RunLoop run_loop_{base::RunLoop::Type::kNestableTasksAllowed};
 };
 
-const char kDownloadTest1Path[] = "download-test1.lib";
-
 void VerifyNewDownloadId(uint32_t expected_download_id, uint32_t download_id) {
   ASSERT_EQ(expected_download_id, download_id);
 }
@@ -356,41 +353,6 @@
   int prev_percent_ = -1;
 };
 
-// DownloadTestObserver subclass that observes one download until it transitions
-// from a non-resumable state to a resumable state a specified number of
-// times. Note that this observer can only observe a single download.
-class DownloadTestObserverResumable : public content::DownloadTestObserver {
- public:
-  // Construct a new observer. |transition_count| is the number of times the
-  // download should transition from a non-resumable state to a resumable state.
-  DownloadTestObserverResumable(DownloadManager* download_manager,
-                                size_t transition_count)
-      : DownloadTestObserver(download_manager, 1,
-                             ON_DANGEROUS_DOWNLOAD_FAIL),
-        was_previously_resumable_(false),
-        transitions_left_(transition_count) {
-    Init();
-  }
-
-  DownloadTestObserverResumable(const DownloadTestObserverResumable&) = delete;
-  DownloadTestObserverResumable& operator=(
-      const DownloadTestObserverResumable&) = delete;
-
-  ~DownloadTestObserverResumable() override {}
-
- private:
-  bool IsDownloadInFinalState(DownloadItem* download) override {
-    bool is_resumable_now = download->CanResume();
-    if (!was_previously_resumable_ && is_resumable_now)
-      --transitions_left_;
-    was_previously_resumable_ = is_resumable_now;
-    return transitions_left_ == 0;
-  }
-
-  bool was_previously_resumable_;
-  size_t transitions_left_;
-};
-
 // IDs and paths of CRX files used in tests.
 const char kGoodCrxId[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
 const char kGoodCrxPath[] = "extensions/good.crx";
@@ -429,10 +391,6 @@
   raw_ptr<Profile> profile_;
 };
 
-static DownloadManager* DownloadManagerForBrowser(Browser* browser) {
-  return browser->profile()->GetDownloadManager();
-}
-
 bool WasAutoOpened(DownloadItem* item) {
   return item->GetAutoOpened();
 }
@@ -547,26 +505,6 @@
 
 }  // namespace
 
-DownloadTestObserverNotInProgress::DownloadTestObserverNotInProgress(
-    DownloadManager* download_manager,
-    size_t count)
-    : DownloadTestObserver(download_manager, count, ON_DANGEROUS_DOWNLOAD_FAIL),
-      started_observing_(false) {
-  Init();
-}
-
-DownloadTestObserverNotInProgress::~DownloadTestObserverNotInProgress() {}
-
-void DownloadTestObserverNotInProgress::StartObserving() {
-  started_observing_ = true;
-}
-
-bool DownloadTestObserverNotInProgress::IsDownloadInFinalState(
-    DownloadItem* download) {
-  return started_observing_ &&
-         download->GetState() != DownloadItem::IN_PROGRESS;
-}
-
 class HistoryObserver : public DownloadHistory::Observer {
  public:
   explicit HistoryObserver(Profile* profile) : profile_(profile) {
@@ -612,687 +550,13 @@
   bool seen_stored_ = false;
 };
 
-class DownloadTest : public InProcessBrowserTest {
- public:
-  // Choice of navigation or direct fetch.  Used by |DownloadFileCheckErrors()|.
-  enum DownloadMethod {
-    DOWNLOAD_NAVIGATE,
-    DOWNLOAD_DIRECT
-  };
-
-  // Information passed in to |DownloadFileCheckErrors()|.
-  struct DownloadInfo {
-    const char* starting_url;           // URL for initiating the download.
-    const char* expected_download_url;  // Expected value of DI::GetURL(). Can
-                                        // be different if |starting_url|
-                                        // initiates a download from another
-                                        // URL.
-    DownloadMethod download_method;     // Navigation or Direct.
-    // Download interrupt reason (NONE is OK).
-    download::DownloadInterruptReason reason;
-    bool show_download_item;  // True if the download item appears on the shelf.
-    bool should_redirect_to_documents;  // True if we save it in "My Documents".
-  };
-
-  struct FileErrorInjectInfo {
-    DownloadInfo download_info;
-    content::TestFileErrorInjector::FileErrorInfo error_info;
-  };
-
-  DownloadTest() {}
-
-  void SetUpOnMainThread() override {
-    ASSERT_TRUE(CheckTestDir());
-    ASSERT_TRUE(InitialSetup());
-    host_resolver()->AddRule("www.a.com", "127.0.0.1");
-    host_resolver()->AddRule("foo.com", "127.0.0.1");
-    host_resolver()->AddRule("bar.com", "127.0.0.1");
-    content::SetupCrossSiteRedirector(embedded_test_server());
-  }
-
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    // Slower builders (linux-chromeos-rel, debug, and maybe others) are flaky
-    // due to slower loading interacting with deferred commits.
-    command_line->AppendSwitch(blink::switches::kAllowPreCommitInput);
-  }
-
-  void TearDownOnMainThread() override {
-    // Needs to be torn down on the main thread. file_activity_observer_ holds a
-    // reference to the ChromeDownloadManagerDelegate which should be destroyed
-    // on the UI thread.
-    file_activity_observer_.reset();
-  }
-
-  bool CheckTestDir() {
-    bool have_test_dir =
-        base::PathService::Get(chrome::DIR_TEST_DATA, &test_dir_);
-    EXPECT_TRUE(have_test_dir);
-    return have_test_dir;
-  }
-
-  // Returning false indicates a failure of the setup, and should be asserted
-  // in the caller.
-  bool InitialSetup() {
-    // Sanity check default values for window and tab count.
-    int window_count = chrome::GetTotalBrowserCount();
-    EXPECT_EQ(1, window_count);
-    EXPECT_EQ(1, browser()->tab_strip_model()->count());
-
-    browser()->profile()->GetPrefs()->SetBoolean(
-        prefs::kPromptForDownload, false);
-
-    DownloadManager* manager = DownloadManagerForBrowser(browser());
-    DownloadPrefs::FromDownloadManager(manager)->ResetAutoOpenByUser();
-
-    file_activity_observer_ =
-        std::make_unique<DownloadTestFileActivityObserver>(
-            browser()->profile());
-
-    return true;
-  }
-
- protected:
-  enum SizeTestType {
-    SIZE_TEST_TYPE_KNOWN,
-    SIZE_TEST_TYPE_UNKNOWN,
-  };
-
-  base::FilePath GetTestDataDirectory() {
-    base::FilePath test_file_directory;
-    base::PathService::Get(chrome::DIR_TEST_DATA, &test_file_directory);
-    return test_file_directory;
-  }
-
-  // Location of the file source (the place from which it is downloaded).
-  base::FilePath OriginFile(const base::FilePath& file) {
-    return test_dir_.Append(file);
-  }
-
-  // Location of the file destination (place to which it is downloaded).
-  base::FilePath DestinationFile(Browser* browser, const base::FilePath& file) {
-    return GetDownloadDirectory(browser).Append(file.BaseName());
-  }
-
-  content::TestDownloadResponseHandler* test_response_handler() {
-    return &test_response_handler_;
-  }
-
-  DownloadPrefs* GetDownloadPrefs(Browser* browser) {
-    return DownloadPrefs::FromDownloadManager(
-        DownloadManagerForBrowser(browser));
-  }
-
-  base::FilePath GetDownloadDirectory(Browser* browser) {
-    return GetDownloadPrefs(browser)->DownloadPath();
-  }
-
-  // Create a DownloadTestObserverTerminal that will wait for the
-  // specified number of downloads to finish.
-  content::DownloadTestObserver* CreateWaiter(
-      Browser* browser, int num_downloads) {
-    DownloadManager* download_manager = DownloadManagerForBrowser(browser);
-    return new content::DownloadTestObserverTerminal(
-        download_manager, num_downloads,
-        content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
-  }
-
-  // Create a DownloadTestObserverInProgress that will wait for the
-  // specified number of downloads to start.
-  content::DownloadTestObserver* CreateInProgressWaiter(
-      Browser* browser, int num_downloads) {
-    DownloadManager* download_manager = DownloadManagerForBrowser(browser);
-    return new content::DownloadTestObserverInProgress(
-        download_manager, num_downloads);
-  }
-
-  // Create a DownloadTestObserverTerminal that will wait for the
-  // specified number of downloads to finish, or for
-  // a dangerous download warning to be shown.
-  content::DownloadTestObserver* DangerousDownloadWaiter(
-      Browser* browser,
-      int num_downloads,
-      content::DownloadTestObserver::DangerousDownloadAction
-          dangerous_download_action) {
-    DownloadManager* download_manager = DownloadManagerForBrowser(browser);
-    return new content::DownloadTestObserverTerminal(
-        download_manager, num_downloads, dangerous_download_action);
-  }
-
-  void CheckDownloadStatesForBrowser(Browser* browser,
-                                     size_t num,
-                                     DownloadItem::DownloadState state) {
-    std::vector<DownloadItem*> download_items;
-    GetDownloads(browser, &download_items);
-
-    EXPECT_EQ(num, download_items.size());
-
-    for (size_t i = 0; i < download_items.size(); ++i) {
-      EXPECT_EQ(state, download_items[i]->GetState()) << " Item " << i;
-    }
-  }
-
-  void CheckDownloadStates(size_t num, DownloadItem::DownloadState state) {
-    CheckDownloadStatesForBrowser(browser(), num, state);
-  }
-
-  bool VerifyNoDownloads() const {
-    DownloadManager::DownloadVector items;
-    GetDownloads(browser(), &items);
-    return items.empty();
-  }
-
-  // Download |url|, then wait for the download to finish.
-  // |disposition| indicates where the navigation occurs (current tab, new
-  // foreground tab, etc).
-  // |browser_test_flags| indicate what to wait for, and is an OR of 0 or more
-  // values in the ui_test_utils::BrowserTestWaitFlags enum.
-  void DownloadAndWaitWithDisposition(Browser* browser,
-                                      const GURL& url,
-                                      WindowOpenDisposition disposition,
-                                      int browser_test_flags) {
-    // Setup notification, navigate, and block.
-    std::unique_ptr<content::DownloadTestObserver> observer(
-        CreateWaiter(browser, 1));
-    // This call will block until the condition specified by
-    // |browser_test_flags|, but will not wait for the download to finish.
-    ui_test_utils::NavigateToURLWithDisposition(browser,
-                                                url,
-                                                disposition,
-                                                browser_test_flags);
-    // Waits for the download to complete.
-    observer->WaitForFinished();
-    EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE));
-    // We don't expect a file chooser to be shown.
-    EXPECT_FALSE(DidShowFileChooser());
-  }
-
-  // Download a file in the current tab, then wait for the download to finish.
-  void DownloadAndWait(Browser* browser,
-                       const GURL& url) {
-    DownloadAndWaitWithDisposition(
-        browser, url, WindowOpenDisposition::CURRENT_TAB,
-        ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
-  }
-
-  // Should only be called when the download is known to have finished
-  // (in error or not).
-  // Returning false indicates a failure of the function, and should be asserted
-  // in the caller.
-  bool CheckDownload(Browser* browser,
-                     const base::FilePath& downloaded_filename,
-                     const base::FilePath& origin_filename) {
-    // Find the path to which the data will be downloaded.
-    base::FilePath downloaded_file(
-        DestinationFile(browser, downloaded_filename));
-
-    // Find the origin path (from which the data comes).
-    base::FilePath origin_file(OriginFile(origin_filename));
-    return CheckDownloadFullPaths(browser, downloaded_file, origin_file);
-  }
-
-  // A version of CheckDownload that allows complete path specification.
-  bool CheckDownloadFullPaths(Browser* browser,
-                              const base::FilePath& downloaded_file,
-                              const base::FilePath& origin_file) {
-    base::ScopedAllowBlockingForTesting allow_blocking;
-    bool origin_file_exists = base::PathExists(origin_file);
-    EXPECT_TRUE(origin_file_exists) << origin_file.value();
-    if (!origin_file_exists)
-      return false;
-
-    // Confirm the downloaded data file exists.
-    bool downloaded_file_exists = base::PathExists(downloaded_file);
-    EXPECT_TRUE(downloaded_file_exists) << downloaded_file.value();
-    if (!downloaded_file_exists)
-      return false;
-
-    int64_t origin_file_size = 0;
-    EXPECT_TRUE(base::GetFileSize(origin_file, &origin_file_size));
-    std::string original_file_contents;
-    EXPECT_TRUE(base::ReadFileToString(origin_file, &original_file_contents));
-    EXPECT_TRUE(
-        VerifyFile(downloaded_file, original_file_contents, origin_file_size));
-
-    // Delete the downloaded copy of the file.
-    bool downloaded_file_deleted = base::DieFileDie(downloaded_file, false);
-    EXPECT_TRUE(downloaded_file_deleted);
-    return downloaded_file_deleted;
-  }
-
-  content::DownloadTestObserver* CreateInProgressDownloadObserver(
-      size_t download_count) {
-    DownloadManager* manager = DownloadManagerForBrowser(browser());
-    return new content::DownloadTestObserverInProgress(
-        manager, download_count);
-  }
-
-  DownloadItem* CreateSlowTestDownload() {
-    std::unique_ptr<content::DownloadTestObserver> observer(
-        CreateInProgressDownloadObserver(1));
-    embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
-        &content::SlowDownloadHttpResponse::HandleSlowDownloadRequest));
-    EXPECT_TRUE(embedded_test_server()->Start());
-    GURL slow_download_url = embedded_test_server()->GetURL(
-        content::SlowDownloadHttpResponse::kKnownSizeUrl);
-
-    DownloadManager* manager = DownloadManagerForBrowser(browser());
-
-    EXPECT_EQ(0, manager->NonMaliciousInProgressCount());
-    EXPECT_EQ(0, manager->InProgressCount());
-    if (manager->InProgressCount() != 0)
-      return nullptr;
-
-    EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), slow_download_url));
-
-    observer->WaitForFinished();
-    EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
-
-    DownloadManager::DownloadVector items;
-    manager->GetAllDownloads(&items);
-
-    DownloadItem* new_item = nullptr;
-    for (auto iter = items.begin(); iter != items.end(); ++iter) {
-      if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) {
-        // There should be only one IN_PROGRESS item.
-        EXPECT_FALSE(new_item);
-        new_item = *iter;
-      }
-    }
-    return new_item;
-  }
-
-  bool RunSizeTest(Browser* browser,
-                   SizeTestType type,
-                   const std::string& partial_indication,
-                   const std::string& total_indication) {
-    embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
-    embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
-        &content::SlowDownloadHttpResponse::HandleSlowDownloadRequest));
-    EXPECT_TRUE(embedded_test_server()->Start());
-
-    base::ScopedAllowBlockingForTesting allow_blocking;
-    EXPECT_TRUE(type == SIZE_TEST_TYPE_UNKNOWN || type == SIZE_TEST_TYPE_KNOWN);
-    if (type != SIZE_TEST_TYPE_KNOWN && type != SIZE_TEST_TYPE_UNKNOWN)
-      return false;
-    GURL url(type == SIZE_TEST_TYPE_KNOWN
-                 ? embedded_test_server()->GetURL(
-                       content::SlowDownloadHttpResponse::kKnownSizeUrl)
-                 : embedded_test_server()->GetURL(
-                       content::SlowDownloadHttpResponse::kUnknownSizeUrl));
-    GURL finish_url = embedded_test_server()->GetURL(
-        content::SlowDownloadHttpResponse::kFinishSlowResponseUrl);
-
-    // TODO(ahendrickson) -- |expected_title_in_progress| and
-    // |expected_title_finished| need to be checked.
-    base::FilePath filename = base::FilePath::FromUTF8Unsafe(url.path());
-    std::u16string expected_title_in_progress(
-        base::ASCIIToUTF16(partial_indication) + filename.LossyDisplayName());
-    std::u16string expected_title_finished(
-        base::ASCIIToUTF16(total_indication) + filename.LossyDisplayName());
-
-    // Download a partial web page in a background tab and wait.
-    // The mock system will not complete until it gets a special URL.
-    std::unique_ptr<content::DownloadTestObserver> observer(
-        CreateWaiter(browser, 1));
-    EXPECT_TRUE(ui_test_utils::NavigateToURL(browser, url));
-
-    // TODO(ahendrickson): check download status text before downloading.
-    // Need to:
-    //  - Add a member function to the |DownloadShelf| interface class, that
-    //    indicates how many members it has.
-    //  - Add a member function to |DownloadShelf| to get the status text
-    //    of a given member (for example, via the name in |DownloadItemView|'s
-    //    GetAccessibleNodeData() member function), by index.
-    //  - Iterate over browser->window()->GetDownloadShelf()'s members
-    //    to see if any match the status text we want.  Start with the last one.
-
-    // Allow the request to finish.  We do this by loading a second URL in a
-    // separate tab.
-
-    ui_test_utils::NavigateToURLWithDisposition(
-        browser, finish_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
-        ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
-    observer->WaitForFinished();
-    EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE));
-    CheckDownloadStatesForBrowser(browser, 1, DownloadItem::COMPLETE);
-
-    EXPECT_EQ(2, browser->tab_strip_model()->count());
-
-    // TODO(ahendrickson): check download status text after downloading.
-
-    base::FilePath download_path =
-        GetDownloadDirectory(browser).Append(filename.BaseName());
-
-    bool downloaded_path_exists = base::PathExists(download_path);
-    EXPECT_TRUE(downloaded_path_exists);
-    if (!downloaded_path_exists)
-      return false;
-
-    // Check the file contents.
-    size_t file_size =
-        content::SlowDownloadHttpResponse::kFirstResponsePartSize +
-        content::SlowDownloadHttpResponse::kSecondResponsePartSize;
-    std::string expected_contents(file_size, '*');
-    EXPECT_TRUE(VerifyFile(download_path, expected_contents, file_size));
-
-    // Delete the file we just downloaded.
-    EXPECT_TRUE(base::DieFileDie(download_path, false));
-    EXPECT_FALSE(base::PathExists(download_path));
-
-    return true;
-  }
-
-  void GetDownloads(Browser* browser,
-                    std::vector<DownloadItem*>* downloads) const {
-    DCHECK(downloads);
-    DownloadManager* manager = DownloadManagerForBrowser(browser);
-    manager->GetAllDownloads(downloads);
-  }
-
-  static void ExpectWindowCountAfterDownload(size_t expected) {
-    EXPECT_EQ(expected, chrome::GetTotalBrowserCount());
-  }
-
-  void EnableFileChooser(bool enable) {
-    file_activity_observer_->EnableFileChooser(enable);
-  }
-
-  bool DidShowFileChooser() {
-    return file_activity_observer_->TestAndResetDidShowFileChooser();
-  }
-
-  // Checks that |path| is has |file_size| bytes, and matches the |value|
-  // string.
-  bool VerifyFile(const base::FilePath& path,
-                  const std::string& value,
-                  const int64_t file_size) {
-    std::string file_contents;
-
-    base::ScopedAllowBlockingForTesting allow_blocking;
-    bool read = base::ReadFileToString(path, &file_contents);
-    EXPECT_TRUE(read) << "Failed reading file: " << path.value() << std::endl;
-    if (!read)
-      return false;  // Couldn't read the file.
-
-    // Note: we don't handle really large files (more than size_t can hold)
-    // so we will fail in that case.
-    size_t expected_size = static_cast<size_t>(file_size);
-
-    // Check the size.
-    EXPECT_EQ(expected_size, file_contents.size());
-    if (expected_size != file_contents.size())
-      return false;
-
-    // Check the contents.
-    EXPECT_EQ(value, file_contents);
-    if (memcmp(file_contents.c_str(), value.c_str(), expected_size) != 0)
-      return false;
-
-    return true;
-  }
-
-  // Attempts to download a file, based on information in |download_info|.
-  // If a Select File dialog opens, will automatically choose the default.
-  void DownloadFilesCheckErrorsSetup() {
-    embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
-    ASSERT_TRUE(embedded_test_server()->Start());
-    std::vector<DownloadItem*> download_items;
-    GetDownloads(browser(), &download_items);
-    ASSERT_TRUE(download_items.empty());
-
-    EnableFileChooser(true);
-  }
-
-  void DownloadFilesCheckErrorsLoopBody(const DownloadInfo& download_info,
-                                        size_t i) {
-    SCOPED_TRACE(testing::Message()
-                 << " " << __FUNCTION__ << "()"
-                 << " index = " << i << " starting_url = '"
-                 << download_info.starting_url << "'"
-                 << " download_url = '" << download_info.expected_download_url
-                 << "'"
-                 << " method = "
-                 << ((download_info.download_method == DOWNLOAD_DIRECT)
-                         ? "DOWNLOAD_DIRECT"
-                         : "DOWNLOAD_NAVIGATE")
-                 << " show_item = " << download_info.show_download_item
-                 << " reason = "
-                 << DownloadInterruptReasonToString(download_info.reason));
-
-    std::vector<DownloadItem*> download_items;
-    GetDownloads(browser(), &download_items);
-    size_t downloads_expected = download_items.size();
-
-    // GURL("http://foo/bar").Resolve("baz") => "http://foo/bar/baz"
-    // GURL("http://foo/bar").Resolve("http://baz") => "http://baz"
-    // I.e. both starting_url and expected_download_url can either be relative
-    // to the base test server URL or be an absolute URL.
-    GURL base_url = embedded_test_server()->GetURL("/downloads/");
-    GURL starting_url = base_url.Resolve(download_info.starting_url);
-    GURL download_url = base_url.Resolve(download_info.expected_download_url);
-    ASSERT_TRUE(starting_url.is_valid());
-    ASSERT_TRUE(download_url.is_valid());
-
-    DownloadManager* download_manager = DownloadManagerForBrowser(browser());
-    WebContents* web_contents =
-        browser()->tab_strip_model()->GetActiveWebContents();
-    ASSERT_TRUE(web_contents);
-
-    std::unique_ptr<content::DownloadTestObserver> observer;
-    if (download_info.reason == download::DOWNLOAD_INTERRUPT_REASON_NONE) {
-      observer = std::make_unique<content::DownloadTestObserverTerminal>(
-          download_manager, 1,
-          content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
-    } else {
-      observer = std::make_unique<content::DownloadTestObserverInterrupted>(
-          download_manager, 1,
-          content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
-    }
-
-    if (download_info.download_method == DOWNLOAD_DIRECT) {
-      // Go directly to download.  Don't wait for navigation.
-      scoped_refptr<content::DownloadTestItemCreationObserver>
-          creation_observer(new content::DownloadTestItemCreationObserver);
-
-      std::unique_ptr<DownloadUrlParameters> params(
-          content::DownloadRequestUtils::CreateDownloadForWebContentsMainFrame(
-              web_contents, starting_url, TRAFFIC_ANNOTATION_FOR_TESTS));
-      params->set_callback(creation_observer->callback());
-      DownloadManagerForBrowser(browser())->DownloadUrl(std::move(params));
-
-      // Wait until the item is created, or we have determined that it
-      // won't be.
-      creation_observer->WaitForDownloadItemCreation();
-
-      EXPECT_NE(download::DownloadItem::kInvalidId,
-                creation_observer->download_id());
-    } else {
-      // Navigate to URL normally, wait until done.
-      ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
-          browser(), starting_url, 1);
-    }
-
-    if (download_info.show_download_item) {
-      downloads_expected++;
-      observer->WaitForFinished();
-      DownloadItem::DownloadState final_state =
-          (download_info.reason == download::DOWNLOAD_INTERRUPT_REASON_NONE)
-              ? DownloadItem::COMPLETE
-              : DownloadItem::INTERRUPTED;
-      EXPECT_EQ(1u, observer->NumDownloadsSeenInState(final_state));
-    }
-
-    // Wait till the |DownloadFile|s are destroyed.
-    content::RunAllTasksUntilIdle();
-
-    // Validate that the correct files were downloaded.
-    download_items.clear();
-    GetDownloads(browser(), &download_items);
-    ASSERT_EQ(downloads_expected, download_items.size());
-
-    if (download_info.show_download_item) {
-      // Find the last download item.
-      DownloadItem* item = download_items[0];
-      for (size_t d = 1; d < downloads_expected; ++d) {
-        if (download_items[d]->GetStartTime() > item->GetStartTime())
-          item = download_items[d];
-      }
-
-      EXPECT_EQ(download_url, item->GetURL());
-      EXPECT_EQ(download_info.reason, item->GetLastReason());
-
-      if (item->GetState() == download::DownloadItem::COMPLETE) {
-        // Clean up the file, in case it ended up in the My Documents folder.
-        base::ScopedAllowBlockingForTesting allow_blocking;
-        base::FilePath destination_folder = GetDownloadDirectory(browser());
-        base::FilePath my_downloaded_file = item->GetTargetFilePath();
-        EXPECT_TRUE(base::PathExists(my_downloaded_file));
-        EXPECT_TRUE(base::DeleteFile(my_downloaded_file));
-        item->Remove();
-
-        EXPECT_EQ(download_info.should_redirect_to_documents ?
-                      std::string::npos :
-                      0u,
-                  my_downloaded_file.value().find(destination_folder.value()));
-        if (download_info.should_redirect_to_documents) {
-          // If it's not where we asked it to be, it should be in the
-          // My Documents folder.
-          base::FilePath my_docs_folder;
-          EXPECT_TRUE(base::PathService::Get(chrome::DIR_USER_DOCUMENTS,
-                                             &my_docs_folder));
-          EXPECT_EQ(0u,
-                    my_downloaded_file.value().find(my_docs_folder.value()));
-        }
-      }
-    }
-  }
-
-  // Attempts to download a set of files, based on information in the
-  // |download_info| array.  |count| is the number of files.
-  // If a Select File dialog appears, it will choose the default and return
-  // immediately.
-  void DownloadFilesCheckErrors(size_t count, DownloadInfo* download_info) {
-    DownloadFilesCheckErrorsSetup();
-
-    for (size_t i = 0; i < count; ++i) {
-      DownloadFilesCheckErrorsLoopBody(download_info[i], i);
-    }
-  }
-
-  void DownloadInsertFilesErrorCheckErrorsLoopBody(
-      scoped_refptr<content::TestFileErrorInjector> injector,
-      const FileErrorInjectInfo& info,
-      size_t i) {
-    SCOPED_TRACE(
-        ::testing::Message()
-        << " " << __FUNCTION__ << "()"
-        << " index = " << i << " operation code = "
-        << content::TestFileErrorInjector::DebugString(info.error_info.code)
-        << " instance = " << info.error_info.operation_instance << " error = "
-        << download::DownloadInterruptReasonToString(info.error_info.error));
-
-    injector->InjectError(info.error_info);
-
-    DownloadFilesCheckErrorsLoopBody(info.download_info, i);
-
-    size_t expected_successes = info.download_info.show_download_item ? 1u : 0u;
-    EXPECT_EQ(expected_successes, injector->TotalFileCount());
-    EXPECT_EQ(0u, injector->CurrentFileCount());
-  }
-
-  void DownloadInsertFilesErrorCheckErrors(size_t count,
-                                           FileErrorInjectInfo* info) {
-    DownloadFilesCheckErrorsSetup();
-
-    // Set up file failures.
-    scoped_refptr<content::TestFileErrorInjector> injector(
-        content::TestFileErrorInjector::Create(
-            DownloadManagerForBrowser(browser())));
-
-    for (size_t i = 0; i < count; ++i) {
-      DownloadInsertFilesErrorCheckErrorsLoopBody(injector, info[i], i);
-    }
-  }
-
-  // Attempts to download a file to a read-only folder, based on information
-  // in |download_info|.
-  void DownloadFilesToReadonlyFolder(size_t count,
-                                     DownloadInfo* download_info) {
-    DownloadFilesCheckErrorsSetup();
-
-    // Make the test folder unwritable.
-    base::FilePath destination_folder = GetDownloadDirectory(browser());
-    DVLOG(1) << " " << __FUNCTION__ << "()"
-             << " folder = '" << destination_folder.value() << "'";
-    base::ScopedAllowBlockingForTesting allow_blocking;
-    base::FilePermissionRestorer permission_restorer(destination_folder);
-    EXPECT_TRUE(base::MakeFileUnwritable(destination_folder));
-
-    for (size_t i = 0; i < count; ++i) {
-      DownloadFilesCheckErrorsLoopBody(download_info[i], i);
-    }
-  }
-
-  // This method:
-  // * Starts a mock download by navigating to embedded test server URL.
-  // * Injects |error| on the first write using |error_injector|.
-  // * Waits for the download to be interrupted.
-  // * Clears the errors on |error_injector|.
-  // * Returns the resulting interrupted download.
-  DownloadItem* StartMockDownloadAndInjectError(
-      content::TestFileErrorInjector* error_injector,
-      download::DownloadInterruptReason error) {
-    content::TestFileErrorInjector::FileErrorInfo error_info;
-    error_info.code = content::TestFileErrorInjector::FILE_OPERATION_WRITE;
-    error_info.operation_instance = 0;
-    error_info.error = error;
-    error_injector->InjectError(error_info);
-
-    std::unique_ptr<content::DownloadTestObserver> observer(
-        new DownloadTestObserverResumable(DownloadManagerForBrowser(browser()),
-                                          1));
-
-    if (!embedded_test_server()->Started()) {
-      embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
-      EXPECT_TRUE(embedded_test_server()->Start());
-    }
-
-    GURL url =
-        embedded_test_server()->GetURL("/" + std::string(kDownloadTest1Path));
-    EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-    observer->WaitForFinished();
-
-    content::DownloadManager::DownloadVector downloads;
-    DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads);
-    EXPECT_EQ(1u, downloads.size());
-
-    if (downloads.size() != 1)
-      return nullptr;
-
-    error_injector->ClearError();
-    DownloadItem* download = downloads[0];
-    EXPECT_EQ(DownloadItem::INTERRUPTED, download->GetState());
-    EXPECT_EQ(error, download->GetLastReason());
-    return download;
-  }
-
- private:
-  // Location of the test data.
-  base::FilePath test_dir_;
-
-  content::TestDownloadResponseHandler test_response_handler_;
-  std::unique_ptr<DownloadTestFileActivityObserver> file_activity_observer_;
-  extensions::ScopedIgnoreContentVerifierForTest ignore_content_verifier_;
-  extensions::ScopedInstallVerifierBypassForTest ignore_install_verification_;
-};
-
 class DownloadReferrerPolicyTest
-    : public DownloadTest,
+    : public DownloadTestBase,
       public ::testing::WithParamInterface<network::mojom::ReferrerPolicy> {
  public:
   void SetUpOnMainThread() override {
     referrer_policy_ = GetParam();
-    DownloadTest::SetUpOnMainThread();
+    DownloadTestBase::SetUpOnMainThread();
   }
 
  protected:
@@ -1318,13 +582,13 @@
         network::mojom::ReferrerPolicy::kSameOrigin,
         network::mojom::ReferrerPolicy::kStrictOrigin));
 
-class MPArchDownloadTest : public DownloadTest {
+class MPArchDownloadTest : public DownloadTestBase {
  public:
   MPArchDownloadTest() = default;
   ~MPArchDownloadTest() override = default;
 
   void SetUpOnMainThread() override {
-    DownloadTest::SetUpOnMainThread();
+    DownloadTestBase::SetUpOnMainThread();
     ASSERT_TRUE(embedded_test_server()->Start());
   }
 
@@ -1428,7 +692,7 @@
   scoped_refptr<FakeSafeBrowsingService> fake_safe_browsing_service_;
 };
 
-class DownloadTestWithFakeSafeBrowsing : public DownloadTest {
+class DownloadTestWithFakeSafeBrowsing : public DownloadTestBase {
  public:
   DownloadTestWithFakeSafeBrowsing()
       : test_safe_browsing_factory_(new TestSafeBrowsingServiceFactory()) {
@@ -1439,12 +703,12 @@
   void SetUp() override {
     safe_browsing::SafeBrowsingServiceInterface::RegisterFactory(
         test_safe_browsing_factory_.get());
-    DownloadTest::SetUp();
+    DownloadTestBase::SetUp();
   }
 
   void TearDown() override {
     safe_browsing::SafeBrowsingServiceInterface::RegisterFactory(nullptr);
-    DownloadTest::TearDown();
+    DownloadTestBase::TearDown();
   }
 
  protected:
@@ -1466,7 +730,7 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-class DownloadWakeLockTest : public DownloadTest {
+class DownloadWakeLockTest : public DownloadTestBase {
  public:
   DownloadWakeLockTest() = default;
 
@@ -1500,6 +764,8 @@
 
 }  // namespace
 
+using DownloadTest = DownloadTestBase;
+
 // NOTES:
 //
 // Files for these tests are found in DIR_TEST_DATA (currently
diff --git a/chrome/browser/download/download_browsertest.h b/chrome/browser/download/download_browsertest.h
deleted file mode 100644
index 6d5fd28..0000000
--- a/chrome/browser/download/download_browsertest.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_BROWSERTEST_H_
-#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_BROWSERTEST_H_
-
-#include <stddef.h>
-
-#include "content/public/test/download_test_observer.h"
-
-// DownloadTestObserver subclass that observes a download until it transitions
-// from IN_PROGRESS to another state, but only after StartObserving() is called.
-class DownloadTestObserverNotInProgress : public content::DownloadTestObserver {
- public:
-  DownloadTestObserverNotInProgress(content::DownloadManager* download_manager,
-                                    size_t count);
-
-  DownloadTestObserverNotInProgress(const DownloadTestObserverNotInProgress&) =
-      delete;
-  DownloadTestObserverNotInProgress& operator=(
-      const DownloadTestObserverNotInProgress&) = delete;
-
-  ~DownloadTestObserverNotInProgress() override;
-
-  void StartObserving();
-
- private:
-  bool IsDownloadInFinalState(download::DownloadItem* download) override;
-
-  bool started_observing_;
-};
-
-#endif  // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_BROWSERTEST_H_
diff --git a/chrome/browser/download/download_browsertest_utils.cc b/chrome/browser/download/download_browsertest_utils.cc
new file mode 100644
index 0000000..175cc6d9
--- /dev/null
+++ b/chrome/browser/download/download_browsertest_utils.cc
@@ -0,0 +1,685 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/download/download_browsertest_utils.h"
+
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/path_service.h"
+#include "base/test/test_file_util.h"
+#include "chrome/browser/download/download_prefs.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/browser/download_request_utils.h"
+#include "net/dns/mock_host_resolver.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "third_party/blink/public/common/switches.h"
+
+using content::DownloadManager;
+using content::WebContents;
+using download::DownloadItem;
+using download::DownloadUrlParameters;
+using extensions::Extension;
+
+DownloadManager* DownloadManagerForBrowser(Browser* browser) {
+  return browser->profile()->GetDownloadManager();
+}
+
+DownloadTestObserverResumable::DownloadTestObserverResumable(
+    DownloadManager* download_manager,
+    size_t transition_count)
+    : DownloadTestObserver(download_manager, 1, ON_DANGEROUS_DOWNLOAD_FAIL),
+      transitions_left_(transition_count) {
+  Init();
+}
+
+DownloadTestObserverResumable::~DownloadTestObserverResumable() = default;
+
+bool DownloadTestObserverResumable::IsDownloadInFinalState(
+    DownloadItem* download) {
+  bool is_resumable_now = download->CanResume();
+  if (!was_previously_resumable_ && is_resumable_now) {
+    --transitions_left_;
+  }
+  was_previously_resumable_ = is_resumable_now;
+  return transitions_left_ == 0;
+}
+
+DownloadTestObserverNotInProgress::DownloadTestObserverNotInProgress(
+    DownloadManager* download_manager,
+    size_t count)
+    : DownloadTestObserver(download_manager, count, ON_DANGEROUS_DOWNLOAD_FAIL),
+      started_observing_(false) {
+  Init();
+}
+
+DownloadTestObserverNotInProgress::~DownloadTestObserverNotInProgress() =
+    default;
+
+void DownloadTestObserverNotInProgress::StartObserving() {
+  started_observing_ = true;
+}
+
+bool DownloadTestObserverNotInProgress::IsDownloadInFinalState(
+    DownloadItem* download) {
+  return started_observing_ &&
+         download->GetState() != DownloadItem::IN_PROGRESS;
+}
+
+DownloadTestBase::DownloadTestBase() = default;
+
+DownloadTestBase::~DownloadTestBase() = default;
+
+void DownloadTestBase::SetUpOnMainThread() {
+  ASSERT_TRUE(CheckTestDir());
+  ASSERT_TRUE(InitialSetup());
+  host_resolver()->AddRule("www.a.com", "127.0.0.1");
+  host_resolver()->AddRule("foo.com", "127.0.0.1");
+  host_resolver()->AddRule("bar.com", "127.0.0.1");
+  content::SetupCrossSiteRedirector(embedded_test_server());
+}
+
+void DownloadTestBase::SetUpCommandLine(base::CommandLine* command_line) {
+  // Slower builders (linux-chromeos-rel, debug, and maybe others) are flaky
+  // due to slower loading interacting with deferred commits.
+  command_line->AppendSwitch(blink::switches::kAllowPreCommitInput);
+}
+
+void DownloadTestBase::TearDownOnMainThread() {
+  // Needs to be torn down on the main thread. file_activity_observer_ holds a
+  // reference to the ChromeDownloadManagerDelegate which should be destroyed
+  // on the UI thread.
+  file_activity_observer_.reset();
+}
+
+bool DownloadTestBase::CheckTestDir() {
+  bool have_test_dir =
+      base::PathService::Get(chrome::DIR_TEST_DATA, &test_dir_);
+  EXPECT_TRUE(have_test_dir);
+  return have_test_dir;
+}
+
+bool DownloadTestBase::InitialSetup() {
+  // Sanity check default values for window and tab count.
+  int window_count = chrome::GetTotalBrowserCount();
+  EXPECT_EQ(1, window_count);
+  EXPECT_EQ(1, browser()->tab_strip_model()->count());
+
+  browser()->profile()->GetPrefs()->SetBoolean(prefs::kPromptForDownload,
+                                               false);
+
+  DownloadManager* manager = DownloadManagerForBrowser(browser());
+  DownloadPrefs::FromDownloadManager(manager)->ResetAutoOpenByUser();
+
+  file_activity_observer_ =
+      std::make_unique<DownloadTestFileActivityObserver>(browser()->profile());
+
+  return true;
+}
+
+base::FilePath DownloadTestBase::GetTestDataDirectory() {
+  base::FilePath test_file_directory;
+  base::PathService::Get(chrome::DIR_TEST_DATA, &test_file_directory);
+  return test_file_directory;
+}
+
+base::FilePath DownloadTestBase::OriginFile(const base::FilePath& file) {
+  return test_dir_.Append(file);
+}
+
+base::FilePath DownloadTestBase::DestinationFile(Browser* browser,
+                                                 const base::FilePath& file) {
+  return GetDownloadDirectory(browser).Append(file.BaseName());
+}
+
+content::TestDownloadResponseHandler*
+DownloadTestBase::test_response_handler() {
+  return &test_response_handler_;
+}
+
+DownloadPrefs* DownloadTestBase::GetDownloadPrefs(Browser* browser) {
+  return DownloadPrefs::FromDownloadManager(DownloadManagerForBrowser(browser));
+}
+
+base::FilePath DownloadTestBase::GetDownloadDirectory(Browser* browser) {
+  return GetDownloadPrefs(browser)->DownloadPath();
+}
+
+content::DownloadTestObserver* DownloadTestBase::CreateWaiter(
+    Browser* browser,
+    int num_downloads) {
+  DownloadManager* download_manager = DownloadManagerForBrowser(browser);
+  return new content::DownloadTestObserverTerminal(
+      download_manager, num_downloads,
+      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
+}
+
+content::DownloadTestObserver* DownloadTestBase::CreateInProgressWaiter(
+    Browser* browser,
+    int num_downloads) {
+  DownloadManager* download_manager = DownloadManagerForBrowser(browser);
+  return new content::DownloadTestObserverInProgress(download_manager,
+                                                     num_downloads);
+}
+
+content::DownloadTestObserver* DownloadTestBase::DangerousDownloadWaiter(
+    Browser* browser,
+    int num_downloads,
+    content::DownloadTestObserver::DangerousDownloadAction
+        dangerous_download_action) {
+  DownloadManager* download_manager = DownloadManagerForBrowser(browser);
+  return new content::DownloadTestObserverTerminal(
+      download_manager, num_downloads, dangerous_download_action);
+}
+
+void DownloadTestBase::CheckDownloadStatesForBrowser(
+    Browser* browser,
+    size_t num,
+    DownloadItem::DownloadState state) {
+  std::vector<DownloadItem*> download_items;
+  GetDownloads(browser, &download_items);
+
+  EXPECT_EQ(num, download_items.size());
+
+  for (size_t i = 0; i < download_items.size(); ++i) {
+    EXPECT_EQ(state, download_items[i]->GetState()) << " Item " << i;
+  }
+}
+
+void DownloadTestBase::CheckDownloadStates(size_t num,
+                                           DownloadItem::DownloadState state) {
+  CheckDownloadStatesForBrowser(browser(), num, state);
+}
+
+bool DownloadTestBase::VerifyNoDownloads() const {
+  DownloadManager::DownloadVector items;
+  GetDownloads(browser(), &items);
+  return items.empty();
+}
+
+void DownloadTestBase::DownloadAndWaitWithDisposition(
+    Browser* browser,
+    const GURL& url,
+    WindowOpenDisposition disposition,
+    int browser_test_flags) {
+  // Setup notification, navigate, and block.
+  std::unique_ptr<content::DownloadTestObserver> observer(
+      CreateWaiter(browser, 1));
+  // This call will block until the condition specified by
+  // |browser_test_flags|, but will not wait for the download to finish.
+  ui_test_utils::NavigateToURLWithDisposition(browser, url, disposition,
+                                              browser_test_flags);
+  // Waits for the download to complete.
+  observer->WaitForFinished();
+  EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE));
+  // We don't expect a file chooser to be shown.
+  EXPECT_FALSE(DidShowFileChooser());
+}
+
+void DownloadTestBase::DownloadAndWait(Browser* browser, const GURL& url) {
+  DownloadAndWaitWithDisposition(
+      browser, url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
+}
+
+bool DownloadTestBase::CheckDownload(Browser* browser,
+                                     const base::FilePath& downloaded_filename,
+                                     const base::FilePath& origin_filename) {
+  // Find the path to which the data will be downloaded.
+  base::FilePath downloaded_file(DestinationFile(browser, downloaded_filename));
+
+  // Find the origin path (from which the data comes).
+  base::FilePath origin_file(OriginFile(origin_filename));
+  return CheckDownloadFullPaths(browser, downloaded_file, origin_file);
+}
+
+bool DownloadTestBase::CheckDownloadFullPaths(
+    Browser* browser,
+    const base::FilePath& downloaded_file,
+    const base::FilePath& origin_file) {
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  bool origin_file_exists = base::PathExists(origin_file);
+  EXPECT_TRUE(origin_file_exists) << origin_file.value();
+  if (!origin_file_exists) {
+    return false;
+  }
+
+  // Confirm the downloaded data file exists.
+  bool downloaded_file_exists = base::PathExists(downloaded_file);
+  EXPECT_TRUE(downloaded_file_exists) << downloaded_file.value();
+  if (!downloaded_file_exists) {
+    return false;
+  }
+
+  int64_t origin_file_size = 0;
+  EXPECT_TRUE(base::GetFileSize(origin_file, &origin_file_size));
+  std::string original_file_contents;
+  EXPECT_TRUE(base::ReadFileToString(origin_file, &original_file_contents));
+  EXPECT_TRUE(
+      VerifyFile(downloaded_file, original_file_contents, origin_file_size));
+
+  // Delete the downloaded copy of the file.
+  bool downloaded_file_deleted = base::DieFileDie(downloaded_file, false);
+  EXPECT_TRUE(downloaded_file_deleted);
+  return downloaded_file_deleted;
+}
+
+content::DownloadTestObserver*
+DownloadTestBase::CreateInProgressDownloadObserver(size_t download_count) {
+  DownloadManager* manager = DownloadManagerForBrowser(browser());
+  return new content::DownloadTestObserverInProgress(manager, download_count);
+}
+
+DownloadItem* DownloadTestBase::CreateSlowTestDownload() {
+  std::unique_ptr<content::DownloadTestObserver> observer(
+      CreateInProgressDownloadObserver(1));
+  embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
+      &content::SlowDownloadHttpResponse::HandleSlowDownloadRequest));
+  EXPECT_TRUE(embedded_test_server()->Start());
+  GURL slow_download_url = embedded_test_server()->GetURL(
+      content::SlowDownloadHttpResponse::kKnownSizeUrl);
+
+  DownloadManager* manager = DownloadManagerForBrowser(browser());
+
+  EXPECT_EQ(0, manager->NonMaliciousInProgressCount());
+  EXPECT_EQ(0, manager->InProgressCount());
+  if (manager->InProgressCount() != 0) {
+    return nullptr;
+  }
+
+  EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), slow_download_url));
+
+  observer->WaitForFinished();
+  EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
+
+  DownloadManager::DownloadVector items;
+  manager->GetAllDownloads(&items);
+
+  DownloadItem* new_item = nullptr;
+  for (auto iter = items.begin(); iter != items.end(); ++iter) {
+    if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) {
+      // There should be only one IN_PROGRESS item.
+      EXPECT_FALSE(new_item);
+      new_item = *iter;
+    }
+  }
+  return new_item;
+}
+
+bool DownloadTestBase::RunSizeTest(Browser* browser,
+                                   SizeTestType type,
+                                   const std::string& partial_indication,
+                                   const std::string& total_indication) {
+  embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
+  embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
+      &content::SlowDownloadHttpResponse::HandleSlowDownloadRequest));
+  EXPECT_TRUE(embedded_test_server()->Start());
+
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  EXPECT_TRUE(type == SIZE_TEST_TYPE_UNKNOWN || type == SIZE_TEST_TYPE_KNOWN);
+  if (type != SIZE_TEST_TYPE_KNOWN && type != SIZE_TEST_TYPE_UNKNOWN) {
+    return false;
+  }
+  GURL url(type == SIZE_TEST_TYPE_KNOWN
+               ? embedded_test_server()->GetURL(
+                     content::SlowDownloadHttpResponse::kKnownSizeUrl)
+               : embedded_test_server()->GetURL(
+                     content::SlowDownloadHttpResponse::kUnknownSizeUrl));
+  GURL finish_url = embedded_test_server()->GetURL(
+      content::SlowDownloadHttpResponse::kFinishSlowResponseUrl);
+
+  // TODO(ahendrickson) -- |expected_title_in_progress| and
+  // |expected_title_finished| need to be checked.
+  base::FilePath filename = base::FilePath::FromUTF8Unsafe(url.path());
+  std::u16string expected_title_in_progress(
+      base::ASCIIToUTF16(partial_indication) + filename.LossyDisplayName());
+  std::u16string expected_title_finished(base::ASCIIToUTF16(total_indication) +
+                                         filename.LossyDisplayName());
+
+  // Download a partial web page in a background tab and wait.
+  // The mock system will not complete until it gets a special URL.
+  std::unique_ptr<content::DownloadTestObserver> observer(
+      CreateWaiter(browser, 1));
+  EXPECT_TRUE(ui_test_utils::NavigateToURL(browser, url));
+
+  // TODO(ahendrickson): check download status text before downloading.
+  // Need to:
+  //  - Add a member function to the |DownloadShelf| interface class, that
+  //    indicates how many members it has.
+  //  - Add a member function to |DownloadShelf| to get the status text
+  //    of a given member (for example, via the name in |DownloadItemView|'s
+  //    GetAccessibleNodeData() member function), by index.
+  //  - Iterate over browser->window()->GetDownloadShelf()'s members
+  //    to see if any match the status text we want.  Start with the last one.
+
+  // Allow the request to finish.  We do this by loading a second URL in a
+  // separate tab.
+
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser, finish_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
+  observer->WaitForFinished();
+  EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE));
+  CheckDownloadStatesForBrowser(browser, 1, DownloadItem::COMPLETE);
+
+  EXPECT_EQ(2, browser->tab_strip_model()->count());
+
+  // TODO(ahendrickson): check download status text after downloading.
+
+  base::FilePath download_path =
+      GetDownloadDirectory(browser).Append(filename.BaseName());
+
+  bool downloaded_path_exists = base::PathExists(download_path);
+  EXPECT_TRUE(downloaded_path_exists);
+  if (!downloaded_path_exists) {
+    return false;
+  }
+
+  // Check the file contents.
+  size_t file_size = content::SlowDownloadHttpResponse::kFirstResponsePartSize +
+                     content::SlowDownloadHttpResponse::kSecondResponsePartSize;
+  std::string expected_contents(file_size, '*');
+  EXPECT_TRUE(VerifyFile(download_path, expected_contents, file_size));
+
+  // Delete the file we just downloaded.
+  EXPECT_TRUE(base::DieFileDie(download_path, false));
+  EXPECT_FALSE(base::PathExists(download_path));
+
+  return true;
+}
+
+void DownloadTestBase::GetDownloads(
+    Browser* browser,
+    std::vector<DownloadItem*>* downloads) const {
+  DCHECK(downloads);
+  DownloadManager* manager = DownloadManagerForBrowser(browser);
+  manager->GetAllDownloads(downloads);
+}
+
+// static
+void DownloadTestBase::ExpectWindowCountAfterDownload(size_t expected) {
+  EXPECT_EQ(expected, chrome::GetTotalBrowserCount());
+}
+
+void DownloadTestBase::EnableFileChooser(bool enable) {
+  file_activity_observer_->EnableFileChooser(enable);
+}
+
+bool DownloadTestBase::DidShowFileChooser() {
+  return file_activity_observer_->TestAndResetDidShowFileChooser();
+}
+
+bool DownloadTestBase::VerifyFile(const base::FilePath& path,
+                                  const std::string& value,
+                                  const int64_t file_size) {
+  std::string file_contents;
+
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  bool read = base::ReadFileToString(path, &file_contents);
+  EXPECT_TRUE(read) << "Failed reading file: " << path.value() << std::endl;
+  if (!read) {
+    return false;  // Couldn't read the file.
+  }
+
+  // Note: we don't handle really large files (more than size_t can hold)
+  // so we will fail in that case.
+  size_t expected_size = static_cast<size_t>(file_size);
+
+  // Check the size.
+  EXPECT_EQ(expected_size, file_contents.size());
+  if (expected_size != file_contents.size()) {
+    return false;
+  }
+
+  // Check the contents.
+  EXPECT_EQ(value, file_contents);
+  if (memcmp(file_contents.c_str(), value.c_str(), expected_size) != 0) {
+    return false;
+  }
+
+  return true;
+}
+
+void DownloadTestBase::DownloadFilesCheckErrorsSetup() {
+  embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
+  ASSERT_TRUE(embedded_test_server()->Start());
+  std::vector<DownloadItem*> download_items;
+  GetDownloads(browser(), &download_items);
+  ASSERT_TRUE(download_items.empty());
+
+  EnableFileChooser(true);
+}
+
+void DownloadTestBase::DownloadFilesCheckErrorsLoopBody(
+    const DownloadInfo& download_info,
+    size_t i) {
+  SCOPED_TRACE(testing::Message()
+               << " " << __FUNCTION__ << "()"
+               << " index = " << i << " starting_url = '"
+               << download_info.starting_url << "'"
+               << " download_url = '" << download_info.expected_download_url
+               << "'"
+               << " method = "
+               << ((download_info.download_method == DOWNLOAD_DIRECT)
+                       ? "DOWNLOAD_DIRECT"
+                       : "DOWNLOAD_NAVIGATE")
+               << " show_item = " << download_info.show_download_item
+               << " reason = "
+               << DownloadInterruptReasonToString(download_info.reason));
+
+  std::vector<DownloadItem*> download_items;
+  GetDownloads(browser(), &download_items);
+  size_t downloads_expected = download_items.size();
+
+  // GURL("http://foo/bar").Resolve("baz") => "http://foo/bar/baz"
+  // GURL("http://foo/bar").Resolve("http://baz") => "http://baz"
+  // I.e. both starting_url and expected_download_url can either be relative
+  // to the base test server URL or be an absolute URL.
+  GURL base_url = embedded_test_server()->GetURL("/downloads/");
+  GURL starting_url = base_url.Resolve(download_info.starting_url);
+  GURL download_url = base_url.Resolve(download_info.expected_download_url);
+  ASSERT_TRUE(starting_url.is_valid());
+  ASSERT_TRUE(download_url.is_valid());
+
+  DownloadManager* download_manager = DownloadManagerForBrowser(browser());
+  WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+
+  std::unique_ptr<content::DownloadTestObserver> observer;
+  if (download_info.reason == download::DOWNLOAD_INTERRUPT_REASON_NONE) {
+    observer = std::make_unique<content::DownloadTestObserverTerminal>(
+        download_manager, 1,
+        content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
+  } else {
+    observer = std::make_unique<content::DownloadTestObserverInterrupted>(
+        download_manager, 1,
+        content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
+  }
+
+  if (download_info.download_method == DOWNLOAD_DIRECT) {
+    // Go directly to download.  Don't wait for navigation.
+    scoped_refptr<content::DownloadTestItemCreationObserver> creation_observer(
+        new content::DownloadTestItemCreationObserver);
+
+    std::unique_ptr<DownloadUrlParameters> params(
+        content::DownloadRequestUtils::CreateDownloadForWebContentsMainFrame(
+            web_contents, starting_url, TRAFFIC_ANNOTATION_FOR_TESTS));
+    params->set_callback(creation_observer->callback());
+    DownloadManagerForBrowser(browser())->DownloadUrl(std::move(params));
+
+    // Wait until the item is created, or we have determined that it
+    // won't be.
+    creation_observer->WaitForDownloadItemCreation();
+
+    EXPECT_NE(download::DownloadItem::kInvalidId,
+              creation_observer->download_id());
+  } else {
+    // Navigate to URL normally, wait until done.
+    ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(),
+                                                              starting_url, 1);
+  }
+
+  if (download_info.show_download_item) {
+    downloads_expected++;
+    observer->WaitForFinished();
+    DownloadItem::DownloadState final_state =
+        (download_info.reason == download::DOWNLOAD_INTERRUPT_REASON_NONE)
+            ? DownloadItem::COMPLETE
+            : DownloadItem::INTERRUPTED;
+    EXPECT_EQ(1u, observer->NumDownloadsSeenInState(final_state));
+  }
+
+  // Wait till the |DownloadFile|s are destroyed.
+  content::RunAllTasksUntilIdle();
+
+  // Validate that the correct files were downloaded.
+  download_items.clear();
+  GetDownloads(browser(), &download_items);
+  ASSERT_EQ(downloads_expected, download_items.size());
+
+  if (download_info.show_download_item) {
+    // Find the last download item.
+    DownloadItem* item = download_items[0];
+    for (size_t d = 1; d < downloads_expected; ++d) {
+      if (download_items[d]->GetStartTime() > item->GetStartTime()) {
+        item = download_items[d];
+      }
+    }
+
+    EXPECT_EQ(download_url, item->GetURL());
+    EXPECT_EQ(download_info.reason, item->GetLastReason());
+
+    if (item->GetState() == download::DownloadItem::COMPLETE) {
+      // Clean up the file, in case it ended up in the My Documents folder.
+      base::ScopedAllowBlockingForTesting allow_blocking;
+      base::FilePath destination_folder = GetDownloadDirectory(browser());
+      base::FilePath my_downloaded_file = item->GetTargetFilePath();
+      EXPECT_TRUE(base::PathExists(my_downloaded_file));
+      EXPECT_TRUE(base::DeleteFile(my_downloaded_file));
+      item->Remove();
+
+      EXPECT_EQ(
+          download_info.should_redirect_to_documents ? std::string::npos : 0u,
+          my_downloaded_file.value().find(destination_folder.value()));
+      if (download_info.should_redirect_to_documents) {
+        // If it's not where we asked it to be, it should be in the
+        // My Documents folder.
+        base::FilePath my_docs_folder;
+        EXPECT_TRUE(base::PathService::Get(chrome::DIR_USER_DOCUMENTS,
+                                           &my_docs_folder));
+        EXPECT_EQ(0u, my_downloaded_file.value().find(my_docs_folder.value()));
+      }
+    }
+  }
+}
+
+void DownloadTestBase::DownloadFilesCheckErrors(size_t count,
+                                                DownloadInfo* download_info) {
+  DownloadFilesCheckErrorsSetup();
+
+  for (size_t i = 0; i < count; ++i) {
+    DownloadFilesCheckErrorsLoopBody(download_info[i], i);
+  }
+}
+
+void DownloadTestBase::DownloadInsertFilesErrorCheckErrorsLoopBody(
+    scoped_refptr<content::TestFileErrorInjector> injector,
+    const FileErrorInjectInfo& info,
+    size_t i) {
+  SCOPED_TRACE(
+      ::testing::Message()
+      << " " << __FUNCTION__ << "()"
+      << " index = " << i << " operation code = "
+      << content::TestFileErrorInjector::DebugString(info.error_info.code)
+      << " instance = " << info.error_info.operation_instance << " error = "
+      << download::DownloadInterruptReasonToString(info.error_info.error));
+
+  injector->InjectError(info.error_info);
+
+  DownloadFilesCheckErrorsLoopBody(info.download_info, i);
+
+  size_t expected_successes = info.download_info.show_download_item ? 1u : 0u;
+  EXPECT_EQ(expected_successes, injector->TotalFileCount());
+  EXPECT_EQ(0u, injector->CurrentFileCount());
+}
+
+void DownloadTestBase::DownloadInsertFilesErrorCheckErrors(
+    size_t count,
+    FileErrorInjectInfo* info) {
+  DownloadFilesCheckErrorsSetup();
+
+  // Set up file failures.
+  scoped_refptr<content::TestFileErrorInjector> injector(
+      content::TestFileErrorInjector::Create(
+          DownloadManagerForBrowser(browser())));
+
+  for (size_t i = 0; i < count; ++i) {
+    DownloadInsertFilesErrorCheckErrorsLoopBody(injector, info[i], i);
+  }
+}
+
+// Attempts to download a file to a read-only folder, based on information
+// in |download_info|.
+void DownloadTestBase::DownloadFilesToReadonlyFolder(
+    size_t count,
+    DownloadInfo* download_info) {
+  DownloadFilesCheckErrorsSetup();
+
+  // Make the test folder unwritable.
+  base::FilePath destination_folder = GetDownloadDirectory(browser());
+  DVLOG(1) << " " << __FUNCTION__ << "()"
+           << " folder = '" << destination_folder.value() << "'";
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  base::FilePermissionRestorer permission_restorer(destination_folder);
+  EXPECT_TRUE(base::MakeFileUnwritable(destination_folder));
+
+  for (size_t i = 0; i < count; ++i) {
+    DownloadFilesCheckErrorsLoopBody(download_info[i], i);
+  }
+}
+
+DownloadItem* DownloadTestBase::StartMockDownloadAndInjectError(
+    content::TestFileErrorInjector* error_injector,
+    download::DownloadInterruptReason error) {
+  content::TestFileErrorInjector::FileErrorInfo error_info;
+  error_info.code = content::TestFileErrorInjector::FILE_OPERATION_WRITE;
+  error_info.operation_instance = 0;
+  error_info.error = error;
+  error_injector->InjectError(error_info);
+
+  std::unique_ptr<content::DownloadTestObserver> observer(
+      new DownloadTestObserverResumable(DownloadManagerForBrowser(browser()),
+                                        1));
+
+  if (!embedded_test_server()->Started()) {
+    embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
+    EXPECT_TRUE(embedded_test_server()->Start());
+  }
+
+  GURL url =
+      embedded_test_server()->GetURL("/" + std::string(kDownloadTest1Path));
+  EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+  observer->WaitForFinished();
+
+  content::DownloadManager::DownloadVector downloads;
+  DownloadManagerForBrowser(browser())->GetAllDownloads(&downloads);
+  EXPECT_EQ(1u, downloads.size());
+
+  if (downloads.size() != 1) {
+    return nullptr;
+  }
+
+  error_injector->ClearError();
+  DownloadItem* download = downloads[0];
+  EXPECT_EQ(DownloadItem::INTERRUPTED, download->GetState());
+  EXPECT_EQ(error, download->GetLastReason());
+  return download;
+}
diff --git a/chrome/browser/download/download_browsertest_utils.h b/chrome/browser/download/download_browsertest_utils.h
new file mode 100644
index 0000000..24fb8a5
--- /dev/null
+++ b/chrome/browser/download/download_browsertest_utils.h
@@ -0,0 +1,251 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_BROWSERTEST_UTILS_H_
+#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_BROWSERTEST_UTILS_H_
+
+#include <stddef.h>
+
+#include "base/files/file_path.h"
+#include "chrome/browser/download/download_test_file_activity_observer.h"
+#include "chrome/browser/extensions/install_verifier.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/test/download_test_observer.h"
+#include "content/public/test/slow_download_http_response.h"
+#include "content/public/test/test_download_http_response.h"
+#include "content/public/test/test_file_error_injector.h"
+#include "extensions/browser/scoped_ignore_content_verifier_for_test.h"
+
+class DownloadPrefs;
+
+// Gets the download manager for a browser.
+content::DownloadManager* DownloadManagerForBrowser(Browser* browser);
+
+// DownloadTestObserver subclass that observes one download until it transitions
+// from a non-resumable state to a resumable state a specified number of
+// times. Note that this observer can only observe a single download.
+class DownloadTestObserverResumable : public content::DownloadTestObserver {
+ public:
+  // Construct a new observer. |transition_count| is the number of times the
+  // download should transition from a non-resumable state to a resumable state.
+  DownloadTestObserverResumable(content::DownloadManager* download_manager,
+                                size_t transition_count);
+
+  DownloadTestObserverResumable(const DownloadTestObserverResumable&) = delete;
+  DownloadTestObserverResumable& operator=(
+      const DownloadTestObserverResumable&) = delete;
+
+  ~DownloadTestObserverResumable() override;
+
+ private:
+  bool IsDownloadInFinalState(download::DownloadItem* download) override;
+
+  bool was_previously_resumable_ = false;
+  size_t transitions_left_;
+};
+
+// DownloadTestObserver subclass that observes a download until it transitions
+// from IN_PROGRESS to another state, but only after StartObserving() is called.
+class DownloadTestObserverNotInProgress : public content::DownloadTestObserver {
+ public:
+  DownloadTestObserverNotInProgress(content::DownloadManager* download_manager,
+                                    size_t count);
+
+  DownloadTestObserverNotInProgress(const DownloadTestObserverNotInProgress&) =
+      delete;
+  DownloadTestObserverNotInProgress& operator=(
+      const DownloadTestObserverNotInProgress&) = delete;
+
+  ~DownloadTestObserverNotInProgress() override;
+
+  void StartObserving();
+
+ private:
+  bool IsDownloadInFinalState(download::DownloadItem* download) override;
+
+  bool started_observing_;
+};
+
+class DownloadTestBase : public InProcessBrowserTest {
+ public:
+  // Choice of navigation or direct fetch.  Used by |DownloadFileCheckErrors()|.
+  enum DownloadMethod { DOWNLOAD_NAVIGATE, DOWNLOAD_DIRECT };
+
+  // Information passed in to |DownloadFileCheckErrors()|.
+  struct DownloadInfo {
+    const char* starting_url;           // URL for initiating the download.
+    const char* expected_download_url;  // Expected value of DI::GetURL(). Can
+                                        // be different if |starting_url|
+                                        // initiates a download from another
+                                        // URL.
+    DownloadMethod download_method;     // Navigation or Direct.
+    // Download interrupt reason (NONE is OK).
+    download::DownloadInterruptReason reason;
+    bool show_download_item;  // True if the download item appears on the shelf.
+    bool should_redirect_to_documents;  // True if we save it in "My Documents".
+  };
+
+  struct FileErrorInjectInfo {
+    DownloadInfo download_info;
+    content::TestFileErrorInjector::FileErrorInfo error_info;
+  };
+
+  static constexpr char kDownloadTest1Path[] = "download-test1.lib";
+
+  DownloadTestBase();
+  ~DownloadTestBase() override;
+
+  void SetUpOnMainThread() override;
+  void SetUpCommandLine(base::CommandLine* command_line) override;
+  void TearDownOnMainThread() override;
+
+  bool CheckTestDir();
+
+  // Returning false indicates a failure of the setup, and should be asserted
+  // in the caller.
+  bool InitialSetup();
+
+ protected:
+  enum SizeTestType {
+    SIZE_TEST_TYPE_KNOWN,
+    SIZE_TEST_TYPE_UNKNOWN,
+  };
+
+  base::FilePath GetTestDataDirectory();
+
+  // Location of the file source (the place from which it is downloaded).
+  base::FilePath OriginFile(const base::FilePath& file);
+
+  // Location of the file destination (place to which it is downloaded).
+  base::FilePath DestinationFile(Browser* browser, const base::FilePath& file);
+
+  content::TestDownloadResponseHandler* test_response_handler();
+
+  DownloadPrefs* GetDownloadPrefs(Browser* browser);
+
+  base::FilePath GetDownloadDirectory(Browser* browser);
+
+  // Create a DownloadTestObserverTerminal that will wait for the
+  // specified number of downloads to finish.
+  content::DownloadTestObserver* CreateWaiter(Browser* browser,
+                                              int num_downloads);
+
+  // Create a DownloadTestObserverInProgress that will wait for the
+  // specified number of downloads to start.
+  content::DownloadTestObserver* CreateInProgressWaiter(Browser* browser,
+                                                        int num_downloads);
+
+  // Create a DownloadTestObserverTerminal that will wait for the
+  // specified number of downloads to finish, or for
+  // a dangerous download warning to be shown.
+  content::DownloadTestObserver* DangerousDownloadWaiter(
+      Browser* browser,
+      int num_downloads,
+      content::DownloadTestObserver::DangerousDownloadAction
+          dangerous_download_action);
+
+  void CheckDownloadStatesForBrowser(
+      Browser* browser,
+      size_t num,
+      download::DownloadItem::DownloadState state);
+
+  void CheckDownloadStates(size_t num,
+                           download::DownloadItem::DownloadState state);
+
+  bool VerifyNoDownloads() const;
+
+  // Download |url|, then wait for the download to finish.
+  // |disposition| indicates where the navigation occurs (current tab, new
+  // foreground tab, etc).
+  // |browser_test_flags| indicate what to wait for, and is an OR of 0 or more
+  // values in the ui_test_utils::BrowserTestWaitFlags enum.
+  void DownloadAndWaitWithDisposition(Browser* browser,
+                                      const GURL& url,
+                                      WindowOpenDisposition disposition,
+                                      int browser_test_flags);
+
+  // Download a file in the current tab, then wait for the download to finish.
+  void DownloadAndWait(Browser* browser, const GURL& url);
+
+  // Should only be called when the download is known to have finished
+  // (in error or not).
+  // Returning false indicates a failure of the function, and should be asserted
+  // in the caller.
+  bool CheckDownload(Browser* browser,
+                     const base::FilePath& downloaded_filename,
+                     const base::FilePath& origin_filename);
+
+  // A version of CheckDownload that allows complete path specification.
+  bool CheckDownloadFullPaths(Browser* browser,
+                              const base::FilePath& downloaded_file,
+                              const base::FilePath& origin_file);
+
+  content::DownloadTestObserver* CreateInProgressDownloadObserver(
+      size_t download_count);
+
+  download::DownloadItem* CreateSlowTestDownload();
+
+  bool RunSizeTest(Browser* browser,
+                   SizeTestType type,
+                   const std::string& partial_indication,
+                   const std::string& total_indication);
+
+  void GetDownloads(Browser* browser,
+                    std::vector<download::DownloadItem*>* downloads) const;
+
+  static void ExpectWindowCountAfterDownload(size_t expected);
+
+  void EnableFileChooser(bool enable);
+  bool DidShowFileChooser();
+
+  // Checks that |path| is has |file_size| bytes, and matches the |value|
+  // string.
+  bool VerifyFile(const base::FilePath& path,
+                  const std::string& value,
+                  const int64_t file_size);
+
+  // Attempts to download a file, based on information in |download_info|.
+  // If a Select File dialog opens, will automatically choose the default.
+  void DownloadFilesCheckErrorsSetup();
+
+  // Attempts to download a set of files, based on information in the
+  // |download_info| array.  |count| is the number of files.
+  // If a Select File dialog appears, it will choose the default and return
+  // immediately.
+  void DownloadFilesCheckErrors(size_t count, DownloadInfo* download_info);
+  void DownloadFilesCheckErrorsLoopBody(const DownloadInfo& download_info,
+                                        size_t i);
+
+  void DownloadInsertFilesErrorCheckErrors(size_t count,
+                                           FileErrorInjectInfo* info);
+  void DownloadInsertFilesErrorCheckErrorsLoopBody(
+      scoped_refptr<content::TestFileErrorInjector> injector,
+      const FileErrorInjectInfo& info,
+      size_t i);
+
+  // Attempts to download a file to a read-only folder, based on information
+  // in |download_info|.
+  void DownloadFilesToReadonlyFolder(size_t count, DownloadInfo* download_info);
+
+  // This method:
+  // * Starts a mock download by navigating to embedded test server URL.
+  // * Injects |error| on the first write using |error_injector|.
+  // * Waits for the download to be interrupted.
+  // * Clears the errors on |error_injector|.
+  // * Returns the resulting interrupted download.
+  download::DownloadItem* StartMockDownloadAndInjectError(
+      content::TestFileErrorInjector* error_injector,
+      download::DownloadInterruptReason error);
+
+ private:
+  // Location of the test data.
+  base::FilePath test_dir_;
+
+  content::TestDownloadResponseHandler test_response_handler_;
+  std::unique_ptr<DownloadTestFileActivityObserver> file_activity_observer_;
+  extensions::ScopedIgnoreContentVerifierForTest ignore_content_verifier_;
+  extensions::ScopedInstallVerifierBypassForTest ignore_install_verification_;
+};
+
+#endif  // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_BROWSERTEST_UTILS_H_
diff --git a/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImplTest.java b/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImplTest.java
index d32dcd6..a824d2c 100644
--- a/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImplTest.java
+++ b/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImplTest.java
@@ -252,7 +252,7 @@
         getEnterpriseInfoImpl().setSkipAsyncCheckForTesting(false);
         ShadowPostTask.setTestImpl(new ShadowPostTask.TestImpl() {
             @Override
-            public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+            public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
                 throw new RejectedExecutionException();
             }
         });
diff --git a/chrome/browser/extensions/api/autofill_private/autofill_util.cc b/chrome/browser/extensions/api/autofill_private/autofill_util.cc
index 1adc19b..5c7ebec 100644
--- a/chrome/browser/extensions/api/autofill_private/autofill_util.cc
+++ b/chrome/browser/extensions/api/autofill_private/autofill_util.cc
@@ -143,28 +143,51 @@
 }
 
 std::string CardNetworkToIconResourceIdString(const std::string& network) {
-  if (network == autofill::kAmericanExpressCard)
-    return "chrome://theme/IDR_AUTOFILL_CC_AMEX";
-  if (network == autofill::kDinersCard)
-    return "chrome://theme/IDR_AUTOFILL_CC_DINERS";
-  if (network == autofill::kDiscoverCard)
-    return "chrome://theme/IDR_AUTOFILL_CC_DISCOVER";
-  if (network == autofill::kEloCard)
-    return "chrome://theme/IDR_AUTOFILL_CC_ELO";
-  if (network == autofill::kJCBCard)
-    return "chrome://theme/IDR_AUTOFILL_CC_JCB";
-  if (network == autofill::kMasterCard)
-    return "chrome://theme/IDR_AUTOFILL_CC_MASTERCARD";
-  if (network == autofill::kMirCard)
-    return "chrome://theme/IDR_AUTOFILL_CC_MIR";
-  if (network == autofill::kTroyCard)
-    return "chrome://theme/IDR_AUTOFILL_CC_TROY";
-  if (network == autofill::kUnionPay)
-    return "chrome://theme/IDR_AUTOFILL_CC_UNIONPAY";
-  if (network == autofill::kVisaCard)
-    return "chrome://theme/IDR_AUTOFILL_CC_VISA";
+  bool metadata_icon = base::FeatureList::IsEnabled(
+      autofill::features::kAutofillEnableNewCardArtAndNetworkImages);
 
-  return "chrome://theme/IDR_AUTOFILL_CC_GENERIC";
+  if (network == autofill::kAmericanExpressCard) {
+    return metadata_icon ? "chrome://theme/IDR_AUTOFILL_METADATA_CC_AMEX"
+                         : "chrome://theme/IDR_AUTOFILL_CC_AMEX";
+  }
+  if (network == autofill::kDinersCard) {
+    return metadata_icon ? "chrome://theme/IDR_AUTOFILL_METADATA_CC_DINERS"
+                         : "chrome://theme/IDR_AUTOFILL_CC_DINERS";
+  }
+  if (network == autofill::kDiscoverCard) {
+    return metadata_icon ? "chrome://theme/IDR_AUTOFILL_METADATA_CC_DISCOVER"
+                         : "chrome://theme/IDR_AUTOFILL_CC_DISCOVER";
+  }
+  if (network == autofill::kEloCard) {
+    return "chrome://theme/IDR_AUTOFILL_CC_ELO";
+  }
+  if (network == autofill::kJCBCard) {
+    return metadata_icon ? "chrome://theme/IDR_AUTOFILL_METADATA_CC_JCB"
+                         : "chrome://theme/IDR_AUTOFILL_CC_JCB";
+  }
+  if (network == autofill::kMasterCard) {
+    return metadata_icon ? "chrome://theme/IDR_AUTOFILL_METADATA_CC_MASTERCARD"
+                         : "chrome://theme/IDR_AUTOFILL_CC_MASTERCARD";
+  }
+  if (network == autofill::kMirCard) {
+    return metadata_icon ? "chrome://theme/IDR_AUTOFILL_METADATA_CC_MIR"
+                         : "chrome://theme/IDR_AUTOFILL_CC_MIR";
+  }
+  if (network == autofill::kTroyCard) {
+    return metadata_icon ? "chrome://theme/IDR_AUTOFILL_METADATA_CC_TROY"
+                         : "chrome://theme/IDR_AUTOFILL_CC_TROY";
+  }
+  if (network == autofill::kUnionPay) {
+    return metadata_icon ? "chrome://theme/IDR_AUTOFILL_METADATA_CC_UNIONPAY"
+                         : "chrome://theme/IDR_AUTOFILL_CC_UNIONPAY";
+  }
+  if (network == autofill::kVisaCard) {
+    return metadata_icon ? "chrome://theme/IDR_AUTOFILL_METADATA_CC_VISA"
+                         : "chrome://theme/IDR_AUTOFILL_CC_VISA";
+  }
+
+  return metadata_icon ? "chrome://theme/IDR_AUTOFILL_METADATA_CC_GENERIC"
+                       : "chrome://theme/IDR_AUTOFILL_CC_GENERIC";
 }
 
 autofill_private::CreditCardEntry CreditCardToCreditCardEntry(
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
index 6510db2..119a35b8 100644
--- a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
+++ b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
@@ -20,7 +20,7 @@
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_browser_main.h"
-#include "chrome/browser/download/download_browsertest.h"
+#include "chrome/browser/download/download_browsertest_utils.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h"
 #include "chrome/browser/extensions/extension_apitest.h"
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProvider.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProvider.java
index ea317f8..80752816 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProvider.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProvider.java
@@ -80,7 +80,8 @@
 
     @Override
     public void postTask(int taskType, Runnable task, long delayMs) {
-        TaskTraits traits;
+        @TaskTraits
+        int traits;
         switch (taskType) {
             case ProcessScopeDependencyProvider.TASK_TYPE_UI_THREAD:
                 traits = UiThreadTaskTraits.DEFAULT;
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
index 02d11655..ef987a9a 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
@@ -38,7 +38,7 @@
 
 constexpr base::TimeDelta kRequestTimeout = base::Seconds(5);
 constexpr base::TimeDelta kRequestMargin = base::Minutes(5);
-constexpr base::TimeDelta kKeyCacheDuration = base::Hours(4);
+constexpr base::TimeDelta kKeyCacheDuration = base::Hours(24);
 constexpr int kMaxRetries = 5;
 constexpr size_t kMaxQueueSize = 100;
 
diff --git a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc
index 08dc4264..a9b72ea7 100644
--- a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc
+++ b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc
@@ -34,6 +34,8 @@
 #include "components/history_clusters/public/mojom/history_cluster_types.mojom.h"
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/search/ntp_features.h"
+#include "components/search_engines/template_url.h"
+#include "components/search_engines/template_url_service.h"
 #include "components/strings/grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/url_util.h"
@@ -46,12 +48,9 @@
 // visit.
 constexpr int kMinRequiredVisits = 3;
 
-base::flat_set<std::string> GetCategories(bool allowlist) {
+base::flat_set<std::string> GetCategories(const char* feature_param) {
   std::string categories_string = base::GetFieldTrialParamValueByFeature(
-      ntp_features::kNtpHistoryClustersModuleCategories,
-      allowlist
-          ? ntp_features::kNtpHistoryClustersModuleCategoriesAllowlistParam
-          : ntp_features::kNtpHistoryClustersModuleCategoriesBlocklistParam);
+      ntp_features::kNtpHistoryClustersModuleCategories, feature_param);
   if (categories_string.empty()) {
     return {};
   }
@@ -72,15 +71,32 @@
   return min_images_to_show;
 }
 
+size_t GetMaxClusters() {
+  // Even though only one cluster will be shown on the NTP at a time for now,
+  // set this to greater than that in case the filtering logic does not match
+  // up.
+  static int max_clusters = base::GetFieldTrialParamByFeatureAsInt(
+      ntp_features::kNtpHistoryClustersModuleMaxClusters,
+      ntp_features::kNtpHistoryClustersModuleMaxClustersParam, 5);
+  if (max_clusters < 0) {
+    return 5;
+  }
+  return static_cast<size_t>(max_clusters);
+}
+
 history_clusters::QueryClustersFilterParams GetFilterParamsFromFeatureFlags() {
   history_clusters::QueryClustersFilterParams filter_params;
   filter_params.min_visits_with_images = GetMinImagesToShow();
-  filter_params.categories_allowlist = GetCategories(/*allowlist=*/true);
-  filter_params.categories_blocklist = GetCategories(/*allowlist=*/false);
+  filter_params.categories_allowlist = GetCategories(
+      ntp_features::kNtpHistoryClustersModuleCategoriesAllowlistParam);
+  filter_params.categories_blocklist = GetCategories(
+      ntp_features::kNtpHistoryClustersModuleCategoriesBlocklistParam);
   filter_params.is_search_initiated = true;
   filter_params.has_related_searches = true;
   filter_params.is_shown_on_prominent_ui_surfaces = true;
-  // TODO(b/265301665): Add max clusters param when actually showing in the UI.
+  filter_params.max_clusters = GetMaxClusters();
+  filter_params.categories_boostlist = GetCategories(
+      ntp_features::kNtpHistoryClustersModuleCategoriesBoostlistParam);
   return filter_params;
 }
 
@@ -189,18 +205,55 @@
     GetClusterCallback callback,
     std::vector<history::Cluster> clusters,
     history_clusters::QueryClustersContinuationParams continuation_params) {
-  std::set<GURL> seen_urls = {};
-  history_clusters::CullNonProminentOrDuplicateClusters("", clusters,
-                                                        &seen_urls);
-  // Cull clusters that do not have the minimum number of visits to be eligible
-  // for display.
+  const TemplateURLService* template_url_service =
+      TemplateURLServiceFactory::GetForProfile(profile_);
+  if (!template_url_service) {
+    return;
+  }
+
+  // Cull clusters that do not have the minimum number of visits with and
+  // without images to be eligible for display.
   base::EraseIf(clusters, [&](auto& cluster) {
+    // Cull non prominent clusters.
+    if (!cluster.should_show_on_prominent_ui_surfaces) {
+      return true;
+    }
+
+    // Cull clusters whose visits don't have at least one SRP.
+    const TemplateURL* default_search_provider =
+        template_url_service->GetDefaultSearchProvider();
+    auto srp_visits_it = std::find_if(
+        cluster.visits.begin(), cluster.visits.end(), [&](auto& visit) {
+          return default_search_provider->IsSearchURL(
+              visit.normalized_url, template_url_service->search_terms_data());
+        });
+    if (srp_visits_it == cluster.visits.end()) {
+      return true;
+    }
+
+    // Ensure visits contains at most one SRP visit and its the first one in the
+    // list.
+    history::ClusterVisit first_srp_visit = *srp_visits_it;
+    base::EraseIf(cluster.visits, [&](auto& visit) {
+      return default_search_provider->IsSearchURL(
+          visit.normalized_url, template_url_service->search_terms_data());
+    });
+    cluster.visits.insert(cluster.visits.begin(), first_srp_visit);
+
     // Cull visits that have a zero relevance score.
     base::EraseIf(cluster.visits,
                   [&](auto& visit) { return visit.score == 0.0; });
 
-    return cluster.visits.size() < kMinRequiredVisits;
+    int visits_with_images = std::accumulate(
+        cluster.visits.begin(), cluster.visits.end(), 0,
+        [](const auto& i, const auto& v) {
+          return i +
+                 int(v.annotated_visit.content_annotations.has_url_keyed_image);
+        });
+    return cluster.visits.size() < kMinRequiredVisits ||
+           visits_with_images < GetMinImagesToShow();
   });
+
   history_clusters::CoalesceRelatedSearches(clusters);
   // Cull clusters that do not have the minimum required number of related
   // searches to be eligible for display.
@@ -224,8 +277,8 @@
                               clusters.front().related_searches.size());
 
   history::Cluster top_cluster = clusters.front();
-  auto cluster_mojom = history_clusters::ClusterToMojom(
-      TemplateURLServiceFactory::GetForProfile(profile_), top_cluster);
+  auto cluster_mojom =
+      history_clusters::ClusterToMojom(template_url_service, top_cluster);
   std::move(callback).Run(std::move(cluster_mojom));
 
   if (!IsCartModuleEnabled() || !cart_service_) {
diff --git a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc
index e7af2e8..e48aac6 100644
--- a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc
+++ b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/cart/cart_service_factory.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/history_clusters/history_clusters_service_factory.h"
+#include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.h"
 #include "chrome/browser/ui/tabs/tab_group_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
@@ -82,6 +83,10 @@
   MOCK_METHOD2(HasActiveCartForURL,
                void(const GURL& url, base::OnceCallback<void(bool)> callback));
 };
+
+constexpr char kSampleNonSearchUrl[] = "https://www.foo.com/";
+constexpr char kSampleSearchUrl[] = "https://www.google.com/search?q=foo";
+
 }  // namespace
 
 class HistoryClustersPageHandlerTest : public BrowserWithTestWindowTest {
@@ -142,6 +147,8 @@
                                      -> std::unique_ptr<KeyedService> {
                return std::make_unique<MockHistoryService>();
              })},
+            {TemplateURLServiceFactory::GetInstance(),
+             base::BindRepeating(&TemplateURLServiceFactory::BuildInstanceFor)},
             {CartServiceFactory::GetInstance(),
              base::BindRepeating([](content::BrowserContext* context)
                                      -> std::unique_ptr<KeyedService> {
@@ -179,11 +186,18 @@
   return sample_visit;
 }
 
-history::Cluster SampleCluster() {
-  history::ClusterVisit sample_visit =
-      SampleVisitForURL(GURL("https://www.google.com"));
+history::Cluster SampleCluster(int srp_visits, int non_srp_visits) {
+  history::ClusterVisit sample_srp_visit =
+      SampleVisitForURL(GURL(kSampleSearchUrl));
+  history::ClusterVisit sample_non_srp_visit =
+      SampleVisitForURL(GURL(kSampleNonSearchUrl));
+
+  std::vector<history::ClusterVisit> visits;
+  visits.insert(visits.end(), srp_visits, sample_srp_visit);
+  visits.insert(visits.end(), non_srp_visits, sample_non_srp_visit);
+
   std::string kSampleLabel = "LabelOne";
-  return history::Cluster(1, {3, sample_visit},
+  return history::Cluster(1, std::move(visits),
                           {{u"apples", history::ClusterKeywordData()},
                            {u"Red Oranges", history::ClusterKeywordData()}},
                           /*should_show_on_prominent_ui_surfaces=*/true,
@@ -196,7 +210,8 @@
 TEST_F(HistoryClustersPageHandlerTest, GetCluster) {
   base::HistogramTester histogram_tester;
 
-  const history::Cluster kSampleCluster = SampleCluster();
+  const history::Cluster kSampleCluster =
+      SampleCluster(/*srp_visits=*/1, /*non_srp_visits=*/2);
   const std::vector<history::Cluster> kSampleClusters = {kSampleCluster};
   test_history_clusters_service().SetClustersToReturn(kSampleClusters);
 
@@ -227,6 +242,43 @@
       "NewTabPage.HistoryClusters.NumRelatedSearches", 3, 1);
 }
 
+TEST_F(HistoryClustersPageHandlerTest, ClusterVisitsCulled) {
+  base::HistogramTester histogram_tester;
+
+  const history::Cluster kSampleCluster =
+      SampleCluster(/*srp_visits=*/3, /*non_srp_visits=*/3);
+  const std::vector<history::Cluster> kSampleClusters = {kSampleCluster};
+  test_history_clusters_service().SetClustersToReturn(kSampleClusters);
+
+  history_clusters::mojom::ClusterPtr cluster_mojom;
+  base::MockCallback<HistoryClustersPageHandler::GetClusterCallback> callback;
+  EXPECT_CALL(callback, Run(testing::_))
+      .Times(1)
+      .WillOnce(testing::Invoke(
+          [&cluster_mojom](history_clusters::mojom::ClusterPtr cluster_arg) {
+            cluster_mojom = std::move(cluster_arg);
+          }));
+  handler().GetCluster(callback.Get());
+  ASSERT_TRUE(cluster_mojom);
+  ASSERT_EQ(1u, cluster_mojom->id);
+  ASSERT_EQ(base::UTF16ToUTF8(kSampleCluster.label.value()),
+            cluster_mojom->label);
+  ASSERT_EQ(4u, cluster_mojom->visits.size());
+  ASSERT_EQ(kSampleSearchUrl, cluster_mojom->visits[0]->url_for_display);
+  for (size_t i = 1; i < cluster_mojom->visits.size(); i++) {
+    ASSERT_EQ(kSampleNonSearchUrl, cluster_mojom->visits[i]->url_for_display);
+  }
+
+  histogram_tester.ExpectUniqueSample(
+      "NewTabPage.HistoryClusters.HasClusterToShow", true, 1);
+  histogram_tester.ExpectUniqueSample(
+      "NewTabPage.HistoryClusters.NumClusterCandidates", 1, 1);
+  histogram_tester.ExpectUniqueSample("NewTabPage.HistoryClusters.NumVisits", 4,
+                                      1);
+  histogram_tester.ExpectUniqueSample(
+      "NewTabPage.HistoryClusters.NumRelatedSearches", 3, 1);
+}
+
 TEST_F(HistoryClustersPageHandlerTest, GetFakeCluster) {
   const unsigned long kNumVisits = 2;
   const unsigned long kNumVisitsWithImages = 2;
@@ -258,7 +310,8 @@
 TEST_F(HistoryClustersPageHandlerTest, MultipleClusters) {
   base::HistogramTester histogram_tester;
 
-  const history::Cluster kSampleCluster = SampleCluster();
+  const history::Cluster kSampleCluster =
+      SampleCluster(/*srp_visits=*/1, /*non_srp_visits=*/2);
   const std::vector<history::Cluster> kSampleClusters = {kSampleCluster,
                                                          kSampleCluster};
   test_history_clusters_service().SetClustersToReturn(kSampleClusters);
@@ -300,7 +353,8 @@
       },
       {});
 
-  const history::Cluster kSampleCluster = SampleCluster();
+  const history::Cluster kSampleCluster =
+      SampleCluster(/*srp_visits=*/1, /*non_srp_visits=*/2);
   test_history_clusters_service().SetClustersToReturn({kSampleCluster});
   history_clusters::mojom::ClusterPtr cluster_mojom;
   base::MockCallback<HistoryClustersPageHandler::GetClusterCallback> callback;
@@ -404,14 +458,14 @@
   const GURL url_C = GURL("https://www.baz.com");
   MockCartService& cart_service = mock_cart_service();
 
-  const history::Cluster cluster =
-      history::Cluster(1,
-                       {SampleVisitForURL(url_A), SampleVisitForURL(url_B),
-                        SampleVisitForURL(url_C)},
-                       {{u"apples", history::ClusterKeywordData()},
-                        {u"Red Oranges", history::ClusterKeywordData()}},
-                       /*should_show_on_prominent_ui_surfaces=*/true,
-                       /*label=*/base::UTF8ToUTF16(kSampleLabel));
+  const history::Cluster cluster = history::Cluster(
+      1,
+      {SampleVisitForURL(GURL(kSampleSearchUrl)), SampleVisitForURL(url_A),
+       SampleVisitForURL(url_B), SampleVisitForURL(url_C)},
+      {{u"apples", history::ClusterKeywordData()},
+       {u"Red Oranges", history::ClusterKeywordData()}},
+      /*should_show_on_prominent_ui_surfaces=*/true,
+      /*label=*/base::UTF8ToUTF16(kSampleLabel));
   test_history_clusters_service().SetClustersToReturn({cluster});
 
   // Vectors to capture mocked method args.
diff --git a/chrome/browser/new_tab_page/modules/new_tab_page_modules.cc b/chrome/browser/new_tab_page/modules/new_tab_page_modules.cc
index e7f6afc..bfe0078 100644
--- a/chrome/browser/new_tab_page/modules/new_tab_page_modules.cc
+++ b/chrome/browser/new_tab_page/modules/new_tab_page_modules.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/new_tab_page/new_tab_page_util.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/image_service/features.h"
 #include "components/search/ntp_features.h"
 #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
@@ -26,7 +27,8 @@
     bool drive_module_enabled) {
   std::vector<std::pair<const std::string, int>> details;
 
-  if (base::FeatureList::IsEnabled(ntp_features::kNtpHistoryClustersModule)) {
+  if (base::FeatureList::IsEnabled(ntp_features::kNtpHistoryClustersModule) &&
+      base::FeatureList::IsEnabled(image_service::kImageService)) {
     details.emplace_back("history_clusters",
                          IDS_HISTORY_CLUSTERS_JOURNEYS_TAB_LABEL);
   }
diff --git a/chrome/browser/offline_pages/offline_page_request_handler.cc b/chrome/browser/offline_pages/offline_page_request_handler.cc
index 3da6a6d..2477243 100644
--- a/chrome/browser/offline_pages/offline_page_request_handler.cc
+++ b/chrome/browser/offline_pages/offline_page_request_handler.cc
@@ -92,159 +92,6 @@
   validator->Update(buffer->data(), len);
 }
 
-OfflinePageRequestHandler::AggregatedRequestResult
-RequestResultToAggregatedRequestResult(
-    RequestResult request_result,
-    OfflinePageRequestHandler::NetworkState network_state) {
-  if (request_result == RequestResult::NO_TAB_ID)
-    return OfflinePageRequestHandler::AggregatedRequestResult::NO_TAB_ID;
-
-  if (request_result == RequestResult::NO_WEB_CONTENTS)
-    return OfflinePageRequestHandler::AggregatedRequestResult::NO_WEB_CONTENTS;
-
-  if (request_result == RequestResult::FILE_NOT_FOUND)
-    return OfflinePageRequestHandler::AggregatedRequestResult::FILE_NOT_FOUND;
-
-  if (request_result == RequestResult::PAGE_NOT_FRESH) {
-    DCHECK_EQ(
-        OfflinePageRequestHandler::NetworkState::PROHIBITIVELY_SLOW_NETWORK,
-        network_state);
-    return OfflinePageRequestHandler::AggregatedRequestResult::
-        PAGE_NOT_FRESH_ON_PROHIBITIVELY_SLOW_NETWORK;
-  }
-
-  if (request_result == RequestResult::OFFLINE_PAGE_NOT_FOUND) {
-    switch (network_state) {
-      case OfflinePageRequestHandler::NetworkState::DISCONNECTED_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            PAGE_NOT_FOUND_ON_DISCONNECTED_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::PROHIBITIVELY_SLOW_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            PAGE_NOT_FOUND_ON_PROHIBITIVELY_SLOW_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::FLAKY_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            PAGE_NOT_FOUND_ON_FLAKY_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::
-          FORCE_OFFLINE_ON_CONNECTED_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            PAGE_NOT_FOUND_ON_CONNECTED_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::CONNECTED_NETWORK:
-        break;
-    }
-    NOTREACHED();
-  }
-
-  if (request_result == RequestResult::REDIRECTED) {
-    switch (network_state) {
-      case OfflinePageRequestHandler::NetworkState::DISCONNECTED_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            REDIRECTED_ON_DISCONNECTED_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::PROHIBITIVELY_SLOW_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            REDIRECTED_ON_PROHIBITIVELY_SLOW_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::FLAKY_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            REDIRECTED_ON_FLAKY_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::
-          FORCE_OFFLINE_ON_CONNECTED_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            REDIRECTED_ON_CONNECTED_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::CONNECTED_NETWORK:
-        break;
-    }
-    NOTREACHED();
-  }
-
-  if (request_result == RequestResult::DIGEST_MISMATCH) {
-    switch (network_state) {
-      case OfflinePageRequestHandler::NetworkState::DISCONNECTED_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            DIGEST_MISMATCH_ON_DISCONNECTED_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::PROHIBITIVELY_SLOW_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            DIGEST_MISMATCH_ON_PROHIBITIVELY_SLOW_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::FLAKY_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            DIGEST_MISMATCH_ON_FLAKY_NETWORK;
-      case OfflinePageRequestHandler::NetworkState::
-          FORCE_OFFLINE_ON_CONNECTED_NETWORK:
-      case OfflinePageRequestHandler::NetworkState::CONNECTED_NETWORK:
-        return OfflinePageRequestHandler::AggregatedRequestResult::
-            DIGEST_MISMATCH_ON_CONNECTED_NETWORK;
-    }
-    NOTREACHED();
-  }
-
-  DCHECK_EQ(RequestResult::OFFLINE_PAGE_SERVED, request_result);
-  DCHECK_NE(OfflinePageRequestHandler::NetworkState::CONNECTED_NETWORK,
-            network_state);
-  switch (network_state) {
-    case OfflinePageRequestHandler::NetworkState::DISCONNECTED_NETWORK:
-      return OfflinePageRequestHandler::AggregatedRequestResult::
-          SHOW_OFFLINE_ON_DISCONNECTED_NETWORK;
-    case OfflinePageRequestHandler::NetworkState::PROHIBITIVELY_SLOW_NETWORK:
-      return OfflinePageRequestHandler::AggregatedRequestResult::
-          SHOW_OFFLINE_ON_PROHIBITIVELY_SLOW_NETWORK;
-    case OfflinePageRequestHandler::NetworkState::FLAKY_NETWORK:
-      return OfflinePageRequestHandler::AggregatedRequestResult::
-          SHOW_OFFLINE_ON_FLAKY_NETWORK;
-    case OfflinePageRequestHandler::NetworkState::
-        FORCE_OFFLINE_ON_CONNECTED_NETWORK:
-      return OfflinePageRequestHandler::AggregatedRequestResult::
-          SHOW_OFFLINE_ON_CONNECTED_NETWORK;
-    case OfflinePageRequestHandler::NetworkState::CONNECTED_NETWORK:
-      break;
-  }
-  NOTREACHED();
-
-  return OfflinePageRequestHandler::AggregatedRequestResult::
-      AGGREGATED_REQUEST_RESULT_MAX;
-}
-
-void ReportRequestResult(
-    RequestResult request_result,
-    OfflinePageRequestHandler::NetworkState network_state) {
-  OfflinePageRequestHandler::ReportAggregatedRequestResult(
-      RequestResultToAggregatedRequestResult(request_result, network_state));
-}
-
-void ReportOfflinePageSize(
-    OfflinePageRequestHandler::NetworkState network_state,
-    const OfflinePageItem& offline_page) {
-  if (offline_page.client_id.name_space.empty())
-    return;
-
-  // The two histograms report values between 1KiB and 100MiB.
-  switch (network_state) {
-    case OfflinePageRequestHandler::NetworkState::
-        DISCONNECTED_NETWORK:  // Fall-through
-    case OfflinePageRequestHandler::NetworkState::
-        PROHIBITIVELY_SLOW_NETWORK:  // Fall-through
-    case OfflinePageRequestHandler::NetworkState::FLAKY_NETWORK:
-      base::UmaHistogramCounts100000("OfflinePages.PageSizeOnAccess.Offline." +
-                                         offline_page.client_id.name_space,
-                                     offline_page.file_size / 1024);
-      return;
-    case OfflinePageRequestHandler::NetworkState::
-        FORCE_OFFLINE_ON_CONNECTED_NETWORK:
-      base::UmaHistogramCounts100000("OfflinePages.PageSizeOnAccess.Online." +
-                                         offline_page.client_id.name_space,
-                                     offline_page.file_size / 1024);
-      return;
-    case OfflinePageRequestHandler::NetworkState::CONNECTED_NETWORK:
-      break;
-  }
-  NOTREACHED();
-}
-
-void ReportAccessEntryPoint(
-    const std::string& name_space,
-    OfflinePageRequestHandler::AccessEntryPoint entry_point) {
-  base::UmaHistogramEnumeration(
-      "OfflinePages.AccessEntryPoint." + name_space, entry_point,
-      OfflinePageRequestHandler::AccessEntryPoint::COUNT);
-}
-
 OfflinePageModel* GetOfflinePageModel(
     content::WebContents::Getter web_contents_getter) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -273,7 +120,6 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK_NE(RequestResult::OFFLINE_PAGE_SERVED, request_error_result);
 
-  ReportRequestResult(request_error_result, network_state);
   NotifyAvailableOfflinePagesOnUI(
       job, std::vector<OfflinePageRequestHandler::Candidate>());
 }
@@ -447,14 +293,6 @@
 
 }  // namespace
 
-// static
-void OfflinePageRequestHandler::ReportAggregatedRequestResult(
-    AggregatedRequestResult result) {
-  UMA_HISTOGRAM_ENUMERATION(
-      "OfflinePages.AggregatedRequestResult2", static_cast<int>(result),
-      static_cast<int>(AggregatedRequestResult::AGGREGATED_REQUEST_RESULT_MAX));
-}
-
 OfflinePageRequestHandler::OfflinePageRequestHandler(
     const GURL& url,
     const net::HttpRequestHeaders& extra_request_headers,
@@ -583,7 +421,6 @@
   // the problem, we still need to support those pages already saved with this
   if (url_ == GetCurrentOfflinePage().original_url_if_different &&
       url_ != GetCurrentOfflinePage().url) {
-    ReportRequestResult(RequestResult::REDIRECTED, network_state_);
     Redirect(GetCurrentOfflinePage().url);
     return;
   }
@@ -615,11 +452,6 @@
 }
 
 void OfflinePageRequestHandler::VisitTrustedOfflinePage() {
-  ReportRequestResult(RequestResult::OFFLINE_PAGE_SERVED, network_state_);
-  ReportAccessEntryPoint(GetCurrentOfflinePage().client_id.name_space,
-                         GetAccessEntryPoint());
-  ReportOfflinePageSize(network_state_, GetCurrentOfflinePage());
-
   delegate_->SetOfflinePageNavigationUIData(true /*is_offline_page*/);
 
   content::GetUIThreadTaskRunner({})->PostTask(
@@ -649,55 +481,6 @@
   delegate_->NotifyHeadersComplete(0);
 }
 
-OfflinePageRequestHandler::AccessEntryPoint
-OfflinePageRequestHandler::GetAccessEntryPoint() const {
-  switch (offline_header_.reason) {
-    case OfflinePageHeader::Reason::DOWNLOAD:
-      return AccessEntryPoint::DOWNLOADS;
-    case OfflinePageHeader::Reason::NOTIFICATION:
-      return AccessEntryPoint::NOTIFICATION;
-    case OfflinePageHeader::Reason::FILE_URL_INTENT:
-      return AccessEntryPoint::FILE_URL_INTENT;
-    case OfflinePageHeader::Reason::CONTENT_URL_INTENT:
-      return AccessEntryPoint::CONTENT_URL_INTENT;
-    case OfflinePageHeader::Reason::PROGRESS_BAR:
-      return AccessEntryPoint::PROGRESS_BAR;
-    case OfflinePageHeader::Reason::SUGGESTION:
-      return AccessEntryPoint::NTP_SUGGESTIONS_OR_BOOKMARKS;
-    case OfflinePageHeader::Reason::NET_ERROR_SUGGESTION:
-      return AccessEntryPoint::NET_ERROR_PAGE;
-    case OfflinePageHeader::Reason::NONE:
-    case OfflinePageHeader::Reason::NET_ERROR:
-    case OfflinePageHeader::Reason::RELOAD:
-      break;
-  }
-
-  ui::PageTransition transition =
-      static_cast<ui::PageTransition>(delegate_->GetPageTransition());
-  if (ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_LINK)) {
-    return ui::PageTransitionTypeIncludingQualifiersIs(
-               PageTransitionGetQualifier(transition),
-               ui::PAGE_TRANSITION_FROM_API)
-               ? AccessEntryPoint::CCT
-               : AccessEntryPoint::LINK;
-  } else if (ui::PageTransitionCoreTypeIs(transition,
-                                          ui::PAGE_TRANSITION_TYPED) ||
-             ui::PageTransitionCoreTypeIs(transition,
-                                          ui::PAGE_TRANSITION_GENERATED)) {
-    return AccessEntryPoint::OMNIBOX;
-  } else if (ui::PageTransitionCoreTypeIs(transition,
-                                          ui::PAGE_TRANSITION_AUTO_BOOKMARK)) {
-    // Note that this also includes launching from bookmark which tends to be
-    // less likely. For now we don't separate these two.
-    return AccessEntryPoint::NTP_SUGGESTIONS_OR_BOOKMARKS;
-  } else if (ui::PageTransitionCoreTypeIs(transition,
-                                          ui::PAGE_TRANSITION_RELOAD)) {
-    return AccessEntryPoint::RELOAD;
-  }
-
-  return AccessEntryPoint::UNKNOWN;
-}
-
 const OfflinePageItem& OfflinePageRequestHandler::GetCurrentOfflinePage()
     const {
   return candidates_[candidate_index_].offline_page;
@@ -888,18 +671,12 @@
 
   // Otherwise, no trusted offline page can be found so we fall back to the
   // default handling.
-  ReportRequestResult(result == FileValidationResult::FILE_NOT_FOUND
-                          ? RequestResult::FILE_NOT_FOUND
-                          : RequestResult::DIGEST_MISMATCH,
-                      network_state_);
   delegate_->FallbackToDefault();
 }
 
 void OfflinePageRequestHandler::DidOpenForServing(int result) {
   // Handle the file opening failure.
   if (result != net::OK) {
-    ReportRequestResult(RequestResult::FILE_NOT_FOUND, network_state_);
-
     // If the file:// or content:// intent is being processed, don't fall
     // back to the default handling. Instead, we should fail the request.
     if (IsProcessingFileOrContentUrlIntent())
diff --git a/chrome/browser/offline_pages/offline_page_request_handler.h b/chrome/browser/offline_pages/offline_page_request_handler.h
index 41109f4..095b614 100644
--- a/chrome/browser/offline_pages/offline_page_request_handler.h
+++ b/chrome/browser/offline_pages/offline_page_request_handler.h
@@ -45,76 +45,6 @@
 // * "X-Chrome-offline" custom header.
 class OfflinePageRequestHandler {
  public:
-  // This enum is used for UMA reporting. It contains all possible outcomes of
-  // handling requests that might service offline page in different network
-  // conditions. Generally one of these outcomes will happen.
-  // The fringe errors (like no OfflinePageModel, etc.) are not reported due
-  // to their low probability.
-  // NOTE: because this is used for UMA reporting, these values should not be
-  // changed or reused; new values should be ended immediately before the MAX
-  // value. Make sure to update the histogram enum
-  // (OfflinePagesAggregatedRequestResult in enums.xml) accordingly.
-  // Public for testing.
-  enum class AggregatedRequestResult {
-    SHOW_OFFLINE_ON_DISCONNECTED_NETWORK,
-    PAGE_NOT_FOUND_ON_DISCONNECTED_NETWORK,
-    SHOW_OFFLINE_ON_FLAKY_NETWORK,
-    PAGE_NOT_FOUND_ON_FLAKY_NETWORK,
-    SHOW_OFFLINE_ON_PROHIBITIVELY_SLOW_NETWORK,
-    PAGE_NOT_FOUND_ON_PROHIBITIVELY_SLOW_NETWORK,
-    PAGE_NOT_FRESH_ON_PROHIBITIVELY_SLOW_NETWORK,
-    SHOW_OFFLINE_ON_CONNECTED_NETWORK,
-    PAGE_NOT_FOUND_ON_CONNECTED_NETWORK,
-    NO_TAB_ID,
-    NO_WEB_CONTENTS,
-    SHOW_NET_ERROR_PAGE,
-    REDIRECTED_ON_DISCONNECTED_NETWORK,
-    REDIRECTED_ON_FLAKY_NETWORK,
-    REDIRECTED_ON_PROHIBITIVELY_SLOW_NETWORK,
-    REDIRECTED_ON_CONNECTED_NETWORK,
-    DIGEST_MISMATCH_ON_DISCONNECTED_NETWORK,
-    DIGEST_MISMATCH_ON_FLAKY_NETWORK,
-    DIGEST_MISMATCH_ON_PROHIBITIVELY_SLOW_NETWORK,
-    DIGEST_MISMATCH_ON_CONNECTED_NETWORK,
-    FILE_NOT_FOUND,
-    AGGREGATED_REQUEST_RESULT_MAX
-  };
-
-  // This enum is used for UMA reporting of the UI location from which an
-  // offline page was launched.
-  // NOTE: because this is used for UMA reporting, these values should not be
-  // changed or reused; new values should be appended immediately before COUNT.
-  // Make sure to update the histogram enum (OfflinePagesAcessEntryPoint in
-  // enums.xml) accordingly.
-  enum class AccessEntryPoint {
-    // Any other cases not listed below.
-    UNKNOWN = 0,
-    // Launched from the NTP suggestions or bookmarks.
-    NTP_SUGGESTIONS_OR_BOOKMARKS = 1,
-    // Launched from Downloads home.
-    DOWNLOADS = 2,
-    // Launched from the omnibox.
-    OMNIBOX = 3,
-    // Launched from Chrome Custom Tabs.
-    CCT = 4,
-    // Launched due to clicking a link in a page.
-    LINK = 5,
-    // Launched due to hitting the reload button or hitting enter in the
-    // omnibox.
-    RELOAD = 6,
-    // Launched due to clicking a notification.
-    NOTIFICATION = 7,
-    // Launched due to processing a file URL intent to view MHTML file.
-    FILE_URL_INTENT = 8,
-    // Launched due to processing a content URL intent to view MHTML content.
-    CONTENT_URL_INTENT = 9,
-    // Launched due to clicking "Open" link in the progress bar.
-    PROGRESS_BAR = 10,
-    // Launched from content suggestion on the net error page.
-    NET_ERROR_PAGE = 11,
-    COUNT  // Must be last.
-  };
-
   enum class NetworkState {
     // No network connection.
     DISCONNECTED_NETWORK,
@@ -198,10 +128,6 @@
     ~ThreadSafeArchiveValidator() override = default;
   };
 
-  // Reports the aggregated result combining both request result and network
-  // state.
-  static void ReportAggregatedRequestResult(AggregatedRequestResult result);
-
   OfflinePageRequestHandler(
       const GURL& url,
       const net::HttpRequestHeaders& extra_request_headers,
@@ -241,8 +167,6 @@
 
   NetworkState GetNetworkState() const;
 
-  AccessEntryPoint GetAccessEntryPoint() const;
-
   const OfflinePageItem& GetCurrentOfflinePage() const;
 
   bool IsProcessingFileUrlIntent() const;
diff --git a/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc b/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
index 30b1e98..5611d752 100644
--- a/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
+++ b/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
@@ -73,7 +73,6 @@
     FILE_PATH_LITERAL("nonexistent.mhtml"));
 constexpr int kFileSize1 = 471;  // Real size of hello.mhtml.
 constexpr int kFileSize2 = 461;  // Real size of welcome.mhtml.
-constexpr int kMismatchedFileSize = 99999;
 const std::string kDigest1(
     "\x43\x60\x62\x02\x06\x15\x0f\x3e\x77\x99\x3d\xed\xdc\xd4\xe2\x0d\xbe\xbd"
     "\x77\x1a\xfb\x32\x00\x51\x7e\x63\x7d\x3b\x2e\x46\x63\xf6",
@@ -89,14 +88,6 @@
 
 constexpr int kTabId = 1;
 
-constexpr char kAggregatedRequestResultHistogram[] =
-    "OfflinePages.AggregatedRequestResult2";
-constexpr char kAccessEntryPointHistogram[] = "OfflinePages.AccessEntryPoint.";
-constexpr char kPageSizeAccessOfflineHistogramBase[] =
-    "OfflinePages.PageSizeOnAccess.Offline.";
-constexpr char kPageSizeAccessOnlineHistogramBase[] =
-    "OfflinePages.PageSizeOnAccess.Online.";
-
 constexpr int64_t kDownloadId = 42LL;
 
 constexpr char kTestUrl[] = "http://test.org/page";
@@ -340,42 +331,9 @@
   void ReadCompleted(const ResponseInfo& reponse,
                      bool is_offline_page_set_in_navigation_data);
 
-  // Expect exactly one count of |result| UMA reported. No other bucket should
-  // have sample.
-  void ExpectOneUniqueSampleForAggregatedRequestResult(
-      OfflinePageRequestHandler::AggregatedRequestResult result);
-  // Expect exactly |count| of |result| UMA reported. No other bucket should
-  // have sample.
-  void ExpectMultiUniqueSampleForAggregatedRequestResult(
-      OfflinePageRequestHandler::AggregatedRequestResult result,
-      int count);
-  // Expect one count of |result| UMA reported. Other buckets may have samples
-  // as well.
-  void ExpectOneNonuniqueSampleForAggregatedRequestResult(
-      OfflinePageRequestHandler::AggregatedRequestResult result);
-  // Expect no samples to have been reported to the aggregated results
-  // histogram.
-  void ExpectNoSamplesInAggregatedRequestResult();
-
-  void ExpectAccessEntryPoint(
-      OfflinePageRequestHandler::AccessEntryPoint entry_point);
-  void ExpectNoAccessEntryPoint();
-
-  void ExpectOfflinePageSizeUniqueSample(int bucket, int count);
-  void ExpectOfflinePageSizeTotalSuffixCount(int count);
-  void ExpectOnlinePageSizeUniqueSample(int bucket, int count);
-  void ExpectOnlinePageSizeTotalSuffixCount(int count);
-  void ExpectOfflinePageAccessCount(int64_t offline_id, int count);
-
-  void ExpectNoOfflinePageServed(
-      int64_t offline_id,
-      OfflinePageRequestHandler::AggregatedRequestResult
-          expected_request_result);
-  void ExpectOfflinePageServed(
-      int64_t expected_offline_id,
-      int expected_file_size,
-      OfflinePageRequestHandler::AggregatedRequestResult
-          expected_request_result);
+  void ExpectNoOfflinePageServed(int64_t offline_id);
+  void ExpectOfflinePageServed(int64_t expected_offline_id,
+                               int expected_file_size);
 
   // Use the offline header with specific reason and offline_id. Return the
   // full header string.
@@ -414,9 +372,6 @@
   static base::FilePath private_archives_dir_;
   static base::FilePath public_archives_dir_;
 
-  OfflinePageRequestHandler::AccessEntryPoint GetExpectedAccessEntryPoint()
-      const;
-
   void OnSavePageDone(SavePageResult result, int64_t offline_id);
   void OnGetPageByOfflineIdDone(const OfflinePageItem* pages);
 
@@ -600,122 +555,17 @@
   return temp_file_path_;
 }
 
-void OfflinePageRequestHandlerTest::
-    ExpectOneUniqueSampleForAggregatedRequestResult(
-        OfflinePageRequestHandler::AggregatedRequestResult result) {
-  histogram_tester_->ExpectUniqueSample(kAggregatedRequestResultHistogram,
-                                        static_cast<int>(result), 1);
-}
-
-void OfflinePageRequestHandlerTest::
-    ExpectMultiUniqueSampleForAggregatedRequestResult(
-        OfflinePageRequestHandler::AggregatedRequestResult result,
-        int count) {
-  histogram_tester_->ExpectUniqueSample(kAggregatedRequestResultHistogram,
-                                        static_cast<int>(result), count);
-}
-
-void OfflinePageRequestHandlerTest::
-    ExpectOneNonuniqueSampleForAggregatedRequestResult(
-        OfflinePageRequestHandler::AggregatedRequestResult result) {
-  histogram_tester_->ExpectBucketCount(kAggregatedRequestResultHistogram,
-                                       static_cast<int>(result), 1);
-}
-
-void OfflinePageRequestHandlerTest::ExpectNoSamplesInAggregatedRequestResult() {
-  histogram_tester_->ExpectTotalCount(kAggregatedRequestResultHistogram, 0);
-}
-
-void OfflinePageRequestHandlerTest::ExpectAccessEntryPoint(
-    OfflinePageRequestHandler::AccessEntryPoint entry_point) {
-  histogram_tester_->ExpectUniqueSample(
-      std::string(kAccessEntryPointHistogram) + kDownloadNamespace,
-      static_cast<int>(entry_point), 1);
-}
-
-void OfflinePageRequestHandlerTest::ExpectNoAccessEntryPoint() {
-  EXPECT_TRUE(
-      histogram_tester_->GetTotalCountsForPrefix(kAccessEntryPointHistogram)
-          .empty());
-}
-
-void OfflinePageRequestHandlerTest::ExpectOfflinePageSizeUniqueSample(
-    int bucket,
-    int count) {
-  histogram_tester_->ExpectUniqueSample(
-      std::string(kPageSizeAccessOfflineHistogramBase) + kDownloadNamespace,
-      bucket, count);
-}
-
-void OfflinePageRequestHandlerTest::ExpectOfflinePageSizeTotalSuffixCount(
-    int count) {
-  int total_offline_count = 0;
-  base::HistogramTester::CountsMap all_offline_counts =
-      histogram_tester_->GetTotalCountsForPrefix(
-          kPageSizeAccessOfflineHistogramBase);
-  for (const std::pair<const std::string, base::HistogramBase::Count>&
-           namespace_and_count : all_offline_counts) {
-    total_offline_count += namespace_and_count.second;
-  }
-  EXPECT_EQ(count, total_offline_count)
-      << "Wrong histogram samples count under prefix "
-      << kPageSizeAccessOfflineHistogramBase << "*";
-}
-
-void OfflinePageRequestHandlerTest::ExpectOnlinePageSizeUniqueSample(
-    int bucket,
-    int count) {
-  histogram_tester_->ExpectUniqueSample(
-      std::string(kPageSizeAccessOnlineHistogramBase) + kDownloadNamespace,
-      bucket, count);
-}
-
-void OfflinePageRequestHandlerTest::ExpectOnlinePageSizeTotalSuffixCount(
-    int count) {
-  int online_count = 0;
-  base::HistogramTester::CountsMap all_online_counts =
-      histogram_tester_->GetTotalCountsForPrefix(
-          kPageSizeAccessOnlineHistogramBase);
-  for (const std::pair<const std::string, base::HistogramBase::Count>&
-           namespace_and_count : all_online_counts) {
-    online_count += namespace_and_count.second;
-  }
-  EXPECT_EQ(count, online_count)
-      << "Wrong histogram samples count under prefix "
-      << kPageSizeAccessOnlineHistogramBase << "*";
-}
-
-void OfflinePageRequestHandlerTest::ExpectOfflinePageAccessCount(
-    int64_t offline_id,
-    int count) {
-  OfflinePageItem offline_page = GetPage(offline_id);
-  EXPECT_EQ(count, offline_page.access_count);
-}
-
 void OfflinePageRequestHandlerTest::ExpectNoOfflinePageServed(
-    int64_t offline_id,
-    OfflinePageRequestHandler::AggregatedRequestResult
-        expected_request_result) {
+    int64_t offline_id) {
   EXPECT_NE("multipart/related", mime_type());
   EXPECT_EQ(0, bytes_read());
   EXPECT_FALSE(is_offline_page_set_in_navigation_data());
   EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
-  if (expected_request_result !=
-      OfflinePageRequestHandler::AggregatedRequestResult::
-          AGGREGATED_REQUEST_RESULT_MAX) {
-    ExpectOneUniqueSampleForAggregatedRequestResult(expected_request_result);
-  }
-  ExpectNoAccessEntryPoint();
-  ExpectOfflinePageSizeTotalSuffixCount(0);
-  ExpectOnlinePageSizeTotalSuffixCount(0);
-  ExpectOfflinePageAccessCount(offline_id, 0);
 }
 
 void OfflinePageRequestHandlerTest::ExpectOfflinePageServed(
     int64_t expected_offline_id,
-    int expected_file_size,
-    OfflinePageRequestHandler::AggregatedRequestResult
-        expected_request_result) {
+    int expected_file_size) {
   EXPECT_EQ(net::OK, request_status());
   EXPECT_EQ("multipart/related", mime_type());
   EXPECT_EQ(expected_file_size, bytes_read());
@@ -730,40 +580,6 @@
           : OfflinePageTrustedState::TRUSTED_AS_UNMODIFIED_AND_IN_PUBLIC_DIR;
   EXPECT_EQ(expected_trusted_state,
             offline_page_tab_helper()->GetTrustedStateForTest());
-  if (expected_request_result !=
-      OfflinePageRequestHandler::AggregatedRequestResult::
-          AGGREGATED_REQUEST_RESULT_MAX) {
-    ExpectOneUniqueSampleForAggregatedRequestResult(expected_request_result);
-  }
-  OfflinePageRequestHandler::AccessEntryPoint expected_entry_point =
-      GetExpectedAccessEntryPoint();
-  ExpectAccessEntryPoint(expected_entry_point);
-  if (is_connected_with_good_network()) {
-    ExpectOnlinePageSizeUniqueSample(expected_file_size / 1024, 1);
-    ExpectOfflinePageSizeTotalSuffixCount(0);
-  } else {
-    ExpectOfflinePageSizeUniqueSample(expected_file_size / 1024, 1);
-    ExpectOnlinePageSizeTotalSuffixCount(0);
-  }
-  ExpectOfflinePageAccessCount(expected_offline_id, 1);
-}
-
-OfflinePageRequestHandler::AccessEntryPoint
-OfflinePageRequestHandlerTest::GetExpectedAccessEntryPoint() const {
-  switch (offline_page_header_.reason) {
-    case OfflinePageHeader::Reason::DOWNLOAD:
-      return OfflinePageRequestHandler::AccessEntryPoint::DOWNLOADS;
-    case OfflinePageHeader::Reason::NOTIFICATION:
-      return OfflinePageRequestHandler::AccessEntryPoint::NOTIFICATION;
-    case OfflinePageHeader::Reason::FILE_URL_INTENT:
-      return OfflinePageRequestHandler::AccessEntryPoint::FILE_URL_INTENT;
-    case OfflinePageHeader::Reason::CONTENT_URL_INTENT:
-      return OfflinePageRequestHandler::AccessEntryPoint::CONTENT_URL_INTENT;
-    case OfflinePageHeader::Reason::NET_ERROR_SUGGESTION:
-      return OfflinePageRequestHandler::AccessEntryPoint::NET_ERROR_PAGE;
-    default:
-      return OfflinePageRequestHandler::AccessEntryPoint::LINK;
-  }
 }
 
 std::string OfflinePageRequestHandlerTest::UseOfflinePageHeader(
@@ -1108,10 +924,6 @@
                    false /* is_outermost_main_frame */);
   EXPECT_EQ(0, bytes_read());
   EXPECT_FALSE(offline_page_tab_helper()->GetOfflinePageForTest());
-
-  ExpectNoSamplesInAggregatedRequestResult();
-  ExpectOfflinePageSizeTotalSuffixCount(0);
-  ExpectOnlinePageSizeTotalSuffixCount(0);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, LoadOfflinePageOnDisconnectedNetwork) {
@@ -1123,9 +935,7 @@
 
   LoadPage(test_url);
 
-  ExpectOfflinePageServed(offline_id, kFileSize1,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
+  ExpectOfflinePageServed(offline_id, kFileSize1);
 }
 
 TEST_F(OfflinePageRequestHandlerTest,
@@ -1146,9 +956,7 @@
   // immediately. So no request result should be reported. Passing
   // AGGREGATED_REQUEST_RESULT_MAX to skip checking request result in
   // the helper function.
-  this->ExpectNoOfflinePageServed(
-      offline_id, OfflinePageRequestHandler::AggregatedRequestResult::
-                      AGGREGATED_REQUEST_RESULT_MAX);
+  this->ExpectNoOfflinePageServed(offline_id);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, PageNotFoundOnDisconnectedNetwork) {
@@ -1159,9 +967,7 @@
 
   LoadPage(GURL(kTestUrl2));
 
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                PAGE_NOT_FOUND_ON_DISCONNECTED_NETWORK);
+  ExpectNoOfflinePageServed(offline_id);
 }
 
 TEST_F(OfflinePageRequestHandlerTest,
@@ -1177,9 +983,7 @@
       UseOfflinePageHeader(OfflinePageHeader::Reason::NET_ERROR_SUGGESTION, 0));
   LoadPageWithHeaders(test_url, extra_headers);
 
-  ExpectOfflinePageServed(offline_id, kFileSize1,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
+  ExpectOfflinePageServed(offline_id, kFileSize1);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, LoadOfflinePageOnFlakyNetwork) {
@@ -1196,9 +1000,7 @@
       UseOfflinePageHeader(OfflinePageHeader::Reason::NET_ERROR, 0));
   LoadPageWithHeaders(test_url, extra_headers);
 
-  ExpectOfflinePageServed(offline_id, kFileSize1,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_FLAKY_NETWORK);
+  ExpectOfflinePageServed(offline_id, kFileSize1);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, PageNotFoundOnFlakyNetwork) {
@@ -1214,9 +1016,7 @@
       UseOfflinePageHeader(OfflinePageHeader::Reason::NET_ERROR, 0));
   LoadPageWithHeaders(GURL(kTestUrl2), extra_headers);
 
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                PAGE_NOT_FOUND_ON_FLAKY_NETWORK);
+  ExpectNoOfflinePageServed(offline_id);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, ForceLoadOfflinePageOnConnectedNetwork) {
@@ -1233,9 +1033,7 @@
       UseOfflinePageHeader(OfflinePageHeader::Reason::DOWNLOAD, 0));
   LoadPageWithHeaders(test_url, extra_headers);
 
-  ExpectOfflinePageServed(offline_id, kFileSize1,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_CONNECTED_NETWORK);
+  ExpectOfflinePageServed(offline_id, kFileSize1);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, PageNotFoundOnConnectedNetwork) {
@@ -1252,9 +1050,7 @@
       UseOfflinePageHeader(OfflinePageHeader::Reason::DOWNLOAD, 0));
   LoadPageWithHeaders(GURL(kTestUrl2), extra_headers);
 
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                PAGE_NOT_FOUND_ON_CONNECTED_NETWORK);
+  ExpectNoOfflinePageServed(offline_id);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, DoNotLoadOfflinePageOnConnectedNetwork) {
@@ -1270,9 +1066,7 @@
   // immediately. So no request result should be reported. Passing
   // AGGREGATED_REQUEST_RESULT_MAX to skip checking request result in
   // the helper function.
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                AGGREGATED_REQUEST_RESULT_MAX);
+  ExpectNoOfflinePageServed(offline_id);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, LoadMostRecentlyCreatedOfflinePage) {
@@ -1281,8 +1075,6 @@
   // Save 2 offline pages associated with same online URL, but pointing to
   // different archive file.
   const GURL test_url(kTestUrl);
-  int64_t offline_id1 =
-      SaveInternalPage(test_url, GURL(), kFilename1, kFileSize1, std::string());
   int64_t offline_id2 =
       SaveInternalPage(test_url, GURL(), kFilename2, kFileSize2, std::string());
 
@@ -1290,10 +1082,7 @@
   // recently created offline page is fetched.
   LoadPage(test_url);
 
-  ExpectOfflinePageServed(offline_id2, kFileSize2,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
-  ExpectOfflinePageAccessCount(offline_id1, 0);
+  ExpectOfflinePageServed(offline_id2, kFileSize2);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, LoadOfflinePageByOfflineID) {
@@ -1304,8 +1093,6 @@
   const GURL test_url(kTestUrl);
   int64_t offline_id1 =
       SaveInternalPage(test_url, GURL(), kFilename1, kFileSize1, std::string());
-  int64_t offline_id2 =
-      SaveInternalPage(test_url, GURL(), kFilename2, kFileSize2, std::string());
 
   // Load an URL with a specific offline ID designated in the custom header.
   // Expect the offline page matching the offline id is fetched.
@@ -1314,10 +1101,7 @@
       UseOfflinePageHeader(OfflinePageHeader::Reason::DOWNLOAD, offline_id1));
   LoadPageWithHeaders(test_url, extra_headers);
 
-  ExpectOfflinePageServed(offline_id1, kFileSize1,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_CONNECTED_NETWORK);
-  ExpectOfflinePageAccessCount(offline_id2, 0);
+  ExpectOfflinePageServed(offline_id1, kFileSize1);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, FailToLoadByOfflineIDOnUrlMismatch) {
@@ -1334,9 +1118,7 @@
       UseOfflinePageHeader(OfflinePageHeader::Reason::DOWNLOAD, offline_id));
   LoadPageWithHeaders(GURL(kTestUrl2), extra_headers);
 
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                PAGE_NOT_FOUND_ON_CONNECTED_NETWORK);
+  ExpectNoOfflinePageServed(offline_id);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, LoadOfflinePageForUrlWithFragment) {
@@ -1353,18 +1135,12 @@
   int64_t offline_id2 = SaveInternalPage(url2_with_fragment, GURL(), kFilename2,
                                          kFileSize2, std::string());
 
-  ExpectOfflinePageAccessCount(offline_id1, 0);
-  ExpectOfflinePageAccessCount(offline_id2, 0);
-
   // Loads an url with fragment, that will match the offline URL without the
   // fragment.
   GURL url_with_fragment(test_url.spec() + "#ref");
   LoadPage(url_with_fragment);
 
-  ExpectOfflinePageServed(offline_id1, kFileSize1,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
-  ExpectOfflinePageAccessCount(offline_id2, 0);
+  ExpectOfflinePageServed(offline_id1, kFileSize1);
 
   // Loads an url without fragment, that will match the offline URL with the
   // fragment.
@@ -1374,14 +1150,6 @@
   ASSERT_TRUE(offline_page_tab_helper()->GetOfflinePageForTest());
   EXPECT_EQ(offline_id2,
             offline_page_tab_helper()->GetOfflinePageForTest()->offline_id);
-  ExpectMultiUniqueSampleForAggregatedRequestResult(
-      OfflinePageRequestHandler::AggregatedRequestResult::
-          SHOW_OFFLINE_ON_DISCONNECTED_NETWORK,
-      2);
-  ExpectOfflinePageSizeTotalSuffixCount(2);
-  ExpectOnlinePageSizeTotalSuffixCount(0);
-  ExpectOfflinePageAccessCount(offline_id1, 1);
-  ExpectOfflinePageAccessCount(offline_id2, 1);
 
   // Loads an url with fragment, that will match the offline URL with different
   // fragment.
@@ -1392,248 +1160,6 @@
   ASSERT_TRUE(offline_page_tab_helper()->GetOfflinePageForTest());
   EXPECT_EQ(offline_id2,
             offline_page_tab_helper()->GetOfflinePageForTest()->offline_id);
-  ExpectMultiUniqueSampleForAggregatedRequestResult(
-      OfflinePageRequestHandler::AggregatedRequestResult::
-          SHOW_OFFLINE_ON_DISCONNECTED_NETWORK,
-      3);
-  ExpectOfflinePageSizeTotalSuffixCount(3);
-  ExpectOnlinePageSizeTotalSuffixCount(0);
-  ExpectOfflinePageAccessCount(offline_id1, 1);
-  ExpectOfflinePageAccessCount(offline_id2, 2);
-}
-
-TEST_F(OfflinePageRequestHandlerTest, LoadOfflinePageAfterRedirect) {
-  SimulateHasNetworkConnectivity(false);
-
-  // Save an offline page with same original URL and final URL.
-  int64_t offline_id = SaveInternalPage(GURL(kTestUrl), GURL(kTestUrl2),
-                                        kFilename1, kFileSize1, std::string());
-
-  // This should trigger redirect first.
-  LoadPage(GURL(kTestUrl2));
-
-  // Passing AGGREGATED_REQUEST_RESULT_MAX to skip checking request result in
-  // the helper function. Different checks will be done after that.
-  ExpectOfflinePageServed(offline_id, kFileSize1,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              AGGREGATED_REQUEST_RESULT_MAX);
-  ExpectOneNonuniqueSampleForAggregatedRequestResult(
-      OfflinePageRequestHandler::AggregatedRequestResult::
-          REDIRECTED_ON_DISCONNECTED_NETWORK);
-  ExpectOneNonuniqueSampleForAggregatedRequestResult(
-      OfflinePageRequestHandler::AggregatedRequestResult::
-          SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
-}
-
-TEST_F(OfflinePageRequestHandlerTest,
-       NoRedirectForOfflinePageWithSameOriginalURL) {
-  SimulateHasNetworkConnectivity(false);
-
-  // Skip the logic to clear the original URL if it is same as final URL.
-  // This is needed in order to test that offline page request handler can
-  // omit the redirect under this circumstance, for compatibility with the
-  // metadata already written to the store.
-  OfflinePageModelTaskified* model = static_cast<OfflinePageModelTaskified*>(
-      OfflinePageModelFactory::GetForBrowserContext(profile()));
-  model->SetSkipClearingOriginalUrlForTesting();
-
-  // Save an offline page with same original URL and final URL.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id = SaveInternalPage(test_url, test_url, kFilename1,
-                                        kFileSize1, std::string());
-
-  // Check if the original URL is still present.
-  OfflinePageItem page = GetPage(offline_id);
-  EXPECT_EQ(test_url, page.original_url_if_different);
-
-  // No redirect should be triggered when original URL is same as final URL.
-  LoadPage(test_url);
-
-  ExpectOfflinePageServed(offline_id, kFileSize1,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
-}
-
-TEST_F(OfflinePageRequestHandlerTest,
-       LoadOfflinePageFromNonExistentInternalFile) {
-  SimulateHasNetworkConnectivity(false);
-
-  // Save an offline page pointing to non-existent internal archive file.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id = SaveInternalPage(test_url, GURL(), kNonexistentFilename,
-                                        kFileSize1, std::string());
-
-  LoadPage(test_url);
-
-  ExpectNoOfflinePageServed(
-      offline_id,
-      OfflinePageRequestHandler::AggregatedRequestResult::FILE_NOT_FOUND);
-}
-
-TEST_F(OfflinePageRequestHandlerTest,
-       LoadOfflinePageFromNonExistentPublicFile) {
-  SimulateHasNetworkConnectivity(false);
-
-  // Save an offline page pointing to non-existent public archive file.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id = SavePublicPage(test_url, GURL(), kNonexistentFilename,
-                                      kFileSize1, kDigest1);
-
-  LoadPage(test_url);
-
-  ExpectNoOfflinePageServed(
-      offline_id,
-      OfflinePageRequestHandler::AggregatedRequestResult::FILE_NOT_FOUND);
-}
-
-TEST_F(OfflinePageRequestHandlerTest, FileSizeMismatchOnDisconnectedNetwork) {
-  SimulateHasNetworkConnectivity(false);
-
-  // Save an offline page in public location with mismatched file size.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id = SavePublicPage(test_url, GURL(), kFilename1,
-                                      kMismatchedFileSize, kDigest1);
-
-  LoadPage(test_url);
-
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                DIGEST_MISMATCH_ON_DISCONNECTED_NETWORK);
-}
-
-TEST_F(OfflinePageRequestHandlerTest, FileSizeMismatchOnConnectedNetwork) {
-  SimulateHasNetworkConnectivity(true);
-
-  // Save an offline page in public location with mismatched file size.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id = SavePublicPage(test_url, GURL(), kFilename1,
-                                      kMismatchedFileSize, kDigest1);
-
-  // When custom offline header exists and contains value other than
-  // "reason=error", it means that offline page is forced to load.
-  net::HttpRequestHeaders extra_headers;
-  extra_headers.AddHeaderFromString(
-      UseOfflinePageHeader(OfflinePageHeader::Reason::DOWNLOAD, 0));
-  LoadPageWithHeaders(test_url, extra_headers);
-
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                DIGEST_MISMATCH_ON_CONNECTED_NETWORK);
-}
-
-TEST_F(OfflinePageRequestHandlerTest, FileSizeMismatchOnFlakyNetwork) {
-  SimulateHasNetworkConnectivity(true);
-
-  // Save an offline page in public location with mismatched file size.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id = SavePublicPage(test_url, GURL(), kFilename1,
-                                      kMismatchedFileSize, kDigest1);
-
-  // When custom offline header exists and contains "reason=error", it means
-  // that net error is hit in last request due to flaky network.
-  net::HttpRequestHeaders extra_headers;
-  extra_headers.AddHeaderFromString(
-      UseOfflinePageHeader(OfflinePageHeader::Reason::NET_ERROR, 0));
-  LoadPageWithHeaders(test_url, extra_headers);
-
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                DIGEST_MISMATCH_ON_FLAKY_NETWORK);
-}
-
-TEST_F(OfflinePageRequestHandlerTest, DigestMismatchOnDisconnectedNetwork) {
-  SimulateHasNetworkConnectivity(false);
-
-  // Save an offline page in public location with mismatched digest.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id = SavePublicPage(test_url, GURL(), kFilename1, kFileSize1,
-                                      kMismatchedDigest);
-
-  LoadPage(test_url);
-
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                DIGEST_MISMATCH_ON_DISCONNECTED_NETWORK);
-}
-
-TEST_F(OfflinePageRequestHandlerTest, DigestMismatchOnConnectedNetwork) {
-  SimulateHasNetworkConnectivity(true);
-
-  // Save an offline page in public location with mismatched digest.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id = SavePublicPage(test_url, GURL(), kFilename1, kFileSize1,
-                                      kMismatchedDigest);
-
-  // When custom offline header exists and contains value other than
-  // "reason=error", it means that offline page is forced to load.
-  net::HttpRequestHeaders extra_headers;
-  extra_headers.AddHeaderFromString(
-      UseOfflinePageHeader(OfflinePageHeader::Reason::DOWNLOAD, 0));
-  LoadPageWithHeaders(test_url, extra_headers);
-
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                DIGEST_MISMATCH_ON_CONNECTED_NETWORK);
-}
-
-TEST_F(OfflinePageRequestHandlerTest, DigestMismatchOnFlakyNetwork) {
-  SimulateHasNetworkConnectivity(true);
-
-  // Save an offline page in public location with mismatched digest.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id = SavePublicPage(test_url, GURL(), kFilename1, kFileSize1,
-                                      kMismatchedDigest);
-
-  // When custom offline header exists and contains "reason=error", it means
-  // that net error is hit in last request due to flaky network.
-  net::HttpRequestHeaders extra_headers;
-  extra_headers.AddHeaderFromString(
-      UseOfflinePageHeader(OfflinePageHeader::Reason::NET_ERROR, 0));
-  LoadPageWithHeaders(test_url, extra_headers);
-
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                DIGEST_MISMATCH_ON_FLAKY_NETWORK);
-}
-
-TEST_F(OfflinePageRequestHandlerTest, FailOnNoDigestForPublicArchiveFile) {
-  SimulateHasNetworkConnectivity(false);
-
-  // Save an offline page in public location with no digest.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id =
-      SavePublicPage(test_url, GURL(), kFilename1, kFileSize1, std::string());
-
-  LoadPage(test_url);
-
-  ExpectNoOfflinePageServed(offline_id,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                DIGEST_MISMATCH_ON_DISCONNECTED_NETWORK);
-}
-
-TEST_F(OfflinePageRequestHandlerTest, FailToLoadByOfflineIDOnDigestMismatch) {
-  SimulateHasNetworkConnectivity(true);
-
-  // Save 2 offline pages associated with same online URL, one in internal
-  // location, while another in public location with mismatched digest.
-  const GURL test_url(kTestUrl);
-  int64_t offline_id1 =
-      SaveInternalPage(test_url, GURL(), kFilename1, kFileSize1, std::string());
-  int64_t offline_id2 = SavePublicPage(test_url, GURL(), kFilename1, kFileSize1,
-                                       kMismatchedDigest);
-
-  // The offline page found with specific offline ID does not pass the
-  // validation. Though there is another page with the same URL, it will not be
-  // fetched. Instead, fall back to load the online URL.
-  net::HttpRequestHeaders extra_headers;
-  extra_headers.AddHeaderFromString(
-      UseOfflinePageHeader(OfflinePageHeader::Reason::DOWNLOAD, offline_id2));
-  LoadPageWithHeaders(test_url, extra_headers);
-
-  ExpectNoOfflinePageServed(offline_id1,
-                            OfflinePageRequestHandler::AggregatedRequestResult::
-                                DIGEST_MISMATCH_ON_CONNECTED_NETWORK);
-  ExpectOfflinePageAccessCount(offline_id2, 0);
 }
 
 TEST_F(OfflinePageRequestHandlerTest, LoadOtherPageOnDigestMismatch) {
@@ -1644,20 +1170,13 @@
   const GURL test_url(kTestUrl);
   int64_t offline_id1 =
       SaveInternalPage(test_url, GURL(), kFilename1, kFileSize1, std::string());
-  int64_t offline_id2 = SavePublicPage(test_url, GURL(), kFilename2, kFileSize2,
-                                       kMismatchedDigest);
-  ExpectOfflinePageAccessCount(offline_id1, 0);
-  ExpectOfflinePageAccessCount(offline_id2, 0);
 
   // There are 2 offline pages matching |test_url|. The most recently created
   // one should fail on mistmatched digest. The second most recently created
   // offline page should work.
   LoadPage(test_url);
 
-  ExpectOfflinePageServed(offline_id1, kFileSize1,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
-  ExpectOfflinePageAccessCount(offline_id2, 0);
+  ExpectOfflinePageServed(offline_id1, kFileSize1);
 }
 
 // Disabled due to https://crbug.com/917113.
@@ -1675,9 +1194,7 @@
 
   LoadPage(test_url);
 
-  ExpectOfflinePageServed(offline_id, 0,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
+  ExpectOfflinePageServed(offline_id, 0);
   EXPECT_EQ(expected_data, data_received());
 }
 
@@ -1697,9 +1214,7 @@
 
   LoadPage(test_url);
 
-  ExpectOfflinePageServed(offline_id, expected_size,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
+  ExpectOfflinePageServed(offline_id, expected_size);
   EXPECT_EQ(expected_data, data_received());
 }
 
@@ -1719,9 +1234,7 @@
 
   LoadPage(test_url);
 
-  ExpectOfflinePageServed(offline_id, expected_size,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
+  ExpectOfflinePageServed(offline_id, expected_size);
   EXPECT_EQ(expected_data, data_received());
 }
 
@@ -1741,9 +1254,7 @@
 
   LoadPage(test_url);
 
-  ExpectOfflinePageServed(offline_id, expected_size,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_DISCONNECTED_NETWORK);
+  ExpectOfflinePageServed(offline_id, expected_size);
   EXPECT_EQ(expected_data, data_received());
 }
 
@@ -1778,9 +1289,7 @@
       net::FilePathToFileURL(unmodified_file_path)));
   LoadPageWithHeaders(test_url, extra_headers);
 
-  ExpectOfflinePageServed(offline_id, expected_size,
-                          OfflinePageRequestHandler::AggregatedRequestResult::
-                              SHOW_OFFLINE_ON_CONNECTED_NETWORK);
+  ExpectOfflinePageServed(offline_id, expected_size);
   EXPECT_EQ(expected_data, data_received());
 }
 
diff --git a/chrome/browser/offline_pages/offline_page_tab_helper.cc b/chrome/browser/offline_pages/offline_page_tab_helper.cc
index e6449d86..1e7afe4 100644
--- a/chrome/browser/offline_pages/offline_page_tab_helper.cc
+++ b/chrome/browser/offline_pages/offline_page_tab_helper.cc
@@ -325,13 +325,6 @@
       error_code != net::ERR_NAME_NOT_RESOLVED &&
       error_code != net::ERR_ADDRESS_UNREACHABLE &&
       error_code != net::ERR_PROXY_CONNECTION_FAILED) {
-    // Do not report aborted error since the error page is not shown on this
-    // error.
-    if (error_code != net::ERR_ABORTED) {
-      OfflinePageRequestHandler::ReportAggregatedRequestResult(
-          OfflinePageRequestHandler::AggregatedRequestResult::
-              SHOW_NET_ERROR_PAGE);
-    }
     return;
   }
 
@@ -360,9 +353,6 @@
     const std::vector<OfflinePageItem>& offline_pages) {
   // Bails out if no offline page is found.
   if (offline_pages.empty()) {
-    OfflinePageRequestHandler::ReportAggregatedRequestResult(
-        OfflinePageRequestHandler::AggregatedRequestResult::
-            PAGE_NOT_FOUND_ON_FLAKY_NETWORK);
     return;
   }
 
diff --git a/chrome/browser/password_check/android/password_check_manager.cc b/chrome/browser/password_check/android/password_check_manager.cc
index c874e87..d91d023 100644
--- a/chrome/browser/password_check/android/password_check_manager.cc
+++ b/chrome/browser/password_check/android/password_check_manager.cc
@@ -329,6 +329,8 @@
     case SyncState::kNotSyncing:
       ABSL_FALLTHROUGH_INTENDED;
     case SyncState::kSyncingWithCustomPassphrase:
+      ABSL_FALLTHROUGH_INTENDED;
+    case SyncState::kAccountPasswordsActiveWithCustomPassphrase:
       return false;
 
     case SyncState::kSyncingNormalEncryption:
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc b/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc
index f4272f4..9fcb203 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/device_identity/device_oauth2_token_service_factory.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/policy/messaging_layer/upload/file_upload_job.h"
+#include "components/reporting/resources/resource_manager.h"
 #include "components/reporting/util/status.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -103,12 +104,13 @@
   int64_t upload_granularity = -1;
   std::string upload_granularity_string;
   if (!headers->GetNormalizedHeader(kUploadChunkGranularityHeader,
-                                    &upload_granularity_string) ||
-      !base::StringToInt64(upload_granularity_string, &upload_granularity) ||
+                                    &upload_granularity_string)) {
+    return Status(error::DATA_LOSS, "No granularity returned");
+  }
+  if (!base::StringToInt64(upload_granularity_string, &upload_granularity) ||
       upload_granularity <= 0L) {
-    return Status(error::DATA_LOSS,
-                  base::StrCat({"Unexpected upload granularity=",
-                                upload_granularity_string}));
+    return Status(error::DATA_LOSS, base::StrCat({"Unexpected granularity=",
+                                                  upload_granularity_string}));
   }
   return upload_granularity;
 }
@@ -242,15 +244,6 @@
     // Record total size of the file.
     total_ = total_result.ValueOrDie();
 
-    // Extract base name of the file for metadata.
-    const base::FilePath full_name = base::FilePath(origin_path_);
-    const auto base_name = full_name.BaseName().MaybeAsASCII();
-    if (base_name.empty()) {
-      Complete(Status(error::FAILED_PRECONDITION,
-                      base::StrCat({"Origin path malformed: ", origin_path_})));
-      return;
-    }
-
     // Initiate upload.
     DVLOG(1) << "Starting URL fetcher.";
 
@@ -266,27 +259,34 @@
 
     url_loader_ = delegate()->CreatePostLoader(std::move(resource_request));
 
-    // Construct and attach medatata.
-    // See go/scotty-http-protocols#unified-resumable-protocol
-    // Retrieve the base name of the file to be used as uploaded file name.
-    // TODO(b/264399295): The rest is to be populated from the event.
-    std::string metadata;
-    metadata.append("<File-Type>\r\n")
-        .append("  ")
-        .append("support_file")  // TODO(b/264399295): get from the event
-        .append("\r\n")
-        .append("</File-Type>\r\n");
-    metadata.append("<Command-ID>\r\n")
-        .append("  ")
-        .append("ID12345")  // TODO(b/264399295): get from the event
-        .append("\r\n")
-        .append("</Command-ID>\r\n");
-    metadata.append("<Filename>\r\n")
-        .append("  ")
-        .append(base_name)
-        .append("\r\n")
-        .append("</Filename>\r\n");
-    url_loader_->AttachStringForUpload(metadata, "text/xml");
+    // Construct and attach medatata - see
+    // go/scotty-http-protocols#unified-resumable-protocol
+    // Here we expect `upload_parameters` to be in the form like:
+    //
+    // "<File-Type>\r\n"
+    // "  support_file\r\n"
+    // "</File-Type>\r\n"
+    // "<Command-ID>\r\n"
+    // "  ID12345\r\n"
+    // "</Command-ID>\r\n"
+    // "<Filename>\r\n"
+    // "  resulting_file_name\r\n"
+    // "</Filename>\r\n"
+    // "text/xml"
+    //
+    // with the last line indicating content type.
+    const auto pos = upload_parameters_.find_last_of("\n");
+    if (pos == std::string::npos || pos + 1u >= upload_parameters_.size()) {
+      Complete(Status(error::INVALID_ARGUMENT,
+                      base::StrCat({"Cannot parse upload_parameters=`",
+                                    upload_parameters_, "`"})));
+      return;
+    }
+    const std::string metadata_contents_type =
+        upload_parameters_.substr(pos + 1u);
+    const std::string metadata =
+        upload_parameters_.substr(0, pos + 1u);  // With \n included!
+    url_loader_->AttachStringForUpload(metadata, metadata_contents_type);
 
     // Make a call and get response headers.
     delegate()->SendAndGetResponse(
@@ -371,6 +371,7 @@
       int64_t total,
       int64_t uploaded,
       base::StringPiece session_token,
+      ScopedReservation scoped_reservation,
       base::WeakPtr<FileUploadDelegate> delegate,
       base::OnceCallback<
           void(StatusOr<std::pair<int64_t /*uploaded*/,
@@ -378,7 +379,8 @@
       : ActionContext(std::move(delegate), std::move(result_cb)),
         total_(total),
         uploaded_(uploaded),
-        session_token_(session_token) {}
+        session_token_(session_token),
+        scoped_reservation_(std::move(scoped_reservation)) {}
 
   void Run() {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -453,9 +455,8 @@
           upload_received < 0 || uploaded_ > upload_received) {
         Complete(Status(
             error::DATA_LOSS,
-            base::StrCat(
-                {"Unexpected received=", base::NumberToString(upload_received),
-                 ", expected=", base::NumberToString(uploaded_)})));
+            base::StrCat({"Unexpected received=", upload_received_string,
+                          ", expected=", base::NumberToString(uploaded_)})));
         return;
       }
     }
@@ -493,6 +494,17 @@
     resource_request->headers.SetHeader(kUploadOffsetHeader,
                                         base::NumberToString(upload_received));
 
+    // See whether we have enough memory for the buffer.
+    ScopedReservation buffer_reservation(size, scoped_reservation_);
+    if (!buffer_reservation.reserved()) {
+      // Do not post error status - it would stop the whole job.
+      // Post success without making any progress!
+      Complete(std::make_pair(upload_received, session_token_));
+      return;
+    }
+    // Attach the new reservation.
+    scoped_reservation_.HandOver(buffer_reservation);
+
     // Retrieve data from the file to be attached on a thread pool, then resume
     // on the current task runner. Note: it could be done with
     // `AttachFileForUpload` instead, but loading into memory allows to check
@@ -539,6 +551,9 @@
       scoped_refptr<::net::HttpResponseHeaders> headers) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+    // Buffer no longer used.
+    scoped_reservation_.Reduce(size);
+
     auto status_result =
         CheckResponseAndGetStatus(std::move(url_loader_), headers);
     if (!status_result.ok()) {
@@ -590,7 +605,7 @@
                                   base::NumberToString(handle->GetLength())}));
     }
 
-    // Load into buffer. TODO(b/264399295): Add memory resource control.
+    // Load into buffer.
     buffer.resize(
         size);  // Initialization is redundant, but std::string mandates it.
     const int read_size = handle->Read(offset, buffer.data(), size);
@@ -623,6 +638,9 @@
   std::unique_ptr<network::SimpleURLLoader> url_loader_
       GUARDED_BY_CONTEXT(sequence_checker_);
 
+  // Memory usage by upload.
+  ScopedReservation scoped_reservation_ GUARDED_BY_CONTEXT(sequence_checker_);
+
   // Should remain the last member so it will be destroyed first and
   // invalidate all weak pointers.
   base::WeakPtrFactory<NextStepContext> weak_ptr_factory_{this};
@@ -710,9 +728,9 @@
       }
       if (!base::StringToInt64(upload_received_string, &upload_received) ||
           upload_received < 0) {
-        Complete(Status(error::DATA_LOSS,
-                        base::StrCat({"Unexpected received=",
-                                      base::NumberToString(upload_received)})));
+        Complete(Status(
+            error::DATA_LOSS,
+            base::StrCat({"Unexpected received=", upload_received_string})));
         return;
       }
     }
@@ -940,20 +958,23 @@
     int64_t total,
     int64_t uploaded,
     base::StringPiece session_token,
+    ScopedReservation scoped_reservation,
     base::OnceCallback<void(StatusOr<std::pair<int64_t /*uploaded*/,
                                                std::string /*session_token*/>>)>
         result_cb) {
   if (!::content::BrowserThread::CurrentlyOn(::content::BrowserThread::UI)) {
     ::content::GetUIThreadTaskRunner({})->PostTask(
-        FROM_HERE, base::BindOnce(&FileUploadDelegate::DoNextStep, GetWeakPtr(),
-                                  total, uploaded, std::string(session_token),
-                                  std::move(result_cb)));
+        FROM_HERE,
+        base::BindOnce(&FileUploadDelegate::DoNextStep, GetWeakPtr(), total,
+                       uploaded, std::string(session_token),
+                       std::move(scoped_reservation), std::move(result_cb)));
     return;
   }
 
   InitializeOnce();
 
-  (new NextStepContext(total, uploaded, session_token, GetWeakPtr(),
+  (new NextStepContext(total, uploaded, session_token,
+                       std::move(scoped_reservation), GetWeakPtr(),
                        std::move(result_cb)))
       ->Run();
 }
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_impl.h b/chrome/browser/policy/messaging_layer/upload/file_upload_impl.h
index 39a8cae..2d38190 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_impl.h
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_impl.h
@@ -17,6 +17,7 @@
 #include "base/thread_annotations.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/policy/messaging_layer/upload/file_upload_job.h"
+#include "components/reporting/resources/resource_manager.h"
 #include "components/reporting/util/status.h"
 #include "google_apis/gaia/core_account_id.h"
 #include "google_apis/gaia/oauth2_access_token_manager.h"
@@ -54,11 +55,12 @@
       int64_t total,
       int64_t uploaded,
       base::StringPiece session_token,
+      ScopedReservation scoped_reservation,
       base::OnceCallback<void(
           StatusOr<std::pair<int64_t /*uploaded*/,
                              std::string /*session_token*/>>)> cb) override;
   void DoFinalize(
-      base::StringPiece access_parameters,
+      base::StringPiece session_token,
       base::OnceCallback<void(StatusOr<std::string /*access_parameters*/>)> cb)
       override;
 
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc b/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc
index c8c143d6..4c1c452 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc
@@ -26,6 +26,7 @@
 #include "base/time/time.h"
 #include "chrome/browser/ash/policy/uploading/upload_job_impl.h"
 #include "components/reporting/proto/synced/upload_tracker.pb.h"
+#include "components/reporting/resources/resource_manager.h"
 #include "components/reporting/util/status.h"
 #include "components/reporting/util/statusor.h"
 #include "components/reporting/util/test_support_callbacks.h"
@@ -66,6 +67,17 @@
 constexpr size_t kDataGranularity = 10;
 constexpr size_t kMaxUploadBufferSize = kDataGranularity * 2;
 constexpr char kUploadId[] = "ABC";
+constexpr char kUploadMedata[] =
+    "<File-Type>\r\n"
+    "  support_file\r\n"
+    "</File-Type>\r\n"
+    "<Command-ID>\r\n"
+    "  ID12345\r\n"
+    "</Command-ID>\r\n"
+    "<Filename>\r\n"
+    "  resulting_file_name\r\n"
+    "</Filename>\r\n";
+constexpr char kUploadMetadataContentType[] = "text/xml";
 constexpr char kResumableUrl[] =
     "/upload?upload_id=ABC&upload_protocol=resumable";
 constexpr char kTokenInvalid[] = "INVALID_TOKEN";
@@ -75,6 +87,16 @@
     "0123456789012345678901234567890123456789012345678901234567890123456789";
 constexpr size_t kTestDataSize = sizeof(kTestData) - 1;
 
+constexpr char kUploadStatusHeader[] = "X-Goog-Upload-Status";
+constexpr char kUploadCommandHeader[] = "X-Goog-Upload-Command";
+constexpr char kUploadChunkGranularityHeader[] =
+    "X-Goog-Upload-Chunk-Granularity";
+constexpr char kUploadUrlHeader[] = "X-Goog-Upload-Url";
+constexpr char kUploadSizeReceivedHeader[] = "X-Goog-Upload-Size-Received";
+constexpr char kUploadOffsetHeader[] = "X-Goog-Upload-Offset";
+constexpr char kUploadProtocolHeader[] = "X-Goog-Upload-Protocol";
+constexpr char kUploadIdHeader[] = "X-GUploader-UploadID";
+
 // Test-only access token manager fake, that allows to pre-populate
 // expected valid and invalid tokens ahead of the test execution.
 class FakeOAuth2AccessTokenManagerWithCaching
@@ -209,6 +231,9 @@
   }
 
   void SetUp() override {
+    memory_resource_ =
+        base::MakeRefCounted<ResourceManager>(4u * 1024LLu * 1024LLu);  // 4 MiB
+
     url_loader_factory_ =
         base::MakeRefCounted<::network::TestSharedURLLoaderFactory>();
     test_server_.RegisterRequestHandler(base::BindRepeating(
@@ -219,6 +244,7 @@
 
   void TearDown() override {
     ASSERT_TRUE(test_server_.ShutdownAndWaitUntilComplete());
+    EXPECT_THAT(memory_resource_->GetUsed(), Eq(0uL));
   }
 
   std::unique_ptr<FileUploadDelegate> PrepareFileUploadDelegate() {
@@ -264,9 +290,9 @@
         IsSupersetOf({
             Pair("Authorization",
                  ::testing::MatcherCast<std::string>(StartsWith("Bearer "))),
-            Pair("X-Goog-Upload-Protocol",
+            Pair(kUploadProtocolHeader,
                  ::testing::MatcherCast<std::string>(StrEq("resumable"))),
-            Pair("X-Goog-Upload-Command",
+            Pair(kUploadCommandHeader,
                  ::testing::MatcherCast<std::string>(StrEq("start"))),
             Pair("X-Goog-Upload-Header-Content-Length",
                  ::testing::MatcherCast<std::string>(
@@ -274,7 +300,11 @@
             Pair("X-Goog-Upload-Header-Content-Type",
                  ::testing::MatcherCast<std::string>(
                      StrEq("application/octet-stream"))),
+            Pair("Content-Type", ::testing::MatcherCast<std::string>(
+                                     kUploadMetadataContentType)),
         }));
+    EXPECT_TRUE(request.has_content);
+    EXPECT_THAT(request.content, StrEq(kUploadMedata));
   }
 
   void ExpectQuery(const ::net::test_server::HttpRequest& request) {
@@ -282,8 +312,8 @@
     EXPECT_THAT(request.relative_url, StrEq(kResumableUrl));
     EXPECT_THAT(request.headers,
                 IsSupersetOf({
-                    Pair("X-Goog-Upload-Protocol", StrEq("resumable")),
-                    Pair("X-Goog-Upload-Command", StrEq("query")),
+                    Pair(kUploadProtocolHeader, StrEq("resumable")),
+                    Pair(kUploadCommandHeader, StrEq("query")),
                 }));
   }
 
@@ -294,9 +324,9 @@
     EXPECT_THAT(
         request.headers,
         IsSupersetOf({
-            Pair("X-Goog-Upload-Protocol", StrEq("resumable")),
-            Pair("X-Goog-Upload-Command", StrEq("upload")),
-            Pair("X-Goog-Upload-Offset", StrEq(base::NumberToString(offset))),
+            Pair(kUploadProtocolHeader, StrEq("resumable")),
+            Pair(kUploadCommandHeader, StrEq("upload")),
+            Pair(kUploadOffsetHeader, StrEq(base::NumberToString(offset))),
         }));
   }
 
@@ -305,8 +335,8 @@
     EXPECT_THAT(request.relative_url, StrEq(kResumableUrl));
     EXPECT_THAT(request.headers,
                 IsSupersetOf({
-                    Pair("X-Goog-Upload-Protocol", StrEq("resumable")),
-                    Pair("X-Goog-Upload-Command", StrEq("finalize")),
+                    Pair(kUploadProtocolHeader, StrEq("resumable")),
+                    Pair(kUploadCommandHeader, StrEq("finalize")),
                 }));
   }
 
@@ -328,6 +358,8 @@
   FakeOAuth2AccessTokenManagerWithCaching access_token_manager_{
       &token_manager_delegate_};
 
+  scoped_refptr<ResourceManager> memory_resource_;
+
  private:
   base::ScopedTempDir temp_dir_;
   base::FilePath origin_path_;
@@ -350,10 +382,10 @@
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectStart(request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "active");
-        response->AddCustomHeader("X-Goog-Upload-Chunk-Granularity",
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
                                   base::NumberToString(kDataGranularity));
-        response->AddCustomHeader("X-Goog-Upload-Url",
+        response->AddCustomHeader(kUploadUrlHeader,
                                   GetServerURL(kResumableUrl).spec());
         response->set_code(::net::HTTP_OK);
       }));
@@ -361,8 +393,11 @@
   test::TestEvent<
       StatusOr<std::pair<int64_t /*total*/, std::string /*session_token*/>>>
       init_done;
-  delegate->DoInitiate(origin_path(), GetServerURL(kResumableUrl).spec(),
-                       init_done.cb());
+  delegate->DoInitiate(
+      origin_path(),
+      /*upload_parameters=*/
+      base::StrCat({kUploadMedata, kUploadMetadataContentType}),
+      init_done.cb());
   const auto& result = init_done.result();
   ASSERT_OK(result) << result.status();
   ASSERT_THAT(result.ValueOrDie().first,
@@ -382,36 +417,36 @@
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectStart(request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "final");
-        response->AddCustomHeader("X-Goog-Upload-Chunk-Granularity",
+        response->AddCustomHeader(kUploadStatusHeader, "final");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
                                   base::NumberToString(kDataGranularity));
-        response->AddCustomHeader("X-Goog-Upload-Url",
+        response->AddCustomHeader(kUploadUrlHeader,
                                   GetServerURL(kResumableUrl).spec());
         response->set_code(::net::HTTP_OK);
       }))
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectStart(request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "active");
-        response->AddCustomHeader("X-Goog-Upload-Url",
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadUrlHeader,
                                   GetServerURL(kResumableUrl).spec());
         response->set_code(::net::HTTP_OK);
       }))
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectStart(request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "active");
-        response->AddCustomHeader("X-Goog-Upload-Chunk-Granularity",
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
                                   base::NumberToString(kDataGranularity));
         response->set_code(::net::HTTP_OK);
       }))
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectStart(request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "active");
-        response->AddCustomHeader("X-Goog-Upload-Chunk-Granularity",
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
                                   base::NumberToString(kDataGranularity));
-        response->AddCustomHeader("X-Goog-Upload-Url",
+        response->AddCustomHeader(kUploadUrlHeader,
                                   GetServerURL(kResumableUrl).spec());
         response->set_code(::net::HTTP_INTERNAL_SERVER_ERROR);
       }));
@@ -424,8 +459,28 @@
     test::TestEvent<
         StatusOr<std::pair<int64_t /*total*/, std::string /*session_token*/>>>
         init_done;
-    delegate->DoInitiate(origin_path(), GetServerURL(kResumableUrl).spec(),
-                         init_done.cb());
+    // Incorrect upload parameters prevent calling the server - no expectation
+    // is provided!
+    delegate->DoInitiate(origin_path(),
+                         /*upload_parameters=*/"ABCD", init_done.cb());
+    EXPECT_THAT(
+        init_done.result().status(),
+        AllOf(Property(&Status::error_code, Eq(error::INVALID_ARGUMENT)),
+              Property(&Status::error_message,
+                       StrEq("Cannot parse upload_parameters=`ABCD`"))));
+  }
+  {
+    // Prepare access token.
+    access_token_manager_.AddTokenToQueue(kTokenValid);
+
+    test::TestEvent<
+        StatusOr<std::pair<int64_t /*total*/, std::string /*session_token*/>>>
+        init_done;
+    delegate->DoInitiate(
+        origin_path(),
+        /*upload_parameters=*/
+        base::StrCat({kUploadMedata, kUploadMetadataContentType}),
+        init_done.cb());
     EXPECT_THAT(init_done.result().status(),
                 AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
                       Property(&Status::error_message,
@@ -438,12 +493,15 @@
     test::TestEvent<
         StatusOr<std::pair<int64_t /*total*/, std::string /*session_token*/>>>
         init_done;
-    delegate->DoInitiate(origin_path(), GetServerURL(kResumableUrl).spec(),
-                         init_done.cb());
+    delegate->DoInitiate(
+        origin_path(),
+        /*upload_parameters=*/
+        base::StrCat({kUploadMedata, kUploadMetadataContentType}),
+        init_done.cb());
     EXPECT_THAT(init_done.result().status(),
                 AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
                       Property(&Status::error_message,
-                               StrEq("Unexpected upload granularity="))));
+                               StrEq("No granularity returned"))));
   }
   {
     // Prepare access token.
@@ -452,8 +510,11 @@
     test::TestEvent<
         StatusOr<std::pair<int64_t /*total*/, std::string /*session_token*/>>>
         init_done;
-    delegate->DoInitiate(origin_path(), GetServerURL(kResumableUrl).spec(),
-                         init_done.cb());
+    delegate->DoInitiate(
+        origin_path(),
+        /*upload_parameters=*/
+        base::StrCat({kUploadMedata, kUploadMetadataContentType}),
+        init_done.cb());
     EXPECT_THAT(init_done.result().status(),
                 AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
                       Property(&Status::error_message,
@@ -466,8 +527,11 @@
     test::TestEvent<
         StatusOr<std::pair<int64_t /*total*/, std::string /*session_token*/>>>
         init_done;
-    delegate->DoInitiate(origin_path(), GetServerURL(kResumableUrl).spec(),
-                         init_done.cb());
+    delegate->DoInitiate(
+        origin_path(),
+        /*upload_parameters=*/
+        base::StrCat({kUploadMedata, kUploadMetadataContentType}),
+        init_done.cb());
     EXPECT_THAT(
         init_done.result().status(),
         AllOf(
@@ -483,8 +547,11 @@
     test::TestEvent<
         StatusOr<std::pair<int64_t /*total*/, std::string /*session_token*/>>>
         init_done;
-    delegate->DoInitiate(origin_path(), GetServerURL(kResumableUrl).spec(),
-                         init_done.cb());
+    delegate->DoInitiate(
+        origin_path(),
+        /*upload_parameters=*/
+        base::StrCat({kUploadMedata, kUploadMetadataContentType}),
+        init_done.cb());
     EXPECT_THAT(
         init_done.result().status(),
         AllOf(
@@ -501,22 +568,23 @@
   std::unique_ptr<FileUploadJob::Delegate> delegate =
       PrepareFileUploadDelegate();
 
-  // Set up responses: query at offset=2*granularity, and make one upload.
+  // Set up responses: query at offset = kMaxUploadBufferSize, and make one
+  // upload.
   EXPECT_CALL(mock_request_call_, Call(_, _))
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectQuery(request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "active");
-        response->AddCustomHeader("X-Goog-Upload-Chunk-Granularity",
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
                                   base::NumberToString(kDataGranularity));
-        response->AddCustomHeader("X-Goog-Upload-Size-Received",
+        response->AddCustomHeader(kUploadSizeReceivedHeader,
                                   base::NumberToString(kMaxUploadBufferSize));
         response->set_code(::net::HTTP_OK);
       }))
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectStep(kMaxUploadBufferSize, request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "active");
+        response->AddCustomHeader(kUploadStatusHeader, "active");
         response->set_code(::net::HTTP_OK);
       }));
 
@@ -525,8 +593,9 @@
       step_done;
   delegate->DoNextStep(
       kTestDataSize, kMaxUploadBufferSize,
+      /*session_token=*/
       base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
-      step_done.cb());
+      ScopedReservation(0uL, memory_resource_), step_done.cb());
   const auto& result = step_done.result();
   ASSERT_OK(result) << result.status();
   ASSERT_THAT(
@@ -542,23 +611,24 @@
   std::unique_ptr<FileUploadJob::Delegate> delegate =
       PrepareFileUploadDelegate();
 
-  // Set up responses: query at offset=2*granularity, and make one upload.
+  // Set up responses: query at offset = (kTestDataSize - kMaxUploadBufferSize),
+  // and make one upload.
   EXPECT_CALL(mock_request_call_, Call(_, _))
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectQuery(request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "active");
-        response->AddCustomHeader("X-Goog-Upload-Chunk-Granularity",
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
                                   base::NumberToString(kDataGranularity));
         response->AddCustomHeader(
-            "X-Goog-Upload-Size-Received",
+            kUploadSizeReceivedHeader,
             base::NumberToString(kTestDataSize - kMaxUploadBufferSize));
         response->set_code(::net::HTTP_OK);
       }))
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectStep(kTestDataSize - kMaxUploadBufferSize, request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "final");
+        response->AddCustomHeader(kUploadStatusHeader, "final");
         response->set_code(::net::HTTP_OK);
       }));
 
@@ -567,8 +637,9 @@
       step_done;
   delegate->DoNextStep(
       kTestDataSize, kTestDataSize - kMaxUploadBufferSize,
+      /*session_token=*/
       base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
-      step_done.cb());
+      ScopedReservation(0uL, memory_resource_), step_done.cb());
   const auto& result = step_done.result();
   ASSERT_OK(result) << result.status();
   ASSERT_THAT(result.ValueOrDie().first,
@@ -578,7 +649,205 @@
                   {origin_path(), "\n", GetServerURL(kResumableUrl).spec()})));
 }
 
-// TODO(b/264399295): Add failure tests.
+TEST_F(FileUploadDelegateTest, UploadStepOutOfMemory) {
+  // Prepare the delegate.
+  std::unique_ptr<FileUploadJob::Delegate> delegate =
+      PrepareFileUploadDelegate();
+
+  // Set up responses: query at offset = (kTestDataSize - kMaxUploadBufferSize).
+  EXPECT_CALL(mock_request_call_, Call(_, _))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
+                                  base::NumberToString(kDataGranularity));
+        response->AddCustomHeader(
+            kUploadSizeReceivedHeader,
+            base::NumberToString(kTestDataSize - kMaxUploadBufferSize));
+        response->set_code(::net::HTTP_OK);
+      }));
+
+  test::TestEvent<
+      StatusOr<std::pair<int64_t /*uploaded*/, std::string /*session_token*/>>>
+      step_done;
+  ScopedReservation scoped_reservation(memory_resource_->GetTotal(),
+                                       memory_resource_);
+  ASSERT_TRUE(scoped_reservation.reserved());
+  delegate->DoNextStep(
+      kTestDataSize, kTestDataSize - kMaxUploadBufferSize,
+      /*session_token=*/
+      base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+      std::move(scoped_reservation), step_done.cb());
+  const auto& result = step_done.result();
+  ASSERT_OK(result) << result.status();
+  ASSERT_THAT(result.ValueOrDie().first,
+              Eq(static_cast<int64_t>(kTestDataSize - kMaxUploadBufferSize)));
+  ASSERT_THAT(result.ValueOrDie().second,
+              StrEq(base::StrCat(
+                  {origin_path(), "\n", GetServerURL(kResumableUrl).spec()})));
+}
+
+TEST_F(FileUploadDelegateTest, UploadStepFailures) {
+  // Prepare the delegate.
+  std::unique_ptr<FileUploadJob::Delegate> delegate =
+      PrepareFileUploadDelegate();
+
+  // Set up responses: query at offset = (kTestDataSize - kMaxUploadBufferSize).
+  EXPECT_CALL(mock_request_call_, Call(_, _))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "unknown");
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
+                                  base::NumberToString(kDataGranularity));
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(
+            kUploadSizeReceivedHeader,
+            base::NumberToString(kTestDataSize - kMaxUploadBufferSize));
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
+                                  base::NumberToString(kDataGranularity));
+        response->AddCustomHeader(kUploadSizeReceivedHeader, "12345Z");
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader, "12345Z");
+        response->AddCustomHeader(
+            kUploadSizeReceivedHeader,
+            base::NumberToString(kTestDataSize - kMaxUploadBufferSize));
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
+                                  base::NumberToString(kDataGranularity));
+        response->AddCustomHeader(kUploadSizeReceivedHeader,
+                                  base::NumberToString(kMaxUploadBufferSize));
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectStep(kMaxUploadBufferSize, request);
+        response->AddCustomHeader(kUploadStatusHeader, "unknown");
+        response->set_code(::net::HTTP_OK);
+      }));
+
+  {
+    test::TestEvent<StatusOr<
+        std::pair<int64_t /*uploaded*/, std::string /*session_token*/>>>
+        step_done;
+    delegate->DoNextStep(
+        kTestDataSize, kMaxUploadBufferSize,
+        /*session_token=*/
+        base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        ScopedReservation(0uL, memory_resource_), step_done.cb());
+    const auto& result = step_done.result();
+    ASSERT_THAT(result.status(),
+                AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+                      Property(&Status::error_message,
+                               StrEq("Unexpected upload status=unknown"))));
+  }
+  {
+    test::TestEvent<StatusOr<
+        std::pair<int64_t /*uploaded*/, std::string /*session_token*/>>>
+        step_done;
+    delegate->DoNextStep(
+        kTestDataSize, kMaxUploadBufferSize,
+        /*session_token=*/
+        base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        ScopedReservation(0uL, memory_resource_), step_done.cb());
+    const auto& result = step_done.result();
+    ASSERT_THAT(result.status(),
+                AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+                      Property(&Status::error_message,
+                               StrEq("No upload size returned"))));
+  }
+  {
+    test::TestEvent<StatusOr<
+        std::pair<int64_t /*uploaded*/, std::string /*session_token*/>>>
+        step_done;
+    delegate->DoNextStep(
+        kTestDataSize, kMaxUploadBufferSize,
+        /*session_token=*/
+        base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        ScopedReservation(0uL, memory_resource_), step_done.cb());
+    const auto& result = step_done.result();
+    ASSERT_THAT(result.status(),
+                AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+                      Property(&Status::error_message,
+                               StrEq("No granularity returned"))));
+  }
+  {
+    test::TestEvent<StatusOr<
+        std::pair<int64_t /*uploaded*/, std::string /*session_token*/>>>
+        step_done;
+    delegate->DoNextStep(
+        kTestDataSize, kMaxUploadBufferSize,
+        /*session_token=*/
+        base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        ScopedReservation(0uL, memory_resource_), step_done.cb());
+    const auto& result = step_done.result();
+    ASSERT_THAT(
+        result.status(),
+        AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+              Property(&Status::error_message,
+                       StrEq(base::StrCat(
+                           {"Unexpected received=12345Z, expected=",
+                            base::NumberToString(kMaxUploadBufferSize)})))));
+  }
+  {
+    test::TestEvent<StatusOr<
+        std::pair<int64_t /*uploaded*/, std::string /*session_token*/>>>
+        step_done;
+    delegate->DoNextStep(
+        kTestDataSize, kMaxUploadBufferSize,
+        /*session_token=*/
+        base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        ScopedReservation(0uL, memory_resource_), step_done.cb());
+    const auto& result = step_done.result();
+    ASSERT_THAT(result.status(),
+                AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+                      Property(&Status::error_message,
+                               StrEq("Unexpected granularity=12345Z"))));
+  }
+  {
+    test::TestEvent<StatusOr<
+        std::pair<int64_t /*uploaded*/, std::string /*session_token*/>>>
+        step_done;
+    delegate->DoNextStep(
+        kTestDataSize, kMaxUploadBufferSize,
+        /*session_token=*/
+        base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        ScopedReservation(0uL, memory_resource_), step_done.cb());
+    const auto& result = step_done.result();
+    ASSERT_THAT(result.status(),
+                AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+                      Property(&Status::error_message,
+                               StrEq("Unexpected upload status=unknown"))));
+  }
+}
 
 TEST_F(FileUploadDelegateTest, SuccessfulUploadFinish) {
   // Prepare the delegate.
@@ -590,26 +859,27 @@
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectQuery(request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "active");
-        response->AddCustomHeader("X-Goog-Upload-Chunk-Granularity",
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadChunkGranularityHeader,
                                   base::NumberToString(kDataGranularity));
-        response->AddCustomHeader("X-Goog-Upload-Size-Received",
+        response->AddCustomHeader(kUploadSizeReceivedHeader,
                                   base::NumberToString(kTestDataSize));
         response->set_code(::net::HTTP_OK);
       }))
       .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
                               ::net::test_server::BasicHttpResponse* response) {
         ExpectFinish(request);
-        response->AddCustomHeader("X-Goog-Upload-Status", "final");
-        response->AddCustomHeader("X-Goog-Upload-Size-Received",
+        response->AddCustomHeader(kUploadStatusHeader, "final");
+        response->AddCustomHeader(kUploadSizeReceivedHeader,
                                   base::NumberToString(kTestDataSize));
-        response->AddCustomHeader("X-GUploader-UploadID", kUploadId);
+        response->AddCustomHeader(kUploadIdHeader, kUploadId);
         response->set_code(::net::HTTP_OK);
       }));
 
   test::TestEvent<StatusOr<std::string /*access_parameters*/>> finish_done;
   delegate->DoFinalize(
-      base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+      /*session_token=*/base::StrCat(
+          {origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
       finish_done.cb());
   const auto& result = finish_done.result();
   ASSERT_OK(result) << result.status();
@@ -619,5 +889,120 @@
   EnsureOriginFileIsErased();
 }
 
-// TODO(b/264399295): Add failure tests.
+TEST_F(FileUploadDelegateTest, FinishFailures) {
+  // Prepare the delegate.
+  std::unique_ptr<FileUploadJob::Delegate> delegate =
+      PrepareFileUploadDelegate();
+
+  // Set up responses: query at offset=total, and finalize.
+  EXPECT_CALL(mock_request_call_, Call(_, _))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "unknown");
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadSizeReceivedHeader, "12345Z");
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadSizeReceivedHeader,
+                                  base::NumberToString(kTestDataSize));
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectFinish(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectQuery(request);
+        response->AddCustomHeader(kUploadStatusHeader, "active");
+        response->AddCustomHeader(kUploadSizeReceivedHeader,
+                                  base::NumberToString(kTestDataSize));
+        response->set_code(::net::HTTP_OK);
+      }))
+      .WillOnce(Invoke([this](const ::net::test_server::HttpRequest& request,
+                              ::net::test_server::BasicHttpResponse* response) {
+        ExpectFinish(request);
+        response->AddCustomHeader(kUploadStatusHeader, "final");
+        response->set_code(::net::HTTP_OK);
+      }));
+
+  {
+    test::TestEvent<StatusOr<std::string /*access_parameters*/>> finish_done;
+    delegate->DoFinalize(
+        /*session_token=*/base::StrCat(
+            {origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        finish_done.cb());
+    const auto& result = finish_done.result();
+    ASSERT_THAT(result.status(),
+                AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+                      Property(&Status::error_message,
+                               "Unexpected upload status=unknown")));
+  }
+  {
+    test::TestEvent<StatusOr<std::string /*access_parameters*/>> finish_done;
+    delegate->DoFinalize(
+        /*session_token=*/
+        base::StrCat({origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        finish_done.cb());
+    const auto& result = finish_done.result();
+    ASSERT_THAT(
+        result.status(),
+        AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+              Property(&Status::error_message, "No upload size returned")));
+  }
+  {
+    test::TestEvent<StatusOr<std::string /*access_parameters*/>> finish_done;
+    delegate->DoFinalize(
+        /*session_token=*/base::StrCat(
+            {origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        finish_done.cb());
+    const auto& result = finish_done.result();
+    ASSERT_THAT(
+        result.status(),
+        AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+              Property(&Status::error_message, "Unexpected received=12345Z")));
+  }
+  {
+    test::TestEvent<StatusOr<std::string /*access_parameters*/>> finish_done;
+    delegate->DoFinalize(
+        /*session_token=*/base::StrCat(
+            {origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        finish_done.cb());
+    const auto& result = finish_done.result();
+    ASSERT_THAT(result.status(),
+                AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+                      Property(&Status::error_message,
+                               "Unexpected upload status=active")));
+  }
+  {
+    test::TestEvent<StatusOr<std::string /*access_parameters*/>> finish_done;
+    delegate->DoFinalize(
+        /*session_token=*/base::StrCat(
+            {origin_path(), "\n", GetServerURL(kResumableUrl).spec()}),
+        finish_done.cb());
+    const auto& result = finish_done.result();
+    ASSERT_THAT(
+        result.status(),
+        AllOf(Property(&Status::error_code, Eq(error::DATA_LOSS)),
+              Property(&Status::error_message, "No upload ID returned")));
+  }
+}
 }  // namespace reporting
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_job.cc b/chrome/browser/policy/messaging_layer/upload/file_upload_job.cc
index bd6140d3..d91e4d13 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_job.cc
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_job.cc
@@ -29,6 +29,7 @@
 #include "components/reporting/proto/synced/record.pb.h"
 #include "components/reporting/proto/synced/record_constants.pb.h"
 #include "components/reporting/proto/synced/upload_tracker.pb.h"
+#include "components/reporting/resources/resource_manager.h"
 #include "components/reporting/storage/storage_module_interface.h"
 #include "components/reporting/util/status.h"
 
@@ -162,10 +163,9 @@
   }
 }
 
-// FileUploadJob progresses based on the last recorded state.
-// Called back once the job is located or created.
-// `done_cb_` is going to post update as the next tracking event.
-void FileUploadJob::EventHelper::Run(base::OnceCallback<void(Status)> done_cb) {
+void FileUploadJob::EventHelper::Run(
+    const ScopedReservation& scoped_reservation,
+    base::OnceCallback<void(Status)> done_cb) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!done_cb_) << "Helper already running";
   done_cb_ = std::move(done_cb);
@@ -214,7 +214,8 @@
   if (job_->tracker().uploaded() < job_->tracker().total()) {
     // Job in progress, perform next step. Upon completion success post new
     // event and upload the current one.
-    job_->NextStep(base::BindOnce(&EventHelper::RepostAndComplete,
+    job_->NextStep(scoped_reservation,
+                   base::BindOnce(&EventHelper::RepostAndComplete,
                                   weak_ptr_factory_.GetWeakPtr()));
     return;
   }
@@ -335,7 +336,8 @@
   tracker_.set_session_token(session_token.data(), session_token.size());
 }
 
-void FileUploadJob::NextStep(base::OnceClosure done_cb) {
+void FileUploadJob::NextStep(const ScopedReservation& scoped_reservation,
+                             base::OnceClosure done_cb) {
   base::ScopedClosureRunner done(std::move(done_cb));
   DCHECK_CALLED_ON_VALID_SEQUENCE(job_sequence_checker_);
   DCHECK(event_helper_) << "Event must be associated with the job";
@@ -367,6 +369,7 @@
       base::BindOnce(&Delegate::DoNextStep, base::Unretained(delegate_),
                      tracker_.total(), tracker_.uploaded(),
                      tracker_.session_token(),
+                     ScopedReservation(0uL, scoped_reservation),
                      base::BindPostTaskToCurrentDefault(base::BindOnce(
                          &FileUploadJob::DoneNextStep,
                          weak_ptr_factory_.GetWeakPtr(), std::move(done)))));
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_job.h b/chrome/browser/policy/messaging_layer/upload/file_upload_job.h
index e016cfb..f8ef1a2 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_job.h
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_job.h
@@ -26,6 +26,7 @@
 #include "components/reporting/proto/synced/record.pb.h"
 #include "components/reporting/proto/synced/record_constants.pb.h"
 #include "components/reporting/proto/synced/upload_tracker.pb.h"
+#include "components/reporting/resources/resource_manager.h"
 #include "components/reporting/util/status.h"
 #include "components/reporting/util/statusor.h"
 
@@ -58,12 +59,14 @@
                                     std::string /*session_token*/>>)> cb) = 0;
 
     // Asynchronously uploads the next chunk.
+    // Uses `scoped_reservation` to manage memory usage by data buffer.
     // Calls back with new `uploaded` and `session_token` (could be the same),
     // or Status in case of an error.
     virtual void DoNextStep(
         int64_t total,
         int64_t uploaded,
         base::StringPiece session_token,
+        ScopedReservation scoped_reservation,
         base::OnceCallback<
             void(StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) = 0;
@@ -71,7 +74,7 @@
     // Asynchronously finalizes upload (once `uploaded` reached `total`).
     // Calls back with `access_parameters`, or Status in case of error.
     virtual void DoFinalize(
-        base::StringPiece access_parameters,
+        base::StringPiece session_token,
         base::OnceCallback<void(StatusOr<std::string /*access_parameters*/>)>
             cb) = 0;
 
@@ -140,9 +143,11 @@
     ~EventHelper();
 
     // FileUploadJob progresses based on the last recorded state.
-    // Called back once the job is located or created.
+    // Called once the job is located or created.
+    // Uses `scoped_reservation` to manage memory usage by data buffer.
     // `done_cb_` is going to post update as the next tracking event.
-    void Run(base::OnceCallback<void(Status)> done_cb);
+    void Run(const ScopedReservation& scoped_reservation,
+             base::OnceCallback<void(Status)> done_cb);
 
    private:
     // Complete and call `done_cb_` (with OK, if the event is accepted for
@@ -177,7 +182,8 @@
   // including `session_token` that must be set and identifies the external
   // access on the next steps.
   // Then the Job proceeds with one or more calls to `NextStep`: after every
-  // step `tracker_` is updated. Note that `session_token` might change if it
+  // step `tracker_` is updated and `scoped_reservation` is used to manage
+  // memory usage by data buffer. Note that `session_token` might change if it
   // is necessary to track the progress externally.
   // After the Job finished uploading, it calls `Finalize`, setting up
   // `access_parameters` or error status in `tracker_`.
@@ -189,7 +195,8 @@
   // possible (but not necessary) to provide `done_cb` callback to be called
   // once finished - this option is mostly used for testing.
   void Initiate(base::OnceClosure done_cb = base::DoNothing());
-  void NextStep(base::OnceClosure done_cb = base::DoNothing());
+  void NextStep(const ScopedReservation& scoped_reservation,
+                base::OnceClosure done_cb = base::DoNothing());
   void Finalize(base::OnceClosure done_cb = base::DoNothing());
 
   // Test-only explicit setter of the event helper.
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_job_unittest.cc b/chrome/browser/policy/messaging_layer/upload/file_upload_job_unittest.cc
index b31f027e..2cb6e3b3 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_job_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_job_unittest.cc
@@ -53,6 +53,7 @@
               (int64_t total,
                int64_t uploaded,
                base::StringPiece session_token,
+               ScopedReservation scoped_reservation,
                base::OnceCallback<void(
                    StatusOr<std::pair<int64_t /*uploaded*/,
                                       std::string /*session_token*/>>)> cb),
@@ -69,19 +70,31 @@
 
 class FileUploadJobTest : public ::testing::Test {
  protected:
-  template <typename Method>
-  void RunAsyncJobAndWait(FileUploadJob& job, Method method) {
+  template <typename Method, class... Args>
+  void RunAsyncJobAndWait(FileUploadJob& job, Method method, Args&&... args) {
     test::TestCallbackAutoWaiter waiter;
-    (job.*method)(base::BindOnce(&test::TestCallbackAutoWaiter::Signal,
+    (job.*method)(std::forward<Args>(args)...,
+                  base::BindOnce(&test::TestCallbackAutoWaiter::Signal,
                                  base::Unretained(&waiter)));
   }
 
+  void SetUp() override {
+    memory_resource_ =
+        base::MakeRefCounted<ResourceManager>(4u * 1024LLu * 1024LLu);  // 4 MiB
+  }
+
+  void TearDown() override {
+    EXPECT_THAT(memory_resource_->GetUsed(), Eq(0uL));
+  }
+
   base::test::TaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
 
   FileUploadJob::TestEnvironment manager_test_env_;
 
   MockFileUploadJobDelegate mock_delegate_;
+
+  scoped_refptr<ResourceManager> memory_resource_;
 };
 
 TEST_F(FileUploadJobTest, SuccessfulRun) {
@@ -112,10 +125,11 @@
   ASSERT_FALSE(job->tracker().has_status());
   EXPECT_THAT(job->settings().retry_count(), Eq(0));
 
-  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _))
+  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _, _))
       .Times(3)
       .WillRepeatedly(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
@@ -123,8 +137,9 @@
             std::move(cb).Run(
                 std::make_pair(uploaded + 100L, std::string(session_token)));
           });
+  ScopedReservation scoped_reservation(0uL, memory_resource_);
   for (size_t i = 0u; i < 3u; ++i) {
-    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep);
+    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
     ASSERT_FALSE(job->tracker().has_status());
   }
 
@@ -253,9 +268,10 @@
   ASSERT_FALSE(job->tracker().has_status());
   EXPECT_THAT(job->settings().retry_count(), Eq(0));
 
-  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _))
+  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _, _))
       .WillOnce(Invoke(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
@@ -265,14 +281,16 @@
           }))
       .WillOnce(Invoke(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
             EXPECT_THAT(uploaded, AllOf(Ge(0L), Lt(total)));
             std::move(cb).Run(Status(error::CANCELLED, "Declined in test"));
           }));
+  ScopedReservation scoped_reservation(0uL, memory_resource_);
   for (size_t i = 0u; i < 3u; ++i) {
-    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep);
+    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
   }
   ASSERT_TRUE(job->tracker().has_status());
   EXPECT_THAT(
@@ -309,10 +327,11 @@
   ASSERT_FALSE(job->tracker().has_status());
   EXPECT_THAT(job->settings().retry_count(), Eq(0));
 
-  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _))
+  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _, _))
       .Times(3)
       .WillRepeatedly(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
@@ -320,8 +339,9 @@
             std::move(cb).Run(
                 std::make_pair(uploaded + 100L, std::string(session_token)));
           });
+  ScopedReservation scoped_reservation(0uL, memory_resource_);
   for (size_t i = 0u; i < 3u; ++i) {
-    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep);
+    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
     ASSERT_FALSE(job->tracker().has_status());
   }
 
@@ -368,10 +388,11 @@
   ASSERT_FALSE(job->tracker().has_status());
   EXPECT_THAT(job->settings().retry_count(), Eq(0));
 
-  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _))
+  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _, _))
       .Times(3)
       .WillRepeatedly(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
@@ -379,8 +400,9 @@
             std::move(cb).Run(std::make_pair(uploaded + 100L - 1L,
                                              std::string(session_token)));
           });
+  ScopedReservation scoped_reservation(0uL, memory_resource_);
   for (size_t i = 0u; i < 3u; ++i) {
-    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep);
+    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
     ASSERT_FALSE(job->tracker().has_status());
   }
 
@@ -421,9 +443,10 @@
   ASSERT_FALSE(job->tracker().has_status());
   EXPECT_THAT(job->settings().retry_count(), Eq(0));
 
-  EXPECT_CALL(mock_delegate_, DoNextStep(300L, _, StrEq("ABC"), _))
+  EXPECT_CALL(mock_delegate_, DoNextStep(300L, _, StrEq("ABC"), _, _))
       .WillOnce(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
@@ -431,9 +454,10 @@
             std::move(cb).Run(
                 std::make_pair(uploaded + 500L, std::string(session_token)));
           });
-  RunAsyncJobAndWait(*job, &FileUploadJob::NextStep);
+  ScopedReservation scoped_reservation(0uL, memory_resource_);
+  RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
   ASSERT_FALSE(job->tracker().has_status());
-  RunAsyncJobAndWait(*job, &FileUploadJob::NextStep);
+  RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
   ASSERT_TRUE(job->tracker().has_status());
   EXPECT_THAT(job->tracker().status(),
               AllOf(Property(&StatusProto::code, Eq(error::OUT_OF_RANGE)),
@@ -469,9 +493,10 @@
   ASSERT_FALSE(job->tracker().has_status());
   EXPECT_THAT(job->settings().retry_count(), Eq(0));
 
-  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _))
+  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _, _))
       .WillOnce(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
@@ -481,15 +506,17 @@
           })
       .WillOnce(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
             std::move(cb).Run(
                 std::make_pair(uploaded - 1L, std::string(session_token)));
           });
-  RunAsyncJobAndWait(*job, &FileUploadJob::NextStep);
+  ScopedReservation scoped_reservation(0uL, memory_resource_);
+  RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
   ASSERT_FALSE(job->tracker().has_status());
-  RunAsyncJobAndWait(*job, &FileUploadJob::NextStep);
+  RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
   ASSERT_TRUE(job->tracker().has_status());
   EXPECT_THAT(job->tracker().status(),
               AllOf(Property(&StatusProto::code, Eq(error::DATA_LOSS)),
@@ -517,10 +544,11 @@
       job->GetWeakPtr(), Priority::IMMEDIATE, std::move(record_copy),
       std::move(log_upload_event)));
   EXPECT_CALL(mock_delegate_, DoInitiate).Times(0);
-  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _))
+  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _, _))
       .Times(2)
       .WillRepeatedly(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
@@ -528,8 +556,9 @@
             std::move(cb).Run(
                 std::make_pair(uploaded + 100L, std::string(session_token)));
           });
+  ScopedReservation scoped_reservation(0uL, memory_resource_);
   for (size_t i = 0u; i < 2u; ++i) {
-    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep);
+    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
     ASSERT_FALSE(job->tracker().has_status());
   }
 
@@ -567,7 +596,8 @@
   EXPECT_CALL(mock_delegate_, DoInitiate).Times(0);
   EXPECT_CALL(mock_delegate_, DoNextStep).Times(0);
   EXPECT_CALL(mock_delegate_, DoFinalize).Times(0);
-  RunAsyncJobAndWait(*job, &FileUploadJob::NextStep);
+  ScopedReservation scoped_reservation(0uL, memory_resource_);
+  RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
   ASSERT_TRUE(job->tracker().has_status());
   EXPECT_THAT(
       job->tracker().status(),
@@ -702,10 +732,11 @@
     // In production code we would probably also compare `uploaded` to the one
     // specified in the log_upload_event, and only proceed if they match, but in
     // the test we can do differently.
-    EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _))
+    EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _, _))
         .Times(Between(1, 3))
         .WillRepeatedly(
             [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+               ScopedReservation scoped_reservation,
                base::OnceCallback<void(
                    StatusOr<std::pair<int64_t /*uploaded*/,
                                       std::string /*session_token*/>>)> cb) {
@@ -737,6 +768,7 @@
           base::BindOnce(
               [](base::ScopedClosureRunner done,
                  std::vector<base::WeakPtr<FileUploadJob>>* jobs_weak_ptrs,
+                 scoped_refptr<ResourceManager> memory_resource,
                  std::atomic<size_t>* failures,
                  StatusOr<FileUploadJob*> job_or_error) {
                 if (!job_or_error.ok()) {
@@ -750,10 +782,11 @@
                 EXPECT_OK(job_or_error) << job_or_error.status();
                 auto* const job = job_or_error.ValueOrDie();
                 jobs_weak_ptrs->push_back(job->GetWeakPtr());
-                job->NextStep(done.Release());
+                ScopedReservation scoped_reservation(0uL, memory_resource);
+                job->NextStep(scoped_reservation, done.Release());
               },
               std::move(done), base::Unretained(&jobs_weak_ptrs),
-              base::Unretained(&failures)));
+              memory_resource_, base::Unretained(&failures)));
     }
   }
   EXPECT_THAT(failures.load(), Eq(kJobsCount - 1));
@@ -898,10 +931,11 @@
   }
 
   // Make 3 steps.
-  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _))
+  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _, _))
       .Times(3)
       .WillRepeatedly(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
@@ -919,6 +953,7 @@
     FileUploadJob::Manager::GetInstance()->sequenced_task_runner()->PostTask(
         FROM_HERE,
         base::BindOnce(&FileUploadJob::NextStep, job_weak_ptr,
+                       ScopedReservation(0uL, memory_resource_),
                        base::BindOnce(&test::TestCallbackAutoWaiter::Signal,
                                       base::Unretained(&waiter))));
   }
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc
index 6265943..937fe52a 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc
+++ b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc
@@ -81,6 +81,7 @@
 void ProcessFileUpload(FileUploadJob::Delegate* delegate,
                        Priority priority,
                        Record record_copy,
+                       const ScopedReservation& scoped_reservation,
                        base::OnceCallback<void(Status)> done_cb) {
   // Here we need to determine which events we got. It would be better to
   // use protobuf reflection and detect upload_settings presence in the event,
@@ -115,7 +116,8 @@
           priority, std::move(record_copy), std::move(log_upload_event),
           delegate,
           base::BindOnce(
-              [](base::OnceCallback<void(Status)> done_cb,
+              [](ScopedReservation scoped_reservation,
+                 base::OnceCallback<void(Status)> done_cb,
                  StatusOr<FileUploadJob*> job_or_error) {
                 if (!job_or_error.ok()) {
                   LOG(WARNING) << "Failed to locate/create upload job, status="
@@ -126,9 +128,9 @@
                 }
                 // Job has been located or created.
                 job_or_error.ValueOrDie()->event_helper()->Run(
-                    std::move(done_cb));
+                    scoped_reservation, std::move(done_cb));
               },
-              std::move(done_cb)));
+              ScopedReservation(0uL, scoped_reservation), std::move(done_cb)));
       break;
     }
     default:
@@ -293,7 +295,9 @@
     base::ThreadPool::PostTask(
         FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()},
         base::BindOnce(&ProcessFileUpload, base::Unretained(delegate_.get()),
-                       priority, std::move(record_copy), std::move(resume_cb)));
+                       priority, std::move(record_copy),
+                       ScopedReservation(0uL, scoped_reservation_),
+                       std::move(resume_cb)));
     return;  // We will resume on `resume_cb`
   }
 
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc
index 07c95f48..e6234d4 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc
@@ -88,6 +88,7 @@
               (int64_t total,
                int64_t uploaded,
                base::StringPiece session_token,
+               ScopedReservation scoped_reservation,
                base::OnceCallback<void(
                    StatusOr<std::pair<int64_t /*uploaded*/,
                                       std::string /*session_token*/>>)> cb),
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc
index 6f7a976..49293653 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc
@@ -100,6 +100,7 @@
               (int64_t total,
                int64_t uploaded,
                base::StringPiece session_token,
+               ScopedReservation scoped_reservation,
                base::OnceCallback<void(
                    StatusOr<std::pair<int64_t /*uploaded*/,
                                       std::string /*session_token*/>>)> cb),
@@ -338,9 +339,10 @@
   test::TestEvent<CompletionResponse> responder_event;
 
   EXPECT_CALL(*delegate_, DoInitiate).Times(0);
-  EXPECT_CALL(*delegate_, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _))
+  EXPECT_CALL(*delegate_, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _, _))
       .WillOnce(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
@@ -470,9 +472,10 @@
   test::TestEvent<CompletionResponse> responder_event;
 
   EXPECT_CALL(*delegate_, DoInitiate).Times(0);
-  EXPECT_CALL(*delegate_, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _))
+  EXPECT_CALL(*delegate_, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _, _))
       .WillOnce(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
@@ -577,9 +580,10 @@
           std::move(ResponseBuilder().SetSuccess(true))));
 
   EXPECT_CALL(*delegate_, DoInitiate).Times(0);
-  EXPECT_CALL(*delegate_, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _))
+  EXPECT_CALL(*delegate_, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _, _))
       .WillOnce(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
              base::OnceCallback<void(
                  StatusOr<std::pair<int64_t /*uploaded*/,
                                     std::string /*session_token*/>>)> cb) {
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
index b5ff19b..b9b91d9a 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -597,6 +597,16 @@
     public static final KeyPrefix OPTIMIZATION_GUIDE_PUSH_NOTIFICATION_CACHE =
             new KeyPrefix("Chrome.OptimizationGuide.PushNotificationCache.*");
 
+    /** The gaia email address Password Protection should protect. */
+    public static final String PASSWORD_PROTECTION_ACCOUNT = "Chrome.PasswordProtection.Account";
+
+    /** The hashed password associated with PASSWORD_PROTECTION_ACCOUNT. */
+    public static final String PASSWORD_PROTECTION_HASHED_PASSWORD =
+            "Chrome.PasswordProtection.HashedPassword";
+
+    /** The salt used to create PASSWORD_PROTECTION_HASHED_PASSWORD. */
+    public static final String PASSWORD_PROTECTION_SALT = "Chrome.PasswordProtection.Salt";
+
     /** The shared preference for the 'save card to device' checkbox status. */
     public static final String PAYMENTS_CHECK_SAVE_CARD_TO_DEVICE = "check_save_card_to_device";
 
@@ -1091,6 +1101,9 @@
                 OPEN_NEW_TAB_PAGE_COUNT,
                 OPEN_RECENT_TABS_COUNT,
                 OPTIMIZATION_GUIDE_PUSH_NOTIFICATION_CACHE.pattern(),
+                PASSWORD_PROTECTION_ACCOUNT,
+                PASSWORD_PROTECTION_HASHED_PASSWORD,
+                PASSWORD_PROTECTION_SALT,
                 PERSISTENT_OFFLINE_CONTENT_AVAILABILITY_STATUS,
                 PRICE_TRACKING_ANNOTATIONS_ENABLED_METRICS_TIMESTAMP,
                 PRICE_TRACKING_CHROME_MANAGED_NOTIFICATIONS_TIMESTAMPS,
diff --git a/chrome/browser/printing/print_browsertest.cc b/chrome/browser/printing/print_browsertest.cc
index a6e405b..54db7fe 100644
--- a/chrome/browser/printing/print_browsertest.cc
+++ b/chrome/browser/printing/print_browsertest.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/printing/print_browsertest.h"
+
 #include <memory>
 #include <utility>
 #include <vector>
@@ -110,48 +112,11 @@
 using OnDidCreatePrintJobCallback =
     base::RepeatingCallback<void(PrintJob* print_job)>;
 
-#if BUILDFLAG(ENABLE_OOP_PRINTING)
-using OnUseDefaultSettingsCallback = base::RepeatingClosure;
-using OnGetSettingsWithUICallback = base::RepeatingClosure;
-
-using ErrorCheckCallback =
-    base::RepeatingCallback<void(mojom::ResultCode result)>;
-using OnDidUseDefaultSettingsCallback =
-    base::RepeatingCallback<void(mojom::ResultCode result)>;
-#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-using OnDidAskUserForSettingsCallback =
-    base::RepeatingCallback<void(mojom::ResultCode result)>;
-#endif
-using OnDidStartPrintingCallback =
-    base::RepeatingCallback<void(mojom::ResultCode result)>;
-#if BUILDFLAG(IS_WIN)
-using OnDidRenderPrintedPageCallback =
-    base::RepeatingCallback<void(uint32_t page_number,
-                                 mojom::ResultCode result)>;
-#endif
-using OnDidRenderPrintedDocumentCallback =
-    base::RepeatingCallback<void(mojom::ResultCode result)>;
-using OnDidDocumentDoneCallback =
-    base::RepeatingCallback<void(mojom::ResultCode result)>;
-using OnDidCancelCallback = base::RepeatingClosure;
-using OnDidShowErrorDialog = base::RepeatingClosure;
-
-#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
-
 namespace {
 
 constexpr int kTestPrinterCapabilitiesMaxCopies = 99;
 constexpr int kDefaultDocumentCookie = 1234;
 
-#if !BUILDFLAG(IS_CHROMEOS)
-constexpr gfx::Size kPhysicalSize = gfx::Size(612, 792);
-constexpr gfx::Rect kPrintableArea = gfx::Rect(0, 0, 612, 792);
-
-// The default margins are set to 1.0cm in //printing/print_settings.cc, which
-// is about 28 printer units. The resulting content size is 556 x 736.
-constexpr gfx::Size kExpectedContentSize = gfx::Size(556, 736);
-#endif  // !BUILDFLAG(IS_CHROMEOS)
-
 const PrinterSemanticCapsAndDefaults::Paper kTestPaper{
     /*display_name=*/"Letter", /*vendor_id=*/"45",
     /*size_um=*/gfx::Size(215900, 279400),
@@ -161,82 +126,6 @@
 constexpr char kFakeDmToken[] = "fake-dm-token";
 #endif  // BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
 
-class TestPrintRenderFrame
-    : public mojom::PrintRenderFrameInterceptorForTesting {
- public:
-  TestPrintRenderFrame(content::RenderFrameHost* frame_host,
-                       content::WebContents* web_contents,
-                       int document_cookie,
-                       base::RepeatingClosure msg_callback)
-      : frame_host_(frame_host),
-        web_contents_(web_contents),
-        document_cookie_(document_cookie),
-        task_runner_(base::SequencedTaskRunner::GetCurrentDefault()),
-        msg_callback_(msg_callback) {}
-  ~TestPrintRenderFrame() override = default;
-
-  void OnDidPrintFrameContent(int document_cookie,
-                              mojom::DidPrintContentParamsPtr param,
-                              PrintFrameContentCallback callback) const {
-    EXPECT_EQ(document_cookie, document_cookie_);
-    ASSERT_TRUE(param->metafile_data_region.IsValid());
-    EXPECT_GT(param->metafile_data_region.GetSize(), 0U);
-    std::move(callback).Run(document_cookie, std::move(param));
-    task_runner_->PostTask(FROM_HERE, msg_callback_);
-  }
-
-  void Bind(mojo::ScopedInterfaceEndpointHandle handle) {
-    receiver_.Bind(mojo::PendingAssociatedReceiver<mojom::PrintRenderFrame>(
-        std::move(handle)));
-  }
-
-  static mojom::DidPrintContentParamsPtr GetDefaultDidPrintContentParams() {
-    auto printed_frame_params = mojom::DidPrintContentParams::New();
-    // Creates a small amount of region to avoid passing empty data to mojo.
-    constexpr size_t kSize = 10;
-    base::MappedReadOnlyRegion region_mapping =
-        base::ReadOnlySharedMemoryRegion::Create(kSize);
-    printed_frame_params->metafile_data_region =
-        std::move(region_mapping.region);
-    return printed_frame_params;
-  }
-
-  // mojom::PrintRenderFrameInterceptorForTesting
-  mojom::PrintRenderFrame* GetForwardingInterface() override {
-    NOTREACHED();
-    return nullptr;
-  }
-  void PrintFrameContent(mojom::PrintFrameContentParamsPtr params,
-                         PrintFrameContentCallback callback) override {
-    // Sends the printed result back.
-    OnDidPrintFrameContent(params->document_cookie,
-                           GetDefaultDidPrintContentParams(),
-                           std::move(callback));
-
-    auto* client = PrintCompositeClient::FromWebContents(web_contents_);
-    if (!client)
-      return;
-
-    // Prints its children.
-    content::RenderFrameHost* child = ChildFrameAt(frame_host_.get(), 0);
-    for (size_t i = 1; child; i++) {
-      if (child->GetSiteInstance() != frame_host_->GetSiteInstance()) {
-        client->PrintCrossProcessSubframe(gfx::Rect(), params->document_cookie,
-                                          child);
-      }
-      child = ChildFrameAt(frame_host_.get(), i);
-    }
-  }
-
- private:
-  raw_ptr<content::RenderFrameHost> frame_host_;
-  raw_ptr<content::WebContents> web_contents_;
-  const int document_cookie_;
-  scoped_refptr<base::SequencedTaskRunner> task_runner_;
-  base::RepeatingClosure msg_callback_;
-  mojo::AssociatedReceiver<mojom::PrintRenderFrame> receiver_{this};
-};
-
 class KillPrintRenderFrame
     : public mojom::PrintRenderFrameInterceptorForTesting {
  public:
@@ -345,6 +234,83 @@
 
 }  // namespace
 
+class TestPrintRenderFrame
+    : public mojom::PrintRenderFrameInterceptorForTesting {
+ public:
+  TestPrintRenderFrame(content::RenderFrameHost* frame_host,
+                       content::WebContents* web_contents,
+                       int document_cookie,
+                       base::RepeatingClosure msg_callback)
+      : frame_host_(frame_host),
+        web_contents_(web_contents),
+        document_cookie_(document_cookie),
+        task_runner_(base::SequencedTaskRunner::GetCurrentDefault()),
+        msg_callback_(msg_callback) {}
+  ~TestPrintRenderFrame() override = default;
+
+  void OnDidPrintFrameContent(int document_cookie,
+                              mojom::DidPrintContentParamsPtr param,
+                              PrintFrameContentCallback callback) const {
+    EXPECT_EQ(document_cookie, document_cookie_);
+    ASSERT_TRUE(param->metafile_data_region.IsValid());
+    EXPECT_GT(param->metafile_data_region.GetSize(), 0U);
+    std::move(callback).Run(document_cookie, std::move(param));
+    task_runner_->PostTask(FROM_HERE, msg_callback_);
+  }
+
+  void Bind(mojo::ScopedInterfaceEndpointHandle handle) {
+    receiver_.Bind(mojo::PendingAssociatedReceiver<mojom::PrintRenderFrame>(
+        std::move(handle)));
+  }
+
+  static mojom::DidPrintContentParamsPtr GetDefaultDidPrintContentParams() {
+    auto printed_frame_params = mojom::DidPrintContentParams::New();
+    // Creates a small amount of region to avoid passing empty data to mojo.
+    constexpr size_t kSize = 10;
+    base::MappedReadOnlyRegion region_mapping =
+        base::ReadOnlySharedMemoryRegion::Create(kSize);
+    printed_frame_params->metafile_data_region =
+        std::move(region_mapping.region);
+    return printed_frame_params;
+  }
+
+  // mojom::PrintRenderFrameInterceptorForTesting
+  mojom::PrintRenderFrame* GetForwardingInterface() override {
+    NOTREACHED();
+    return nullptr;
+  }
+  void PrintFrameContent(mojom::PrintFrameContentParamsPtr params,
+                         PrintFrameContentCallback callback) override {
+    // Sends the printed result back.
+    OnDidPrintFrameContent(params->document_cookie,
+                           GetDefaultDidPrintContentParams(),
+                           std::move(callback));
+
+    auto* client = PrintCompositeClient::FromWebContents(web_contents_);
+    if (!client) {
+      return;
+    }
+
+    // Prints its children.
+    content::RenderFrameHost* child = ChildFrameAt(frame_host_.get(), 0);
+    for (size_t i = 1; child; i++) {
+      if (child->GetSiteInstance() != frame_host_->GetSiteInstance()) {
+        client->PrintCrossProcessSubframe(gfx::Rect(), params->document_cookie,
+                                          child);
+      }
+      child = ChildFrameAt(frame_host_.get(), i);
+    }
+  }
+
+ private:
+  raw_ptr<content::RenderFrameHost> frame_host_;
+  raw_ptr<content::WebContents> web_contents_;
+  const int document_cookie_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  base::RepeatingClosure msg_callback_;
+  mojo::AssociatedReceiver<mojom::PrintRenderFrame> receiver_{this};
+};
+
 class TestPrintViewManagerForDLP : public TestPrintViewManager {
  public:
   // Used to simulate Data Leak Prevention polices and possible user actions.
@@ -580,207 +546,176 @@
 };
 #endif  // BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
 
-class PrintBrowserTest : public InProcessBrowserTest {
- public:
-  struct PrintParams {
-    bool print_only_selection = false;
-    int pages_per_sheet = 1;
-  };
+PrintBrowserTest::PrintBrowserTest() = default;
+PrintBrowserTest::~PrintBrowserTest() = default;
 
-  PrintBrowserTest() = default;
-  ~PrintBrowserTest() override = default;
+void PrintBrowserTest::SetUp() {
+  test_print_backend_ = base::MakeRefCounted<TestPrintBackend>();
+  PrintBackend::SetPrintBackendForTesting(test_print_backend_.get());
+  PrintingContext::SetPrintingContextFactoryForTest(
+      &test_printing_context_factory_);
 
-  void SetUp() override {
-    test_print_backend_ = base::MakeRefCounted<TestPrintBackend>();
-    PrintBackend::SetPrintBackendForTesting(test_print_backend_.get());
-    PrintingContext::SetPrintingContextFactoryForTest(
-        &test_printing_context_factory_);
+  num_expected_messages_ = 1;  // By default, only wait on one message.
+  num_received_messages_ = 0;
+  InProcessBrowserTest::SetUp();
+}
 
-    num_expected_messages_ = 1;  // By default, only wait on one message.
-    num_received_messages_ = 0;
-    InProcessBrowserTest::SetUp();
-  }
+void PrintBrowserTest::SetUpOnMainThread() {
+  // Safe to use `base::Unretained(this)` since this testing class
+  // necessarily must outlive all interactions from the tests which will
+  // run through the printing stack using derivatives of
+  // `PrintViewManagerBase` and `PrintPreviewHandler`, which can trigger
+  // this callback.
+  SetShowPrintErrorDialogForTest(base::BindRepeating(
+      &PrintBrowserTest::ShowPrintErrorDialog, base::Unretained(this)));
 
-  void SetUpOnMainThread() override {
-    // Safe to use `base::Unretained(this)` since this testing class
-    // necessarily must outlive all interactions from the tests which will
-    // run through the printing stack using derivatives of
-    // `PrintViewManagerBase` and `PrintPreviewHandler`, which can trigger
-    // this callback.
-    SetShowPrintErrorDialogForTest(base::BindRepeating(
-        &PrintBrowserTest::ShowPrintErrorDialog, base::Unretained(this)));
+  host_resolver()->AddRule("*", "127.0.0.1");
+  content::SetupCrossSiteRedirector(embedded_test_server());
+  ASSERT_TRUE(embedded_test_server()->Start());
+}
 
-    host_resolver()->AddRule("*", "127.0.0.1");
-    content::SetupCrossSiteRedirector(embedded_test_server());
-    ASSERT_TRUE(embedded_test_server()->Start());
-  }
+void PrintBrowserTest::TearDownOnMainThread() {
+  // Remove map of objects pointing to //content objects before they go away.
+  frame_content_.clear();
 
-  void TearDownOnMainThread() override {
-    // Remove map of objects pointing to //content objects before they go away.
-    frame_content_.clear();
+  SetShowPrintErrorDialogForTest(base::NullCallback());
+  InProcessBrowserTest::TearDownOnMainThread();
+}
 
-    SetShowPrintErrorDialogForTest(base::NullCallback());
-    InProcessBrowserTest::TearDownOnMainThread();
-  }
+void PrintBrowserTest::TearDown() {
+  InProcessBrowserTest::TearDown();
+  PrintingContext::SetPrintingContextFactoryForTest(/*factory=*/nullptr);
+  PrintBackend::SetPrintBackendForTesting(/*print_backend=*/nullptr);
+}
 
-  void TearDown() override {
-    InProcessBrowserTest::TearDown();
-    PrintingContext::SetPrintingContextFactoryForTest(/*factory=*/nullptr);
-    PrintBackend::SetPrintBackendForTesting(/*print_backend=*/nullptr);
-  }
+void PrintBrowserTest::AddPrinter(const std::string& printer_name) {
+  PrinterBasicInfo printer_info(
+      printer_name,
+      /*display_name=*/"test printer",
+      /*printer_description=*/"A printer for testing.",
+      /*printer_status=*/0,
+      /*is_default=*/true, kTestDummyPrintInfoOptions);
 
-  void AddPrinter(const std::string& printer_name) {
-    PrinterBasicInfo printer_info(
-        printer_name,
-        /*display_name=*/"test printer",
-        /*printer_description=*/"A printer for testing.",
-        /*printer_status=*/0,
-        /*is_default=*/true, kTestDummyPrintInfoOptions);
+  auto default_caps = std::make_unique<PrinterSemanticCapsAndDefaults>();
+  default_caps->copies_max = kTestPrinterCapabilitiesMaxCopies;
+  default_caps->dpis = kTestPrinterCapabilitiesDefaultDpis;
+  default_caps->default_dpi = kTestPrinterCapabilitiesDpi;
+  default_caps->papers.push_back(kTestPaper);
+  test_print_backend_->AddValidPrinter(
+      printer_name, std::move(default_caps),
+      std::make_unique<PrinterBasicInfo>(printer_info));
+}
 
-    auto default_caps = std::make_unique<PrinterSemanticCapsAndDefaults>();
-    default_caps->copies_max = kTestPrinterCapabilitiesMaxCopies;
-    default_caps->dpis = kTestPrinterCapabilitiesDefaultDpis;
-    default_caps->default_dpi = kTestPrinterCapabilitiesDpi;
-    default_caps->papers.push_back(kTestPaper);
-    test_print_backend_->AddValidPrinter(
-        printer_name, std::move(default_caps),
-        std::make_unique<PrinterBasicInfo>(printer_info));
-  }
+void PrintBrowserTest::SetPrinterNameForSubsequentContexts(
+    const std::string& printer_name) {
+  test_printing_context_factory_.SetPrinterNameForSubsequentContexts(
+      printer_name);
+}
 
-  void SetPrinterNameForSubsequentContexts(const std::string& printer_name) {
-    test_printing_context_factory_.SetPrinterNameForSubsequentContexts(
-        printer_name);
-  }
+void PrintBrowserTest::PrintAndWaitUntilPreviewIsReady() {
+  const PrintParams kParams;
+  PrintAndWaitUntilPreviewIsReady(kParams);
+}
 
-  void PrintAndWaitUntilPreviewIsReady() {
-    const PrintParams kParams;
-    PrintAndWaitUntilPreviewIsReady(kParams);
-  }
+void PrintBrowserTest::PrintAndWaitUntilPreviewIsReady(
+    const PrintParams& params) {
+  TestPrintPreviewObserver print_preview_observer(/*wait_for_loaded=*/false,
+                                                  params.pages_per_sheet);
 
-  void PrintAndWaitUntilPreviewIsReady(const PrintParams& params) {
-    TestPrintPreviewObserver print_preview_observer(/*wait_for_loaded=*/false,
-                                                    params.pages_per_sheet);
+  StartPrint(browser()->tab_strip_model()->GetActiveWebContents(),
+             /*print_renderer=*/mojo::NullAssociatedRemote(),
+             /*print_preview_disabled=*/false, params.print_only_selection);
 
-    StartPrint(browser()->tab_strip_model()->GetActiveWebContents(),
-               /*print_renderer=*/mojo::NullAssociatedRemote(),
-               /*print_preview_disabled=*/false, params.print_only_selection);
+  print_preview_observer.WaitUntilPreviewIsReady();
 
-    print_preview_observer.WaitUntilPreviewIsReady();
+  set_rendered_page_count(print_preview_observer.rendered_page_count());
+}
 
-    set_rendered_page_count(print_preview_observer.rendered_page_count());
-  }
+void PrintBrowserTest::PrintAndWaitUntilPreviewIsReadyAndLoaded() {
+  const PrintParams kParams;
+  PrintAndWaitUntilPreviewIsReadyAndLoaded(kParams);
+}
 
-  void PrintAndWaitUntilPreviewIsReadyAndLoaded() {
-    const PrintParams kParams;
-    PrintAndWaitUntilPreviewIsReadyAndLoaded(kParams);
-  }
+void PrintBrowserTest::PrintAndWaitUntilPreviewIsReadyAndLoaded(
+    const PrintParams& params) {
+  TestPrintPreviewObserver print_preview_observer(/*wait_for_loaded=*/true,
+                                                  params.pages_per_sheet);
 
-  void PrintAndWaitUntilPreviewIsReadyAndLoaded(const PrintParams& params) {
-    TestPrintPreviewObserver print_preview_observer(/*wait_for_loaded=*/true,
-                                                    params.pages_per_sheet);
+  StartPrint(browser()->tab_strip_model()->GetActiveWebContents(),
+             /*print_renderer=*/mojo::NullAssociatedRemote(),
+             /*print_preview_disabled=*/false, params.print_only_selection);
 
-    StartPrint(browser()->tab_strip_model()->GetActiveWebContents(),
-               /*print_renderer=*/mojo::NullAssociatedRemote(),
-               /*print_preview_disabled=*/false, params.print_only_selection);
+  print_preview_observer.WaitUntilPreviewIsReady();
 
-    print_preview_observer.WaitUntilPreviewIsReady();
-
-    set_rendered_page_count(print_preview_observer.rendered_page_count());
-  }
+  set_rendered_page_count(print_preview_observer.rendered_page_count());
+}
 
   // The following are helper functions for having a wait loop in the test and
   // exit when all expected messages are received.
-  void SetNumExpectedMessages(unsigned int num) {
-    num_expected_messages_ = num;
+void PrintBrowserTest::SetNumExpectedMessages(unsigned int num) {
+  num_expected_messages_ = num;
+}
+
+void PrintBrowserTest::WaitUntilCallbackReceived() {
+  base::RunLoop run_loop;
+  quit_callback_ = run_loop.QuitClosure();
+  run_loop.Run();
+}
+
+void PrintBrowserTest::CheckForQuit() {
+  if (++num_received_messages_ != num_expected_messages_) {
+    return;
   }
-
-  void WaitUntilCallbackReceived() {
-    base::RunLoop run_loop;
-    quit_callback_ = run_loop.QuitClosure();
-    run_loop.Run();
+  if (quit_callback_) {
+    std::move(quit_callback_).Run();
   }
+}
 
-  void CheckForQuit() {
-    if (++num_received_messages_ != num_expected_messages_)
-      return;
-    if (quit_callback_)
-      std::move(quit_callback_).Run();
+void PrintBrowserTest::CreateTestPrintRenderFrame(
+    content::RenderFrameHost* frame_host,
+    content::WebContents* web_contents) {
+  frame_content_.emplace(
+      frame_host, std::make_unique<TestPrintRenderFrame>(
+                      frame_host, web_contents, kDefaultDocumentCookie,
+                      base::BindRepeating(&PrintBrowserTest::CheckForQuit,
+                                          base::Unretained(this))));
+  OverrideBinderForTesting(frame_host);
+}
+
+// static
+mojom::PrintFrameContentParamsPtr
+PrintBrowserTest::GetDefaultPrintFrameParams() {
+  return mojom::PrintFrameContentParams::New(gfx::Rect(800, 600),
+                                             kDefaultDocumentCookie);
+}
+
+const mojo::AssociatedRemote<mojom::PrintRenderFrame>&
+PrintBrowserTest::GetPrintRenderFrame(content::RenderFrameHost* rfh) {
+  if (!remote_) {
+    rfh->GetRemoteAssociatedInterfaces()->GetInterface(&remote_);
   }
+  return remote_;
+}
 
-  void CreateTestPrintRenderFrame(content::RenderFrameHost* frame_host,
-                                  content::WebContents* web_contents) {
-    frame_content_.emplace(
-        frame_host, std::make_unique<TestPrintRenderFrame>(
-                        frame_host, web_contents, kDefaultDocumentCookie,
-                        base::BindRepeating(&PrintBrowserTest::CheckForQuit,
-                                            base::Unretained(this))));
-    OverrideBinderForTesting(frame_host);
-  }
+TestPrintRenderFrame* PrintBrowserTest::GetFrameContent(
+    content::RenderFrameHost* host) const {
+  auto iter = frame_content_.find(host);
+  return iter != frame_content_.end() ? iter->second.get() : nullptr;
+}
 
-  static mojom::PrintFrameContentParamsPtr GetDefaultPrintFrameParams() {
-    return mojom::PrintFrameContentParams::New(gfx::Rect(800, 600),
-                                               kDefaultDocumentCookie);
-  }
+void PrintBrowserTest::OverrideBinderForTesting(
+    content::RenderFrameHost* render_frame_host) {
+  render_frame_host->GetRemoteAssociatedInterfaces()->OverrideBinderForTesting(
+      mojom::PrintRenderFrame::Name_,
+      base::BindRepeating(
+          &TestPrintRenderFrame::Bind,
+          base::Unretained(GetFrameContent(render_frame_host))));
+}
 
-  const mojo::AssociatedRemote<mojom::PrintRenderFrame>& GetPrintRenderFrame(
-      content::RenderFrameHost* rfh) {
-    if (!remote_)
-      rfh->GetRemoteAssociatedInterfaces()->GetInterface(&remote_);
-    return remote_;
-  }
-
-  uint32_t rendered_page_count() const { return rendered_page_count_; }
-
-  uint32_t error_dialog_shown_count() const {
-    return error_dialog_shown_count_;
-  }
-
- protected:
-  TestPrintBackend* test_print_backend() { return test_print_backend_.get(); }
-
-  BrowserPrintingContextFactoryForTest* test_printing_context_factory() {
-    return &test_printing_context_factory_;
-  }
-
-  void set_rendered_page_count(uint32_t page_count) {
-    rendered_page_count_ = page_count;
-  }
-
-  const absl::optional<PrintSettings>& document_print_settings() const {
-    return test_printing_context_factory_.document_print_settings();
-  }
-
- private:
-  TestPrintRenderFrame* GetFrameContent(content::RenderFrameHost* host) const {
-    auto iter = frame_content_.find(host);
-    return iter != frame_content_.end() ? iter->second.get() : nullptr;
-  }
-
-  void OverrideBinderForTesting(content::RenderFrameHost* render_frame_host) {
-    render_frame_host->GetRemoteAssociatedInterfaces()
-        ->OverrideBinderForTesting(
-            mojom::PrintRenderFrame::Name_,
-            base::BindRepeating(
-                &TestPrintRenderFrame::Bind,
-                base::Unretained(GetFrameContent(render_frame_host))));
-  }
-
-  void ShowPrintErrorDialog() {
-    ++error_dialog_shown_count_;
-    CheckForQuit();
-  }
-
-  uint32_t error_dialog_shown_count_ = 0;
-  uint32_t rendered_page_count_ = 0;
-  unsigned int num_expected_messages_;
-  unsigned int num_received_messages_;
-  base::OnceClosure quit_callback_;
-  mojo::AssociatedRemote<mojom::PrintRenderFrame> remote_;
-  std::map<content::RenderFrameHost*, std::unique_ptr<TestPrintRenderFrame>>
-      frame_content_;
-  scoped_refptr<TestPrintBackend> test_print_backend_;
-  BrowserPrintingContextFactoryForTest test_printing_context_factory_;
-};
+void PrintBrowserTest::ShowPrintErrorDialog() {
+  ++error_dialog_shown_count_;
+  CheckForQuit();
+}
 
 class SitePerProcessPrintBrowserTest : public PrintBrowserTest {
  public:
@@ -2022,1638 +1957,6 @@
   RunPrintTest("document.execCommand('print');");
 }
 
-// TODO(crbug.com/822505)  ChromeOS uses different testing setup that isn't
-// hooked up to make use of `TestPrintingContext` yet.
-#if !BUILDFLAG(IS_CHROMEOS)
-
-#if BUILDFLAG(ENABLE_OOP_PRINTING)
-class TestPrinterQuery : public PrinterQuery {
- public:
-  // Callbacks to run for overrides.
-  struct PrintCallbacks {
-    OnUseDefaultSettingsCallback did_use_default_settings_callback;
-    OnGetSettingsWithUICallback did_get_settings_with_ui_callback;
-  };
-
-  TestPrinterQuery(content::GlobalRenderFrameHostId rfh_id,
-                   PrintCallbacks* callbacks)
-      : PrinterQuery(rfh_id), callbacks_(callbacks) {}
-
-  void UseDefaultSettings(SettingsCallback callback) override {
-    DVLOG(1) << "Observed: invoke use default settings";
-    PrinterQuery::UseDefaultSettings(std::move(callback));
-    callbacks_->did_use_default_settings_callback.Run();
-  }
-
-  void GetSettingsWithUI(uint32_t document_page_count,
-                         bool has_selection,
-                         bool is_scripted,
-                         SettingsCallback callback) override {
-    DVLOG(1) << "Observed: invoke get settings with UI";
-    PrinterQuery::GetSettingsWithUI(document_page_count, has_selection,
-                                    is_scripted, std::move(callback));
-    callbacks_->did_get_settings_with_ui_callback.Run();
-  }
-
-  raw_ptr<PrintCallbacks> callbacks_;
-};
-
-class TestPrintJobWorkerOop : public PrintJobWorkerOop {
- public:
-  // Callbacks to run for overrides are broken into the following steps:
-  //   1.  Error case processing.  Call `error_check_callback` to reset any
-  //       triggers that were primed to cause errors in the testing context.
-  //   2.  Run the base class callback for normal handling.  If there was an
-  //       access-denied error then this can lead to a retry.  The retry has a
-  //       chance to succeed since error triggers were removed.
-  //   3.  Exercise the associated test callback (e.g.,
-  //       `did_start_printing_callback` when in `OnDidStartPrinting()`) to note
-  //       the callback was observed and completed.  This ensures all base class
-  //       processing was done before possibly quitting the test run loop.
-  struct PrintCallbacks {
-    ErrorCheckCallback error_check_callback;
-    OnDidUseDefaultSettingsCallback did_use_default_settings_callback;
-#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-    OnDidAskUserForSettingsCallback did_ask_user_for_settings_callback;
-#endif
-    OnDidStartPrintingCallback did_start_printing_callback;
-#if BUILDFLAG(IS_WIN)
-    OnDidRenderPrintedPageCallback did_render_printed_page_callback;
-#endif
-    OnDidRenderPrintedDocumentCallback did_render_printed_document_callback;
-    OnDidDocumentDoneCallback did_document_done_callback;
-    OnDidCancelCallback did_cancel_callback;
-  };
-
-  TestPrintJobWorkerOop(
-      std::unique_ptr<PrintingContext::Delegate> printing_context_delegate,
-      std::unique_ptr<PrintingContext> printing_context,
-      PrintJob* print_job,
-      mojom::PrintTargetType print_target_type,
-      bool simulate_spooling_memory_errors,
-      TestPrintJobWorkerOop::PrintCallbacks* callbacks)
-      : PrintJobWorkerOop(std::move(printing_context_delegate),
-                          std::move(printing_context),
-                          print_job,
-                          print_target_type,
-                          simulate_spooling_memory_errors),
-        callbacks_(callbacks) {}
-  TestPrintJobWorkerOop(const TestPrintJobWorkerOop&) = delete;
-  TestPrintJobWorkerOop& operator=(const TestPrintJobWorkerOop&) = delete;
-  ~TestPrintJobWorkerOop() override = default;
-
- private:
-  void OnDidStartPrinting(mojom::ResultCode result) override {
-    DVLOG(1) << "Observed: start printing of document";
-    callbacks_->error_check_callback.Run(result);
-    PrintJobWorkerOop::OnDidStartPrinting(result);
-    callbacks_->did_start_printing_callback.Run(result);
-  }
-
-#if BUILDFLAG(IS_WIN)
-  void OnDidRenderPrintedPage(uint32_t page_number,
-                              mojom::ResultCode result) override {
-    DVLOG(1) << "Observed render for printed page " << page_number;
-    callbacks_->error_check_callback.Run(result);
-    PrintJobWorkerOop::OnDidRenderPrintedPage(page_number, result);
-    callbacks_->did_render_printed_page_callback.Run(page_number, result);
-  }
-#endif  // BUILDFLAG(IS_WIN)
-
-  void OnDidRenderPrintedDocument(mojom::ResultCode result) override {
-    DVLOG(1) << "Observed render for printed document";
-    callbacks_->error_check_callback.Run(result);
-    PrintJobWorkerOop::OnDidRenderPrintedDocument(result);
-    callbacks_->did_render_printed_document_callback.Run(result);
-  }
-
-  void OnDidDocumentDone(int job_id, mojom::ResultCode result) override {
-    DVLOG(1) << "Observed: document done";
-    callbacks_->error_check_callback.Run(result);
-    PrintJobWorkerOop::OnDidDocumentDone(job_id, result);
-    callbacks_->did_document_done_callback.Run(result);
-  }
-
-  void OnDidCancel(scoped_refptr<PrintJob> job) override {
-    DVLOG(1) << "Observed: cancel";
-    // Must not use `std::move(job)`, as that could potentially cause the `job`
-    // (and consequentially `this`) to be destroyed before
-    // `did_cancel_callback` is run.
-    PrintJobWorkerOop::OnDidCancel(job);
-    callbacks_->did_cancel_callback.Run();
-  }
-
-  raw_ptr<PrintCallbacks> callbacks_;
-};
-
-class TestPrinterQueryOop : public PrinterQueryOop {
- public:
-  TestPrinterQueryOop(content::GlobalRenderFrameHostId rfh_id,
-                      bool simulate_spooling_memory_errors,
-                      TestPrintJobWorkerOop::PrintCallbacks* callbacks)
-      : PrinterQueryOop(rfh_id),
-        simulate_spooling_memory_errors_(simulate_spooling_memory_errors),
-        callbacks_(callbacks) {}
-
-  void OnDidUseDefaultSettings(
-      SettingsCallback callback,
-      mojom::PrintSettingsResultPtr print_settings) override {
-    DVLOG(1) << "Observed: use default settings";
-    mojom::ResultCode result = print_settings->is_result_code()
-                                   ? print_settings->get_result_code()
-                                   : mojom::ResultCode::kSuccess;
-    callbacks_->error_check_callback.Run(result);
-    PrinterQueryOop::OnDidUseDefaultSettings(std::move(callback),
-                                             std::move(print_settings));
-    callbacks_->did_use_default_settings_callback.Run(result);
-  }
-
-#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-  void OnDidAskUserForSettings(
-      SettingsCallback callback,
-      mojom::PrintSettingsResultPtr print_settings) override {
-    DVLOG(1) << "Observed: ask user for settings";
-    mojom::ResultCode result = print_settings->is_result_code()
-                                   ? print_settings->get_result_code()
-                                   : mojom::ResultCode::kSuccess;
-    callbacks_->error_check_callback.Run(result);
-    PrinterQueryOop::OnDidAskUserForSettings(std::move(callback),
-                                             std::move(print_settings));
-    callbacks_->did_ask_user_for_settings_callback.Run(result);
-  }
-#endif  // BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-
-  std::unique_ptr<PrintJobWorkerOop> CreatePrintJobWorker(
-      PrintJob* print_job) override {
-    return std::make_unique<TestPrintJobWorkerOop>(
-        std::move(printing_context_delegate_), std::move(printing_context_),
-        print_job, print_target_type(), simulate_spooling_memory_errors_,
-        callbacks_);
-  }
-
-  bool simulate_spooling_memory_errors_;
-  raw_ptr<TestPrintJobWorkerOop::PrintCallbacks> callbacks_;
-};
-#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
-
-class SystemAccessProcessPrintBrowserTestBase
-    : public PrintBrowserTest,
-      public PrintJob::Observer,
-      public PrintViewManagerBase::Observer {
- public:
-  SystemAccessProcessPrintBrowserTestBase() = default;
-  ~SystemAccessProcessPrintBrowserTestBase() override = default;
-
-  virtual bool UseService() = 0;
-
-  // Only of interest when `UseService()` returns true.
-  virtual bool SandboxService() = 0;
-
-  void SetUp() override {
-#if BUILDFLAG(ENABLE_OOP_PRINTING)
-    if (UseService()) {
-      feature_list_.InitAndEnableFeatureWithParameters(
-          features::kEnableOopPrintDrivers,
-          {{features::kEnableOopPrintDriversJobPrint.name, "true"},
-           {features::kEnableOopPrintDriversSandbox.name,
-            SandboxService() ? "true" : "false"}});
-
-      // Safe to use `base::Unretained(this)` since this testing class
-      // necessarily must outlive all interactions from the tests which will
-      // run through `TestPrintJobWorkerOop`, the user of these callbacks.
-      test_print_job_worker_oop_callbacks_.error_check_callback =
-          base::BindRepeating(
-              &SystemAccessProcessPrintBrowserTestBase::ErrorCheck,
-              base::Unretained(this));
-      test_print_job_worker_oop_callbacks_.did_use_default_settings_callback =
-          base::BindRepeating(
-              &SystemAccessProcessPrintBrowserTestBase::OnDidUseDefaultSettings,
-              base::Unretained(this));
-#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-      test_print_job_worker_oop_callbacks_.did_ask_user_for_settings_callback =
-          base::BindRepeating(
-              &SystemAccessProcessPrintBrowserTestBase::OnDidAskUserForSettings,
-              base::Unretained(this));
-#endif
-      test_print_job_worker_oop_callbacks_.did_start_printing_callback =
-          base::BindRepeating(
-              &SystemAccessProcessPrintBrowserTestBase::OnDidStartPrinting,
-              base::Unretained(this));
-#if BUILDFLAG(IS_WIN)
-      test_print_job_worker_oop_callbacks_.did_render_printed_page_callback =
-          base::BindRepeating(
-              &SystemAccessProcessPrintBrowserTestBase::OnDidRenderPrintedPage,
-              base::Unretained(this));
-#endif
-      test_print_job_worker_oop_callbacks_
-          .did_render_printed_document_callback = base::BindRepeating(
-          &SystemAccessProcessPrintBrowserTestBase::OnDidRenderPrintedDocument,
-          base::Unretained(this));
-      test_print_job_worker_oop_callbacks_.did_document_done_callback =
-          base::BindRepeating(
-              &SystemAccessProcessPrintBrowserTestBase::OnDidDocumentDone,
-              base::Unretained(this));
-      test_print_job_worker_oop_callbacks_.did_cancel_callback =
-          base::BindRepeating(
-              &SystemAccessProcessPrintBrowserTestBase::OnDidCancel,
-              base::Unretained(this));
-    } else {
-      test_print_job_worker_callbacks_.did_use_default_settings_callback =
-          base::BindRepeating(
-              &SystemAccessProcessPrintBrowserTestBase::OnUseDefaultSettings,
-              base::Unretained(this));
-      test_print_job_worker_callbacks_.did_get_settings_with_ui_callback =
-          base::BindRepeating(
-              &SystemAccessProcessPrintBrowserTestBase::OnGetSettingsWithUI,
-              base::Unretained(this));
-    }
-    test_create_printer_query_callback_ = base::BindRepeating(
-        &SystemAccessProcessPrintBrowserTestBase::CreatePrinterQuery,
-        base::Unretained(this), UseService());
-    PrinterQuery::SetCreatePrinterQueryCallbackForTest(
-        &test_create_printer_query_callback_);
-#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
-
-    PrintBrowserTest::SetUp();
-  }
-
-  void SetUpOnMainThread() override {
-#if BUILDFLAG(ENABLE_OOP_PRINTING)
-    if (UseService()) {
-      print_backend_service_ = PrintBackendServiceTestImpl::LaunchForTesting(
-          test_remote_, test_print_backend(), /*sandboxed=*/true);
-    }
-#endif
-    PrintBrowserTest::SetUpOnMainThread();
-  }
-
-  void TearDown() override {
-    PrintBrowserTest::TearDown();
-#if BUILDFLAG(ENABLE_OOP_PRINTING)
-    PrinterQuery::SetCreatePrinterQueryCallbackForTest(/*callback=*/nullptr);
-    if (UseService()) {
-      // Check that there is never a straggler client registration.
-      EXPECT_EQ(
-          PrintBackendServiceManager::GetInstance().GetClientsRegisteredCount(),
-          0u);
-    }
-    PrintBackendServiceManager::ResetForTesting();
-#endif
-    ASSERT_EQ(print_job_construction_count(), print_job_destruction_count());
-  }
-
-  // PrintViewManagerBase::Observer:
-  void OnRegisterSystemPrintClient(bool succeeded) override {
-    system_print_registration_succeeded_ = succeeded;
-  }
-
-  void OnDidPrintDocument() override {
-    ++did_print_document_count_;
-    CheckForQuit();
-  }
-
-  // PrintJob::Observer:
-  void OnDestruction() override {
-    ++print_job_destruction_count_;
-    CheckForQuit();
-  }
-
-  void OnCreatedPrintJob(PrintJob* print_job) {
-    ++print_job_construction_count_;
-    print_job->AddObserver(*this);
-  }
-
-  void SetUpPrintViewManager(content::WebContents* web_contents) {
-    auto manager = std::make_unique<TestPrintViewManager>(
-        web_contents,
-        base::BindRepeating(
-            &SystemAccessProcessPrintBrowserTestBase::OnCreatedPrintJob,
-            base::Unretained(this)));
-    manager->AddObserver(*this);
-    web_contents->SetUserData(PrintViewManager::UserDataKey(),
-                              std::move(manager));
-  }
-
-  void PrintAfterPreviewIsReadyAndLoaded() {
-    // First invoke the Print Preview dialog with `StartPrint()`.
-    TestPrintPreviewObserver print_preview_observer(/*wait_for_loaded=*/true);
-    StartPrint(browser()->tab_strip_model()->GetActiveWebContents(),
-               /*print_renderer=*/mojo::NullAssociatedRemote(),
-               /*print_preview_disabled=*/false,
-               /*has_selection=*/false);
-    content::WebContents* preview_dialog =
-        print_preview_observer.WaitUntilPreviewIsReadyAndReturnPreviewDialog();
-    ASSERT_TRUE(preview_dialog);
-
-    set_rendered_page_count(print_preview_observer.rendered_page_count());
-
-    // Print Preview is completely ready, can now initiate printing.
-    // This script locates and clicks the Print button.
-    const char kScript[] = R"(
-      const button = document.getElementsByTagName('print-preview-app')[0]
-                       .$['sidebar']
-                       .shadowRoot.querySelector('print-preview-button-strip')
-                       .shadowRoot.querySelector('.action-button');
-      button.click();)";
-    ASSERT_TRUE(content::ExecuteScript(preview_dialog, kScript));
-    WaitUntilCallbackReceived();
-  }
-
-#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
-  void SystemPrintFromPreviewOnceReadyAndLoaded(bool wait_for_callback) {
-    // First invoke the Print Preview dialog with `StartPrint()`.
-    TestPrintPreviewObserver print_preview_observer(/*wait_for_loaded=*/true);
-    StartPrint(browser()->tab_strip_model()->GetActiveWebContents(),
-               /*print_renderer=*/mojo::NullAssociatedRemote(),
-               /*print_preview_disabled=*/false,
-               /*has_selection=*/false);
-    content::WebContents* preview_dialog =
-        print_preview_observer.WaitUntilPreviewIsReadyAndReturnPreviewDialog();
-    ASSERT_TRUE(preview_dialog);
-
-    set_rendered_page_count(print_preview_observer.rendered_page_count());
-
-    // Print Preview is completely ready, can now initiate printing.
-    // This script locates and clicks the "Print using system dialog",
-    // which is still enabled even if it is hidden.
-    const char kPrintWithSystemDialogScript[] = R"(
-      const printSystemDialog
-          = document.getElementsByTagName('print-preview-app')[0]
-              .$['sidebar']
-              .shadowRoot.querySelector('print-preview-link-container')
-              .$['systemDialogLink'];
-        printSystemDialog.click();)";
-    // It is possible for sufficient processing for the system print to
-    // complete such that the renderer naturally terminates before ExecJs()
-    // returns here.  This causes ExecJs() to return false, with a JavaScript
-    // error of "Renderer terminated".  Since the termination can actually be
-    // a result of successful print processing, do not assert on this return
-    // result, just ignore the error instead.  Rely upon tests catching any
-    // failure through the use of other expectation checks.
-    std::ignore = content::ExecJs(preview_dialog, kPrintWithSystemDialogScript);
-    if (wait_for_callback) {
-      WaitUntilCallbackReceived();
-    }
-  }
-#endif  // BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
-
-  void PrimeAsRepeatingErrorGenerator() { reset_errors_after_check_ = false; }
-
-#if BUILDFLAG(ENABLE_OOP_PRINTING)
-  void PrimeForSpoolingSharedMemoryErrors() {
-    simulate_spooling_memory_errors_ = true;
-  }
-
-  void PrimeForFailInUseDefaultSettings() {
-    test_printing_context_factory()->SetFailErrorOnUseDefaultSettings();
-  }
-
-#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
-  void PrimeForCancelInAskUserForSettings() {
-    test_printing_context_factory()->SetCancelErrorOnAskUserForSettings();
-  }
-#endif
-
-  void PrimeForCancelInNewDocument() {
-    test_printing_context_factory()->SetCancelErrorOnNewDocument(
-        /*cause_errors=*/true);
-  }
-
-  void PrimeForErrorsInNewDocument() {
-    test_printing_context_factory()->SetFailedErrorOnNewDocument(
-        /*cause_errors=*/true);
-  }
-
-  void PrimeForAccessDeniedErrorsInNewDocument() {
-    test_printing_context_factory()->SetAccessDeniedErrorOnNewDocument(
-        /*cause_errors=*/true);
-  }
-
-#if BUILDFLAG(IS_WIN)
-  void PrimeForAccessDeniedErrorsInRenderPrintedPage() {
-    test_printing_context_factory()->SetAccessDeniedErrorOnRenderPage(
-        /*cause_errors=*/true);
-  }
-
-  void PrimeForDelayedRenderingUntilPage(uint32_t page_number) {
-    print_backend_service_->set_rendering_delayed_until_page(page_number);
-  }
-
-  void PrimeForRenderingErrorOnPage(uint32_t page_number) {
-    test_printing_context_factory()->SetFailedErrorForRenderPage(page_number);
-  }
-#endif
-
-  void PrimeForAccessDeniedErrorsInRenderPrintedDocument() {
-    test_printing_context_factory()->SetAccessDeniedErrorOnRenderDocument(
-        /*cause_errors=*/true);
-  }
-
-  void PrimeForAccessDeniedErrorsInDocumentDone() {
-    test_printing_context_factory()->SetAccessDeniedErrorOnDocumentDone(
-        /*cause_errors=*/true);
-  }
-
-  const absl::optional<bool> system_print_registration_succeeded() const {
-    return system_print_registration_succeeded_;
-  }
-
-  bool did_use_default_settings() const { return did_use_default_settings_; }
-
-  bool did_get_settings_with_ui() const { return did_get_settings_with_ui_; }
-
-  bool print_backend_service_use_detected() const {
-    return print_backend_service_use_detected_;
-  }
-#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
-
-  mojom::ResultCode use_default_settings_result() const {
-    return use_default_settings_result_;
-  }
-
-#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
-  mojom::ResultCode ask_user_for_settings_result() const {
-    return ask_user_for_settings_result_;
-  }
-#endif
-
-  mojom::ResultCode start_printing_result() const {
-    return start_printing_result_;
-  }
-
-#if BUILDFLAG(IS_WIN)
-  mojom::ResultCode render_printed_page_result() const {
-    return render_printed_page_result_;
-  }
-  int render_printed_page_count() const { return render_printed_pages_count_; }
-#endif  // BUILDFLAG(IS_WIN)
-
-  mojom::ResultCode render_printed_document_result() {
-    return render_printed_document_result_;
-  }
-
-  mojom::ResultCode document_done_result() const {
-    return document_done_result_;
-  }
-
-  int cancel_count() const { return cancel_count_; }
-
-  int print_job_construction_count() const {
-    return print_job_construction_count_;
-  }
-  int print_job_destruction_count() const {
-    return print_job_destruction_count_;
-  }
-  int did_print_document_count() const { return did_print_document_count_; }
-
- private:
-#if BUILDFLAG(ENABLE_OOP_PRINTING)
-  std::unique_ptr<PrinterQuery> CreatePrinterQuery(
-      bool use_service,
-      content::GlobalRenderFrameHostId rfh_id) {
-    if (use_service) {
-      return std::make_unique<TestPrinterQueryOop>(
-          rfh_id, simulate_spooling_memory_errors_,
-          &test_print_job_worker_oop_callbacks_);
-    }
-    return std::make_unique<TestPrinterQuery>(
-        rfh_id, &test_print_job_worker_callbacks_);
-  }
-
-  void OnUseDefaultSettings() {
-    did_use_default_settings_ = true;
-    PrintBackendServiceDetectionCheck();
-    CheckForQuit();
-  }
-
-  void OnGetSettingsWithUI() {
-    did_get_settings_with_ui_ = true;
-    PrintBackendServiceDetectionCheck();
-    CheckForQuit();
-  }
-
-  void PrintBackendServiceDetectionCheck() {
-    // Want to know if `PrintBackendService` clients are ever detected, since
-    // registrations could have gone away by the time checks are made at the
-    // end of tests.
-    if (PrintBackendServiceManager::GetInstance().GetClientsRegisteredCount() >
-        0) {
-      print_backend_service_use_detected_ = true;
-    }
-  }
-#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
-
-  void ErrorCheck(mojom::ResultCode result) {
-    // Interested to reset any trigger for causing access-denied errors, so
-    // that retry logic has a chance to be exercised and succeed.
-    if (result == mojom::ResultCode::kAccessDenied)
-      ResetForNoAccessDeniedErrors();
-  }
-
-  void OnDidUseDefaultSettings(mojom::ResultCode result) {
-    use_default_settings_result_ = result;
-    CheckForQuit();
-  }
-
-#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
-  void OnDidAskUserForSettings(mojom::ResultCode result) {
-    ask_user_for_settings_result_ = result;
-    CheckForQuit();
-  }
-#endif
-
-  void OnDidStartPrinting(mojom::ResultCode result) {
-    start_printing_result_ = result;
-    CheckForQuit();
-  }
-
-#if BUILDFLAG(IS_WIN)
-  void OnDidRenderPrintedPage(uint32_t page_number, mojom::ResultCode result) {
-    render_printed_page_result_ = result;
-    if (result == mojom::ResultCode::kSuccess)
-      render_printed_pages_count_++;
-    CheckForQuit();
-  }
-#endif
-
-  void OnDidRenderPrintedDocument(mojom::ResultCode result) {
-    render_printed_document_result_ = result;
-    CheckForQuit();
-  }
-
-  void OnDidDocumentDone(mojom::ResultCode result) {
-    document_done_result_ = result;
-    CheckForQuit();
-  }
-
-  void OnDidCancel() {
-    ++cancel_count_;
-    CheckForQuit();
-  }
-
-  void OnDidDestroyPrintJob() {
-    ++print_job_destruction_count_;
-    CheckForQuit();
-  }
-
-  void ResetForNoAccessDeniedErrors() {
-    // Don't do the reset if test scenario is repeatedly return errors.
-    if (!reset_errors_after_check_)
-      return;
-
-    test_printing_context_factory()->SetAccessDeniedErrorOnNewDocument(
-        /*cause_errors=*/false);
-#if BUILDFLAG(IS_WIN)
-    test_printing_context_factory()->SetAccessDeniedErrorOnRenderPage(
-        /*cause_errors=*/false);
-#endif
-    test_printing_context_factory()->SetAccessDeniedErrorOnRenderDocument(
-        /*cause_errors=*/false);
-    test_printing_context_factory()->SetAccessDeniedErrorOnDocumentDone(
-        /*cause_errors=*/false);
-  }
-
-  base::test::ScopedFeatureList feature_list_;
-#if BUILDFLAG(ENABLE_OOP_PRINTING)
-  TestPrinterQuery::PrintCallbacks test_print_job_worker_callbacks_;
-  TestPrintJobWorkerOop::PrintCallbacks test_print_job_worker_oop_callbacks_;
-  CreatePrinterQueryCallback test_create_printer_query_callback_;
-  absl::optional<bool> system_print_registration_succeeded_;
-  bool did_use_default_settings_ = false;
-  bool did_get_settings_with_ui_ = false;
-  bool print_backend_service_use_detected_ = false;
-  bool simulate_spooling_memory_errors_ = false;
-  mojo::Remote<mojom::PrintBackendService> test_remote_;
-  std::unique_ptr<PrintBackendServiceTestImpl> print_backend_service_;
-#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
-  bool reset_errors_after_check_ = true;
-  int did_print_document_count_ = 0;
-  mojom::ResultCode use_default_settings_result_ = mojom::ResultCode::kFailed;
-#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
-  mojom::ResultCode ask_user_for_settings_result_ = mojom::ResultCode::kFailed;
-#endif
-  mojom::ResultCode start_printing_result_ = mojom::ResultCode::kFailed;
-#if BUILDFLAG(IS_WIN)
-  mojom::ResultCode render_printed_page_result_ = mojom::ResultCode::kFailed;
-  int render_printed_pages_count_ = 0;
-#endif
-  mojom::ResultCode render_printed_document_result_ =
-      mojom::ResultCode::kFailed;
-  mojom::ResultCode document_done_result_ = mojom::ResultCode::kFailed;
-  int cancel_count_ = 0;
-  int print_job_construction_count_ = 0;
-  int print_job_destruction_count_ = 0;
-};
-
-class SystemAccessProcessSandboxedServicePrintBrowserTest
-    : public SystemAccessProcessPrintBrowserTestBase {
- public:
-  SystemAccessProcessSandboxedServicePrintBrowserTest() = default;
-  ~SystemAccessProcessSandboxedServicePrintBrowserTest() override = default;
-
-  bool UseService() override { return true; }
-  bool SandboxService() override { return true; }
-};
-
-#if BUILDFLAG(ENABLE_OOP_PRINTING)
-
-class SystemAccessProcessServicePrintBrowserTest
-    : public SystemAccessProcessPrintBrowserTestBase,
-      public testing::WithParamInterface<bool> {
- public:
-  SystemAccessProcessServicePrintBrowserTest() = default;
-  ~SystemAccessProcessServicePrintBrowserTest() override = default;
-
-  bool UseService() override { return true; }
-  bool SandboxService() override { return GetParam(); }
-};
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         SystemAccessProcessServicePrintBrowserTest,
-                         testing::Bool());
-
-#endif
-
-class SystemAccessProcessInBrowserPrintBrowserTest
-    : public SystemAccessProcessPrintBrowserTestBase {
- public:
-  SystemAccessProcessInBrowserPrintBrowserTest() = default;
-  ~SystemAccessProcessInBrowserPrintBrowserTest() override = default;
-
-  bool UseService() override { return false; }
-  bool SandboxService() override { return false; }
-};
-
-enum class PrintBackendFeatureVariation {
-  // `PrintBackend` calls occur from browser process.
-  kInBrowserProcess,
-  // Use OOP `PrintBackend`.  Attempt to have `PrintBackendService` be
-  // sandboxed.
-  kOopSandboxedService,
-  // Use OOP `PrintBackend`.  Always use `PrintBackendService` unsandboxed.
-  kOopUnsandboxedService,
-};
-
-class SystemAccessProcessPrintBrowserTest
-    : public SystemAccessProcessPrintBrowserTestBase,
-      public testing::WithParamInterface<PrintBackendFeatureVariation> {
- public:
-  SystemAccessProcessPrintBrowserTest() = default;
-  ~SystemAccessProcessPrintBrowserTest() override = default;
-
-  bool UseService() override {
-    return GetParam() != PrintBackendFeatureVariation::kInBrowserProcess;
-  }
-  bool SandboxService() override {
-    return GetParam() == PrintBackendFeatureVariation::kOopSandboxedService;
-  }
-};
-
-INSTANTIATE_TEST_SUITE_P(
-    All,
-    SystemAccessProcessPrintBrowserTest,
-    testing::Values(PrintBackendFeatureVariation::kInBrowserProcess,
-                    PrintBackendFeatureVariation::kOopSandboxedService,
-                    PrintBackendFeatureVariation::kOopUnsandboxedService));
-
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessPrintBrowserTest,
-                       UpdatePrintSettings) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/multipage.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  TestPrintViewManager print_view_manager(web_contents);
-  PrintViewManager::SetReceiverImplForTesting(&print_view_manager);
-
-  PrintAndWaitUntilPreviewIsReady();
-
-  EXPECT_EQ(3u, rendered_page_count());
-
-  const mojom::PrintPagesParamsPtr& snooped_params =
-      print_view_manager.snooped_params();
-  ASSERT_TRUE(snooped_params);
-  EXPECT_EQ(kTestPrinterCapabilitiesDpi, snooped_params->params->dpi);
-  EXPECT_EQ(kPhysicalSize, snooped_params->params->page_size);
-  EXPECT_EQ(kPrintableArea, snooped_params->params->printable_area);
-  EXPECT_EQ(kExpectedContentSize, snooped_params->params->content_size);
-}
-
-#if BUILDFLAG(ENABLE_OOP_PRINTING)
-
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
-                       StartPrinting) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  // The expected events for this are:
-  // 1.  A print job is started.
-  // 2.  Rendering for 1 page of document of content.
-  // 3.  Completes with document done.
-  // 4.  Wait for the one print job to be destroyed, to ensure printing
-  //    finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/4);
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
-#if BUILDFLAG(IS_WIN)
-  // TODO(crbug.com/1008222)  Include Windows coverage of
-  // RenderPrintedDocument() once XPS print pipeline is added.
-  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(render_printed_page_count(), 1);
-#else
-  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kSuccess);
-#endif
-  EXPECT_EQ(document_done_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(error_dialog_shown_count(), 0u);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-
-#if BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_CUPS)
-  absl::optional<PrintSettings> settings = document_print_settings();
-  ASSERT_TRUE(settings);
-  // Collect just the keys to compare the info options vs. advanced settings.
-  std::vector<std::string> advanced_setting_keys;
-  std::vector<std::string> print_info_options_keys;
-  const PrintSettings::AdvancedSettings& advanced_settings =
-      settings->advanced_settings();
-  for (const auto& advanced_setting : advanced_settings) {
-    advanced_setting_keys.push_back(advanced_setting.first);
-  }
-  for (const auto& option : kTestDummyPrintInfoOptions) {
-    print_info_options_keys.push_back(option.first);
-  }
-  EXPECT_THAT(advanced_setting_keys,
-              testing::UnorderedElementsAreArray(print_info_options_keys));
-#endif  // BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_CUPS)
-}
-
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
-                       StartPrintingMultipage) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/multipage.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-#if BUILDFLAG(IS_WIN)
-  // Windows GDI results in a callback for each rendered page.
-  // The expected events for this are:
-  // 1.  A print job is started.
-  // 2.  First page is rendered.
-  // 3.  Second page is rendered.
-  // 4.  Third page is rendered.
-  // 5.  Completes with document done.
-  // 6.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  // TODO(crbug.com/1008222)  Include Windows coverage of
-  // RenderPrintedDocument() once XPS print pipeline is added.
-  SetNumExpectedMessages(/*num=*/6);
-#else
-  // The expected events for this are:
-  // 1.  A print job is started.
-  // 2.  Document is rendered.
-  // 3.  Completes with document done.
-  // 4.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/4);
-#endif
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
-#if BUILDFLAG(IS_WIN)
-  // TODO(crbug.com/1008222)  Include Windows coverage of
-  // RenderPrintedDocument() once XPS print pipeline is added.
-  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(render_printed_page_count(), 3);
-#else
-  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kSuccess);
-#endif
-  EXPECT_EQ(document_done_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(error_dialog_shown_count(), 0u);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
-                       StartPrintingSpoolingSharedMemoryError) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeForSpoolingSharedMemoryErrors();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  // No attempt to retry is made if a job has a shared memory error when trying
-  // to spool a page/document fails on a shared memory error.  The test
-  // sequence for this is:
-  // 1.  A print job is started.
-  // 2.  Spooling to send the render data will fail.  An error dialog is shown.
-  // 3.  The print job is canceled.  The callback from the service could occur
-  //     after the print job has been destroyed.
-  // 4.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/4);
-
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(error_dialog_shown_count(), 1u);
-  EXPECT_EQ(cancel_count(), 1);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-// TODO(crbug.com/1384459): Flaky on MSan builds.
-#if defined(MEMORY_SANITIZER)
-#define MAYBE_StartPrintingFails DISABLED_StartPrintingFails
-#else
-#define MAYBE_StartPrintingFails StartPrintingFails
-#endif
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessPrintBrowserTest,
-                       MAYBE_StartPrintingFails) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeForErrorsInNewDocument();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) {
-    // There are no callbacks for print stages with in-browser printing.  So
-    // the print job is started, but that fails, and there is no capturing of
-    // that result.
-    // The expected events for this are:
-    // 1.  An error dialog is shown.
-    // 2.  Wait for the one print job to be destroyed, to ensure printing
-    //     finished cleanly before completing the test.
-    SetNumExpectedMessages(/*num=*/2);
-  } else {
-    // The expected events for this are:
-    // 1.  A print job is started, but that fails.
-    // 2.  An error dialog is shown.
-    // 3.  The print job is canceled.  The callback from the service could occur
-    //     after the print job has been destroyed.
-    // 4.  Wait for the one print job to be destroyed, to ensure printing
-    //     finished cleanly before completing the test.
-    SetNumExpectedMessages(/*num=*/4);
-  }
-
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kFailed);
-  EXPECT_EQ(error_dialog_shown_count(), 1u);
-  // No tracking of cancel for in-browser tests, only for OOP.
-  if (GetParam() != PrintBackendFeatureVariation::kInBrowserProcess)
-    EXPECT_EQ(cancel_count(), 1);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessPrintBrowserTest,
-                       StartPrintingCanceled) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeForCancelInNewDocument();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) {
-    // A print job is started, but results in a cancel.  There are no callbacks
-    // to notice the start job.  The expected events for this are:
-    // 1.  Wait for the one print job to be destroyed, to ensure printing
-    //     finished cleanly before completing the test.
-    SetNumExpectedMessages(/*num=*/1);
-  } else {
-    // The expected events for this are:
-    // 1.  A print job is started, but results in a cancel.
-    // 2.  The print job is canceled.
-    // 3.  Wait for the one print job to be destroyed, to ensure printing
-    //     finished cleanly before completing the test.
-    SetNumExpectedMessages(/*num=*/3);
-  }
-
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  // No tracking of start printing or cancel callbacks for in-browser tests,
-  // only for OOP.
-  if (GetParam() != PrintBackendFeatureVariation::kInBrowserProcess) {
-    EXPECT_EQ(start_printing_result(), mojom::ResultCode::kCanceled);
-    EXPECT_EQ(cancel_count(), 1);
-  }
-  EXPECT_EQ(error_dialog_shown_count(), 0u);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
-                       StartPrintingAccessDenied) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeForAccessDeniedErrorsInNewDocument();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  // The expected events for this are:
-  // 1.  A print job is started, but has an access-denied error.
-  // 2.  A retry to start the print job with adjusted access will succeed.
-  // 3.  Rendering for 1 page of document of content.
-  // 4.  Completes with document done.
-  // 5.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/5);
-
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
-#if BUILDFLAG(IS_WIN)
-  // TODO(crbug.com/1008222)  Include Windows coverage of
-  // RenderPrintedDocument() once XPS print pipeline is added.
-  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(render_printed_page_count(), 1);
-#else
-  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kSuccess);
-#endif
-  EXPECT_EQ(document_done_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(error_dialog_shown_count(), 0u);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
-                       StartPrintingRepeatedAccessDenied) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeAsRepeatingErrorGenerator();
-  PrimeForAccessDeniedErrorsInNewDocument();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  // Test of a misbehaving printer driver which only returns access-denied
-  // errors.  The expected events for this are:
-  // 1.  A print job is started, but has an access-denied error.
-  // 2.  A retry to start the print job with adjusted access will still fail.
-  // 3.  An error dialog is shown.
-  // 4.  The print job is canceled.  The callback from the service could occur
-  //     after the print job has been destroyed.
-  // 5.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/5);
-
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kAccessDenied);
-  EXPECT_EQ(error_dialog_shown_count(), 1u);
-  EXPECT_EQ(cancel_count(), 1);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-#if BUILDFLAG(IS_WIN)
-IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
-                       StartPrintingRenderPageAccessDenied) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeForAccessDeniedErrorsInRenderPrintedPage();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  // No attempt to retry is made if an access-denied error occurs when trying
-  // to render a page.  The expected events for this are:
-  // 1.  A print job is started.
-  // 2.  Rendering for 1 page of document of content fails with access denied.
-  // 3.  An error dialog is shown.
-  // 4.  The print job is canceled.  The callback from the service could occur
-  //     after the print job has been destroyed.
-  // 5.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/5);
-
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kAccessDenied);
-  EXPECT_EQ(render_printed_page_count(), 0);
-  EXPECT_EQ(error_dialog_shown_count(), 1u);
-  EXPECT_EQ(cancel_count(), 1);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
-                       StartPrintingMultipageMidJobError) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  // Delay rendering until all pages have been sent, to avoid any race
-  // conditions related to error handling.  This is to ensure that page 3 is in
-  // the service queued for processing, before we let page 2 be processed and
-  // have it trigger an error that could affect page 3 processing.
-  PrimeForDelayedRenderingUntilPage(/*page_number=*/3);
-  PrimeForRenderingErrorOnPage(/*page_number=*/2);
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/multipage.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  // The expected events for this are:
-  // 1.  Start the print job.
-  // 2.  First page render callback shows success.
-  // 3.  Second page render callback shows failure.  Will start failure
-  //     processing to cancel the print job.
-  // 4.  A printing error dialog is displayed.
-  // 5.  Third page render callback will show it was canceled (due to prior
-  //     failure).  This is disregarded by the browser, since the job has
-  //     already been canceled.
-  // 6.  The print job is canceled.  The callback from the service could occur
-  //     after the print job has been destroyed.
-  // 7.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/7);
-
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
-  // First failure page is `kFailed`, but is followed by another page with
-  // status `kCanceled`.
-  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kCanceled);
-  EXPECT_EQ(render_printed_page_count(), 1);
-  EXPECT_EQ(error_dialog_shown_count(), 1u);
-  EXPECT_EQ(cancel_count(), 1);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-#endif  // BUILDFLAG(IS_WIN)
-
-// TODO(crbug.com/1008222)  Include Windows once XPS print pipeline is added.
-#if !BUILDFLAG(IS_WIN)
-IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
-                       StartPrintingRenderDocumentAccessDenied) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeForAccessDeniedErrorsInRenderPrintedDocument();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  // No attempt to retry is made if an access-denied error occurs when trying
-  // to render a document.  The expected events for this are:
-  // 1.  A print job is started.
-  // 2.  Rendering for 1 page of document of content fails with access denied.
-  // 3.  An error dialog is shown.
-  // 4.  The print job is canceled.  The callback from the service could occur
-  //     after the print job has been destroyed.
-  // 5.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/5);
-
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kAccessDenied);
-  EXPECT_EQ(error_dialog_shown_count(), 1u);
-  EXPECT_EQ(cancel_count(), 1);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-#endif  // !BUILDFLAG(IS_WIN)
-
-IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
-                       StartPrintingDocumentDoneAccessDenied) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeForAccessDeniedErrorsInDocumentDone();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  // No attempt to retry is made if an access-denied error occurs when trying
-  // do wrap-up a rendered document.  The expected events are:
-  // 1.  A print job is started.
-  // 2.  Rendering for 1 page of document of content.
-  // 3.  Document done results in an access-denied error.
-  // 4.  An error dialog is shown.
-  // 5.  The print job is canceled.  The callback from the service could occur
-  //     after the print job has been destroyed.
-  // 6.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/6);
-
-  PrintAfterPreviewIsReadyAndLoaded();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
-#if BUILDFLAG(IS_WIN)
-  // TODO(crbug.com/1008222)  Include Windows coverage of
-  // RenderPrintedDocument() once XPS print pipeline is added.
-  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(render_printed_page_count(), 1);
-#else
-  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kSuccess);
-#endif
-  EXPECT_EQ(document_done_result(), mojom::ResultCode::kAccessDenied);
-  EXPECT_EQ(error_dialog_shown_count(), 1u);
-  EXPECT_EQ(cancel_count(), 1);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
-
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessPrintBrowserTest,
-                       SystemPrintFromPrintPreview) {
-  // TODO(crbug.com/1393505)  Enable OOP test coverage once underlying
-  // printing stack updates to support this scenario with out-of-process are
-  // in place.
-  if (GetParam() != PrintBackendFeatureVariation::kInBrowserProcess) {
-    GTEST_SKIP() << "Skipping test for out-of-process, which is known to crash "
-                    "when transitioning to system print from print preview";
-  }
-
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) {
-#if BUILDFLAG(IS_WIN)
-    // There are no callbacks that trigger for print stages with in-browser
-    // printing for the Windows case.  The only expected event for this is to
-    // wait for the one print job to be destroyed, to ensure printing finished
-    // cleanly before completing the test.
-    SetNumExpectedMessages(/*num=*/1);
-#else
-    // Once the transition to system print is initiated, the expected events
-    // are:
-    // 1.  Use default settings.
-    // 2.  Ask the user for settings.
-    // 3.  Wait until all processing for DidPrintDocument is known to have
-    //     completed, to ensure printing finished cleanly before completing the
-    //     test.
-    // 4.  Wait for the one print job to be destroyed, to ensure printing
-    //     finished cleanly before completing the test.
-    SetNumExpectedMessages(/*num=*/4);
-#endif  // BUILDFLAG(IS_WIN)
-  } else {
-    // TODO(crbug.com/1393505)  Fill in expected events once the printing stack
-    // updates to support this scenario with out-of-process are in place.
-  }
-  SystemPrintFromPreviewOnceReadyAndLoaded(/*wait_for_callback=*/true);
-
-#if !BUILDFLAG(IS_WIN)
-  if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) {
-    EXPECT_TRUE(did_get_settings_with_ui());
-    EXPECT_EQ(did_print_document_count(), 1);
-  } else {
-    // TODO(crbug.com/1393505)  Fill in expectations once the printing stack
-    // updates to support this scenario with out-of-process are in place.
-  }
-#endif
-  ASSERT_EQ(*MakeUserModifiedPrintSettings("printer1"),
-            *document_print_settings());
-  EXPECT_EQ(error_dialog_shown_count(), 0u);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
-                       StartBasicPrint) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-  // The expected events for this are:
-  // 1.  Get the default settings.
-  // 2.  Ask the user for settings.
-  // 3.  A print job is started.
-  // 4.  The print compositor will complete generating the document.
-  // 5.  The document is rendered.
-  // 6.  Receive document done notification.
-  // 7.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/7);
-#else
-  // The expected events for this are:
-  // 1.  Get default settings, followed by asking user for settings.  This is
-  //     invoked from the browser process, so there is no override to observe
-  //     this.  Then a print job is started.
-  // 2.  The print compositor will complete generating the document.
-  // 3.  The document is rendered.
-  // 4.  Receive document done notification.
-  // 5.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/5);
-#endif
-
-  StartBasicPrint(web_contents);
-
-  WaitUntilCallbackReceived();
-
-  // macOS and Linux currently have to invoke a system dialog from within the
-  // browser process.  There is not a callback to capture the result in these
-  // cases.
-#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-  EXPECT_EQ(use_default_settings_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(ask_user_for_settings_result(), mojom::ResultCode::kSuccess);
-#endif
-  // TODO(crbug.com/1414968)  Correct expectation once system print settings
-  // are properly reflected at start of job print.
-  ASSERT_NE(*MakeUserModifiedPrintSettings("printer1"),
-            *document_print_settings());
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
-#if BUILDFLAG(IS_WIN)
-  // TODO(crbug.com/1008222)  Include Windows coverage of
-  // RenderPrintedDocument() once XPS print pipeline is added.
-  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(render_printed_page_count(), 1);
-#else
-  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kSuccess);
-#endif
-  EXPECT_EQ(document_done_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(error_dialog_shown_count(), 0u);
-  EXPECT_EQ(did_print_document_count(), 1);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-// TODO(crbug.com/1375007): Very flaky on Mac and slightly on Linux.
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
-#define MAYBE_StartBasicPrintCancel DISABLED_StartBasicPrintCancel
-#else
-#define MAYBE_StartBasicPrintCancel StartBasicPrintCancel
-#endif
-IN_PROC_BROWSER_TEST_F(SystemAccessProcessInBrowserPrintBrowserTest,
-                       MAYBE_StartBasicPrintCancel) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeForCancelInAskUserForSettings();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-  // The expected events for this are:
-  // 1.  Get the default settings.
-  // 2.  Ask the user for settings, which indicates to cancel the print
-  //     request.  No further printing calls are made.
-  // No print job is created because of such an early cancel.
-  SetNumExpectedMessages(/*num=*/2);
-#else
-  // TODO(crbug.com/1375007)  Need a good signal to use for test expectations.
-#endif
-
-  StartBasicPrint(web_contents);
-
-  WaitUntilCallbackReceived();
-
-  EXPECT_TRUE(did_use_default_settings());
-  EXPECT_TRUE(did_get_settings_with_ui());
-  EXPECT_EQ(error_dialog_shown_count(), 0u);
-  EXPECT_EQ(did_print_document_count(), 0);
-  EXPECT_EQ(print_job_destruction_count(), 0);
-
-  // `PrintBackendService` should never be used when printing in-browser.
-  EXPECT_FALSE(print_backend_service_use_detected());
-}
-
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessPrintBrowserTest,
-                       StartBasicPrintFails) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeForErrorsInNewDocument();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) {
-    // There are only partial overrides to track most steps in the printing
-    // pipeline, so the expected events for this are:
-    // 1.  Gets default settings.
-    // 2.  Asks user for settings.
-    // 3.  A print job is started, but that fails.  There is no override to
-    //     this notice directly.  This does cause an error dialog to be shown.
-    // 4.  Wait for the one print job to be destroyed, to ensure printing
-    //     finished cleanly before completing the test.
-    // 5.  The renderer will have initiated printing of document, which could
-    //     invoke the print compositor.  Wait until all processing for
-    //     DidPrintDocument is known to have completed, to ensure printing
-    //     finished cleanly before completing the test.
-    SetNumExpectedMessages(/*num=*/5);
-  } else {
-#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-    // The expected events for this are:
-    // 1.  Gets default settings.
-    // 2.  Asks user for settings.
-    // 3.  A print job is started, which fails.
-    // 4.  An error dialog is shown.
-    // 5.  The print job is canceled.  The callback from the service could occur
-    //     after the print job has been destroyed.
-    // 6.  Wait for the one print job to be destroyed, to ensure printing
-    //     finished cleanly before completing the test.
-    // 7.  The renderer will have initiated printing of document, which could
-    //     invoke the print compositor.  Wait until all processing for
-    //     DidPrintDocument is known to have completed, to ensure printing
-    //     finished cleanly before completing the test.
-    SetNumExpectedMessages(/*num=*/7);
-#else
-    // The expected events for this are:
-    // 1.  Get default settings, followed by asking user for settings.  This is
-    //     invoked from the browser process, so there is no override to observe
-    //     this.  Then a print job is started, which fails.
-    // 2.  An error dialog is shown.
-    // 3.  The print job is canceled.  The callback from the service could occur
-    //     after the print job has been destroyed.
-    // 4.  Wait for the one print job to be destroyed, to ensure printing
-    //     finished cleanly before completing the test.
-    // 5.  The print compositor will have started to generate the document.
-    //     Wait until that is known to have completed, to ensure printing
-    //     finished cleanly before completing the test.
-    SetNumExpectedMessages(/*num=*/5);
-#endif  // BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-  }
-
-  StartBasicPrint(web_contents);
-
-  WaitUntilCallbackReceived();
-
-  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kFailed);
-  EXPECT_EQ(error_dialog_shown_count(), 1u);
-  EXPECT_EQ(
-      cancel_count(),
-      GetParam() == PrintBackendFeatureVariation::kInBrowserProcess ? 0 : 1);
-  EXPECT_EQ(did_print_document_count(), 1);
-  EXPECT_EQ(print_job_destruction_count(), 1);
-}
-
-// macOS and Linux currently have to invoke a system dialog from within the
-// browser process.  There is not a callback to capture the result in these
-// cases.
-// TODO(crbug.com/1374188)  Re-enable for Linux once `AskForUserSettings()` is
-// able to be pushed OOP for Linux.
-#undef MAYBE_StartBasicPrintCancel
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
-#define MAYBE_StartBasicPrintCancel DISABLED_StartBasicPrintCancel
-#else
-#define MAYBE_StartBasicPrintCancel StartBasicPrintCancel
-#endif
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
-                       MAYBE_StartBasicPrintCancel) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-  PrimeForCancelInAskUserForSettings();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  // The expected events for this are:
-  // 1.  Get the default settings.
-  // 2.  Ask the user for settings, which indicates to cancel the print
-  //     request.  No further printing calls are made.
-  // No print job is created because of such an early cancel.
-  SetNumExpectedMessages(/*num=*/2);
-
-  StartBasicPrint(web_contents);
-
-  WaitUntilCallbackReceived();
-
-  EXPECT_EQ(use_default_settings_result(), mojom::ResultCode::kSuccess);
-  EXPECT_EQ(ask_user_for_settings_result(), mojom::ResultCode::kCanceled);
-  EXPECT_EQ(error_dialog_shown_count(), 0u);
-  EXPECT_EQ(did_print_document_count(), 0);
-  EXPECT_EQ(print_job_construction_count(), 0);
-}
-
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
-                       StartBasicPrintConcurrent) {
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  TestPrintViewManager* print_view_manager =
-      TestPrintViewManager::CreateForWebContents(web_contents);
-
-  // Pretend that a window has started a system print.
-  absl::optional<PrintBackendServiceManager::ClientId> client_id =
-      PrintBackendServiceManager::GetInstance().RegisterQueryWithUiClient();
-  ASSERT_TRUE(client_id.has_value());
-
-  // Now initiate a system print that would exist concurrently with that.
-  StartBasicPrint(web_contents);
-
-  const absl::optional<bool>& result = print_view_manager->print_now_result();
-  ASSERT_TRUE(result.has_value());
-  // With the exception of Linux, concurrent system print is not allowed.
-#if BUILDFLAG(IS_LINUX)
-  EXPECT_TRUE(*result);
-#else
-  // The denied concurrent print is silent without an error.
-  EXPECT_EQ(error_dialog_shown_count(), 0u);
-  EXPECT_FALSE(*result);
-#endif
-
-  // Cleanup before test shutdown.
-  PrintBackendServiceManager::GetInstance().UnregisterClient(*client_id);
-}
-
-#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
-                       SystemPrintFromPrintPreviewConcurrent) {
-  AddPrinter("printer1");
-  SetPrinterNameForSubsequentContexts("printer1");
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-  // Pretend that another tab has started a system print.
-  // TODO(crbug.com/809738)  Improve on this test by using a persistent fake
-  // system print dialog.
-  absl::optional<PrintBackendServiceManager::ClientId> client_id =
-      PrintBackendServiceManager::GetInstance().RegisterQueryWithUiClient();
-  ASSERT_TRUE(client_id.has_value());
-
-  // Now do a print preview which will try to switch to doing system print.
-#if BUILDFLAG(IS_LINUX)
-  // The expected events for this are:
-  // 1.  Start printing.
-  // 2.  The document is rendered.
-  // 3.  Receive document done notification.
-  // 4.  Wait for the one print job to be destroyed, to ensure printing
-  //     finished cleanly before completing the test.
-  SetNumExpectedMessages(/*num=*/4);
-
-  constexpr bool kWaitForCallback = true;
-#else
-  // Inability to support this should be detected immediately without needing
-  // to wait for callback.
-  constexpr bool kWaitForCallback = false;
-#endif
-
-  SystemPrintFromPreviewOnceReadyAndLoaded(kWaitForCallback);
-
-  // With the exception of Linux, concurrent system print is not allowed.
-  ASSERT_TRUE(system_print_registration_succeeded().has_value());
-#if BUILDFLAG(IS_LINUX)
-  EXPECT_TRUE(*system_print_registration_succeeded());
-#else
-  // The denied concurrent print is silent without an error.
-  EXPECT_FALSE(*system_print_registration_succeeded());
-  EXPECT_EQ(error_dialog_shown_count(), 0u);
-#endif
-
-  // Cleanup before test shutdown.
-  PrintBackendServiceManager::GetInstance().UnregisterClient(*client_id);
-}
-#endif  // BUILDFLAG(ENABLE_PRINT_PREVIEW)
-
-IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
-                       StartBasicPrintUseDefaultFails) {
-  PrimeForFailInUseDefaultSettings();
-
-  ASSERT_TRUE(embedded_test_server()->Started());
-  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  ASSERT_TRUE(web_contents);
-  SetUpPrintViewManager(web_contents);
-
-#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-  // The expected events for this are:
-  // 1.  Get the default settings, which fails.
-  // 2.  The print error dialog is shown.
-  // No print job is created from such an early failure.
-  SetNumExpectedMessages(/*num=*/2);
-#else
-  // When get default settings is invoked from the browser process, there is no
-  // override to observe this failure.  This means the expected events are:
-  // 1.  The print error dialog is shown.
-  // No print job is created from such an early failure.
-  SetNumExpectedMessages(/*num=*/1);
-#endif
-
-  StartBasicPrint(web_contents);
-
-  WaitUntilCallbackReceived();
-
-#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
-  EXPECT_EQ(use_default_settings_result(), mojom::ResultCode::kFailed);
-#endif
-  EXPECT_EQ(error_dialog_shown_count(), 1u);
-  EXPECT_EQ(did_print_document_count(), 0);
-  EXPECT_EQ(print_job_construction_count(), 0);
-}
-#endif  // BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
-
-#endif  //  BUILDFLAG(ENABLE_OOP_PRINTING)
-
-#endif  // !BUILDFLAG(IS_CHROMEOS)
-
 #if BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
 struct ContentAnalysisTestCase {
   bool content_analysis_allows_print = false;
diff --git a/chrome/browser/printing/print_browsertest.h b/chrome/browser/printing/print_browsertest.h
new file mode 100644
index 0000000..29b2ef3
--- /dev/null
+++ b/chrome/browser/printing/print_browsertest.h
@@ -0,0 +1,101 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PRINTING_PRINT_BROWSERTEST_H_
+#define CHROME_BROWSER_PRINTING_PRINT_BROWSERTEST_H_
+
+#include "chrome/test/base/in_process_browser_test.h"
+
+#include <string>
+
+#include "build/build_config.h"
+#include "chrome/browser/printing/browser_printing_context_factory_for_test.h"
+#include "components/printing/common/print.mojom.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
+#include "printing/backend/test_print_backend.h"
+#include "printing/print_settings.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace printing {
+
+class TestPrintRenderFrame;
+
+class PrintBrowserTest : public InProcessBrowserTest {
+ public:
+  struct PrintParams {
+    bool print_only_selection = false;
+    int pages_per_sheet = 1;
+  };
+
+  PrintBrowserTest();
+  ~PrintBrowserTest() override;
+
+  // InProcessBrowserTest overrides:
+  void SetUp() override;
+  void SetUpOnMainThread() override;
+  void TearDownOnMainThread() override;
+  void TearDown() override;
+
+  void AddPrinter(const std::string& printer_name);
+  void SetPrinterNameForSubsequentContexts(const std::string& printer_name);
+  void PrintAndWaitUntilPreviewIsReady();
+  void PrintAndWaitUntilPreviewIsReady(const PrintParams& params);
+  void PrintAndWaitUntilPreviewIsReadyAndLoaded();
+  void PrintAndWaitUntilPreviewIsReadyAndLoaded(const PrintParams& params);
+
+  void SetNumExpectedMessages(unsigned int num);
+  void WaitUntilCallbackReceived();
+  void CheckForQuit();
+
+  void CreateTestPrintRenderFrame(content::RenderFrameHost* frame_host,
+                                  content::WebContents* web_contents);
+
+  static mojom::PrintFrameContentParamsPtr GetDefaultPrintFrameParams();
+
+  const mojo::AssociatedRemote<mojom::PrintRenderFrame>& GetPrintRenderFrame(
+      content::RenderFrameHost* rfh);
+
+  uint32_t rendered_page_count() const { return rendered_page_count_; }
+
+  uint32_t error_dialog_shown_count() const {
+    return error_dialog_shown_count_;
+  }
+
+ protected:
+  TestPrintBackend* test_print_backend() { return test_print_backend_.get(); }
+
+  BrowserPrintingContextFactoryForTest* test_printing_context_factory() {
+    return &test_printing_context_factory_;
+  }
+
+  void set_rendered_page_count(uint32_t page_count) {
+    rendered_page_count_ = page_count;
+  }
+
+  const absl::optional<PrintSettings>& document_print_settings() const {
+    return test_printing_context_factory_.document_print_settings();
+  }
+
+ private:
+  TestPrintRenderFrame* GetFrameContent(content::RenderFrameHost* host) const;
+  void OverrideBinderForTesting(content::RenderFrameHost* render_frame_host);
+  void ShowPrintErrorDialog();
+
+  uint32_t error_dialog_shown_count_ = 0;
+  uint32_t rendered_page_count_ = 0;
+  unsigned int num_expected_messages_;
+  unsigned int num_received_messages_;
+  base::OnceClosure quit_callback_;
+  mojo::AssociatedRemote<mojom::PrintRenderFrame> remote_;
+  std::map<content::RenderFrameHost*, std::unique_ptr<TestPrintRenderFrame>>
+      frame_content_;
+  scoped_refptr<TestPrintBackend> test_print_backend_;
+  BrowserPrintingContextFactoryForTest test_printing_context_factory_;
+};
+
+}  // namespace printing
+
+#endif  // CHROME_BROWSER_PRINTING_PRINT_BROWSERTEST_H_
diff --git a/chrome/browser/printing/system_access_process_print_browsertest.cc b/chrome/browser/printing/system_access_process_print_browsertest.cc
new file mode 100644
index 0000000..810eb399
--- /dev/null
+++ b/chrome/browser/printing/system_access_process_print_browsertest.cc
@@ -0,0 +1,1722 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+#include <tuple>
+#include <utility>
+
+#include "base/functional/bind.h"
+#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
+#include "base/test/scoped_feature_list.h"
+#include "build/build_config.h"
+#include "chrome/browser/printing/print_browsertest.h"
+#include "chrome/browser/printing/print_job.h"
+#include "chrome/browser/printing/print_test_utils.h"
+#include "chrome/browser/printing/print_view_manager_base.h"
+#include "chrome/browser/printing/print_view_manager_common.h"
+#include "chrome/browser/printing/printer_query.h"
+#include "chrome/browser/printing/test_print_preview_observer.h"
+#include "chrome/browser/printing/test_print_view_manager.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/global_routing_id.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "printing/buildflags/buildflags.h"
+#include "printing/mojom/print.mojom.h"
+#include "printing/printing_context.h"
+#include "printing/printing_features.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+#if BUILDFLAG(ENABLE_OOP_PRINTING)
+#include "chrome/browser/printing/print_backend_service_manager.h"
+#include "chrome/browser/printing/print_backend_service_test_impl.h"
+#include "chrome/browser/printing/print_job_worker_oop.h"
+#include "chrome/browser/printing/printer_query_oop.h"
+#include "chrome/services/printing/public/mojom/print_backend_service.mojom.h"
+#endif
+
+#if BUILDFLAG(IS_CHROMEOS)
+// TODO(crbug.com/822505)  ChromeOS uses different testing setup that isn't
+// hooked up to make use of `TestPrintingContext` yet.
+#error "ChromeOS not supported here yet"
+#endif
+
+namespace printing {
+
+namespace {
+
+#if !BUILDFLAG(IS_CHROMEOS)
+constexpr gfx::Size kPhysicalSize = gfx::Size(612, 792);
+constexpr gfx::Rect kPrintableArea = gfx::Rect(0, 0, 612, 792);
+
+// The default margins are set to 1.0cm in //printing/print_settings.cc, which
+// is about 28 printer units. The resulting content size is 556 x 736.
+constexpr gfx::Size kExpectedContentSize = gfx::Size(556, 736);
+#endif  // !BUILDFLAG(IS_CHROMEOS)
+
+}  // namespace
+
+#if BUILDFLAG(ENABLE_OOP_PRINTING)
+using OnUseDefaultSettingsCallback = base::RepeatingClosure;
+using OnGetSettingsWithUICallback = base::RepeatingClosure;
+
+using ErrorCheckCallback =
+    base::RepeatingCallback<void(mojom::ResultCode result)>;
+using OnDidUseDefaultSettingsCallback =
+    base::RepeatingCallback<void(mojom::ResultCode result)>;
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+using OnDidAskUserForSettingsCallback =
+    base::RepeatingCallback<void(mojom::ResultCode result)>;
+#endif
+using OnDidStartPrintingCallback =
+    base::RepeatingCallback<void(mojom::ResultCode result)>;
+#if BUILDFLAG(IS_WIN)
+using OnDidRenderPrintedPageCallback =
+    base::RepeatingCallback<void(uint32_t page_number,
+                                 mojom::ResultCode result)>;
+#endif
+using OnDidRenderPrintedDocumentCallback =
+    base::RepeatingCallback<void(mojom::ResultCode result)>;
+using OnDidDocumentDoneCallback =
+    base::RepeatingCallback<void(mojom::ResultCode result)>;
+using OnDidCancelCallback = base::RepeatingClosure;
+using OnDidShowErrorDialog = base::RepeatingClosure;
+
+class TestPrinterQuery : public PrinterQuery {
+ public:
+  // Callbacks to run for overrides.
+  struct PrintCallbacks {
+    OnUseDefaultSettingsCallback did_use_default_settings_callback;
+    OnGetSettingsWithUICallback did_get_settings_with_ui_callback;
+  };
+
+  TestPrinterQuery(content::GlobalRenderFrameHostId rfh_id,
+                   PrintCallbacks* callbacks)
+      : PrinterQuery(rfh_id), callbacks_(callbacks) {}
+
+  void UseDefaultSettings(SettingsCallback callback) override {
+    DVLOG(1) << "Observed: invoke use default settings";
+    PrinterQuery::UseDefaultSettings(std::move(callback));
+    callbacks_->did_use_default_settings_callback.Run();
+  }
+
+  void GetSettingsWithUI(uint32_t document_page_count,
+                         bool has_selection,
+                         bool is_scripted,
+                         SettingsCallback callback) override {
+    DVLOG(1) << "Observed: invoke get settings with UI";
+    PrinterQuery::GetSettingsWithUI(document_page_count, has_selection,
+                                    is_scripted, std::move(callback));
+    callbacks_->did_get_settings_with_ui_callback.Run();
+  }
+
+  raw_ptr<PrintCallbacks> callbacks_;
+};
+
+class TestPrintJobWorkerOop : public PrintJobWorkerOop {
+ public:
+  // Callbacks to run for overrides are broken into the following steps:
+  //   1.  Error case processing.  Call `error_check_callback` to reset any
+  //       triggers that were primed to cause errors in the testing context.
+  //   2.  Run the base class callback for normal handling.  If there was an
+  //       access-denied error then this can lead to a retry.  The retry has a
+  //       chance to succeed since error triggers were removed.
+  //   3.  Exercise the associated test callback (e.g.,
+  //       `did_start_printing_callback` when in `OnDidStartPrinting()`) to note
+  //       the callback was observed and completed.  This ensures all base class
+  //       processing was done before possibly quitting the test run loop.
+  struct PrintCallbacks {
+    ErrorCheckCallback error_check_callback;
+    OnDidUseDefaultSettingsCallback did_use_default_settings_callback;
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+    OnDidAskUserForSettingsCallback did_ask_user_for_settings_callback;
+#endif
+    OnDidStartPrintingCallback did_start_printing_callback;
+#if BUILDFLAG(IS_WIN)
+    OnDidRenderPrintedPageCallback did_render_printed_page_callback;
+#endif
+    OnDidRenderPrintedDocumentCallback did_render_printed_document_callback;
+    OnDidDocumentDoneCallback did_document_done_callback;
+    OnDidCancelCallback did_cancel_callback;
+  };
+
+  TestPrintJobWorkerOop(
+      std::unique_ptr<PrintingContext::Delegate> printing_context_delegate,
+      std::unique_ptr<PrintingContext> printing_context,
+      PrintJob* print_job,
+      mojom::PrintTargetType print_target_type,
+      bool simulate_spooling_memory_errors,
+      TestPrintJobWorkerOop::PrintCallbacks* callbacks)
+      : PrintJobWorkerOop(std::move(printing_context_delegate),
+                          std::move(printing_context),
+                          print_job,
+                          print_target_type,
+                          simulate_spooling_memory_errors),
+        callbacks_(callbacks) {}
+  TestPrintJobWorkerOop(const TestPrintJobWorkerOop&) = delete;
+  TestPrintJobWorkerOop& operator=(const TestPrintJobWorkerOop&) = delete;
+  ~TestPrintJobWorkerOop() override = default;
+
+ private:
+  void OnDidStartPrinting(mojom::ResultCode result) override {
+    DVLOG(1) << "Observed: start printing of document";
+    callbacks_->error_check_callback.Run(result);
+    PrintJobWorkerOop::OnDidStartPrinting(result);
+    callbacks_->did_start_printing_callback.Run(result);
+  }
+
+#if BUILDFLAG(IS_WIN)
+  void OnDidRenderPrintedPage(uint32_t page_number,
+                              mojom::ResultCode result) override {
+    DVLOG(1) << "Observed render for printed page " << page_number;
+    callbacks_->error_check_callback.Run(result);
+    PrintJobWorkerOop::OnDidRenderPrintedPage(page_number, result);
+    callbacks_->did_render_printed_page_callback.Run(page_number, result);
+  }
+#endif  // BUILDFLAG(IS_WIN)
+
+  void OnDidRenderPrintedDocument(mojom::ResultCode result) override {
+    DVLOG(1) << "Observed render for printed document";
+    callbacks_->error_check_callback.Run(result);
+    PrintJobWorkerOop::OnDidRenderPrintedDocument(result);
+    callbacks_->did_render_printed_document_callback.Run(result);
+  }
+
+  void OnDidDocumentDone(int job_id, mojom::ResultCode result) override {
+    DVLOG(1) << "Observed: document done";
+    callbacks_->error_check_callback.Run(result);
+    PrintJobWorkerOop::OnDidDocumentDone(job_id, result);
+    callbacks_->did_document_done_callback.Run(result);
+  }
+
+  void OnDidCancel(scoped_refptr<PrintJob> job) override {
+    DVLOG(1) << "Observed: cancel";
+    // Must not use `std::move(job)`, as that could potentially cause the `job`
+    // (and consequentially `this`) to be destroyed before
+    // `did_cancel_callback` is run.
+    PrintJobWorkerOop::OnDidCancel(job);
+    callbacks_->did_cancel_callback.Run();
+  }
+
+  raw_ptr<PrintCallbacks> callbacks_;
+};
+
+class TestPrinterQueryOop : public PrinterQueryOop {
+ public:
+  TestPrinterQueryOop(content::GlobalRenderFrameHostId rfh_id,
+                      bool simulate_spooling_memory_errors,
+                      TestPrintJobWorkerOop::PrintCallbacks* callbacks)
+      : PrinterQueryOop(rfh_id),
+        simulate_spooling_memory_errors_(simulate_spooling_memory_errors),
+        callbacks_(callbacks) {}
+
+  void OnDidUseDefaultSettings(
+      SettingsCallback callback,
+      mojom::PrintSettingsResultPtr print_settings) override {
+    DVLOG(1) << "Observed: use default settings";
+    mojom::ResultCode result = print_settings->is_result_code()
+                                   ? print_settings->get_result_code()
+                                   : mojom::ResultCode::kSuccess;
+    callbacks_->error_check_callback.Run(result);
+    PrinterQueryOop::OnDidUseDefaultSettings(std::move(callback),
+                                             std::move(print_settings));
+    callbacks_->did_use_default_settings_callback.Run(result);
+  }
+
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+  void OnDidAskUserForSettings(
+      SettingsCallback callback,
+      mojom::PrintSettingsResultPtr print_settings) override {
+    DVLOG(1) << "Observed: ask user for settings";
+    mojom::ResultCode result = print_settings->is_result_code()
+                                   ? print_settings->get_result_code()
+                                   : mojom::ResultCode::kSuccess;
+    callbacks_->error_check_callback.Run(result);
+    PrinterQueryOop::OnDidAskUserForSettings(std::move(callback),
+                                             std::move(print_settings));
+    callbacks_->did_ask_user_for_settings_callback.Run(result);
+  }
+#endif  // BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+
+  std::unique_ptr<PrintJobWorkerOop> CreatePrintJobWorker(
+      PrintJob* print_job) override {
+    return std::make_unique<TestPrintJobWorkerOop>(
+        std::move(printing_context_delegate_), std::move(printing_context_),
+        print_job, print_target_type(), simulate_spooling_memory_errors_,
+        callbacks_);
+  }
+
+  bool simulate_spooling_memory_errors_;
+  raw_ptr<TestPrintJobWorkerOop::PrintCallbacks> callbacks_;
+};
+#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
+
+class SystemAccessProcessPrintBrowserTestBase
+    : public PrintBrowserTest,
+      public PrintJob::Observer,
+      public PrintViewManagerBase::Observer {
+ public:
+  SystemAccessProcessPrintBrowserTestBase() = default;
+  ~SystemAccessProcessPrintBrowserTestBase() override = default;
+
+  virtual bool UseService() = 0;
+
+  // Only of interest when `UseService()` returns true.
+  virtual bool SandboxService() = 0;
+
+  void SetUp() override {
+#if BUILDFLAG(ENABLE_OOP_PRINTING)
+    if (UseService()) {
+      feature_list_.InitAndEnableFeatureWithParameters(
+          features::kEnableOopPrintDrivers,
+          {{features::kEnableOopPrintDriversJobPrint.name, "true"},
+           {features::kEnableOopPrintDriversSandbox.name,
+            SandboxService() ? "true" : "false"}});
+
+      // Safe to use `base::Unretained(this)` since this testing class
+      // necessarily must outlive all interactions from the tests which will
+      // run through `TestPrintJobWorkerOop`, the user of these callbacks.
+      test_print_job_worker_oop_callbacks_.error_check_callback =
+          base::BindRepeating(
+              &SystemAccessProcessPrintBrowserTestBase::ErrorCheck,
+              base::Unretained(this));
+      test_print_job_worker_oop_callbacks_.did_use_default_settings_callback =
+          base::BindRepeating(
+              &SystemAccessProcessPrintBrowserTestBase::OnDidUseDefaultSettings,
+              base::Unretained(this));
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+      test_print_job_worker_oop_callbacks_.did_ask_user_for_settings_callback =
+          base::BindRepeating(
+              &SystemAccessProcessPrintBrowserTestBase::OnDidAskUserForSettings,
+              base::Unretained(this));
+#endif
+      test_print_job_worker_oop_callbacks_.did_start_printing_callback =
+          base::BindRepeating(
+              &SystemAccessProcessPrintBrowserTestBase::OnDidStartPrinting,
+              base::Unretained(this));
+#if BUILDFLAG(IS_WIN)
+      test_print_job_worker_oop_callbacks_.did_render_printed_page_callback =
+          base::BindRepeating(
+              &SystemAccessProcessPrintBrowserTestBase::OnDidRenderPrintedPage,
+              base::Unretained(this));
+#endif
+      test_print_job_worker_oop_callbacks_
+          .did_render_printed_document_callback = base::BindRepeating(
+          &SystemAccessProcessPrintBrowserTestBase::OnDidRenderPrintedDocument,
+          base::Unretained(this));
+      test_print_job_worker_oop_callbacks_.did_document_done_callback =
+          base::BindRepeating(
+              &SystemAccessProcessPrintBrowserTestBase::OnDidDocumentDone,
+              base::Unretained(this));
+      test_print_job_worker_oop_callbacks_.did_cancel_callback =
+          base::BindRepeating(
+              &SystemAccessProcessPrintBrowserTestBase::OnDidCancel,
+              base::Unretained(this));
+    } else {
+      test_print_job_worker_callbacks_.did_use_default_settings_callback =
+          base::BindRepeating(
+              &SystemAccessProcessPrintBrowserTestBase::OnUseDefaultSettings,
+              base::Unretained(this));
+      test_print_job_worker_callbacks_.did_get_settings_with_ui_callback =
+          base::BindRepeating(
+              &SystemAccessProcessPrintBrowserTestBase::OnGetSettingsWithUI,
+              base::Unretained(this));
+    }
+    test_create_printer_query_callback_ = base::BindRepeating(
+        &SystemAccessProcessPrintBrowserTestBase::CreatePrinterQuery,
+        base::Unretained(this), UseService());
+    PrinterQuery::SetCreatePrinterQueryCallbackForTest(
+        &test_create_printer_query_callback_);
+#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
+
+    PrintBrowserTest::SetUp();
+  }
+
+  void SetUpOnMainThread() override {
+#if BUILDFLAG(ENABLE_OOP_PRINTING)
+    if (UseService()) {
+      print_backend_service_ = PrintBackendServiceTestImpl::LaunchForTesting(
+          test_remote_, test_print_backend(), /*sandboxed=*/true);
+    }
+#endif
+    PrintBrowserTest::SetUpOnMainThread();
+  }
+
+  void TearDown() override {
+    PrintBrowserTest::TearDown();
+#if BUILDFLAG(ENABLE_OOP_PRINTING)
+    PrinterQuery::SetCreatePrinterQueryCallbackForTest(/*callback=*/nullptr);
+    if (UseService()) {
+      // Check that there is never a straggler client registration.
+      EXPECT_EQ(
+          PrintBackendServiceManager::GetInstance().GetClientsRegisteredCount(),
+          0u);
+    }
+    PrintBackendServiceManager::ResetForTesting();
+#endif
+    ASSERT_EQ(print_job_construction_count(), print_job_destruction_count());
+  }
+
+  // PrintViewManagerBase::Observer:
+  void OnRegisterSystemPrintClient(bool succeeded) override {
+    system_print_registration_succeeded_ = succeeded;
+  }
+
+  void OnDidPrintDocument() override {
+    ++did_print_document_count_;
+    CheckForQuit();
+  }
+
+  // PrintJob::Observer:
+  void OnDestruction() override {
+    ++print_job_destruction_count_;
+    CheckForQuit();
+  }
+
+  void OnCreatedPrintJob(PrintJob* print_job) {
+    ++print_job_construction_count_;
+    print_job->AddObserver(*this);
+  }
+
+  void SetUpPrintViewManager(content::WebContents* web_contents) {
+    auto manager = std::make_unique<TestPrintViewManager>(
+        web_contents,
+        base::BindRepeating(
+            &SystemAccessProcessPrintBrowserTestBase::OnCreatedPrintJob,
+            base::Unretained(this)));
+    manager->AddObserver(*this);
+    web_contents->SetUserData(PrintViewManager::UserDataKey(),
+                              std::move(manager));
+  }
+
+  void PrintAfterPreviewIsReadyAndLoaded() {
+    // First invoke the Print Preview dialog with `StartPrint()`.
+    TestPrintPreviewObserver print_preview_observer(/*wait_for_loaded=*/true);
+    StartPrint(browser()->tab_strip_model()->GetActiveWebContents(),
+               /*print_renderer=*/mojo::NullAssociatedRemote(),
+               /*print_preview_disabled=*/false,
+               /*has_selection=*/false);
+    content::WebContents* preview_dialog =
+        print_preview_observer.WaitUntilPreviewIsReadyAndReturnPreviewDialog();
+    ASSERT_TRUE(preview_dialog);
+
+    set_rendered_page_count(print_preview_observer.rendered_page_count());
+
+    // Print Preview is completely ready, can now initiate printing.
+    // This script locates and clicks the Print button.
+    const char kScript[] = R"(
+      const button = document.getElementsByTagName('print-preview-app')[0]
+                       .$['sidebar']
+                       .shadowRoot.querySelector('print-preview-button-strip')
+                       .shadowRoot.querySelector('.action-button');
+      button.click();)";
+    ASSERT_TRUE(content::ExecuteScript(preview_dialog, kScript));
+    WaitUntilCallbackReceived();
+  }
+
+#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
+  void SystemPrintFromPreviewOnceReadyAndLoaded(bool wait_for_callback) {
+    // First invoke the Print Preview dialog with `StartPrint()`.
+    TestPrintPreviewObserver print_preview_observer(/*wait_for_loaded=*/true);
+    StartPrint(browser()->tab_strip_model()->GetActiveWebContents(),
+               /*print_renderer=*/mojo::NullAssociatedRemote(),
+               /*print_preview_disabled=*/false,
+               /*has_selection=*/false);
+    content::WebContents* preview_dialog =
+        print_preview_observer.WaitUntilPreviewIsReadyAndReturnPreviewDialog();
+    ASSERT_TRUE(preview_dialog);
+
+    set_rendered_page_count(print_preview_observer.rendered_page_count());
+
+    // Print Preview is completely ready, can now initiate printing.
+    // This script locates and clicks the "Print using system dialog",
+    // which is still enabled even if it is hidden.
+    const char kPrintWithSystemDialogScript[] = R"(
+      const printSystemDialog
+          = document.getElementsByTagName('print-preview-app')[0]
+              .$['sidebar']
+              .shadowRoot.querySelector('print-preview-link-container')
+              .$['systemDialogLink'];
+        printSystemDialog.click();)";
+    // It is possible for sufficient processing for the system print to
+    // complete such that the renderer naturally terminates before ExecJs()
+    // returns here.  This causes ExecJs() to return false, with a JavaScript
+    // error of "Renderer terminated".  Since the termination can actually be
+    // a result of successful print processing, do not assert on this return
+    // result, just ignore the error instead.  Rely upon tests catching any
+    // failure through the use of other expectation checks.
+    std::ignore = content::ExecJs(preview_dialog, kPrintWithSystemDialogScript);
+    if (wait_for_callback) {
+      WaitUntilCallbackReceived();
+    }
+  }
+#endif  // BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
+
+  void PrimeAsRepeatingErrorGenerator() { reset_errors_after_check_ = false; }
+
+#if BUILDFLAG(ENABLE_OOP_PRINTING)
+  void PrimeForSpoolingSharedMemoryErrors() {
+    simulate_spooling_memory_errors_ = true;
+  }
+
+  void PrimeForFailInUseDefaultSettings() {
+    test_printing_context_factory()->SetFailErrorOnUseDefaultSettings();
+  }
+
+#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
+  void PrimeForCancelInAskUserForSettings() {
+    test_printing_context_factory()->SetCancelErrorOnAskUserForSettings();
+  }
+#endif
+
+  void PrimeForCancelInNewDocument() {
+    test_printing_context_factory()->SetCancelErrorOnNewDocument(
+        /*cause_errors=*/true);
+  }
+
+  void PrimeForErrorsInNewDocument() {
+    test_printing_context_factory()->SetFailedErrorOnNewDocument(
+        /*cause_errors=*/true);
+  }
+
+  void PrimeForAccessDeniedErrorsInNewDocument() {
+    test_printing_context_factory()->SetAccessDeniedErrorOnNewDocument(
+        /*cause_errors=*/true);
+  }
+
+#if BUILDFLAG(IS_WIN)
+  void PrimeForAccessDeniedErrorsInRenderPrintedPage() {
+    test_printing_context_factory()->SetAccessDeniedErrorOnRenderPage(
+        /*cause_errors=*/true);
+  }
+
+  void PrimeForDelayedRenderingUntilPage(uint32_t page_number) {
+    print_backend_service_->set_rendering_delayed_until_page(page_number);
+  }
+
+  void PrimeForRenderingErrorOnPage(uint32_t page_number) {
+    test_printing_context_factory()->SetFailedErrorForRenderPage(page_number);
+  }
+#endif
+
+  void PrimeForAccessDeniedErrorsInRenderPrintedDocument() {
+    test_printing_context_factory()->SetAccessDeniedErrorOnRenderDocument(
+        /*cause_errors=*/true);
+  }
+
+  void PrimeForAccessDeniedErrorsInDocumentDone() {
+    test_printing_context_factory()->SetAccessDeniedErrorOnDocumentDone(
+        /*cause_errors=*/true);
+  }
+
+  const absl::optional<bool> system_print_registration_succeeded() const {
+    return system_print_registration_succeeded_;
+  }
+
+  bool did_use_default_settings() const { return did_use_default_settings_; }
+
+  bool did_get_settings_with_ui() const { return did_get_settings_with_ui_; }
+
+  bool print_backend_service_use_detected() const {
+    return print_backend_service_use_detected_;
+  }
+#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
+
+  mojom::ResultCode use_default_settings_result() const {
+    return use_default_settings_result_;
+  }
+
+#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
+  mojom::ResultCode ask_user_for_settings_result() const {
+    return ask_user_for_settings_result_;
+  }
+#endif
+
+  mojom::ResultCode start_printing_result() const {
+    return start_printing_result_;
+  }
+
+#if BUILDFLAG(IS_WIN)
+  mojom::ResultCode render_printed_page_result() const {
+    return render_printed_page_result_;
+  }
+  int render_printed_page_count() const { return render_printed_pages_count_; }
+#endif  // BUILDFLAG(IS_WIN)
+
+  mojom::ResultCode render_printed_document_result() {
+    return render_printed_document_result_;
+  }
+
+  mojom::ResultCode document_done_result() const {
+    return document_done_result_;
+  }
+
+  int cancel_count() const { return cancel_count_; }
+
+  int print_job_construction_count() const {
+    return print_job_construction_count_;
+  }
+  int print_job_destruction_count() const {
+    return print_job_destruction_count_;
+  }
+  int did_print_document_count() const { return did_print_document_count_; }
+
+ private:
+#if BUILDFLAG(ENABLE_OOP_PRINTING)
+  std::unique_ptr<PrinterQuery> CreatePrinterQuery(
+      bool use_service,
+      content::GlobalRenderFrameHostId rfh_id) {
+    if (use_service) {
+      return std::make_unique<TestPrinterQueryOop>(
+          rfh_id, simulate_spooling_memory_errors_,
+          &test_print_job_worker_oop_callbacks_);
+    }
+    return std::make_unique<TestPrinterQuery>(
+        rfh_id, &test_print_job_worker_callbacks_);
+  }
+
+  void OnUseDefaultSettings() {
+    did_use_default_settings_ = true;
+    PrintBackendServiceDetectionCheck();
+    CheckForQuit();
+  }
+
+  void OnGetSettingsWithUI() {
+    did_get_settings_with_ui_ = true;
+    PrintBackendServiceDetectionCheck();
+    CheckForQuit();
+  }
+
+  void PrintBackendServiceDetectionCheck() {
+    // Want to know if `PrintBackendService` clients are ever detected, since
+    // registrations could have gone away by the time checks are made at the
+    // end of tests.
+    if (PrintBackendServiceManager::GetInstance().GetClientsRegisteredCount() >
+        0) {
+      print_backend_service_use_detected_ = true;
+    }
+  }
+#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
+
+  void ErrorCheck(mojom::ResultCode result) {
+    // Interested to reset any trigger for causing access-denied errors, so
+    // that retry logic has a chance to be exercised and succeed.
+    if (result == mojom::ResultCode::kAccessDenied) {
+      ResetForNoAccessDeniedErrors();
+    }
+  }
+
+  void OnDidUseDefaultSettings(mojom::ResultCode result) {
+    use_default_settings_result_ = result;
+    CheckForQuit();
+  }
+
+#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
+  void OnDidAskUserForSettings(mojom::ResultCode result) {
+    ask_user_for_settings_result_ = result;
+    CheckForQuit();
+  }
+#endif
+
+  void OnDidStartPrinting(mojom::ResultCode result) {
+    start_printing_result_ = result;
+    CheckForQuit();
+  }
+
+#if BUILDFLAG(IS_WIN)
+  void OnDidRenderPrintedPage(uint32_t page_number, mojom::ResultCode result) {
+    render_printed_page_result_ = result;
+    if (result == mojom::ResultCode::kSuccess) {
+      render_printed_pages_count_++;
+    }
+    CheckForQuit();
+  }
+#endif
+
+  void OnDidRenderPrintedDocument(mojom::ResultCode result) {
+    render_printed_document_result_ = result;
+    CheckForQuit();
+  }
+
+  void OnDidDocumentDone(mojom::ResultCode result) {
+    document_done_result_ = result;
+    CheckForQuit();
+  }
+
+  void OnDidCancel() {
+    ++cancel_count_;
+    CheckForQuit();
+  }
+
+  void OnDidDestroyPrintJob() {
+    ++print_job_destruction_count_;
+    CheckForQuit();
+  }
+
+  void ResetForNoAccessDeniedErrors() {
+    // Don't do the reset if test scenario is repeatedly return errors.
+    if (!reset_errors_after_check_) {
+      return;
+    }
+
+    test_printing_context_factory()->SetAccessDeniedErrorOnNewDocument(
+        /*cause_errors=*/false);
+#if BUILDFLAG(IS_WIN)
+    test_printing_context_factory()->SetAccessDeniedErrorOnRenderPage(
+        /*cause_errors=*/false);
+#endif
+    test_printing_context_factory()->SetAccessDeniedErrorOnRenderDocument(
+        /*cause_errors=*/false);
+    test_printing_context_factory()->SetAccessDeniedErrorOnDocumentDone(
+        /*cause_errors=*/false);
+  }
+
+  base::test::ScopedFeatureList feature_list_;
+#if BUILDFLAG(ENABLE_OOP_PRINTING)
+  TestPrinterQuery::PrintCallbacks test_print_job_worker_callbacks_;
+  TestPrintJobWorkerOop::PrintCallbacks test_print_job_worker_oop_callbacks_;
+  CreatePrinterQueryCallback test_create_printer_query_callback_;
+  absl::optional<bool> system_print_registration_succeeded_;
+  bool did_use_default_settings_ = false;
+  bool did_get_settings_with_ui_ = false;
+  bool print_backend_service_use_detected_ = false;
+  bool simulate_spooling_memory_errors_ = false;
+  mojo::Remote<mojom::PrintBackendService> test_remote_;
+  std::unique_ptr<PrintBackendServiceTestImpl> print_backend_service_;
+#endif  // BUILDFLAG(ENABLE_OOP_PRINTING)
+  bool reset_errors_after_check_ = true;
+  int did_print_document_count_ = 0;
+  mojom::ResultCode use_default_settings_result_ = mojom::ResultCode::kFailed;
+#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
+  mojom::ResultCode ask_user_for_settings_result_ = mojom::ResultCode::kFailed;
+#endif
+  mojom::ResultCode start_printing_result_ = mojom::ResultCode::kFailed;
+#if BUILDFLAG(IS_WIN)
+  mojom::ResultCode render_printed_page_result_ = mojom::ResultCode::kFailed;
+  int render_printed_pages_count_ = 0;
+#endif
+  mojom::ResultCode render_printed_document_result_ =
+      mojom::ResultCode::kFailed;
+  mojom::ResultCode document_done_result_ = mojom::ResultCode::kFailed;
+  int cancel_count_ = 0;
+  int print_job_construction_count_ = 0;
+  int print_job_destruction_count_ = 0;
+};
+
+class SystemAccessProcessSandboxedServicePrintBrowserTest
+    : public SystemAccessProcessPrintBrowserTestBase {
+ public:
+  SystemAccessProcessSandboxedServicePrintBrowserTest() = default;
+  ~SystemAccessProcessSandboxedServicePrintBrowserTest() override = default;
+
+  bool UseService() override { return true; }
+  bool SandboxService() override { return true; }
+};
+
+#if BUILDFLAG(ENABLE_OOP_PRINTING)
+
+class SystemAccessProcessServicePrintBrowserTest
+    : public SystemAccessProcessPrintBrowserTestBase,
+      public testing::WithParamInterface<bool> {
+ public:
+  SystemAccessProcessServicePrintBrowserTest() = default;
+  ~SystemAccessProcessServicePrintBrowserTest() override = default;
+
+  bool UseService() override { return true; }
+  bool SandboxService() override { return GetParam(); }
+};
+
+INSTANTIATE_TEST_SUITE_P(All,
+                         SystemAccessProcessServicePrintBrowserTest,
+                         testing::Bool());
+
+#endif
+
+class SystemAccessProcessInBrowserPrintBrowserTest
+    : public SystemAccessProcessPrintBrowserTestBase {
+ public:
+  SystemAccessProcessInBrowserPrintBrowserTest() = default;
+  ~SystemAccessProcessInBrowserPrintBrowserTest() override = default;
+
+  bool UseService() override { return false; }
+  bool SandboxService() override { return false; }
+};
+
+enum class PrintBackendFeatureVariation {
+  // `PrintBackend` calls occur from browser process.
+  kInBrowserProcess,
+  // Use OOP `PrintBackend`.  Attempt to have `PrintBackendService` be
+  // sandboxed.
+  kOopSandboxedService,
+  // Use OOP `PrintBackend`.  Always use `PrintBackendService` unsandboxed.
+  kOopUnsandboxedService,
+};
+
+class SystemAccessProcessPrintBrowserTest
+    : public SystemAccessProcessPrintBrowserTestBase,
+      public testing::WithParamInterface<PrintBackendFeatureVariation> {
+ public:
+  SystemAccessProcessPrintBrowserTest() = default;
+  ~SystemAccessProcessPrintBrowserTest() override = default;
+
+  bool UseService() override {
+    return GetParam() != PrintBackendFeatureVariation::kInBrowserProcess;
+  }
+  bool SandboxService() override {
+    return GetParam() == PrintBackendFeatureVariation::kOopSandboxedService;
+  }
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    SystemAccessProcessPrintBrowserTest,
+    testing::Values(PrintBackendFeatureVariation::kInBrowserProcess,
+                    PrintBackendFeatureVariation::kOopSandboxedService,
+                    PrintBackendFeatureVariation::kOopUnsandboxedService));
+
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessPrintBrowserTest,
+                       UpdatePrintSettings) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/multipage.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  TestPrintViewManager print_view_manager(web_contents);
+  PrintViewManager::SetReceiverImplForTesting(&print_view_manager);
+
+  PrintAndWaitUntilPreviewIsReady();
+
+  EXPECT_EQ(3u, rendered_page_count());
+
+  const mojom::PrintPagesParamsPtr& snooped_params =
+      print_view_manager.snooped_params();
+  ASSERT_TRUE(snooped_params);
+  EXPECT_EQ(kTestPrinterCapabilitiesDpi, snooped_params->params->dpi);
+  EXPECT_EQ(kPhysicalSize, snooped_params->params->page_size);
+  EXPECT_EQ(kPrintableArea, snooped_params->params->printable_area);
+  EXPECT_EQ(kExpectedContentSize, snooped_params->params->content_size);
+}
+
+#if BUILDFLAG(ENABLE_OOP_PRINTING)
+
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
+                       StartPrinting) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  // The expected events for this are:
+  // 1.  A print job is started.
+  // 2.  Rendering for 1 page of document of content.
+  // 3.  Completes with document done.
+  // 4.  Wait for the one print job to be destroyed, to ensure printing
+  //    finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/4);
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
+#if BUILDFLAG(IS_WIN)
+  // TODO(crbug.com/1008222)  Include Windows coverage of
+  // RenderPrintedDocument() once XPS print pipeline is added.
+  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(render_printed_page_count(), 1);
+#else
+  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kSuccess);
+#endif
+  EXPECT_EQ(document_done_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(error_dialog_shown_count(), 0u);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+
+#if BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_CUPS)
+  absl::optional<PrintSettings> settings = document_print_settings();
+  ASSERT_TRUE(settings);
+  // Collect just the keys to compare the info options vs. advanced settings.
+  std::vector<std::string> advanced_setting_keys;
+  std::vector<std::string> print_info_options_keys;
+  const PrintSettings::AdvancedSettings& advanced_settings =
+      settings->advanced_settings();
+  for (const auto& advanced_setting : advanced_settings) {
+    advanced_setting_keys.push_back(advanced_setting.first);
+  }
+  for (const auto& option : kTestDummyPrintInfoOptions) {
+    print_info_options_keys.push_back(option.first);
+  }
+  EXPECT_THAT(advanced_setting_keys,
+              testing::UnorderedElementsAreArray(print_info_options_keys));
+#endif  // BUILDFLAG(IS_LINUX) && BUILDFLAG(USE_CUPS)
+}
+
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
+                       StartPrintingMultipage) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/multipage.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+#if BUILDFLAG(IS_WIN)
+  // Windows GDI results in a callback for each rendered page.
+  // The expected events for this are:
+  // 1.  A print job is started.
+  // 2.  First page is rendered.
+  // 3.  Second page is rendered.
+  // 4.  Third page is rendered.
+  // 5.  Completes with document done.
+  // 6.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  // TODO(crbug.com/1008222)  Include Windows coverage of
+  // RenderPrintedDocument() once XPS print pipeline is added.
+  SetNumExpectedMessages(/*num=*/6);
+#else
+  // The expected events for this are:
+  // 1.  A print job is started.
+  // 2.  Document is rendered.
+  // 3.  Completes with document done.
+  // 4.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/4);
+#endif
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
+#if BUILDFLAG(IS_WIN)
+  // TODO(crbug.com/1008222)  Include Windows coverage of
+  // RenderPrintedDocument() once XPS print pipeline is added.
+  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(render_printed_page_count(), 3);
+#else
+  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kSuccess);
+#endif
+  EXPECT_EQ(document_done_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(error_dialog_shown_count(), 0u);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
+                       StartPrintingSpoolingSharedMemoryError) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeForSpoolingSharedMemoryErrors();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  // No attempt to retry is made if a job has a shared memory error when trying
+  // to spool a page/document fails on a shared memory error.  The test
+  // sequence for this is:
+  // 1.  A print job is started.
+  // 2.  Spooling to send the render data will fail.  An error dialog is shown.
+  // 3.  The print job is canceled.  The callback from the service could occur
+  //     after the print job has been destroyed.
+  // 4.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/4);
+
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(error_dialog_shown_count(), 1u);
+  EXPECT_EQ(cancel_count(), 1);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+// TODO(crbug.com/1384459): Flaky on MSan builds.
+#if defined(MEMORY_SANITIZER)
+#define MAYBE_StartPrintingFails DISABLED_StartPrintingFails
+#else
+#define MAYBE_StartPrintingFails StartPrintingFails
+#endif
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessPrintBrowserTest,
+                       MAYBE_StartPrintingFails) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeForErrorsInNewDocument();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) {
+    // There are no callbacks for print stages with in-browser printing.  So
+    // the print job is started, but that fails, and there is no capturing of
+    // that result.
+    // The expected events for this are:
+    // 1.  An error dialog is shown.
+    // 2.  Wait for the one print job to be destroyed, to ensure printing
+    //     finished cleanly before completing the test.
+    SetNumExpectedMessages(/*num=*/2);
+  } else {
+    // The expected events for this are:
+    // 1.  A print job is started, but that fails.
+    // 2.  An error dialog is shown.
+    // 3.  The print job is canceled.  The callback from the service could occur
+    //     after the print job has been destroyed.
+    // 4.  Wait for the one print job to be destroyed, to ensure printing
+    //     finished cleanly before completing the test.
+    SetNumExpectedMessages(/*num=*/4);
+  }
+
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kFailed);
+  EXPECT_EQ(error_dialog_shown_count(), 1u);
+  // No tracking of cancel for in-browser tests, only for OOP.
+  if (GetParam() != PrintBackendFeatureVariation::kInBrowserProcess) {
+    EXPECT_EQ(cancel_count(), 1);
+  }
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessPrintBrowserTest,
+                       StartPrintingCanceled) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeForCancelInNewDocument();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) {
+    // A print job is started, but results in a cancel.  There are no callbacks
+    // to notice the start job.  The expected events for this are:
+    // 1.  Wait for the one print job to be destroyed, to ensure printing
+    //     finished cleanly before completing the test.
+    SetNumExpectedMessages(/*num=*/1);
+  } else {
+    // The expected events for this are:
+    // 1.  A print job is started, but results in a cancel.
+    // 2.  The print job is canceled.
+    // 3.  Wait for the one print job to be destroyed, to ensure printing
+    //     finished cleanly before completing the test.
+    SetNumExpectedMessages(/*num=*/3);
+  }
+
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  // No tracking of start printing or cancel callbacks for in-browser tests,
+  // only for OOP.
+  if (GetParam() != PrintBackendFeatureVariation::kInBrowserProcess) {
+    EXPECT_EQ(start_printing_result(), mojom::ResultCode::kCanceled);
+    EXPECT_EQ(cancel_count(), 1);
+  }
+  EXPECT_EQ(error_dialog_shown_count(), 0u);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
+                       StartPrintingAccessDenied) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeForAccessDeniedErrorsInNewDocument();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  // The expected events for this are:
+  // 1.  A print job is started, but has an access-denied error.
+  // 2.  A retry to start the print job with adjusted access will succeed.
+  // 3.  Rendering for 1 page of document of content.
+  // 4.  Completes with document done.
+  // 5.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/5);
+
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
+#if BUILDFLAG(IS_WIN)
+  // TODO(crbug.com/1008222)  Include Windows coverage of
+  // RenderPrintedDocument() once XPS print pipeline is added.
+  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(render_printed_page_count(), 1);
+#else
+  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kSuccess);
+#endif
+  EXPECT_EQ(document_done_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(error_dialog_shown_count(), 0u);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
+                       StartPrintingRepeatedAccessDenied) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeAsRepeatingErrorGenerator();
+  PrimeForAccessDeniedErrorsInNewDocument();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  // Test of a misbehaving printer driver which only returns access-denied
+  // errors.  The expected events for this are:
+  // 1.  A print job is started, but has an access-denied error.
+  // 2.  A retry to start the print job with adjusted access will still fail.
+  // 3.  An error dialog is shown.
+  // 4.  The print job is canceled.  The callback from the service could occur
+  //     after the print job has been destroyed.
+  // 5.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/5);
+
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kAccessDenied);
+  EXPECT_EQ(error_dialog_shown_count(), 1u);
+  EXPECT_EQ(cancel_count(), 1);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+#if BUILDFLAG(IS_WIN)
+IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
+                       StartPrintingRenderPageAccessDenied) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeForAccessDeniedErrorsInRenderPrintedPage();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  // No attempt to retry is made if an access-denied error occurs when trying
+  // to render a page.  The expected events for this are:
+  // 1.  A print job is started.
+  // 2.  Rendering for 1 page of document of content fails with access denied.
+  // 3.  An error dialog is shown.
+  // 4.  The print job is canceled.  The callback from the service could occur
+  //     after the print job has been destroyed.
+  // 5.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/5);
+
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kAccessDenied);
+  EXPECT_EQ(render_printed_page_count(), 0);
+  EXPECT_EQ(error_dialog_shown_count(), 1u);
+  EXPECT_EQ(cancel_count(), 1);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
+                       StartPrintingMultipageMidJobError) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  // Delay rendering until all pages have been sent, to avoid any race
+  // conditions related to error handling.  This is to ensure that page 3 is in
+  // the service queued for processing, before we let page 2 be processed and
+  // have it trigger an error that could affect page 3 processing.
+  PrimeForDelayedRenderingUntilPage(/*page_number=*/3);
+  PrimeForRenderingErrorOnPage(/*page_number=*/2);
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/multipage.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  // The expected events for this are:
+  // 1.  Start the print job.
+  // 2.  First page render callback shows success.
+  // 3.  Second page render callback shows failure.  Will start failure
+  //     processing to cancel the print job.
+  // 4.  A printing error dialog is displayed.
+  // 5.  Third page render callback will show it was canceled (due to prior
+  //     failure).  This is disregarded by the browser, since the job has
+  //     already been canceled.
+  // 6.  The print job is canceled.  The callback from the service could occur
+  //     after the print job has been destroyed.
+  // 7.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/7);
+
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
+  // First failure page is `kFailed`, but is followed by another page with
+  // status `kCanceled`.
+  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kCanceled);
+  EXPECT_EQ(render_printed_page_count(), 1);
+  EXPECT_EQ(error_dialog_shown_count(), 1u);
+  EXPECT_EQ(cancel_count(), 1);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+#endif  // BUILDFLAG(IS_WIN)
+
+// TODO(crbug.com/1008222)  Include Windows once XPS print pipeline is added.
+#if !BUILDFLAG(IS_WIN)
+IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
+                       StartPrintingRenderDocumentAccessDenied) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeForAccessDeniedErrorsInRenderPrintedDocument();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  // No attempt to retry is made if an access-denied error occurs when trying
+  // to render a document.  The expected events for this are:
+  // 1.  A print job is started.
+  // 2.  Rendering for 1 page of document of content fails with access denied.
+  // 3.  An error dialog is shown.
+  // 4.  The print job is canceled.  The callback from the service could occur
+  //     after the print job has been destroyed.
+  // 5.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/5);
+
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kAccessDenied);
+  EXPECT_EQ(error_dialog_shown_count(), 1u);
+  EXPECT_EQ(cancel_count(), 1);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+#endif  // !BUILDFLAG(IS_WIN)
+
+IN_PROC_BROWSER_TEST_F(SystemAccessProcessSandboxedServicePrintBrowserTest,
+                       StartPrintingDocumentDoneAccessDenied) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeForAccessDeniedErrorsInDocumentDone();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  // No attempt to retry is made if an access-denied error occurs when trying
+  // do wrap-up a rendered document.  The expected events are:
+  // 1.  A print job is started.
+  // 2.  Rendering for 1 page of document of content.
+  // 3.  Document done results in an access-denied error.
+  // 4.  An error dialog is shown.
+  // 5.  The print job is canceled.  The callback from the service could occur
+  //     after the print job has been destroyed.
+  // 6.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/6);
+
+  PrintAfterPreviewIsReadyAndLoaded();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
+#if BUILDFLAG(IS_WIN)
+  // TODO(crbug.com/1008222)  Include Windows coverage of
+  // RenderPrintedDocument() once XPS print pipeline is added.
+  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(render_printed_page_count(), 1);
+#else
+  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kSuccess);
+#endif
+  EXPECT_EQ(document_done_result(), mojom::ResultCode::kAccessDenied);
+  EXPECT_EQ(error_dialog_shown_count(), 1u);
+  EXPECT_EQ(cancel_count(), 1);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+#if BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
+
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessPrintBrowserTest,
+                       SystemPrintFromPrintPreview) {
+  // TODO(crbug.com/1393505)  Enable OOP test coverage once underlying
+  // printing stack updates to support this scenario with out-of-process are
+  // in place.
+  if (GetParam() != PrintBackendFeatureVariation::kInBrowserProcess) {
+    GTEST_SKIP() << "Skipping test for out-of-process, which is known to crash "
+                    "when transitioning to system print from print preview";
+  }
+
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) {
+#if BUILDFLAG(IS_WIN)
+    // There are no callbacks that trigger for print stages with in-browser
+    // printing for the Windows case.  The only expected event for this is to
+    // wait for the one print job to be destroyed, to ensure printing finished
+    // cleanly before completing the test.
+    SetNumExpectedMessages(/*num=*/1);
+#else
+    // Once the transition to system print is initiated, the expected events
+    // are:
+    // 1.  Use default settings.
+    // 2.  Ask the user for settings.
+    // 3.  Wait until all processing for DidPrintDocument is known to have
+    //     completed, to ensure printing finished cleanly before completing the
+    //     test.
+    // 4.  Wait for the one print job to be destroyed, to ensure printing
+    //     finished cleanly before completing the test.
+    SetNumExpectedMessages(/*num=*/4);
+#endif  // BUILDFLAG(IS_WIN)
+  } else {
+    // TODO(crbug.com/1393505)  Fill in expected events once the printing stack
+    // updates to support this scenario with out-of-process are in place.
+  }
+  SystemPrintFromPreviewOnceReadyAndLoaded(/*wait_for_callback=*/true);
+
+#if !BUILDFLAG(IS_WIN)
+  if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) {
+    EXPECT_TRUE(did_get_settings_with_ui());
+    EXPECT_EQ(did_print_document_count(), 1);
+  } else {
+    // TODO(crbug.com/1393505)  Fill in expectations once the printing stack
+    // updates to support this scenario with out-of-process are in place.
+  }
+#endif
+  ASSERT_EQ(*MakeUserModifiedPrintSettings("printer1"),
+            *document_print_settings());
+  EXPECT_EQ(error_dialog_shown_count(), 0u);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
+                       StartBasicPrint) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+  // The expected events for this are:
+  // 1.  Get the default settings.
+  // 2.  Ask the user for settings.
+  // 3.  A print job is started.
+  // 4.  The print compositor will complete generating the document.
+  // 5.  The document is rendered.
+  // 6.  Receive document done notification.
+  // 7.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/7);
+#else
+  // The expected events for this are:
+  // 1.  Get default settings, followed by asking user for settings.  This is
+  //     invoked from the browser process, so there is no override to observe
+  //     this.  Then a print job is started.
+  // 2.  The print compositor will complete generating the document.
+  // 3.  The document is rendered.
+  // 4.  Receive document done notification.
+  // 5.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/5);
+#endif
+
+  StartBasicPrint(web_contents);
+
+  WaitUntilCallbackReceived();
+
+  // macOS and Linux currently have to invoke a system dialog from within the
+  // browser process.  There is not a callback to capture the result in these
+  // cases.
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+  EXPECT_EQ(use_default_settings_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(ask_user_for_settings_result(), mojom::ResultCode::kSuccess);
+#endif
+  // TODO(crbug.com/1414968)  Correct expectation once system print settings
+  // are properly reflected at start of job print.
+  ASSERT_NE(*MakeUserModifiedPrintSettings("printer1"),
+            *document_print_settings());
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kSuccess);
+#if BUILDFLAG(IS_WIN)
+  // TODO(crbug.com/1008222)  Include Windows coverage of
+  // RenderPrintedDocument() once XPS print pipeline is added.
+  EXPECT_EQ(render_printed_page_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(render_printed_page_count(), 1);
+#else
+  EXPECT_EQ(render_printed_document_result(), mojom::ResultCode::kSuccess);
+#endif
+  EXPECT_EQ(document_done_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(error_dialog_shown_count(), 0u);
+  EXPECT_EQ(did_print_document_count(), 1);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+// TODO(crbug.com/1375007): Very flaky on Mac and slightly on Linux.
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#define MAYBE_StartBasicPrintCancel DISABLED_StartBasicPrintCancel
+#else
+#define MAYBE_StartBasicPrintCancel StartBasicPrintCancel
+#endif
+IN_PROC_BROWSER_TEST_F(SystemAccessProcessInBrowserPrintBrowserTest,
+                       MAYBE_StartBasicPrintCancel) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeForCancelInAskUserForSettings();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+  // The expected events for this are:
+  // 1.  Get the default settings.
+  // 2.  Ask the user for settings, which indicates to cancel the print
+  //     request.  No further printing calls are made.
+  // No print job is created because of such an early cancel.
+  SetNumExpectedMessages(/*num=*/2);
+#else
+  // TODO(crbug.com/1375007)  Need a good signal to use for test expectations.
+#endif
+
+  StartBasicPrint(web_contents);
+
+  WaitUntilCallbackReceived();
+
+  EXPECT_TRUE(did_use_default_settings());
+  EXPECT_TRUE(did_get_settings_with_ui());
+  EXPECT_EQ(error_dialog_shown_count(), 0u);
+  EXPECT_EQ(did_print_document_count(), 0);
+  EXPECT_EQ(print_job_destruction_count(), 0);
+
+  // `PrintBackendService` should never be used when printing in-browser.
+  EXPECT_FALSE(print_backend_service_use_detected());
+}
+
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessPrintBrowserTest,
+                       StartBasicPrintFails) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeForErrorsInNewDocument();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  if (GetParam() == PrintBackendFeatureVariation::kInBrowserProcess) {
+    // There are only partial overrides to track most steps in the printing
+    // pipeline, so the expected events for this are:
+    // 1.  Gets default settings.
+    // 2.  Asks user for settings.
+    // 3.  A print job is started, but that fails.  There is no override to
+    //     this notice directly.  This does cause an error dialog to be shown.
+    // 4.  Wait for the one print job to be destroyed, to ensure printing
+    //     finished cleanly before completing the test.
+    // 5.  The renderer will have initiated printing of document, which could
+    //     invoke the print compositor.  Wait until all processing for
+    //     DidPrintDocument is known to have completed, to ensure printing
+    //     finished cleanly before completing the test.
+    SetNumExpectedMessages(/*num=*/5);
+  } else {
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+    // The expected events for this are:
+    // 1.  Gets default settings.
+    // 2.  Asks user for settings.
+    // 3.  A print job is started, which fails.
+    // 4.  An error dialog is shown.
+    // 5.  The print job is canceled.  The callback from the service could occur
+    //     after the print job has been destroyed.
+    // 6.  Wait for the one print job to be destroyed, to ensure printing
+    //     finished cleanly before completing the test.
+    // 7.  The renderer will have initiated printing of document, which could
+    //     invoke the print compositor.  Wait until all processing for
+    //     DidPrintDocument is known to have completed, to ensure printing
+    //     finished cleanly before completing the test.
+    SetNumExpectedMessages(/*num=*/7);
+#else
+    // The expected events for this are:
+    // 1.  Get default settings, followed by asking user for settings.  This is
+    //     invoked from the browser process, so there is no override to observe
+    //     this.  Then a print job is started, which fails.
+    // 2.  An error dialog is shown.
+    // 3.  The print job is canceled.  The callback from the service could occur
+    //     after the print job has been destroyed.
+    // 4.  Wait for the one print job to be destroyed, to ensure printing
+    //     finished cleanly before completing the test.
+    // 5.  The print compositor will have started to generate the document.
+    //     Wait until that is known to have completed, to ensure printing
+    //     finished cleanly before completing the test.
+    SetNumExpectedMessages(/*num=*/5);
+#endif  // BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+  }
+
+  StartBasicPrint(web_contents);
+
+  WaitUntilCallbackReceived();
+
+  EXPECT_EQ(start_printing_result(), mojom::ResultCode::kFailed);
+  EXPECT_EQ(error_dialog_shown_count(), 1u);
+  EXPECT_EQ(
+      cancel_count(),
+      GetParam() == PrintBackendFeatureVariation::kInBrowserProcess ? 0 : 1);
+  EXPECT_EQ(did_print_document_count(), 1);
+  EXPECT_EQ(print_job_destruction_count(), 1);
+}
+
+// macOS and Linux currently have to invoke a system dialog from within the
+// browser process.  There is not a callback to capture the result in these
+// cases.
+// TODO(crbug.com/1374188)  Re-enable for Linux once `AskForUserSettings()` is
+// able to be pushed OOP for Linux.
+#undef MAYBE_StartBasicPrintCancel
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#define MAYBE_StartBasicPrintCancel DISABLED_StartBasicPrintCancel
+#else
+#define MAYBE_StartBasicPrintCancel StartBasicPrintCancel
+#endif
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
+                       MAYBE_StartBasicPrintCancel) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+  PrimeForCancelInAskUserForSettings();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  // The expected events for this are:
+  // 1.  Get the default settings.
+  // 2.  Ask the user for settings, which indicates to cancel the print
+  //     request.  No further printing calls are made.
+  // No print job is created because of such an early cancel.
+  SetNumExpectedMessages(/*num=*/2);
+
+  StartBasicPrint(web_contents);
+
+  WaitUntilCallbackReceived();
+
+  EXPECT_EQ(use_default_settings_result(), mojom::ResultCode::kSuccess);
+  EXPECT_EQ(ask_user_for_settings_result(), mojom::ResultCode::kCanceled);
+  EXPECT_EQ(error_dialog_shown_count(), 0u);
+  EXPECT_EQ(did_print_document_count(), 0);
+  EXPECT_EQ(print_job_construction_count(), 0);
+}
+
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
+                       StartBasicPrintConcurrent) {
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  TestPrintViewManager* print_view_manager =
+      TestPrintViewManager::CreateForWebContents(web_contents);
+
+  // Pretend that a window has started a system print.
+  absl::optional<PrintBackendServiceManager::ClientId> client_id =
+      PrintBackendServiceManager::GetInstance().RegisterQueryWithUiClient();
+  ASSERT_TRUE(client_id.has_value());
+
+  // Now initiate a system print that would exist concurrently with that.
+  StartBasicPrint(web_contents);
+
+  const absl::optional<bool>& result = print_view_manager->print_now_result();
+  ASSERT_TRUE(result.has_value());
+  // With the exception of Linux, concurrent system print is not allowed.
+#if BUILDFLAG(IS_LINUX)
+  EXPECT_TRUE(*result);
+#else
+  // The denied concurrent print is silent without an error.
+  EXPECT_EQ(error_dialog_shown_count(), 0u);
+  EXPECT_FALSE(*result);
+#endif
+
+  // Cleanup before test shutdown.
+  PrintBackendServiceManager::GetInstance().UnregisterClient(*client_id);
+}
+
+#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
+                       SystemPrintFromPrintPreviewConcurrent) {
+  AddPrinter("printer1");
+  SetPrinterNameForSubsequentContexts("printer1");
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+  // Pretend that another tab has started a system print.
+  // TODO(crbug.com/809738)  Improve on this test by using a persistent fake
+  // system print dialog.
+  absl::optional<PrintBackendServiceManager::ClientId> client_id =
+      PrintBackendServiceManager::GetInstance().RegisterQueryWithUiClient();
+  ASSERT_TRUE(client_id.has_value());
+
+  // Now do a print preview which will try to switch to doing system print.
+#if BUILDFLAG(IS_LINUX)
+  // The expected events for this are:
+  // 1.  Start printing.
+  // 2.  The document is rendered.
+  // 3.  Receive document done notification.
+  // 4.  Wait for the one print job to be destroyed, to ensure printing
+  //     finished cleanly before completing the test.
+  SetNumExpectedMessages(/*num=*/4);
+
+  constexpr bool kWaitForCallback = true;
+#else
+  // Inability to support this should be detected immediately without needing
+  // to wait for callback.
+  constexpr bool kWaitForCallback = false;
+#endif
+
+  SystemPrintFromPreviewOnceReadyAndLoaded(kWaitForCallback);
+
+  // With the exception of Linux, concurrent system print is not allowed.
+  ASSERT_TRUE(system_print_registration_succeeded().has_value());
+#if BUILDFLAG(IS_LINUX)
+  EXPECT_TRUE(*system_print_registration_succeeded());
+#else
+  // The denied concurrent print is silent without an error.
+  EXPECT_FALSE(*system_print_registration_succeeded());
+  EXPECT_EQ(error_dialog_shown_count(), 0u);
+#endif
+
+  // Cleanup before test shutdown.
+  PrintBackendServiceManager::GetInstance().UnregisterClient(*client_id);
+}
+#endif  // BUILDFLAG(ENABLE_PRINT_PREVIEW)
+
+IN_PROC_BROWSER_TEST_P(SystemAccessProcessServicePrintBrowserTest,
+                       StartBasicPrintUseDefaultFails) {
+  PrimeForFailInUseDefaultSettings();
+
+  ASSERT_TRUE(embedded_test_server()->Started());
+  GURL url(embedded_test_server()->GetURL("/printing/test3.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(web_contents);
+  SetUpPrintViewManager(web_contents);
+
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+  // The expected events for this are:
+  // 1.  Get the default settings, which fails.
+  // 2.  The print error dialog is shown.
+  // No print job is created from such an early failure.
+  SetNumExpectedMessages(/*num=*/2);
+#else
+  // When get default settings is invoked from the browser process, there is no
+  // override to observe this failure.  This means the expected events are:
+  // 1.  The print error dialog is shown.
+  // No print job is created from such an early failure.
+  SetNumExpectedMessages(/*num=*/1);
+#endif
+
+  StartBasicPrint(web_contents);
+
+  WaitUntilCallbackReceived();
+
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+  EXPECT_EQ(use_default_settings_result(), mojom::ResultCode::kFailed);
+#endif
+  EXPECT_EQ(error_dialog_shown_count(), 1u);
+  EXPECT_EQ(did_print_document_count(), 0);
+  EXPECT_EQ(print_job_construction_count(), 0);
+}
+#endif  // BUILDFLAG(ENABLE_BASIC_PRINT_DIALOG)
+
+#endif  //  BUILDFLAG(ENABLE_OOP_PRINTING)
+
+}  // namespace printing
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 5b8a6d2..56f143c 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -2823,12 +2823,21 @@
       ExecRotateCCW();
       break;
 
+    // When the context menu was initialized, we checked whether there were
+    // back/forward entries. Session history may have changed while the context
+    // menu was open. So we need to check `CanGoBack`/`CanGoForward` again.
     case IDC_BACK:
-      embedder_web_contents_->GetController().GoBack();
+      if (auto& controller = embedder_web_contents_->GetController();
+          controller.CanGoBack()) {
+        controller.GoBack();
+      }
       break;
 
     case IDC_FORWARD:
-      embedder_web_contents_->GetController().GoForward();
+      if (auto& controller = embedder_web_contents_->GetController();
+          controller.CanGoForward()) {
+        controller.GoForward();
+      }
       break;
 
     case IDC_SAVE_PAGE:
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
index b58a663..d9e626e4 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -2796,4 +2796,35 @@
   ASSERT_TRUE(menu3->IsItemPresent(IDC_CONTENT_CONTEXT_OPEN_IN_READING_MODE));
 }
 
+// Ensure that the context menu can tolerate changes to session history that
+// happen between menu initialization and command execution.
+IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, BackAfterBackEntryRemoved) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::NavigationController& controller = web_contents->GetController();
+
+  GURL url(embedded_test_server()->GetURL("/title1.html"));
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+
+  // At the time the context menu is created, it is possible to navigate back,
+  // so the back menu item is enabled. While the context menu is open, we
+  // navigate back to the first entry. This will make it so that there is no
+  // back entry to navigate to when clicking the back menu item.
+  base::OnceClosure nav_to_first_entry = base::BindLambdaForTesting([&]() {
+    content::TestNavigationObserver back_nav_observer(web_contents);
+    EXPECT_TRUE(controller.CanGoBack());
+    controller.GoBack();
+    back_nav_observer.Wait();
+    EXPECT_FALSE(controller.CanGoBack());
+  });
+
+  ContextMenuWaiter menu_observer(IDC_BACK, std::move(nav_to_first_entry));
+  content::SimulateMouseClickAt(web_contents, 0,
+                                blink::WebMouseEvent::Button::kRight,
+                                gfx::Point(15, 15));
+  menu_observer.WaitForMenuOpenAndClose();
+}
+
 }  // namespace
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc
index ddc69939..5af4bd1 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc
@@ -53,9 +53,15 @@
   maybe_command_to_execute_ = command_to_execute;
 }
 
-ContextMenuWaiter::~ContextMenuWaiter() {
+ContextMenuWaiter::ContextMenuWaiter(int command_to_execute,
+                                     base::OnceClosure before_execute)
+    : ContextMenuWaiter() {
+  maybe_command_to_execute_ = command_to_execute;
+  before_execute_ = std::move(before_execute);
 }
 
+ContextMenuWaiter::~ContextMenuWaiter() = default;
+
 void ContextMenuWaiter::MenuShown(RenderViewContextMenu* context_menu) {
   base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
       FROM_HERE, base::BindOnce(&ContextMenuWaiter::Cancel,
@@ -82,8 +88,12 @@
   for (size_t i = 0; i < menu_model.GetItemCount(); ++i)
     captured_command_ids_.push_back(menu_model.GetCommandIdAt(i));
 
-  if (maybe_command_to_execute_)
+  if (maybe_command_to_execute_) {
+    if (before_execute_) {
+      std::move(before_execute_).Run();
+    }
     context_menu->ExecuteCommand(*maybe_command_to_execute_, 0);
+  }
   context_menu->Cancel();
   run_loop_.Quit();
 }
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h
index 6ac2c81..5ab6f50 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h
@@ -44,6 +44,10 @@
  public:
   ContextMenuWaiter();
   explicit ContextMenuWaiter(int command_to_execute);
+  // `before_execute` will be run after the context menu is opened and before
+  // executing `command_to_execute`.
+  explicit ContextMenuWaiter(int command_to_execute,
+                             base::OnceClosure before_execute);
 
   ContextMenuWaiter(const ContextMenuWaiter&) = delete;
   ContextMenuWaiter& operator=(const ContextMenuWaiter&) = delete;
@@ -66,6 +70,7 @@
 
   base::RunLoop run_loop_;
   absl::optional<int> maybe_command_to_execute_;
+  base::OnceClosure before_execute_;
 };
 
 #endif  // CHROME_BROWSER_RENDERER_CONTEXT_MENU_RENDER_VIEW_CONTEXT_MENU_BROWSERTEST_UTIL_H_
diff --git a/chrome/browser/resources/nearby_internals/BUILD.gn b/chrome/browser/resources/nearby_internals/BUILD.gn
index e5e1e2e..5c9cc3db 100644
--- a/chrome/browser/resources/nearby_internals/BUILD.gn
+++ b/chrome/browser/resources/nearby_internals/BUILD.gn
@@ -6,15 +6,48 @@
 import("//third_party/closure_compiler/compile_js.gni")
 import("//tools/grit/grit_rule.gni")
 import("//tools/grit/preprocess_if_expr.gni")
-import("//tools/polymer/html_to_js.gni")
+import("//tools/polymer/css_to_wrapper.gni")
+import("//tools/polymer/html_to_wrapper.gni")
 import("//ui/webui/resources/tools/generate_grd.gni")
 
 assert(is_chromeos_ash)
 
-preprocess_folder = "preprocessed"
+preprocess_folder = "$target_gen_dir/preprocessed"
 preprocess_manifest = "preprocessed_manifest.json"
 preprocess_gen_manifest = "preprocessed_gen_manifest.json"
 
+web_component_files = [
+  "contact_object.js",
+  "contact_tab.js",
+  "http_message_object.js",
+  "http_tab.js",
+  "log_object.js",
+  "logging_tab.js",
+  "nearby_internals.js",
+  "ui_trigger_list_object.js",
+  "ui_trigger_tab.js",
+]
+
+# Files that are passed as input to html_to_wrapper().
+html_files = []
+foreach(f, web_component_files) {
+  html_files += [ string_replace(f, ".js", ".html") ]
+}
+
+# Files that are generated by html_to_wrapper().
+html_wrapper_files = []
+foreach(f, html_files) {
+  html_wrapper_files += [ f + ".js" ]
+}
+
+css_files = [ "shared_style.css" ]
+
+# Files that are generated by css_to_wrapper().
+css_wrapper_files = []
+foreach(f, css_files) {
+  css_wrapper_files += [ f + ".js" ]
+}
+
 generate_grd("build_grd") {
   grd_prefix = "nearby_internals"
   out_grd = "$target_gen_dir/${grd_prefix}_resources.grd"
@@ -23,7 +56,7 @@
 
   deps = [
     ":preprocess",
-    ":preprocess_generated",
+    ":preprocess_html_css_files",
   ]
   manifest_files = [
     "$target_gen_dir/$preprocess_manifest",
@@ -32,35 +65,27 @@
 }
 
 preprocess_if_expr("preprocess") {
-  out_folder = "$target_gen_dir/$preprocess_folder"
+  out_folder = preprocess_folder
   out_manifest = "$target_gen_dir/$preprocess_manifest"
   in_files = [
-    "nearby_contact_browser_proxy.js",
-    "nearby_http_browser_proxy.js",
-    "nearby_logs_browser_proxy.js",
-    "nearby_prefs_browser_proxy.js",
-    "nearby_ui_trigger_browser_proxy.js",
-    "types.js",
-  ]
+               "nearby_contact_browser_proxy.js",
+               "nearby_http_browser_proxy.js",
+               "nearby_logs_browser_proxy.js",
+               "nearby_prefs_browser_proxy.js",
+               "nearby_ui_trigger_browser_proxy.js",
+               "types.js",
+             ] + web_component_files
 }
 
-preprocess_if_expr("preprocess_generated") {
-  deps = [ ":web_components" ]
-  in_folder = target_gen_dir
-  out_folder = "$target_gen_dir/$preprocess_folder"
-  out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
-  in_files = [
-    "contact_object.js",
-    "contact_tab.js",
-    "http_message_object.js",
-    "http_tab.js",
-    "log_object.js",
-    "logging_tab.js",
-    "nearby_internals.js",
-    "shared_style.js",
-    "ui_trigger_list_object.js",
-    "ui_trigger_tab.js",
+preprocess_if_expr("preprocess_html_css_files") {
+  deps = [
+    ":css_wrapper_files",
+    ":html_wrapper_files",
   ]
+  in_folder = target_gen_dir
+  out_folder = preprocess_folder
+  out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
+  in_files = html_wrapper_files + css_wrapper_files
 }
 
 grit("resources") {
@@ -209,9 +234,6 @@
 js_library("types") {
 }
 
-js_library("shared_style") {
-}
-
 js_library("contact_tab") {
   deps = [
     ":contact_object",
@@ -237,17 +259,14 @@
   ]
 }
 
-html_to_js("web_components") {
-  js_files = [
-    "contact_object.js",
-    "contact_tab.js",
-    "http_message_object.js",
-    "http_tab.js",
-    "log_object.js",
-    "logging_tab.js",
-    "nearby_internals.js",
-    "shared_style.js",
-    "ui_trigger_list_object.js",
-    "ui_trigger_tab.js",
-  ]
+html_to_wrapper("html_wrapper_files") {
+  out_folder = target_gen_dir
+  in_files = html_files
+  use_js = true
+}
+
+css_to_wrapper("css_wrapper_files") {
+  out_folder = target_gen_dir
+  in_files = css_files
+  use_js = true
 }
diff --git a/chrome/browser/resources/nearby_internals/contact_object.js b/chrome/browser/resources/nearby_internals/contact_object.js
index 1263da5..2725444 100644
--- a/chrome/browser/resources/nearby_internals/contact_object.js
+++ b/chrome/browser/resources/nearby_internals/contact_object.js
@@ -2,13 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {getTemplate} from './contact_object.html.js';
 import {ContactUpdate} from './types.js';
 
 Polymer({
   is: 'contact-object',
 
-  _template: html`{__html_template__}`,
+  _template: getTemplate(),
 
   properties: {
     /**
diff --git a/chrome/browser/resources/nearby_internals/contact_tab.js b/chrome/browser/resources/nearby_internals/contact_tab.js
index 5b618cb1..171b1f1 100644
--- a/chrome/browser/resources/nearby_internals/contact_tab.js
+++ b/chrome/browser/resources/nearby_internals/contact_tab.js
@@ -6,18 +6,19 @@
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
 import './contact_object.js';
-import './shared_style.js';
+import './shared_style.css.js';
 
 import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {getTemplate} from './contact_tab.html.js';
 import {NearbyContactBrowserProxy} from './nearby_contact_browser_proxy.js';
 import {ContactUpdate} from './types.js';
 
 Polymer({
   is: 'contact-tab',
 
-  _template: html`{__html_template__}`,
+  _template: getTemplate(),
 
   behaviors: [
     WebUIListenerBehavior,
diff --git a/chrome/browser/resources/nearby_internals/http_message_object.js b/chrome/browser/resources/nearby_internals/http_message_object.js
index 59f03b5d..57b7dd94 100644
--- a/chrome/browser/resources/nearby_internals/http_message_object.js
+++ b/chrome/browser/resources/nearby_internals/http_message_object.js
@@ -5,14 +5,15 @@
 import 'chrome://resources/cr_elements/cr_expand_button/cr_expand_button.js';
 import 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
 
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {getTemplate} from './http_message_object.html.js';
 import {Direction, Rpc} from './types.js';
 
 Polymer({
   is: 'http-message-object',
 
-  _template: html`{__html_template__}`,
+  _template: getTemplate(),
 
   properties: {
     /**
diff --git a/chrome/browser/resources/nearby_internals/http_tab.js b/chrome/browser/resources/nearby_internals/http_tab.js
index 57211823..d1e0c547 100644
--- a/chrome/browser/resources/nearby_internals/http_tab.js
+++ b/chrome/browser/resources/nearby_internals/http_tab.js
@@ -6,18 +6,19 @@
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
 import './http_message_object.js';
-import './shared_style.js';
+import './shared_style.css.js';
 
 import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {getTemplate} from './http_tab.html.js';
 import {NearbyHttpBrowserProxy} from './nearby_http_browser_proxy.js';
 import {HttpMessage} from './types.js';
 
 Polymer({
   is: 'http-tab',
 
-  _template: html`{__html_template__}`,
+  _template: getTemplate(),
 
   behaviors: [
     WebUIListenerBehavior,
diff --git a/chrome/browser/resources/nearby_internals/log_object.js b/chrome/browser/resources/nearby_internals/log_object.js
index 626db9f..cf6b6b6 100644
--- a/chrome/browser/resources/nearby_internals/log_object.js
+++ b/chrome/browser/resources/nearby_internals/log_object.js
@@ -2,13 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {getTemplate} from './log_object.html.js';
 import {LogMessage, Severity} from './types.js';
 
 Polymer({
   is: 'log-object',
 
-  _template: html`{__html_template__}`,
+  _template: getTemplate(),
 
   properties: {
     /**
diff --git a/chrome/browser/resources/nearby_internals/logging_tab.js b/chrome/browser/resources/nearby_internals/logging_tab.js
index 5b1fb46..9464098 100644
--- a/chrome/browser/resources/nearby_internals/logging_tab.js
+++ b/chrome/browser/resources/nearby_internals/logging_tab.js
@@ -6,11 +6,12 @@
 import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
 import './log_object.js';
-import './shared_style.js';
+import './shared_style.css.js';
 
 import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {getTemplate} from './logging_tab.html.js';
 import {NearbyLogsBrowserProxy} from './nearby_logs_browser_proxy.js';
 import {LogMessage, LogProvider, Severity} from './types.js';
 
@@ -79,7 +80,7 @@
 Polymer({
   is: 'logging-tab',
 
-  _template: html`{__html_template__}`,
+  _template: getTemplate(),
 
   behaviors: [
     WebUIListenerBehavior,
diff --git a/chrome/browser/resources/nearby_internals/nearby_internals.js b/chrome/browser/resources/nearby_internals/nearby_internals.js
index dae9d73..93d690c7 100644
--- a/chrome/browser/resources/nearby_internals/nearby_internals.js
+++ b/chrome/browser/resources/nearby_internals/nearby_internals.js
@@ -9,12 +9,15 @@
 import './logging_tab.js';
 import './contact_tab.js';
 import './ui_trigger_tab.js';
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {getTemplate} from './nearby_internals.html.js';
 
 Polymer({
   is: 'nearby-internals',
 
-  _template: html`{__html_template__}`,
+  _template: getTemplate(),
 
   properties: {
     /** @private */
diff --git a/chrome/browser/resources/nearby_internals/shared_style.css b/chrome/browser/resources/nearby_internals/shared_style.css
new file mode 100644
index 0000000..6958db6
--- /dev/null
+++ b/chrome/browser/resources/nearby_internals/shared_style.css
@@ -0,0 +1,22 @@
+/* Copyright 2023 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* #css_wrapper_metadata_start
+ * #type=style
+ * #import=chrome://resources/cr_elements/cr_shared_style.css.js
+ * #include=cr-shared-style
+ * #css_wrapper_metadata_end */
+
+:host {
+  cursor: default;
+  font-family: monospace;
+  font-size: 12px;
+}
+
+.internals-button {
+  background-color: rgb(0, 134, 179);
+  color: white;
+  font-family: Roboto;
+  margin: 5px;
+}
diff --git a/chrome/browser/resources/nearby_internals/shared_style.html b/chrome/browser/resources/nearby_internals/shared_style.html
deleted file mode 100644
index cb589e3..0000000
--- a/chrome/browser/resources/nearby_internals/shared_style.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<template>
-  <style include="cr-shared-style">
-    :host {
-      cursor: default;
-      font-family: monospace;
-      font-size: 12px;
-    }
-
-    .internals-button {
-      background-color: rgb(0, 134, 179);
-      color: white;
-      font-family: Roboto;
-      margin: 5px;
-    }
-  </style>
-</template>
diff --git a/chrome/browser/resources/nearby_internals/shared_style.js b/chrome/browser/resources/nearby_internals/shared_style.js
deleted file mode 100644
index 5614189..0000000
--- a/chrome/browser/resources/nearby_internals/shared_style.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'chrome://resources/cr_elements/cr_shared_style.css.js';
-
-import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-const styleMod = document.createElement('dom-module');
-styleMod.appendChild(html`{__html_template__}`.content);
-styleMod.register('shared-style');
diff --git a/chrome/browser/resources/nearby_internals/ui_trigger_list_object.js b/chrome/browser/resources/nearby_internals/ui_trigger_list_object.js
index 760e8c0..f8c2d7e 100644
--- a/chrome/browser/resources/nearby_internals/ui_trigger_list_object.js
+++ b/chrome/browser/resources/nearby_internals/ui_trigger_list_object.js
@@ -2,13 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
 import {TimestampedMessage} from './types.js';
+import {getTemplate} from './ui_trigger_list_object.html.js';
 
 Polymer({
   is: 'ui-trigger-object',
 
-  _template: html`{__html_template__}`,
+  _template: getTemplate(),
 
   properties: {
     /**
diff --git a/chrome/browser/resources/nearby_internals/ui_trigger_tab.js b/chrome/browser/resources/nearby_internals/ui_trigger_tab.js
index 708f7243..319720f 100644
--- a/chrome/browser/resources/nearby_internals/ui_trigger_tab.js
+++ b/chrome/browser/resources/nearby_internals/ui_trigger_tab.js
@@ -5,19 +5,20 @@
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
 import './ui_trigger_list_object.js';
-import './shared_style.js';
+import './shared_style.css.js';
 
 import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
-import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NearbyPrefsBrowserProxy} from './nearby_prefs_browser_proxy.js';
 import {NearbyUiTriggerBrowserProxy} from './nearby_ui_trigger_browser_proxy.js';
 import {NearbyShareStates, ShareTarget, ShareTargetDiscoveryChange, ShareTargetSelectOption, StatusCode, TimestampedMessage, TransferMetadataStatus} from './types.js';
+import {getTemplate} from './ui_trigger_tab.html.js';
 
 Polymer({
   is: 'ui-trigger-tab',
 
-  _template: html`{__html_template__}`,
+  _template: getTemplate(),
 
   behaviors: [
     WebUIListenerBehavior,
diff --git a/chrome/browser/resources/new_tab_page/app.html b/chrome/browser/resources/new_tab_page/app.html
index b0105d20..60fbc56 100644
--- a/chrome/browser/resources/new_tab_page/app.html
+++ b/chrome/browser/resources/new_tab_page/app.html
@@ -363,10 +363,9 @@
         on-open-lens-search="onOpenLensSearch_"
         on-open-voice-search="onOpenVoiceSearch_" shown$="[[realboxShown_]]">
     </ntp-realbox>
-    <template is="dom-if" if="[[realboxLensSearchEnabled_]]">
+    <template is="dom-if" if="[[showLensUploadDialog_]]" restamp>
       <ntp-lens-upload-dialog id="lensUploadDialog"
-          on-close-lens-search="onCloseLensSearch_"
-          on-bind-open-dialog="bindOpenLensDialog_">
+          on-close-lens-search="onCloseLensSearch_">
       </ntp-lens-upload-dialog>
     </template>
   </div>
diff --git a/chrome/browser/resources/new_tab_page/app.ts b/chrome/browser/resources/new_tab_page/app.ts
index 069a98bf..1a79b5ce 100644
--- a/chrome/browser/resources/new_tab_page/app.ts
+++ b/chrome/browser/resources/new_tab_page/app.ts
@@ -337,7 +337,6 @@
   private promoAndModulesLoaded_: boolean;
   private removeScrim_: boolean;
   private lazyRender_: boolean;
-  private openLensDialog: Function|null;
 
   private callbackRouter_: PageCallbackRouter;
   private pageHandler_: PageHandlerRemote;
@@ -528,23 +527,8 @@
     recordVoiceAction(VoiceAction.ACTIVATE_SEARCH_BOX);
   }
 
-  /**
-   * Sets the openLensDialog function when the child LensUploadDialogComponent
-   * is lazily loaded.
-   *
-   * We use the connected callback with a custom event dispatch to get around
-   * bundling the upload dialog component with the primary bundle to call open
-   * dialog.
-   */
-  private bindOpenLensDialog_(e: CustomEvent<{fn: () => void}>) {
-    this.openLensDialog = e.detail.fn;
-  }
-
   private onOpenLensSearch_() {
-    if (this.openLensDialog) {
-      this.openLensDialog();
-      this.showLensUploadDialog_ = true;
-    }
+    this.showLensUploadDialog_ = true;
   }
 
   private onCloseLensSearch_() {
diff --git a/chrome/browser/resources/new_tab_page/lens_upload_dialog.ts b/chrome/browser/resources/new_tab_page/lens_upload_dialog.ts
index ccef36c..b2819d1 100644
--- a/chrome/browser/resources/new_tab_page/lens_upload_dialog.ts
+++ b/chrome/browser/resources/new_tab_page/lens_upload_dialog.ts
@@ -193,11 +193,7 @@
 
   override connectedCallback() {
     super.connectedCallback();
-    // Provides the parent element with a reference to the openDialog function
-    // after component is (lazily) loaded so we do not need to reference this
-    // element directly in the parent to open the dialog.
-    this.dispatchEvent(new CustomEvent(
-        'bind-open-dialog', {detail: {fn: this.openDialog.bind(this)}}));
+    this.openDialog();
   }
 
   override disconnectedCallback() {
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html b/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html
index a6084f2..6f10100e 100644
--- a/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html
+++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html
@@ -33,17 +33,33 @@
 
   .main-tile {
     grid-column: 1 / 2;
-    grid-row: 1 / 3
+    grid-row: 1 / 3;
   }
 
   .secondary-tile {
     grid-column: 2 / 3;
-    grid-row: 1 / 2
+    grid-row: 1 / 2;
   }
 
   .related-searches-tile {
     grid-column: 2 / 3;
-    grid-row: 2 / 3
+    grid-row: 2 / 3;
+  }
+
+  @media (max-width: 879px) {
+    .small-tiles,
+    .secondary-tile,
+    .related-searches-tile {
+      display: none;
+    }
+
+    .layout {
+      display: block;
+    }
+
+    .main-tile {
+      min-height: 100%;
+    }
   }
 
   #layout3 .main-tile {
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/module.ts b/chrome/browser/resources/new_tab_page/modules/history_clusters/module.ts
index 8389741..320b8b4 100644
--- a/chrome/browser/resources/new_tab_page/modules/history_clusters/module.ts
+++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/module.ts
@@ -202,8 +202,11 @@
   // isn't used in the layout.
   const visits = element.cluster.visits.slice(1);
   // Count number of visits with images.
-  const imageCount =
-      visits.filter((visit: URLVisit) => visit.hasUrlKeyedImage).length;
+  const imageCount = visits
+                         .filter(
+                             (visit: URLVisit) =>
+                                 visit.hasUrlKeyedImage && visit.isKnownToSync)
+                         .length;
   const visitCount = visits.length;
 
   // Calculate which layout to use.
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html b/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html
index 6178046..ef8b13a 100644
--- a/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html
+++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html
@@ -4,7 +4,7 @@
         var(--color-new-tab-page-history-clusters-module-item-background);
     border-radius: 12px;
     color: var(--color-new-tab-page-primary-foreground);
-    height: 100%;
+    display: inline-block;
     width: 100%;
   }
 
@@ -40,8 +40,8 @@
   :host([large-format]) #image {
     border-radius: 7px;
     height: 152px;
-    margin: 16px 16px;
-    width: 320px;
+    margin: 16px;
+    width: calc(100% - 32px);
   }
 
   :host([medium-format]) #image {
@@ -103,10 +103,12 @@
     display: flex;
     flex-direction: row;
     font-size: 11px;
+    margin-bottom: 24px;
     margin-inline: 16px;
   }
 
   :host([medium-format]) #info-container {
+    margin-bottom: 14px;
     margin-inline-start: 8px;
   }
 
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.ts b/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.ts
index aeab617..52da3c4 100644
--- a/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.ts
+++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.ts
@@ -12,7 +12,7 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {URLVisit} from '../../history_cluster_types.mojom-webui.js';
-import {I18nMixin, loadTimeData} from '../../i18n_setup.js';
+import {I18nMixin} from '../../i18n_setup.js';
 
 import {getTemplate} from './tile.html.js';
 
@@ -67,12 +67,11 @@
   private async onVisitUpdated_(): Promise<void> {
     const visitUrl = this.visit.normalizedUrl;
     if (visitUrl && this.visit.hasUrlKeyedImage && !this.smallFormat &&
-        loadTimeData.getBoolean('isHistoryClustersImagesEnabled') &&
         this.visit.isKnownToSync) {
       const result =
           await ImageServiceBrowserProxy.getInstance().handler.getPageImageUrl(
               ImageServiceClientId.NtpQuests, visitUrl,
-              {suggestImages: true, optimizationGuideImages: true});
+              {suggestImages: false, optimizationGuideImages: true});
       if (result && result.result) {
         this.imageUrl_ = result.result.imageUrl;
         return;
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_section.html b/chrome/browser/resources/settings/autofill_page/autofill_section.html
index 40086cc..617431c 100644
--- a/chrome/browser/resources/settings/autofill_page/autofill_section.html
+++ b/chrome/browser/resources/settings/autofill_page/autofill_section.html
@@ -48,7 +48,7 @@
                 </span>
               </span>
             </div>
-            <cr-icon-button class="icon-more-vert" id="addressMenu"
+            <cr-icon-button class="icon-more-vert address-menu"
                 on-click="onAddressMenuTap_"
                 title="[[moreActionsTitle_(item.metadata.summaryLabel,
                  item.metadata.summarySublabel)]]">
diff --git a/chrome/browser/resources/settings/chromeos/device_page/device_page.html b/chrome/browser/resources/settings/chromeos/device_page/device_page.html
index 13e01d8..47a44e7 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/device_page.html
+++ b/chrome/browser/resources/settings/chromeos/device_page/device_page.html
@@ -93,7 +93,8 @@
   <template is="dom-if" route-path="/per-device-keyboard">
     <os-settings-subpage page-title="$i18n{keyboardTitle}">
       <settings-per-device-keyboard
-          is-device-settings-split-enabled="[[isDeviceSettingsSplitEnabled_]]">
+          is-device-settings-split-enabled="[[isDeviceSettingsSplitEnabled_]]"
+          keyboards="[[keyboards]]">
       </settings-per-device-keyboard>
     </os-settings-subpage>
   </template>
@@ -107,7 +108,8 @@
   <template is="dom-if" route-path="/per-device-pointing-stick">
     <os-settings-subpage page-title="$i18n{pointingStickTitle}">
       <settings-per-device-pointing-stick
-          is-device-settings-split-enabled="[[isDeviceSettingsSplitEnabled_]]">
+          is-device-settings-split-enabled="[[isDeviceSettingsSplitEnabled_]]"
+          pointingSticks="[[pointingSticks]">
       </settings-per-device-pointing-stick>
     </os-settings-subpage>
   </template>
@@ -152,7 +154,8 @@
   <template is="dom-if"
       route-path="/per-device-keyboard/remap-keys">
     <os-settings-subpage id="perDeviceKeyboardRemapKeysRow"
-        page-title="$i18n{remapKeyboardKeysRowLabel}">
+        page-title="$i18n{remapKeyboardKeysRowLabel}"
+        keyboards="[[keyboards]]">
       <settings-per-device-keyboard-remap-keys>
       </settings-per-device-keyboard-remap-keys>
     </os-settings-subpage>
diff --git a/chrome/browser/resources/settings/chromeos/device_page/device_page.ts b/chrome/browser/resources/settings/chromeos/device_page/device_page.ts
index a38d272..9a9143d2 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/device_page.ts
+++ b/chrome/browser/resources/settings/chromeos/device_page/device_page.ts
@@ -31,12 +31,16 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {KeyboardSettingsObserverReceiver, PointingStickSettingsObserverReceiver} from '../mojom-webui/input_device_settings_provider.mojom-webui.js';
 import {routes} from '../os_settings_routes.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Router} from '../router.js';
 
 import {getTemplate} from './device_page.html.js';
 import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl} from './device_page_browser_proxy.js';
+import {FakeInputDeviceSettingsProvider} from './fake_input_device_settings_provider.js';
+import {getInputDeviceSettingsProvider} from './input_device_mojo_interface_provider.js';
+import {InputDeviceSettingsProviderInterface, Keyboard, PointingStick} from './input_device_settings_types.js';
 
 interface SettingsDevicePageElement {
   $: {
@@ -186,6 +190,13 @@
           return loadTimeData.getBoolean('androidEnabled');
         },
       },
+
+      pointingSticks: {
+        type: Array,
+      },
+      keyboards: {
+        type: Array,
+      },
     };
   }
 
@@ -198,16 +209,27 @@
     ];
   }
 
+  protected pointingSticks: PointingStick[];
+  protected keyboards: Keyboard[];
   private browserProxy_: DevicePageBrowserProxy;
   private hasMouse_: boolean;
   private hasPointingStick_: boolean;
   private hasTouchpad_: boolean;
   private isDeviceSettingsSplitEnabled_: boolean;
+  private pointingStickSettingsObserverReceiver:
+      PointingStickSettingsObserverReceiver;
+  private keyboardSettingsObserverReceiver: KeyboardSettingsObserverReceiver;
+  private inputDeviceSettingsProvider: InputDeviceSettingsProviderInterface;
 
   constructor() {
     super();
 
     this.browserProxy_ = DevicePageBrowserProxyImpl.getInstance();
+    if (this.isDeviceSettingsSplitEnabled_) {
+      this.inputDeviceSettingsProvider = getInputDeviceSettingsProvider();
+      this.observePointingStickSettings();
+      this.observeKeyboardSettings();
+    }
   }
 
   override connectedCallback() {
@@ -234,6 +256,43 @@
     this.browserProxy_.updateAndroidEnabled();
   }
 
+  private observePointingStickSettings(): void {
+    if (this.inputDeviceSettingsProvider instanceof
+        FakeInputDeviceSettingsProvider) {
+      this.inputDeviceSettingsProvider.observePointingStickSettings(this);
+      return;
+    }
+
+    this.pointingStickSettingsObserverReceiver =
+        new PointingStickSettingsObserverReceiver(this);
+
+    this.inputDeviceSettingsProvider.observePointingStickSettings(
+        this.pointingStickSettingsObserverReceiver.$
+            .bindNewPipeAndPassRemote());
+  }
+
+  onPointingStickListUpdated(pointingSticks: PointingStick[]): void {
+    this.pointingSticks = pointingSticks;
+  }
+
+  private observeKeyboardSettings(): void {
+    if (this.inputDeviceSettingsProvider instanceof
+        FakeInputDeviceSettingsProvider) {
+      this.inputDeviceSettingsProvider.observeKeyboardSettings(this);
+      return;
+    }
+
+    this.keyboardSettingsObserverReceiver =
+        new KeyboardSettingsObserverReceiver(this);
+
+    this.inputDeviceSettingsProvider.observeKeyboardSettings(
+        this.keyboardSettingsObserverReceiver.$.bindNewPipeAndPassRemote());
+  }
+
+  onKeyboardListUpdated(keyboards: Keyboard[]): void {
+    this.keyboards = keyboards;
+  }
+
   private getPointersTitle_(): string {
     // For the purposes of the title, we call pointing sticks mice. The user
     // will know what we mean, and otherwise we'd get too many possible titles.
diff --git a/chrome/browser/resources/settings/chromeos/device_page/fake_input_device_data.ts b/chrome/browser/resources/settings/chromeos/device_page/fake_input_device_data.ts
index b50cb743..6ff22a5 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/fake_input_device_data.ts
+++ b/chrome/browser/resources/settings/chromeos/device_page/fake_input_device_data.ts
@@ -86,6 +86,58 @@
   },
 ];
 
+export const fakeKeyboards2: Keyboard[] = [
+  {
+    id: 9,
+    deviceKey: 'test:key',
+    name: 'Fake ERGO K860',
+    isExternal: true,
+    metaKey: MetaKey.kCommand,
+    modifierKeys: [
+      ModifierKey.kAlt,
+      ModifierKey.kBackspace,
+      ModifierKey.kCapsLock,
+      ModifierKey.kControl,
+      ModifierKey.kEscape,
+      ModifierKey.kMeta,
+    ],
+    settings: {
+      modifierRemappings: {
+        [ModifierKey.kControl]: ModifierKey.kCapsLock,
+        [ModifierKey.kCapsLock]: ModifierKey.kAssistant,
+      },
+      topRowAreFkeys: false,
+      suppressMetaFkeyRewrites: false,
+      autoRepeatEnabled: false,
+      autoRepeatDelay: mojoTimeDelta(2000),
+      autoRepeatInterval: mojoTimeDelta(2000),
+    },
+  },
+  {
+    id: 10,
+    deviceKey: 'test:key',
+    name: 'Fake AT Translated Set 2 ',
+    isExternal: false,
+    metaKey: MetaKey.kSearch,
+    modifierKeys: [
+      ModifierKey.kAlt,
+      ModifierKey.kAssistant,
+      ModifierKey.kBackspace,
+      ModifierKey.kControl,
+      ModifierKey.kEscape,
+      ModifierKey.kMeta,
+    ],
+    settings: {
+      modifierRemappings: {},
+      topRowAreFkeys: true,
+      suppressMetaFkeyRewrites: true,
+      autoRepeatEnabled: true,
+      autoRepeatDelay: mojoTimeDelta(150),
+      autoRepeatInterval: mojoTimeDelta(20),
+    },
+  },
+];
+
 export const fakeTouchpads: Touchpad[] = [
   {
     id: 2,
@@ -181,4 +233,18 @@
       accelerationEnabled: true,
     },
   },
+];
+
+export const fakePointingSticks2: PointingStick[] = [
+  {
+    id: 12,
+    deviceKey: 'test:key',
+    name: 'Fake Lexmark-Unicomp FSR',
+    isExternal: true,
+    settings: {
+      swapRight: true,
+      sensitivity: 5,
+      accelerationEnabled: true,
+    },
+  },
 ];
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html b/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html
index 2762284..7ebf3bb7 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html
+++ b/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html
@@ -1,14 +1,28 @@
 <style include="settings-shared"></style>
-<template is="dom-repeat" items="[[keyboards]]"
-    as="keyboard" index-as="index" restamp>
-  <settings-per-device-keyboard-subsection
-      keyboard="[[keyboard]]" keyboard-index="[[index]]">
-  </settings-per-device-keyboard-subsection>
+<template is="dom-if" if="[[!hasKeyboards(keyboards.length)]]">
+  <div id="noKeyboardsConnectedContainer">
+    <div class="settings-box first">
+      <div class="start">
+        <span id="noKeyboardsConnectedMessage">
+          $i18n{noKeyboardsConnected}
+        </span>
+      </div>
+    </div>
+  </div>
+</template>
+<template is="dom-if" if="[[hasKeyboards(keyboards.length)]]">
+  <template is="dom-repeat" items="[[keyboards]]"
+      as="keyboard" index-as="index" restamp>
+    <settings-per-device-keyboard-subsection
+        keyboard="[[keyboard]]" keyboard-index="[[index]]">
+    </settings-per-device-keyboard-subsection>
+  </template>
 </template>
 <cr-link-row id="keyboardShortcutViewer" class="hr"
     on-click="onShowKeyboardShortcutViewerTap"
     label="$i18n{showKeyboardShortcutViewer}" external
-    deep-link-focus-id$="[[Setting.kKeyboardShortcuts]]"></cr-link-row>
+    deep-link-focus-id$="[[Setting.kKeyboardShortcuts]]">
+</cr-link-row>
 <cr-link-row id="showLanguagesInput"
     class="hr" on-click="onShowInputSettingsTap"
     label="$i18n{keyboardShowInputSettings}"
diff --git a/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.ts b/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.ts
index db94024..592721c 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.ts
+++ b/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.ts
@@ -19,24 +19,25 @@
 import '../../settings_shared.css.js';
 import 'chrome://resources/cr_elements/cr_slider/cr_slider.js';
 
+import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {PolymerElementProperties} from 'chrome://resources/polymer/v3_0/polymer/interfaces.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {DeepLinkingMixin} from '../deep_linking_mixin.js';
-import {KeyboardSettingsObserverReceiver} from '../mojom-webui/input_device_settings_provider.mojom-webui.js';
+import {DeepLinkingMixin, DeepLinkingMixinInterface} from '../deep_linking_mixin.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {routes} from '../os_settings_routes.js';
-import {RouteObserverMixin} from '../route_observer_mixin.js';
+import {RouteObserverMixin, RouteObserverMixinInterface} from '../route_observer_mixin.js';
 import {Route, Router} from '../router.js';
 
 import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl} from './device_page_browser_proxy.js';
-import {FakeInputDeviceSettingsProvider} from './fake_input_device_settings_provider.js';
-import {getInputDeviceSettingsProvider} from './input_device_mojo_interface_provider.js';
-import {InputDeviceSettingsProviderInterface, Keyboard} from './input_device_settings_types.js';
+import {Keyboard} from './input_device_settings_types.js';
 import {getTemplate} from './per_device_keyboard.html.js';
 
 const SettingsPerDeviceKeyboardElementBase =
-    DeepLinkingMixin(RouteObserverMixin(PolymerElement));
+    DeepLinkingMixin(RouteObserverMixin(I18nMixin(PolymerElement))) as {
+      new (): PolymerElement & I18nMixinInterface &
+          RouteObserverMixinInterface & DeepLinkingMixinInterface,
+    };
 
 export class SettingsPerDeviceKeyboardElement extends
     SettingsPerDeviceKeyboardElementBase {
@@ -69,14 +70,6 @@
   protected keyboards: Keyboard[];
   private browserProxy: DevicePageBrowserProxy =
       DevicePageBrowserProxyImpl.getInstance();
-  private keyboardSettingsObserverReceiver: KeyboardSettingsObserverReceiver;
-  private inputDeviceSettingsProvider: InputDeviceSettingsProviderInterface =
-      getInputDeviceSettingsProvider();
-
-  constructor() {
-    super();
-    this.observeKeyboardSettings();
-  }
 
   override connectedCallback() {
     super.connectedCallback();
@@ -93,20 +86,6 @@
     this.attemptDeepLink();
   }
 
-  private observeKeyboardSettings(): void {
-    if (this.inputDeviceSettingsProvider instanceof
-        FakeInputDeviceSettingsProvider) {
-      this.inputDeviceSettingsProvider.observeKeyboardSettings(this);
-      return;
-    }
-
-    this.keyboardSettingsObserverReceiver =
-        new KeyboardSettingsObserverReceiver(this);
-
-    this.inputDeviceSettingsProvider.observeKeyboardSettings(
-        this.keyboardSettingsObserverReceiver.$.bindNewPipeAndPassRemote());
-  }
-
   private onShowKeyboardShortcutViewerTap(): void {
     this.browserProxy.showKeyboardShortcutViewer();
   }
@@ -117,8 +96,8 @@
         /*dynamicParams=*/ undefined, /*removeSearch=*/ true);
   }
 
-  onKeyboardListUpdated(keyboards: Keyboard[]): void {
-    this.keyboards = keyboards;
+  protected hasKeyboards(): boolean {
+    return this.keyboards.length > 0;
   }
 }
 
diff --git a/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard_remap_keys.ts b/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard_remap_keys.ts
index 2b565d0..b73c9cf6 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard_remap_keys.ts
+++ b/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard_remap_keys.ts
@@ -363,11 +363,9 @@
       ...this.keyboard.settings,
       modifierRemappings: this.getUpdatedRemappings(),
     };
-    if (this.inputDeviceSettingsProvider instanceof
-        FakeInputDeviceSettingsProvider) {
-      this.inputDeviceSettingsProvider.setKeyboardSettings(
-          this.keyboard.id, this.keyboard.settings);
-    }
+
+    this.inputDeviceSettingsProvider.setKeyboardSettings(
+        this.keyboard.id, this.keyboard.settings);
   }
 
   /**
diff --git a/chrome/browser/resources/settings/chromeos/device_page/per_device_pointing_stick.ts b/chrome/browser/resources/settings/chromeos/device_page/per_device_pointing_stick.ts
index c0e8ef0..eb7f49f 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/per_device_pointing_stick.ts
+++ b/chrome/browser/resources/settings/chromeos/device_page/per_device_pointing_stick.ts
@@ -22,14 +22,11 @@
 import {PolymerElementProperties} from 'chrome://resources/polymer/v3_0/polymer/interfaces.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {PointingStickSettingsObserverReceiver} from '../mojom-webui/input_device_settings_provider.mojom-webui.js';
 import {routes} from '../os_settings_routes.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route} from '../router.js';
 
-import {FakeInputDeviceSettingsProvider} from './fake_input_device_settings_provider.js';
-import {getInputDeviceSettingsProvider} from './input_device_mojo_interface_provider.js';
-import {InputDeviceSettingsProviderInterface, PointingStick} from './input_device_settings_types.js';
+import {PointingStick} from './input_device_settings_types.js';
 import {getTemplate} from './per_device_pointing_stick.html.js';
 
 const SettingsPerDevicePointingStickElementBase =
@@ -54,15 +51,6 @@
   }
 
   protected pointingSticks: PointingStick[];
-  private pointingStickSettingsObserverReceiver:
-      PointingStickSettingsObserverReceiver;
-  private inputDeviceSettingsProvider: InputDeviceSettingsProviderInterface =
-      getInputDeviceSettingsProvider();
-
-  constructor() {
-    super();
-    this.observePointingStickSettings();
-  }
 
   override currentRouteChanged(route: Route): void {
     // Does not apply to this page.
@@ -70,25 +58,6 @@
       return;
     }
   }
-
-  private observePointingStickSettings(): void {
-    if (this.inputDeviceSettingsProvider instanceof
-        FakeInputDeviceSettingsProvider) {
-      this.inputDeviceSettingsProvider.observePointingStickSettings(this);
-      return;
-    }
-
-    this.pointingStickSettingsObserverReceiver =
-        new PointingStickSettingsObserverReceiver(this);
-
-    this.inputDeviceSettingsProvider.observePointingStickSettings(
-        this.pointingStickSettingsObserverReceiver.$
-            .bindNewPipeAndPassRemote());
-  }
-
-  onPointingStickListUpdated(pointingSticks: PointingStick[]): void {
-    this.pointingSticks = pointingSticks;
-  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/settings/chromeos/lazy_load.ts b/chrome/browser/resources/settings/chromeos/lazy_load.ts
index cb892e3..582a2c7b 100644
--- a/chrome/browser/resources/settings/chromeos/lazy_load.ts
+++ b/chrome/browser/resources/settings/chromeos/lazy_load.ts
@@ -111,6 +111,7 @@
 export {SettingsOfficePageElement} from './os_files_page/office_page.js';
 export {LanguagesBrowserProxyImpl} from './os_languages_page/languages_browser_proxy.js';
 export {InputsShortcutReminderState, LanguagesMetricsProxyImpl, LanguagesPageInteraction} from './os_languages_page/languages_metrics_proxy.js';
+export {OsSettingsSmartInputsPageElement} from './os_languages_page/smart_inputs_page.js';
 export {AccountManagerBrowserProxy, AccountManagerBrowserProxyImpl} from './os_people_page/account_manager_browser_proxy.js';
 export {SettingsUsersAddUserDialogElement} from './os_people_page/add_user_dialog.js';
 export {FingerprintBrowserProxyImpl, FingerprintResultType} from './os_people_page/fingerprint_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/select_to_speak_subpage.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/select_to_speak_subpage.html
index 43677e69..3b3eba4 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/select_to_speak_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/select_to_speak_subpage.html
@@ -65,16 +65,16 @@
     vertical-align: middle;
   }
 
-  .light {
-    background-color: var(--google-grey-100);
+  .example.light {
+    background-color: var(--cros-bg-color-light);
     border-radius: 4px 0 0 4px;
-    color: black;
+    color: var(--cros-text-color-primary-light);;
   }
 
-  .dark {
-    background-color: var(--google-grey-900);
+  .example.dark {
+    background-color: var(--cros-bg-color-dark);;
     border-radius: 0 4px 4px 0;
-    color: white;
+    color: var(--cros-text-color-primary-dark);
   }
 
   .highlight {
@@ -87,7 +87,7 @@
   }
 
   .background-preview {
-    background-color: RGBA(0, 0, 0, .4);
+    background-color: rgba(var(--cros-bg-color-dark-rgb), .4);
     border-radius: 4px;
     line-height: 1.5;
     margin-inline-end: var(--cr-section-padding);
@@ -97,32 +97,20 @@
   }
 
   .background-preview-selected {
-    background-color: white;
+    background-color: var(--cros-bg-color);
     border-radius: 6px;
     box-shadow: 0 0 4px 4px var(--focus-ring-highlight-color);
-    color: black;
+    color: var(--cros-text-color-primary);
     display: inline-block;
     margin: 0;
     padding: 6px 4px 6px 4px;
   }
 
   .background-preview-unselected {
+    color: var(--cros-text-color-secondary);
     margin: 2px 0 2px 0;
     padding: 0 4px 0 4px;
   }
-
-  @media (prefers-color-scheme: dark) {
-    .background-preview-selected {
-      background-color: var(--google-grey-900);
-      color: var(--cros-text-color-primary);
-    }
-
-    .background-preview-unselected {
-      color: var(--cros-text-color-secondary);
-      margin: 2px 0 2px 0;
-      padding: 0 4px 0 4px;
-    }
-  }
 </style>
 
 <h2>$i18n{selectToSpeakOptionsSpeech}</h2>
@@ -301,4 +289,3 @@
     deep-link-focus-id$="[[Setting.kSelectToSpeakNavigationControls]]"
     aria-show-label aria-show-sublabel>
 </settings-toggle-button>
-
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.ts b/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.ts
index 123ff95c..f9d3235 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.ts
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.ts
@@ -27,7 +27,7 @@
 const OsSettingsSmartInputsPageElementBase =
     RouteObserverMixin(PrefsMixin(I18nMixin(DeepLinkingMixin(PolymerElement))));
 
-class OsSettingsSmartInputsPageElement extends
+export class OsSettingsSmartInputsPageElement extends
     OsSettingsSmartInputsPageElementBase {
   static get is() {
     return 'os-settings-smart-inputs-page' as const;
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_subpage.html b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_subpage.html
index 99fe2203..a12e488 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager_subpage.html
@@ -217,13 +217,15 @@
   }
 
   #removeConfirmationButton {
-    --active-shadow-action-rgb: var(--google-red-500-rgb);
-    --bg-action: var(--google-red-600);
-    --focus-shadow-color: rgba(var(--google-red-600-rgb), .4);
-    --hover-bg-action: rgba(var(--google-red-600-rgb), .9);
-    --hover-shadow-action-rgb: var(--google-red-500-rgb);
-    --hover-border-color: var(--google-red-100);
-    --hover-shadow-action-rgb: var(--google-red-500-rgb);
+    --active-shadow-action-rgb: var(--cros-color-alert-rgb);
+    --bg-action: var(--cros-color-alert);
+    --focus-shadow-color: var(--cros-highlight-color-error);
+    --hover-bg-action: rgba(var(--cros-color-alert-rgb), .9);
+    --hover-shadow-action-rgb: var(--cros-color-alert-rgb);
+  }
+
+  :host-context(body.jelly-enabled) #removeConfirmationButton {
+    --hover-bg-action: var(--cros-sys-hover_on_prominent);
   }
 </style>
 <!-- Account management description -->
@@ -378,7 +380,6 @@
     </template>
   </cr-action-menu>
 </div>
-<div class="settings-box"></div>
 <cr-dialog id="removeConfirmationDialog">
   <div slot="title" class="key-text">
     $i18n{removeLacrosAccountDialogTitle}
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.ts b/chrome/browser/resources/settings/chromeos/os_settings.ts
index 18efb5cad3..40747aa 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.ts
+++ b/chrome/browser/resources/settings/chromeos/os_settings.ts
@@ -109,7 +109,7 @@
 export {setCrosAudioConfigForTesting} from './device_page/cros_audio_config.js';
 export {DevicePageBrowserProxy, DevicePageBrowserProxyImpl, IdleBehavior, LidClosedBehavior, NoteAppLockScreenSupport, setDisplayApiForTesting, StorageSpaceState} from './device_page/device_page_browser_proxy.js';
 export * as fakeCrosAudioConfig from './device_page/fake_cros_audio_config.js';
-export {fakeKeyboards, fakeMice, fakePointingSticks, fakeTouchpads} from './device_page/fake_input_device_data.js';
+export {fakeKeyboards, fakeKeyboards2, fakeMice, fakePointingSticks, fakePointingSticks2, fakeTouchpads} from './device_page/fake_input_device_data.js';
 export {FakeInputDeviceSettingsProvider} from './device_page/fake_input_device_settings_provider.js';
 export {getInputDeviceSettingsProvider, setInputDeviceSettingsProviderForTesting, setupFakeInputDeviceSettingsProvider} from './device_page/input_device_mojo_interface_provider.js';
 export {MetaKey, ModifierKey} from './device_page/input_device_settings_types.js';
diff --git a/chrome/browser/resources/side_panel/bookmarks/images/bookmarks_empty.svg b/chrome/browser/resources/side_panel/bookmarks/images/bookmarks_empty.svg
index b68069fd..782761f5 100644
--- a/chrome/browser/resources/side_panel/bookmarks/images/bookmarks_empty.svg
+++ b/chrome/browser/resources/side_panel/bookmarks/images/bookmarks_empty.svg
@@ -1,8 +1,8 @@
-<svg width="133" height="109" viewBox="0 0 133 109" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M16.2349 42.2184C16.108 40.4801 17.4841 39 19.227 39H36C37.6569 39 39 40.3431 39 42V44H87.2269C88.7925 44 90.0948 45.2038 90.2177 46.7645L94.7452 104.265C94.8826 106.009 93.5042 107.5 91.7545 107.5H23.789C22.2169 107.5 20.9114 106.286 20.797 104.718L16.2349 42.2184Z" fill="#DADCE0" stroke="#DADCE0" stroke-width="2"/>
-<path d="M102.93 17.6177C104.098 16.2444 106.344 16.9958 106.45 18.7955L107.353 34.0822L121.513 39.9123C123.18 40.5986 123.159 42.9668 121.481 43.624L107.221 49.2065L106.052 64.4752C105.915 66.2727 103.656 66.9849 102.512 65.5914L92.7964 53.7549L77.9138 57.3614C76.1618 57.786 74.7865 55.8579 75.7583 54.3395L84.0132 41.4416L75.9842 28.4019C75.039 26.8668 76.4477 24.963 78.1921 25.418L93.0096 29.2832L102.93 17.6177Z" fill="#FBBC04"/>
-<path d="M35.1349 13.0646C35.2195 11.2638 37.4561 10.4853 38.6405 11.8444L45.2022 19.3741L54.8352 16.7366C56.574 16.2605 58.0056 18.1471 57.079 19.6935L51.9455 28.2609L57.4307 36.6074C58.4208 38.1139 57.0689 40.0584 55.3119 39.6551L45.5775 37.4203L39.3345 45.2162C38.2077 46.6234 35.9406 45.9386 35.7812 44.1428L34.8985 34.1944L25.555 30.666C23.8684 30.0291 23.8192 27.6614 25.4778 26.9549L34.6666 23.0412L35.1349 13.0646Z" fill="#4285F4"/>
-<circle r="5" transform="matrix(-1 0 0 1 75 5)" fill="#E8EAED"/>
-<rect width="7" height="7" rx="2" transform="matrix(-0.852995 0.521919 0.521919 0.852995 5.97095 10)" fill="#34A853"/>
-<path d="M25.7839 46.7663C25.9059 45.2049 27.2085 44 28.7748 44H46C47.6569 44 49 45.3431 49 47V49H96.735C98.4918 49 99.8726 50.5028 99.7243 52.2533L95.2328 105.253C95.1012 106.806 93.8021 108 92.2435 108H24.2435C22.4946 108 21.1164 106.51 21.2526 104.766L25.7839 46.7663Z" fill="white" stroke="#E8EAED" stroke-width="2"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="303" height="144" fill="none">
+<path fill="#DADCE0" stroke="#DADCE0" stroke-width="2" d="M109.235 61.218A3 3 0 0 1 112.227 58H129a3 3 0 0 1 3 3v2h48.227a3 3 0 0 1 2.991 2.764l4.527 57.501a3 3 0 0 1-2.991 3.235h-67.965a3 3 0 0 1-2.992-2.782l-4.562-62.5Z"/>
+<path fill="#FBBC04" d="M195.93 36.618c1.168-1.374 3.414-.622 3.521 1.177l.902 15.287 14.161 5.83c1.667.687 1.646 3.055-.033 3.712l-14.259 5.583-1.169 15.268c-.138 1.798-2.397 2.51-3.54 1.116l-9.716-11.836-14.883 3.606c-1.752.425-3.127-1.503-2.155-3.022l8.255-12.897-8.029-13.04c-.946-1.535.463-3.439 2.208-2.984l14.817 3.865 9.92-11.665Z"/>
+<path fill="#4285F4" d="M128.135 32.064c.085-1.8 2.321-2.579 3.506-1.22l6.561 7.53 9.633-2.638c1.739-.476 3.171 1.41 2.244 2.957l-5.133 8.568 5.485 8.346c.99 1.507-.362 3.451-2.119 3.048l-9.734-2.235-6.243 7.796c-1.127 1.407-3.394.722-3.554-1.073l-.882-9.949-9.344-3.528c-1.686-.637-1.736-3.005-.077-3.711l9.189-3.914.468-9.977Z"/>
+<circle cx="5" cy="5" r="5" fill="#E8EAED" transform="matrix(-1 0 0 1 173 19)"/>
+<rect width="7" height="7" fill="#34A853" rx="2" transform="matrix(-.853 .52192 .52192 .853 98.97 29)"/>
+<path fill="#fff" stroke="#E8EAED" stroke-width="2" d="M118.784 65.766A3 3 0 0 1 121.775 63H139a3 3 0 0 1 3 3v2h47.735a3 3 0 0 1 2.989 3.253l-4.491 53a3.001 3.001 0 0 1-2.99 2.747h-67.999a3 3 0 0 1-2.991-3.234l4.531-58Z"/>
 </svg>
diff --git a/chrome/browser/resources/side_panel/bookmarks/images/bookmarks_empty_dark.svg b/chrome/browser/resources/side_panel/bookmarks/images/bookmarks_empty_dark.svg
index eb4e662..b9e3f48 100644
--- a/chrome/browser/resources/side_panel/bookmarks/images/bookmarks_empty_dark.svg
+++ b/chrome/browser/resources/side_panel/bookmarks/images/bookmarks_empty_dark.svg
@@ -1,8 +1,8 @@
-<svg width="133" height="109" viewBox="0 0 133 109" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M16.2349 42.2184C16.108 40.4801 17.4841 39 19.2269 39H36C37.6568 39 39 40.3431 39 42V44H87.2269C88.7924 44 90.0948 45.2038 90.2177 46.7645L94.7452 104.265C94.8826 106.009 93.5042 107.5 91.7545 107.5H23.789C22.2169 107.5 20.9114 106.286 20.7969 104.718L16.2349 42.2184Z" fill="#80868B" stroke="#80868B" stroke-width="2"/>
-<path d="M102.93 17.6177C104.098 16.2444 106.344 16.9958 106.45 18.7955L107.353 34.0822L121.513 39.9123C123.18 40.5986 123.159 42.9668 121.481 43.624L107.221 49.2065L106.052 64.4752C105.915 66.2727 103.656 66.9849 102.512 65.5914L92.7964 53.7549L77.9138 57.3614C76.1618 57.786 74.7865 55.8579 75.7583 54.3395L84.0132 41.4416L75.9842 28.4019C75.039 26.8668 76.4477 24.963 78.1921 25.418L93.0096 29.2832L102.93 17.6177Z" fill="#FBBC04"/>
-<path d="M35.1349 13.0646C35.2195 11.2638 37.4561 10.4853 38.6405 11.8444L45.2022 19.3741L54.8352 16.7366C56.574 16.2605 58.0056 18.1471 57.079 19.6935L51.9455 28.2609L57.4307 36.6074C58.4208 38.1139 57.0689 40.0584 55.3118 39.6551L45.5775 37.4203L39.3345 45.2162C38.2076 46.6234 35.9405 45.9386 35.7812 44.1428L34.8985 34.1944L25.555 30.666C23.8684 30.0291 23.8192 27.6614 25.4778 26.9549L34.6666 23.0412L35.1349 13.0646Z" fill="#4285F4"/>
-<circle r="5" transform="matrix(-1 0 0 1 75 5)" fill="#5F6368"/>
-<rect width="7" height="7" rx="2" transform="matrix(-0.852995 0.521919 0.521919 0.852995 5.97096 10)" fill="#34A853"/>
-<path d="M25.7839 46.7663C25.9059 45.2049 27.2085 44 28.7748 44H46C47.6568 44 49 45.3431 49 47V49H96.735C98.4918 49 99.8726 50.5028 99.7243 52.2533L95.2328 105.253C95.1011 106.806 93.8021 108 92.2435 108H24.2435C22.4945 108 21.1164 106.51 21.2526 104.766L25.7839 46.7663Z" fill="#202124" stroke="#9AA0A6" stroke-width="2"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="303" height="144" fill="none">
+<path fill="#80868B" stroke="#80868B" stroke-width="2" d="M109.235 61.218A3 3 0 0 1 112.227 58H129a3 3 0 0 1 3 3v2h48.227a3 3 0 0 1 2.991 2.764l4.527 57.501a3 3 0 0 1-2.991 3.235h-67.965a3 3 0 0 1-2.992-2.782l-4.562-62.5Z"/>
+<path fill="#FBBC04" d="M195.93 36.618c1.168-1.374 3.414-.622 3.521 1.177l.902 15.287 14.161 5.83c1.667.687 1.646 3.055-.033 3.712l-14.259 5.583-1.169 15.268c-.138 1.798-2.397 2.51-3.54 1.116l-9.716-11.836-14.883 3.606c-1.752.425-3.127-1.503-2.155-3.022l8.255-12.897-8.029-13.04c-.946-1.535.463-3.439 2.208-2.984l14.817 3.865 9.92-11.665Z"/>
+<path fill="#4285F4" d="M128.135 32.064c.085-1.8 2.321-2.579 3.506-1.22l6.561 7.53 9.633-2.638c1.739-.476 3.171 1.41 2.244 2.957l-5.133 8.568 5.485 8.346c.99 1.507-.362 3.451-2.119 3.048l-9.734-2.235-6.243 7.796c-1.127 1.407-3.394.722-3.554-1.073l-.882-9.949-9.344-3.528c-1.686-.637-1.736-3.005-.077-3.711l9.189-3.914.468-9.977Z"/>
+<circle cx="5" cy="5" r="5" fill="#5F6368" transform="matrix(-1 0 0 1 173 19)"/>
+<rect width="7" height="7" fill="#34A853" rx="2" transform="matrix(-.853 .52192 .52192 .853 98.97 29)"/>
+<path fill="#202124" stroke="#9AA0A6" stroke-width="2" d="M118.784 65.766A3 3 0 0 1 121.775 63H139a3 3 0 0 1 3 3v2h47.735a3 3 0 0 1 2.989 3.253l-4.491 53a3.001 3.001 0 0 1-2.99 2.747h-67.999a3 3 0 0 1-2.991-3.234l4.531-58Z"/>
 </svg>
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_edit_dialog.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_edit_dialog.html
index f5922ea..4d230105 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_edit_dialog.html
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_edit_dialog.html
@@ -54,7 +54,6 @@
   }
 
   .input-row {
-    align-items: center;
     display: grid;
     grid-template-columns: 52px auto;
   }
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
index aaa36dd..2f92fa6 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
@@ -78,6 +78,10 @@
     gap: 4px;
   }
 
+  sp-empty-state {
+    margin-top: 40px;
+  }
+
   sp-empty-state[guest] {
     margin-top: 66px;
   }
@@ -105,12 +109,17 @@
     margin: 0 14px;
   }
 
+  .label-row[active-labels] {
+    margin-bottom: 14px;
+  }
+
   :host-context([chrome-refresh-2023]) .label-row {
     margin: var(--sp-card-gap) var(--sp-body-padding);
   }
 
   cr-toolbar-selection-overlay {
     --cr-toolbar-selection-overlay-padding: 16px;
+    --cr-toolbar-selection-overlay-slot-gap: 8px;
     background: var(--edit-footer-background);
     color: var(--cr-secondary-text-color);
     font-size: 12px;
@@ -136,7 +145,8 @@
       clear-label="$i18n{clearSearch}" on-search-changed="onSearchChanged_"
       disabled="[[editing_]]" hidden="[[guestMode_]]">
   </cr-toolbar-search-field>
-  <div class="label-row" hidden="[[guestMode_]]">
+  <div class="label-row" hidden="[[guestMode_]]"
+      active-labels$="[[hasActiveLabels_(labels_.*)]]">
     <template is="dom-repeat" items="[[labels_]]">
       <sp-filter-chip
           selected="[[item.active]]"
@@ -149,7 +159,7 @@
   </div>
 
   <div class="sp-card">
-    <sp-heading hidden$="[[guestMode_]]"
+    <sp-heading hidden$="[[shouldHideHeader_(labels_.*, shownBookmarks_)]]"
         back-button-label="[[getBackButtonLabel_(activeFolderPath_.*)]]"
         on-back-button-click="onBackClicked_"
         hide-back-button="[[!activeFolderPath_.length]]"
@@ -179,7 +189,8 @@
     </sp-heading>
 
     <div id="bookmarks" class="bookmarks sp-scroller"
-        hidden="[[!shownBookmarks_.length]]"
+        hidden="[[hasNoBookmarksInActiveFolder_(shownBookmarks_,
+                                                activeFolderPath_.*)]]"
         role="[[getBookmarksListRole_(editing_)]]"
         aria-multiselectable="[[editing_]]" scrollable>
       <iron-list id="shownBookmarksIronList"
@@ -227,7 +238,8 @@
   </div>
 
   <sp-empty-state
-      hidden="[[shownBookmarks_.length]]"
+      hidden="[[!hasNoBookmarksInActiveFolder_(shownBookmarks_,
+                                               activeFolderPath_.*)]]"
       guest$="[[guestMode_]]"
       image-path="./images/bookmarks_empty.svg"
       dark-image-path="./images/bookmarks_empty_dark.svg"
@@ -235,7 +247,8 @@
       body="[[getEmptyBody_()]]">
   </sp-empty-state>
   <sp-footer
-      pinned="[[shouldPinFooter_(shownBookmarks_.length)]]">
+      pinned="[[!hasNoBookmarksInActiveFolder_(shownBookmarks_,
+                                               activeFolderPath_.*)]]">
     <cr-button class="floating-button"
         hidden="[[hideAddTabButton_(editing_)]]"
         on-click="onAddTabClicked_"
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
index 1f94e34..279b28a 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
@@ -600,6 +600,33 @@
     this.renamingId_ = '';
   }
 
+  private hasActiveLabels_(): boolean {
+    for (const label of this.labels_) {
+      if (label.active) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private shouldHideHeader_(): boolean {
+    return this.hasActiveLabels_() || this.hasNoBookmarks_();
+  }
+
+  private hasNoBookmarks_(): boolean {
+    return this.hasNoBookmarksInActiveFolder_() && !this.getActiveFolder_();
+  }
+
+  private hasNoBookmarksInActiveFolder_(): boolean {
+    for (const bookmark of this.shownBookmarks_) {
+      if (bookmark.url || bookmark.parentId !== '0' ||
+          bookmark.children!.length) {
+        return false;
+      }
+    }
+    return true;
+  }
+
   private getSelectedDescription_() {
     return loadTimeData.getStringF(
         'selectedBookmarkCount', this.selectedBookmarks_.length);
@@ -866,10 +893,6 @@
     }
   }
 
-  private shouldPinFooter_(): boolean {
-    return this.shownBookmarks_.length > 0;
-  }
-
   private resizeShownBookmarks_() {
     // The iron-list of `shownBookmarks_` is in a dynamically sized card.
     // Any time the size changes, let iron-list know so that iron-list can
diff --git a/chrome/browser/safe_browsing/client_side_detection_service_browsertest.cc b/chrome/browser/safe_browsing/client_side_detection_service_browsertest.cc
index f21a4e3..78de4a4 100644
--- a/chrome/browser/safe_browsing/client_side_detection_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_service_browsertest.cc
@@ -6,6 +6,7 @@
 
 #include "base/path_service.h"
 #include "base/test/bind.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/client_side_detection_service_factory.h"
@@ -216,6 +217,8 @@
   content::RenderFrameHost* rfh = web_contents()->GetPrimaryMainFrame();
   content::RenderProcessHost* rph = rfh->GetProcess();
 
+  base::HistogramTester histogram_tester;
+
   // Update the model and wait for confirmation
   {
     base::ScopedAllowBlockingForTesting allow_blocking;
@@ -331,7 +334,152 @@
             kClientSideDetectionModelOptimizationGuide)) {
       EXPECT_EQ(123, request.model_version());
     } else {
-      EXPECT_EQ(27, request.model_version());  // Example model file version
+      EXPECT_EQ(27, request.model_version());
+      safe_browsing::ClientSideDetectionService* csd_service =
+          ClientSideDetectionServiceFactory::GetForProfile(
+              Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
+      csd_service->ClassifyPhishingThroughThresholds(&request);
+
+      histogram_tester.ExpectUniqueSample(
+          "SBClientPhishing.ClassifyThresholdsResult",
+          safe_browsing::SBClientDetectionClassifyThresholdsResult::kSuccess,
+          1);  // Example model file version
+    }
+  }
+}
+
+IN_PROC_BROWSER_TEST_P(ClientSideDetectionServiceBrowserTest,
+                       TfLiteClassificationAfterTwoModelUploads) {
+  if (!base::FeatureList::IsEnabled(
+          kClientSideDetectionModelOptimizationGuide)) {
+    return;
+  }
+  GURL url(embedded_test_server()->GetURL("/empty.html"));
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
+
+  content::RenderFrameHost* rfh = web_contents()->GetPrimaryMainFrame();
+  content::RenderProcessHost* rph = rfh->GetProcess();
+
+  base::HistogramTester histogram_tester;
+
+  safe_browsing::ClientSideDetectionService* csd_service =
+      ClientSideDetectionServiceFactory::GetForProfile(
+          Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
+
+  // Update the model and wait for confirmation
+  {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+
+    std::unique_ptr<PhishingModelWaiter> waiter =
+        CreatePhishingModelWaiter(rph);
+
+    base::RunLoop run_loop;
+    waiter->SetCallback(run_loop.QuitClosure());
+
+    base::FilePath tflite_path;
+    ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &tflite_path));
+#if BUILDFLAG(IS_ANDROID)
+    tflite_path = tflite_path.AppendASCII("safe_browsing")
+                      .AppendASCII("visual_model_android.tflite");
+#else
+    tflite_path = tflite_path.AppendASCII("safe_browsing")
+                      .AppendASCII("visual_model_desktop.tflite");
+#endif
+    base::File tflite_model(tflite_path,
+                            base::File::FLAG_OPEN | base::File::FLAG_READ);
+    ASSERT_TRUE(tflite_model.IsValid());
+
+    base::FilePath model_file_path;
+    ASSERT_TRUE(
+        base::PathService::Get(chrome::DIR_TEST_DATA, &model_file_path));
+    model_file_path = model_file_path.AppendASCII("safe_browsing")
+                          .AppendASCII("client_model.pb");
+    csd_service->SetModelAndVisualTfLiteForTesting(model_file_path,
+                                                   tflite_path);
+
+    run_loop.Run();
+  }
+
+  int first_thresholds_map_size =
+      csd_service->GetVisualTfLiteModelThresholds().size();
+
+  // Second time
+  {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+
+    std::unique_ptr<PhishingModelWaiter> waiter =
+        CreatePhishingModelWaiter(rph);
+
+    base::RunLoop run_loop;
+    waiter->SetCallback(run_loop.QuitClosure());
+
+    base::FilePath tflite_path;
+    ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &tflite_path));
+#if BUILDFLAG(IS_ANDROID)
+    tflite_path = tflite_path.AppendASCII("safe_browsing")
+                      .AppendASCII("visual_model_android.tflite");
+#else
+    tflite_path = tflite_path.AppendASCII("safe_browsing")
+                      .AppendASCII("visual_model_desktop.tflite");
+#endif
+    base::File tflite_model(tflite_path,
+                            base::File::FLAG_OPEN | base::File::FLAG_READ);
+    ASSERT_TRUE(tflite_model.IsValid());
+
+    base::FilePath model_file_path;
+    ASSERT_TRUE(
+        base::PathService::Get(chrome::DIR_TEST_DATA, &model_file_path));
+    model_file_path = model_file_path.AppendASCII("safe_browsing")
+                          .AppendASCII("client_model.pb");
+
+    csd_service->SetModelAndVisualTfLiteForTesting(model_file_path,
+                                                   tflite_path);
+    run_loop.Run();
+  }
+
+  EXPECT_EQ(first_thresholds_map_size,
+            csd_service->GetVisualTfLiteModelThresholds().size());
+
+  // Check that the update was successful
+  {
+    base::RunLoop run_loop;
+
+    mojo::AssociatedRemote<mojom::PhishingDetector> phishing_detector;
+    rfh->GetRemoteAssociatedInterfaces()->GetInterface(&phishing_detector);
+
+    mojom::PhishingDetectorResult result;
+    std::string verdict;
+    phishing_detector->StartPhishingDetection(
+        url,
+        base::BindOnce(
+            [](base::RepeatingClosure quit_closure,
+               mojom::PhishingDetectorResult* out_result,
+               std::string* out_verdict, mojom::PhishingDetectorResult result,
+               const std::string& verdict) {
+              *out_result = result;
+              *out_verdict = verdict;
+              quit_closure.Run();
+            },
+            run_loop.QuitClosure(), &result, &verdict));
+
+    run_loop.Run();
+
+    EXPECT_EQ(result, mojom::PhishingDetectorResult::SUCCESS);
+
+    ClientPhishingRequest request;
+    ASSERT_TRUE(request.ParseFromString(verdict));
+    if (!base::FeatureList::IsEnabled(
+            kClientSideDetectionModelOptimizationGuide)) {
+      EXPECT_EQ(123, request.model_version());
+    } else {
+      EXPECT_EQ(27, request.model_version());
+
+      csd_service->ClassifyPhishingThroughThresholds(&request);
+
+      histogram_tester.ExpectUniqueSample(
+          "SBClientPhishing.ClassifyThresholdsResult",
+          safe_browsing::SBClientDetectionClassifyThresholdsResult::kSuccess,
+          1);  // Example model file version
     }
   }
 }
diff --git a/chrome/browser/safe_browsing/ohttp_key_service_factory.cc b/chrome/browser/safe_browsing/ohttp_key_service_factory.cc
index d32c4d87..ff7c4ab8 100644
--- a/chrome/browser/safe_browsing/ohttp_key_service_factory.cc
+++ b/chrome/browser/safe_browsing/ohttp_key_service_factory.cc
@@ -6,8 +6,11 @@
 
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/safe_browsing/network_context_service_factory.h"
+#include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h"
 #include "content/public/browser/browser_context.h"
+#include "services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.h"
 
 namespace safe_browsing {
 
@@ -28,11 +31,22 @@
           ProfileSelections::Builder()
               .WithRegular(ProfileSelection::kOriginalOnly)
               .WithGuest(ProfileSelection::kOriginalOnly)
-              .Build()) {}
+              .Build()) {
+  DependsOn(NetworkContextServiceFactory::GetInstance());
+}
 
 KeyedService* OhttpKeyServiceFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
-  return new OhttpKeyService();
+  if (!g_browser_process->safe_browsing_service()) {
+    return nullptr;
+  }
+  Profile* profile = Profile::FromBrowserContext(context);
+  auto url_loader_factory =
+      std::make_unique<network::CrossThreadPendingSharedURLLoaderFactory>(
+          g_browser_process->safe_browsing_service()->GetURLLoaderFactory(
+              profile));
+  return new OhttpKeyService(
+      network::SharedURLLoaderFactory::Create(std::move(url_loader_factory)));
 }
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/settings/BUILD.gn b/chrome/browser/settings/BUILD.gn
index 59812dd..59251be9 100644
--- a/chrome/browser/settings/BUILD.gn
+++ b/chrome/browser/settings/BUILD.gn
@@ -53,6 +53,9 @@
   sources = [ "android/java/src/org/chromium/chrome/browser/settings/TestSettingsFragment.java" ]
   deps = [
     ":junit_test_resources",
+    "//base:base_java",
+    "//base:base_java_test_support",
+    "//components/browser_ui/widget/android:java",
     "//third_party/androidx:androidx_annotation_annotation_jvm_java",
     "//third_party/androidx:androidx_preference_preference_java",
   ]
diff --git a/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/TestSettingsFragment.java b/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/TestSettingsFragment.java
index cd607ec1..d98d5f35 100644
--- a/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/TestSettingsFragment.java
+++ b/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/TestSettingsFragment.java
@@ -9,12 +9,36 @@
 import androidx.annotation.Nullable;
 import androidx.preference.PreferenceFragmentCompat;
 
+import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.components.browser_ui.widget.gesture.BackPressHandler;
+
 /**
  * A TestSettingsFragment that has several preference inside.
  */
-public class TestSettingsFragment extends PreferenceFragmentCompat {
+public class TestSettingsFragment extends PreferenceFragmentCompat implements BackPressHandler {
+    private final ObservableSupplierImpl<Boolean> mBackPressStateSupplier =
+            new ObservableSupplierImpl<>();
+
+    private final CallbackHelper mBackPressCallback = new CallbackHelper();
+
+    public CallbackHelper getBackPressCallback() {
+        return mBackPressCallback;
+    }
+
     @Override
     public void onCreatePreferences(@Nullable Bundle bundle, @Nullable String s) {
         addPreferencesFromResource(R.xml.test_settings_fragment);
     }
+
+    @Override
+    public int handleBackPress() {
+        mBackPressCallback.notifyCalled();
+        return BackPressResult.SUCCESS;
+    }
+
+    @Override
+    public ObservableSupplierImpl<Boolean> getHandleBackPressChangedSupplier() {
+        return mBackPressStateSupplier;
+    }
 }
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidCustomActionProvider.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidCustomActionProvider.java
index e902b301..3f35418 100644
--- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidCustomActionProvider.java
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidCustomActionProvider.java
@@ -5,27 +5,16 @@
 package org.chromium.chrome.browser.share.android_share_sheet;
 
 import android.app.Activity;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.graphics.drawable.Icon;
-import android.os.Build;
-import android.os.Parcelable;
 
 import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
+import androidx.annotation.OptIn;
+import androidx.core.os.BuildCompat;
 
-import org.chromium.base.BuildInfo;
 import org.chromium.base.Callback;
-import org.chromium.base.ContextUtils;
-import org.chromium.base.IntentUtils;
-import org.chromium.base.Log;
-import org.chromium.base.ThreadUtils;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.share.ChromeCustomShareAction;
 import org.chromium.chrome.browser.share.ChromeProvidedSharingOptionsProviderBase;
 import org.chromium.chrome.browser.share.ChromeShareExtras;
 import org.chromium.chrome.browser.share.ShareContentTypeHelper;
@@ -33,29 +22,18 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.share.ShareParams;
-import org.chromium.components.browser_ui.share.ShareParams.TargetChosenCallback;
 import org.chromium.components.feature_engagement.Tracker;
 import org.chromium.ui.base.WindowAndroid;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * Provider that constructs custom actions for Android share sheet.
  */
-// TODO(https://crbug/1421447): Support custom actions in multi-instance.
-class AndroidCustomActionProvider extends ChromeProvidedSharingOptionsProviderBase {
-    private static final String TAG = "AndroidShare";
-    private static final String EXTRA_SHARE_CUSTOM_ACTION = "EXTRA_SHARE_CUSTOM_ACTION";
-    // Arbitrary request code used for pending intents of custom action.
-    private static final Integer CUSTOM_ACTION_REQUEST_CODE = 112;
-
-    private static CustomActionAgent sLastRegisteredAgent;
-    private static String sCustomChooserAction;
+class AndroidCustomActionProvider extends ChromeProvidedSharingOptionsProviderBase
+        implements ChromeCustomShareAction.Provider {
+    private final List<ChromeCustomShareAction> mCustomActions = new ArrayList<>();
 
     /**
      * Constructs a new {@link AndroidCustomActionProvider}.
@@ -72,14 +50,19 @@
      * @param featureEngagementTracker feature engagement tracker.
      * @param url Url to share.
      * @param profile The current profile of the User.
+     * @param chromeShareExtras The {@link ChromeShareExtras} for the current share, if exists.
+     * @param isMultiWindow Whether the current activity is in multi-window mode.
      */
     AndroidCustomActionProvider(Activity activity, WindowAndroid windowAndroid,
             Supplier<Tab> tabProvider, BottomSheetController bottomSheetController,
             ShareParams shareParams, Callback<Tab> printTab, boolean isIncognito,
             ChromeOptionShareCallback chromeOptionShareCallback, Tracker featureEngagementTracker,
-            String url, Profile profile) {
+            String url, Profile profile, ChromeShareExtras chromeShareExtras,
+            boolean isMultiWindow) {
         super(activity, windowAndroid, tabProvider, bottomSheetController, shareParams, printTab,
                 isIncognito, chromeOptionShareCallback, featureEngagementTracker, url, profile);
+
+        initCustomActions(shareParams, chromeShareExtras, isMultiWindow);
     }
 
     /**
@@ -90,48 +73,28 @@
      * @param isMultiWindow Whether the current activity is in multi-window mode.
      * @return List of custom action used for Android share sheet.
      */
-    List<Parcelable> createCustomActions(
+    @OptIn(markerClass = androidx.core.os.BuildCompat.PrereleaseSdkCheck.class)
+    private void initCustomActions(
             ShareParams params, ChromeShareExtras chromeShareExtras, boolean isMultiWindow) {
-        // TODO(https://crbug.com/1421783): Maybe fallback to Chrome's share sheet properly.
-        if (!ChooserActionHelper.isSupported()) {
-            return new ArrayList<>();
+        if (!BuildCompat.isAtLeastU()) {
+            return;
         }
 
         List<FirstPartyOption> options = getFirstPartyOptions(
                 ShareContentTypeHelper.getContentTypes(params, chromeShareExtras),
                 chromeShareExtras.getDetailedContentType(), isMultiWindow);
 
-        CustomActionAgent agent = new CustomActionAgent(mActivity, options, params.getCallback());
-        registerBroadcastReceiver(agent);
-        return agent.getCustomActions();
-    }
-
-    private static String getBroadcastReceiverAction() {
-        // Create custom action based on the context and channel. This is needed so actions
-        // triggered by other Chrome channels will not receive signals.
-        if (sCustomChooserAction == null) {
-            sCustomChooserAction = ContextUtils.getApplicationContext().getPackageName() + "/"
-                    + AndroidCustomActionProvider.class.getName() + "_ACTION";
+        for (var option : options) {
+            mCustomActions.add(new ChromeCustomShareAction(option.featureNameForMetrics,
+                    Icon.createWithResource(mActivity, option.icon),
+                    mActivity.getResources().getString(option.iconLabel),
+                    option.onClickCallback.bind(null)));
         }
-        return sCustomChooserAction;
     }
 
-    private static void registerBroadcastReceiver(CustomActionAgent receiver) {
-        ThreadUtils.assertOnUiThread();
-        unregisterBroadcastReceiver();
-        sLastRegisteredAgent = receiver;
-        ContextUtils.registerNonExportedBroadcastReceiver(ContextUtils.getApplicationContext(),
-                receiver, new IntentFilter(getBroadcastReceiverAction()));
-    }
-
-    @VisibleForTesting
-    static void unregisterBroadcastReceiver() {
-        ThreadUtils.assertOnUiThread();
-        if (sLastRegisteredAgent != null) {
-            sCustomChooserAction = null;
-            ContextUtils.getApplicationContext().unregisterReceiver(sLastRegisteredAgent);
-            sLastRegisteredAgent = null;
-        }
+    @Override
+    public List<ChromeCustomShareAction> getCustomActions() {
+        return mCustomActions;
     }
 
     //  extends ChromeProvidedSharingOptionsProviderBase:
@@ -148,130 +111,4 @@
     protected FirstPartyOption createLongScreenshotsFirstPartyOption() {
         return null;
     }
-
-    /** Helper class used to create and handle custom actions. */
-    private static class CustomActionAgent extends BroadcastReceiver {
-        private final Map<String, Runnable> mActionsMap = new HashMap<>();
-        private final List<Parcelable> mCustomActions = new ArrayList<>();
-        private final @Nullable TargetChosenCallback mCallback;
-
-        /**
-         * Create a CustomActionAgent which creates a list of custom actions, and knowing how to
-         * handle them. To use, this class needs to be registered as BroadCastReceiver for the
-         * application context.
-         *
-         * The wrapped {@link TargetChosenCallback} will be called when a custom action is selected.
-         * This class does not handle {@link TargetChosenCallback#onCancel()}, as there's no such a
-         * signal an custom action is "canceled". If the share sheet is canceled, such path is
-         * handled by {@link
-         * org.chromium.components.browser_ui.share.ShareHelper.TargetChosenReceiver}.
-         *
-         * @param context The application context
-         * @param options List of options that used to build the custom actions.
-         * @param callback Wrapped callback will be called when a custom action is selected.
-         */
-        CustomActionAgent(Context context, List<FirstPartyOption> options,
-                @Nullable TargetChosenCallback callback) {
-            mCallback = callback;
-
-            for (FirstPartyOption option : options) {
-                Parcelable chooserAction = makeCustomAction(context, option.featureNameForMetrics,
-                        context.getString(option.iconLabel), option.icon);
-                assert (chooserAction != null)
-                    : "Chooser action is null even when |ChooserActionHelper.isSupported()|.";
-                mActionsMap.put(option.featureNameForMetrics, option.onClickCallback.bind(null));
-                mCustomActions.add(chooserAction);
-            }
-        }
-
-        /**
-         * @return The list of custom actions supported by this agent.
-         */
-        public List<Parcelable> getCustomActions() {
-            return mCustomActions;
-        }
-
-        @Nullable
-        Parcelable makeCustomAction(Context context, String action, String name, int drawableRes) {
-            // Broadcasting intent has to be an explicit intent. (i.e. with package name)
-            Intent broadcastingIntent = new Intent(getBroadcastReceiverAction());
-            broadcastingIntent.setPackage(context.getPackageName());
-            broadcastingIntent.putExtra(EXTRA_SHARE_CUSTOM_ACTION, action);
-
-            // Adding intent extras since non-exported broadcast listener does not exist pre-T.
-            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
-                IntentUtils.addTrustedIntentExtras(broadcastingIntent);
-            }
-
-            // Use unique request codes for each pending intent to not overriding each other.
-            int requestCode = CUSTOM_ACTION_REQUEST_CODE + drawableRes;
-            PendingIntent pendingIntent =
-                    PendingIntent.getBroadcast(context, requestCode, broadcastingIntent,
-                            PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
-            Icon icon = Icon.createWithResource(context, drawableRes);
-
-            return ChooserActionHelper.newChooserAction(icon, name, pendingIntent);
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            assert sLastRegisteredAgent
-                    == this : "CustomActionAgent is not tracked as last registered agent.";
-            // Ignore untrusted intent pre-T.
-            if (!BuildInfo.isAtLeastT() && !IntentUtils.isTrustedIntentFromSelf(intent)) return;
-
-            unregisterBroadcastReceiver();
-            String actionKey = IntentUtils.safeGetStringExtra(intent, EXTRA_SHARE_CUSTOM_ACTION);
-            if (mActionsMap.containsKey(actionKey)) {
-                mActionsMap.get(actionKey).run();
-            } else {
-                // TODO(https://crbug/1421447): Make an assert once we supported multi-instance.
-                Log.w(TAG, "Selected custom action can not be found.");
-            }
-
-            ComponentName chosenComponent =
-                    intent.getParcelableExtra(Intent.EXTRA_CHOSEN_COMPONENT);
-            if (mCallback != null) {
-                mCallback.onTargetChosen(chosenComponent);
-            }
-        }
-    }
-
-    /**
-     * Helper class used to build Android custom action.
-     */
-    // TODO(https://crbug.com/1420388): Replace calls with Android OS chooser actions.
-    @VisibleForTesting
-    static class ChooserActionHelper {
-        /**
-         * Try to query if the builder class exists.
-         */
-        @SuppressWarnings("PrivateApi")
-        static boolean isSupported() {
-            try {
-                Class.forName("android.service.chooser.ChooserAction$Builder");
-                return true;
-            } catch (ClassNotFoundException e) {
-                return false;
-            }
-        }
-
-        @SuppressWarnings("PrivateApi")
-        static Parcelable newChooserAction(Icon icon, String name, PendingIntent action) {
-            Parcelable parcelable = null;
-            try {
-                Class<?> chooserActionBuilderClass =
-                        Class.forName("android.service.chooser.ChooserAction$Builder");
-                Constructor<?> ctor = chooserActionBuilderClass.getConstructor(
-                        Icon.class, CharSequence.class, PendingIntent.class);
-                Object builder = ctor.newInstance(icon, name, action);
-                parcelable =
-                        (Parcelable) chooserActionBuilderClass.getMethod("build").invoke(builder);
-            } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException
-                    | InvocationTargetException | InstantiationException e) {
-                Log.w(TAG, "Building ChooserAction failed.", e);
-            }
-            return parcelable;
-        }
-    }
 }
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetController.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetController.java
index a9906f76..6611306 100644
--- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetController.java
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetController.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.share.android_share_sheet;
 
 import android.app.Activity;
-import android.os.Parcelable;
 import android.text.TextUtils;
 
 import androidx.annotation.VisibleForTesting;
@@ -16,6 +15,7 @@
 import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.share.ChromeCustomShareAction;
 import org.chromium.chrome.browser.share.ChromeShareExtras;
 import org.chromium.chrome.browser.share.ShareHelper;
 import org.chromium.chrome.browser.share.share_sheet.ChromeOptionShareCallback;
@@ -24,8 +24,6 @@
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.share.ShareParams;
 
-import java.util.List;
-
 /**
  * Share sheet controller used to display Android share sheet.
  */
@@ -97,20 +95,23 @@
         Profile profile = mProfileSupplier.get();
         boolean isIncognito = mTabModelSelectorSupplier.hasValue()
                 && mTabModelSelectorSupplier.get().isIncognitoSelected();
-        List<Parcelable> customActions = null;
-        if (showCustomActions) {
-            var customActionHandler = new AndroidCustomActionProvider(
-                    params.getWindow().getActivity().get(), params.getWindow(), mTabProvider,
-                    mController, params, mPrintCallback, isIncognito, this,
-                    TrackerFactory.getTrackerForProfile(profile), params.getUrl(), profile);
+        ChromeCustomShareAction.Provider provider = null;
 
+        if (showCustomActions) {
             Activity activity = params.getWindow().getActivity().get();
             boolean isInMultiWindow = ApiCompatibilityUtils.isInMultiWindowMode(activity);
-            customActions = customActionHandler.createCustomActions(
-                    params, chromeShareExtras, isInMultiWindow);
+            var actionProvider =
+                    new AndroidCustomActionProvider(params.getWindow().getActivity().get(),
+                            params.getWindow(), mTabProvider, mController, params, mPrintCallback,
+                            isIncognito, this, TrackerFactory.getTrackerForProfile(profile),
+                            params.getUrl(), profile, chromeShareExtras, isInMultiWindow);
+            if (actionProvider.getCustomActions().size() > 0) {
+                provider = actionProvider;
+            }
         }
 
-        if (customActions == null || customActions.size() == 0) {
+        // TODO(https://crbug.com/1421783): Maybe fallback to Chrome's share sheet properly.
+        if (provider == null || provider.getCustomActions().size() == 0) {
             Log.i(TAG, "No custom actions provided.");
         }
 
@@ -121,12 +122,7 @@
             params.setUrl(imageUrlToShare);
         }
         ShareHelper.shareWithSystemShareSheetUi(
-                params, profile, chromeShareExtras.saveLastUsed(), customActions);
-    }
-
-    @VisibleForTesting
-    public static void resetForTesting() {
-        AndroidCustomActionProvider.unregisterBroadcastReceiver();
+                params, profile, chromeShareExtras.saveLastUsed(), provider);
     }
 
     private static String getImageUrlToShare(
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetControllerUnitTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetControllerUnitTest.java
index 46878e5..1fe3bf6e 100644
--- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetControllerUnitTest.java
+++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetControllerUnitTest.java
@@ -52,13 +52,14 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.share.ChromeShareExtras;
 import org.chromium.chrome.browser.share.ChromeShareExtras.DetailedContentType;
+import org.chromium.chrome.browser.share.ShareHelper;
 import org.chromium.chrome.browser.share.android_share_sheet.AndroidShareSheetControllerUnitTest.ShadowBuildCompatForU;
+import org.chromium.chrome.browser.share.android_share_sheet.AndroidShareSheetControllerUnitTest.ShadowChooserActionHelper;
 import org.chromium.chrome.browser.share.send_tab_to_self.SendTabToSelfAndroidBridgeJni;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
-import org.chromium.components.browser_ui.share.ShareHelper;
 import org.chromium.components.browser_ui.share.ShareParams;
 import org.chromium.components.browser_ui.share.ShareParams.TargetChosenCallback;
 import org.chromium.components.feature_engagement.Tracker;
@@ -76,7 +77,6 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Features.DisableFeatures(
         {ChromeFeatureList.WEBNOTES_STYLIZE, ChromeFeatureList.SEND_TAB_TO_SELF_SIGNIN_PROMO})
-@Config(shadows = ShadowBuildCompatForU.class)
 public class AndroidShareSheetControllerUnitTest {
     private static final String INTENT_EXTRA_CHOOSER_CUSTOM_ACTIONS =
             "android.intent.extra.CHOOSER_CUSTOM_ACTIONS";
@@ -141,8 +141,6 @@
 
     @After
     public void tearDown() {
-        AndroidShareSheetController.resetForTesting();
-        ShareHelper.TargetChosenReceiver.resetForTesting();
         mWindow.destroy();
         TrackerFactory.setTrackerForTests(null);
     }
@@ -151,11 +149,14 @@
      * Test whether custom actions are attached to the intent.
      */
     @Test
+    @Config(shadows = {ShadowBuildCompatForU.class, ShadowChooserActionHelper.class})
     public void shareWithCustomAction() {
-        ShareParams params = new ShareParams.Builder(mWindow, "", "")
+        ShareParams params = new ShareParams.Builder(mWindow, "", JUnitTestGURLs.EXAMPLE_URL)
                                      .setBypassFixingDomDistillerUrl(true)
+                                     .setFileContentType("text/plain")
                                      .build();
-        ChromeShareExtras chromeShareExtras = new ChromeShareExtras.Builder().build();
+        ChromeShareExtras chromeShareExtras =
+                new ChromeShareExtras.Builder().setIsUrlOfVisiblePage(true).build();
         mController.showShareSheet(params, chromeShareExtras, 1L);
 
         Intent intent = Shadows.shadowOf((Activity) mActivity).peekNextStartedActivity();
@@ -177,7 +178,7 @@
     }
 
     @Test
-    @Config(shadows = ShadowChooserActionHelper.class)
+    @Config(shadows = {ShadowBuildCompatForU.class, ShadowChooserActionHelper.class})
     public void choosePrintAction() throws CanceledException {
         CallbackHelper callbackHelper = new CallbackHelper();
         TargetChosenCallback callback = new TargetChosenCallback() {
@@ -252,7 +253,7 @@
     /**
      * Test implementation to build a ChooserAction.
      */
-    @Implements(AndroidCustomActionProvider.ChooserActionHelper.class)
+    @Implements(ShareHelper.ChooserActionHelper.class)
     static class ShadowChooserActionHelper {
         @Implementation
         protected static boolean isSupported() {
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelperTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelperTest.java
index a49e80b..a78ddaa 100644
--- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelperTest.java
+++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelperTest.java
@@ -27,6 +27,7 @@
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.LooperMode;
 
+import org.chromium.base.UnownedUserDataHost;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.JniMocker;
@@ -100,6 +101,7 @@
 
         mActivity = Robolectric.setupActivity(Activity.class);
         when(mWindow.getActivity()).thenReturn(new WeakReference<>(mActivity));
+        when(mWindow.getUnownedUserDataHost()).thenReturn(new UnownedUserDataHost());
         when(mDistillerUrlUtilsJniMock.getOriginalUrlFromDistillerUrl(anyString()))
                 .thenReturn(JUnitTestGURLs.getGURL(MOCK_URL));
         when(mContentTypes.contains(ShareContentTypeHelper.ContentType.IMAGE)).thenReturn(true);
diff --git a/chrome/browser/storage/shared_storage_browsertest.cc b/chrome/browser/storage/shared_storage_browsertest.cc
index 74d81f2..0b193814 100644
--- a/chrome/browser/storage/shared_storage_browsertest.cc
+++ b/chrome/browser/storage/shared_storage_browsertest.cc
@@ -357,7 +357,8 @@
   }
 
   double RemainingBudget(const content::ToRenderFrameHost& execution_target,
-                         bool should_add_module = false) {
+                         bool should_add_module = false,
+                         bool keep_alive_after_operation = true) {
     if (should_add_module)
       AddSimpleModule(execution_target);
 
@@ -367,8 +368,12 @@
     budget_console_observer.SetPattern(
         base::StrCat({kRemainingBudgetPrefixStr, "*"}));
 
+    EXPECT_TRUE(ExecJs(execution_target,
+                       content::JsReplace("window.keepWorklet = $1;",
+                                          keep_alive_after_operation)));
+
     EXPECT_TRUE(ExecJs(execution_target, R"(
-      sharedStorage.run('remaining-budget-operation', {data: {}});
+      sharedStorage.run('remaining-budget-operation', {keepAlive: keepWorklet});
     )"));
 
     bool observed = budget_console_observer.Wait();
@@ -2321,7 +2326,12 @@
 
       sharedStorage.delete('key0');
       sharedStorage.delete('key2');
-      sharedStorage.clear();
+
+      // It's necessary to `await` this finally promise, since we are not
+      // using the option `keepAlive: true` in the `run()` call. The worklet
+      // will be closed by the browser once the worklet signals to the browser
+      // that the `run()` call has finished.
+      await sharedStorage.clear();
 
       console.log('Finished script');
     )",
@@ -2467,7 +2477,8 @@
 
   content::RenderFrameHost* SelectURLAndCreateFencedFrame(
       content::RenderFrameHost* render_frame_host,
-      bool should_add_module = true) {
+      bool should_add_module = true,
+      bool keep_alive_after_operation = true) {
     if (should_add_module)
       AddSimpleModule(render_frame_host);
 
@@ -2481,6 +2492,10 @@
                content::JsReplace("window.resolveSelectURLToConfig = $1;",
                                   ResolveSelectURLToConfig())));
 
+    EXPECT_TRUE(ExecJs(render_frame_host,
+                       content::JsReplace("window.keepWorklet = $1;",
+                                          keep_alive_after_operation)));
+
     // Construct and add the `TestSelectURLFencedFrameConfigObserver` to shared
     // storage worklet host manager.
     content::StoragePartition* storage_partition =
@@ -2510,7 +2525,8 @@
             ],
             {
               data: {'mockResult': 1},
-              resolveToConfig: resolveSelectURLToConfig
+              resolveToConfig: resolveSelectURLToConfig,
+              keepAlive: keepWorklet
             }
           );
           if (resolveSelectURLToConfig &&
diff --git a/chrome/browser/storage_access_api/api_browsertest.cc b/chrome/browser/storage_access_api/api_browsertest.cc
index 4f02689..b4d69d9 100644
--- a/chrome/browser/storage_access_api/api_browsertest.cc
+++ b/chrome/browser/storage_access_api/api_browsertest.cc
@@ -398,6 +398,64 @@
   StorageAccessAPIBrowserTest() : StorageAccessAPIBaseBrowserTest(GetParam()) {}
 };
 
+// Check default values for permissions.query on storage-access.
+IN_PROC_BROWSER_TEST_P(StorageAccessAPIBrowserTest, PermissionQueryDefault) {
+  SetBlockThirdPartyCookies(true);
+  base::HistogramTester histogram_tester;
+
+  NavigateToPageWithFrame(kHostA);
+  NavigateFrameTo(kHostB, "/echoheader?cookie");
+
+  EXPECT_EQ(QueryPermission(GetPrimaryMainFrame()), "prompt");
+  EXPECT_EQ(QueryPermission(GetFrame()), "prompt");
+}
+
+// Test that permissions.query changes to "granted" when a storage access
+// request was successful.
+IN_PROC_BROWSER_TEST_P(StorageAccessAPIBrowserTest, PermissionQueryGranted) {
+  SetBlockThirdPartyCookies(true);
+  base::HistogramTester histogram_tester;
+
+  NavigateToPageWithFrame(kHostA);
+  NavigateFrameTo(kHostB, "/echoheader?cookie");
+
+  EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame()));
+  EXPECT_EQ(QueryPermission(GetFrame()), "prompt");
+
+  // Grant initial permission.
+  EXPECT_TRUE(storage::test::RequestAndCheckStorageAccessForFrame(GetFrame()));
+  EXPECT_EQ(QueryPermission(GetFrame()), "granted");
+
+  // Ensure that after a navigation the permission state is preserved.
+  NavigateToPageWithFrame(kHostA);
+  NavigateFrameTo(kHostB, "/echoheader?cookie");
+  EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame()));
+  EXPECT_EQ(QueryPermission(GetFrame()), "granted");
+}
+
+IN_PROC_BROWSER_TEST_P(StorageAccessAPIBrowserTest, PermissionQueryCrossSite) {
+  SetBlockThirdPartyCookies(true);
+  base::HistogramTester histogram_tester;
+
+  NavigateToPageWithFrame(kHostB);
+  NavigateFrameTo(kHostA, "/echoheader?cookie");
+
+  EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetFrame()));
+  EXPECT_EQ(QueryPermission(GetFrame()), "prompt");
+
+  // Grant initial permission.
+  EXPECT_TRUE(storage::test::RequestAndCheckStorageAccessForFrame(GetFrame()));
+  EXPECT_EQ(QueryPermission(GetFrame()), "granted");
+
+  // Ensure that the scope of the permission grant is for the entire site.
+  NavigateFrameTo(kHostASubdomain, "/echoheader?cookie");
+  EXPECT_EQ(QueryPermission(GetFrame()), "granted");
+
+  // The permission should not be available cross-site.
+  NavigateFrameTo(kHostC, "/echoheader?cookie");
+  EXPECT_EQ(QueryPermission(GetFrame()), "prompt");
+}
+
 // Validate that a cross-site iframe can bypass third-party cookie blocking via
 // the Storage Access API.
 IN_PROC_BROWSER_TEST_P(StorageAccessAPIBrowserTest,
@@ -1002,16 +1060,10 @@
   NavigateToPageWithFrame(kHostA);
   NavigateFrameTo(EchoCookiesURL(kHostASubdomain));
 
-  prompt_factory()->set_response_type(
-      permissions::PermissionRequestManager::ACCEPT_ALL);
-
   EXPECT_TRUE(storage::test::HasStorageAccessForFrame(GetFrame()));
   EXPECT_TRUE(storage::test::RequestAndCheckStorageAccessForFrame(GetFrame()));
-  // TODO(crbug.com/1425562): requestStorageAccess behavior should be align with
-  // hasStorageAccess, i.e. prompt should not be shown.
-  EXPECT_EQ(1, prompt_factory()->TotalRequestCount());
-  EXPECT_EQ(1, prompt_factory()->RequestTypeSeen(
-                   permissions::RequestType::kStorageAccess));
+
+  EXPECT_EQ(0, prompt_factory()->TotalRequestCount());
 
   EXPECT_EQ(ReadCookiesAndContent(GetFrame(), kHostA),
             CookieBundleWithContent("cross-site=a.test"));
@@ -1047,21 +1099,12 @@
   NavigateFrameTo(kHostB, "/iframe.html");
   NavigateNestedFrameTo(kHostASubdomain, "/empty.html");
 
-  prompt_factory()->set_response_type(
-      permissions::PermissionRequestManager::ACCEPT_ALL);
-
   EXPECT_FALSE(storage::test::HasStorageAccessForFrame(GetNestedFrame()));
   EXPECT_EQ(ReadCookies(GetNestedFrame(), kHostA), NoCookies());
 
   EXPECT_TRUE(
       storage::test::RequestAndCheckStorageAccessForFrame(GetNestedFrame()));
-  // TODO(crbug.com/1425562): requestStorageAccess should resolve to true
-  // without showing the prompt, according to spec PR:
-  // https://github.com/privacycg/storage-access/pull/169
-  EXPECT_EQ(1, prompt_factory()->TotalRequestCount());
-  EXPECT_EQ(1, prompt_factory()->RequestTypeSeen(
-                   permissions::RequestType::kStorageAccess));
-
+  EXPECT_EQ(0, prompt_factory()->TotalRequestCount());
   EXPECT_EQ(ReadCookies(GetNestedFrame(), kHostASubdomain),
             CookieBundle("cross-site=a.test"));
 }
diff --git a/chrome/browser/storage_access_api/storage_access_grant_permission_context.cc b/chrome/browser/storage_access_api/storage_access_grant_permission_context.cc
index 94d8bb0a..cf16a18 100644
--- a/chrome/browser/storage_access_api/storage_access_grant_permission_context.cc
+++ b/chrome/browser/storage_access_api/storage_access_grant_permission_context.cc
@@ -37,6 +37,8 @@
 #include "third_party/blink/public/common/features_generated.h"
 #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom.h"
 
+using content_settings::URLToSchemefulSitePattern;
+
 namespace {
 
 constexpr base::TimeDelta kImplicitGrantDuration = base::Hours(24);
@@ -334,20 +336,11 @@
   // This permission was allowed so store it either ephemerally or more
   // permanently depending on if the allow came from a prompt or automatic
   // grant.
-  const net::SchemefulSite embedding_site(embedding_origin);
-  const GURL embedding_site_as_url = embedding_site.GetURL();
-  ContentSettingsPattern secondary_site_pattern =
-      ContentSettingsPattern::CreateBuilder()
-          ->WithScheme(embedding_site_as_url.scheme())
-          ->WithDomainWildcard()
-          ->WithHost(embedding_site_as_url.host())
-          ->WithPathWildcard()
-          ->WithPortWildcard()
-          ->Build();
   settings_map->SetContentSettingCustomScope(
-      ContentSettingsPattern::FromURLNoWildcard(requesting_origin),
-      secondary_site_pattern, ContentSettingsType::STORAGE_ACCESS,
-      content_setting, ComputeConstraints(outcome, implicit_result));
+      URLToSchemefulSitePattern(requesting_origin),
+      URLToSchemefulSitePattern(embedding_origin),
+      ContentSettingsType::STORAGE_ACCESS, content_setting,
+      ComputeConstraints(outcome, implicit_result));
 
   ContentSettingsForOneType grants;
   settings_map->GetSettingsForOneType(ContentSettingsType::STORAGE_ACCESS,
diff --git a/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc b/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
index b5c33fb..6e354e05 100644
--- a/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
+++ b/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
@@ -41,6 +41,10 @@
   return GURL("https://embedder.com");
 }
 
+GURL GetTopLevelURLSubdomain() {
+  return GURL("https://sub.embedder.com");
+}
+
 GURL GetDummyEmbeddingUrlWithSubdomain() {
   return GURL("https://subdomain.example_embedder_1.com");
 }
@@ -49,6 +53,10 @@
   return GURL("https://requester.example.com");
 }
 
+GURL GetRequesterURLSubdomain() {
+  return GURL("https://another-requester.example.com");
+}
+
 GURL GetDummyEmbeddingUrl(int dummy_id) {
   return GURL(std::string(url::kHttpsScheme) + "://example_embedder_" +
               base::NumberToString(dummy_id) + ".com");
@@ -126,6 +134,38 @@
     EXPECT_FALSE(manager->IsRequestInProgress());
   }
 
+  // Helper to ensure that a given content setting is consistently applied on a
+  // cross-site scope.
+  void CheckCrossSiteContentSettings(ContentSetting expected_setting) {
+    HostContentSettingsMap* settings_map =
+        HostContentSettingsMapFactory::GetForProfile(profile());
+    DCHECK(settings_map);
+
+    auto setting =
+        settings_map->GetContentSetting(GetRequesterURL(), GetTopLevelURL(),
+                                        ContentSettingsType::STORAGE_ACCESS);
+
+    EXPECT_EQ(setting, expected_setting);
+
+    setting = settings_map->GetContentSetting(
+        GetRequesterURLSubdomain(), GetTopLevelURL(),
+        ContentSettingsType::STORAGE_ACCESS);
+
+    EXPECT_EQ(setting, expected_setting);
+
+    setting = settings_map->GetContentSetting(
+        GetRequesterURLSubdomain(), GetTopLevelURLSubdomain(),
+        ContentSettingsType::STORAGE_ACCESS);
+
+    EXPECT_EQ(setting, expected_setting);
+
+    setting = settings_map->GetContentSetting(
+        GetRequesterURL(), GetTopLevelURLSubdomain(),
+        ContentSettingsType::STORAGE_ACCESS);
+
+    EXPECT_EQ(setting, expected_setting);
+  }
+
   permissions::PermissionRequestID CreateFakeID() {
     return permissions::PermissionRequestID(
         web_contents()->GetPrimaryMainFrame(),
@@ -182,6 +222,56 @@
   base::HistogramTester histogram_tester_;
 };
 
+// Test that after a successful explicit storage access grant, there's a content
+// setting that applies on an (embedded site, top-level site) scope.
+TEST_F(StorageAccessGrantPermissionContextAPIEnabledTest,
+       ExplicitGrantAcceptCrossSiteContentSettings) {
+  StorageAccessGrantPermissionContext permission_context(profile());
+
+  ExhaustImplicitGrants(GetRequesterURL(), permission_context);
+  histogram_tester().ExpectTotalCount(kGrantIsImplicitHistogram, 5);
+  histogram_tester().ExpectBucketCount(kGrantIsImplicitHistogram,
+                                       /*sample=*/true, 5);
+
+  // Assert that all content settings are in their initial state.
+  CheckCrossSiteContentSettings(ContentSetting::CONTENT_SETTING_ASK);
+
+  base::test::TestFuture<ContentSetting> future;
+  permission_context.DecidePermissionForTesting(
+      CreateFakeID(), GetRequesterURL(), GetTopLevelURL(),
+      /*user_gesture=*/true, future.GetCallback());
+
+  // Run until the prompt is ready.
+  base::RunLoop().RunUntilIdle();
+
+  permissions::PermissionRequestManager* manager =
+      permissions::PermissionRequestManager::FromWebContents(web_contents());
+  ASSERT_TRUE(manager);
+  ASSERT_TRUE(manager->IsRequestInProgress());
+
+  // Accept the prompt and validate we get the expected setting back in our
+  // callback.
+  manager->Accept();
+  EXPECT_EQ(CONTENT_SETTING_ALLOW, future.Get());
+
+  histogram_tester().ExpectTotalCount(kGrantIsImplicitHistogram, 6);
+  histogram_tester().ExpectBucketCount(kGrantIsImplicitHistogram,
+                                       /*sample=*/true, 5);
+  histogram_tester().ExpectBucketCount(kGrantIsImplicitHistogram,
+                                       /*sample=*/false, 1);
+  histogram_tester().ExpectTotalCount(kPromptResultHistogram, 1);
+  histogram_tester().ExpectBucketCount(
+      kPromptResultHistogram,
+      /*sample=*/permissions::PermissionAction::GRANTED, 1);
+  EXPECT_EQ(histogram_tester().GetBucketCount(kRequestOutcomeHistogram,
+                                              RequestOutcome::kGrantedByUser),
+            1);
+
+  // Assert that the permission grant set a content setting that applies
+  // at the right scope.
+  CheckCrossSiteContentSettings(ContentSetting::CONTENT_SETTING_ALLOW);
+}
+
 // When the Storage Access API feature is enabled and we have a user gesture we
 // should get a decision.
 TEST_F(StorageAccessGrantPermissionContextAPIEnabledTest, PermissionDecided) {
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributesTest.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributesTest.java
index 1269898..7e0a959 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributesTest.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateAttributesTest.java
@@ -65,7 +65,7 @@
         MockitoAnnotations.initMocks(this);
         ShadowPostTask.setTestImpl(new ShadowPostTask.TestImpl() {
             @Override
-            public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+            public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
                 new Handler(Looper.getMainLooper()).postDelayed(task, delay);
             }
         });
diff --git a/chrome/browser/ui/android/toolbar/adaptive_toolbar_enums.h b/chrome/browser/ui/android/toolbar/adaptive_toolbar_enums.h
index e401322..552fd3cb 100644
--- a/chrome/browser/ui/android/toolbar/adaptive_toolbar_enums.h
+++ b/chrome/browser/ui/android/toolbar/adaptive_toolbar_enums.h
@@ -31,7 +31,9 @@
   kReaderMode = 7,
   // Translate page action.
   kTranslate = 8,
-  kMaxValue = kTranslate,
+  // Add to bookmarks action.
+  kAddToBookmarks = 9,
+  kMaxValue = kAddToBookmarks,
 };
 
 #endif  // CHROME_BROWSER_UI_ANDROID_TOOLBAR_ADAPTIVE_TOOLBAR_ENUMS_H_
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
index 2af2bb4..4b47198 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -1164,6 +1164,7 @@
         mActiveLocationBarBackground = mLocationBarBackground;
         mNtpSearchBoxTranslation.set(0, 0);
         mLocationBar.getPhoneCoordinator().setTranslationY(0);
+        mLocationBar.getPhoneCoordinator().setTranslationX(0);
         if (!mUrlFocusChangeInProgress) {
             mToolbarButtonsContainer.setTranslationY(0);
             mHomeButton.setTranslationY(0);
diff --git a/chrome/browser/ui/ash/media_client_impl.cc b/chrome/browser/ui/ash/media_client_impl.cc
index 6a97d5f..3be68da 100644
--- a/chrome/browser/ui/ash/media_client_impl.cc
+++ b/chrome/browser/ui/ash/media_client_impl.cc
@@ -671,6 +671,10 @@
 void MediaClientImpl::ShowCameraOffNotification(const std::string& device_id,
                                                 const std::string& device_name,
                                                 const bool resurface) {
+  if (ash::features::IsPrivacyIndicatorsEnabled() ||
+      ash::features::IsVideoConferenceEnabled()) {
+    return;
+  }
   auto it = device_id_to_camera_privacy_switch_state_.find(device_id);
   if (it == device_id_to_camera_privacy_switch_state_.end() ||
       it->second != cros::mojom::CameraPrivacySwitchState::ON ||
diff --git a/chrome/browser/ui/browser_element_identifiers.cc b/chrome/browser/ui/browser_element_identifiers.cc
index 9bcec83e..9673b02 100644
--- a/chrome/browser/ui/browser_element_identifiers.cc
+++ b/chrome/browser/ui/browser_element_identifiers.cc
@@ -18,6 +18,7 @@
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kBookmarkSidePanelWebViewElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kBookmarkStarViewElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kBrowserViewElementId);
+DEFINE_ELEMENT_IDENTIFIER_VALUE(kDownloadToolbarButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kEnhancedProtectionSettingElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kExclusiveAccessBubbleViewElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kForwardButtonElementId);
diff --git a/chrome/browser/ui/browser_element_identifiers.h b/chrome/browser/ui/browser_element_identifiers.h
index fe20ff6..ceb8101 100644
--- a/chrome/browser/ui/browser_element_identifiers.h
+++ b/chrome/browser/ui/browser_element_identifiers.h
@@ -27,6 +27,7 @@
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kBookmarkSidePanelWebViewElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kBookmarkStarViewElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kBrowserViewElementId);
+DECLARE_ELEMENT_IDENTIFIER_VALUE(kDownloadToolbarButtonElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kEnhancedProtectionSettingElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kExclusiveAccessBubbleViewElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kForwardButtonElementId);
diff --git a/chrome/browser/ui/cocoa/applescript/apple_event_util.h b/chrome/browser/ui/cocoa/applescript/apple_event_util.h
index 9ef8aad..82e0f256cc 100644
--- a/chrome/browser/ui/cocoa/applescript/apple_event_util.h
+++ b/chrome/browser/ui/cocoa/applescript/apple_event_util.h
@@ -5,7 +5,7 @@
 #ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_APPLE_EVENT_UTIL_H_
 #define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_APPLE_EVENT_UTIL_H_
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 namespace base {
 class Value;
@@ -13,15 +13,13 @@
 
 class Profile;
 
-namespace chrome {
-namespace mac {
+namespace chrome::mac {
 
-NSAppleEventDescriptor* ValueToAppleEventDescriptor(const base::Value* value);
+NSAppleEventDescriptor* ValueToAppleEventDescriptor(const base::Value& value);
 
 // Returns true if Javascript in Apple Events is enabled for |profile|.
 bool IsJavaScriptEnabledForProfile(Profile* profile);
 
-}  // namespace mac
-}  // namespace chrome
+}  // namespace chrome::mac
 
 #endif  // CHROME_BROWSER_UI_COCOA_APPLESCRIPT_APPLE_EVENT_UTIL_H_
diff --git a/chrome/browser/ui/cocoa/applescript/apple_event_util.mm b/chrome/browser/ui/cocoa/applescript/apple_event_util.mm
index 4cf2008..3eeccba 100644
--- a/chrome/browser/ui/cocoa/applescript/apple_event_util.mm
+++ b/chrome/browser/ui/cocoa/applescript/apple_event_util.mm
@@ -24,7 +24,7 @@
   // Note that index 0 means "append to end of list"; see the docs for
   // -[NSAppleEventDescriptor insertDescriptor:atIndex:] and ultimately for
   // AEPutDesc().
-  [list insertDescriptor:ValueToAppleEventDescriptor(&value) atIndex:0];
+  [list insertDescriptor:ValueToAppleEventDescriptor(value) atIndex:0];
 }
 
 NSAppleEventDescriptor* RecordDescriptorForKeyValuePairs(
@@ -54,10 +54,10 @@
 
 }  // namespace
 
-NSAppleEventDescriptor* ValueToAppleEventDescriptor(const base::Value* value) {
+NSAppleEventDescriptor* ValueToAppleEventDescriptor(const base::Value& value) {
   NSAppleEventDescriptor* descriptor = nil;
 
-  switch (value->type()) {
+  switch (value.type()) {
     case base::Value::Type::NONE:
       descriptor = [NSAppleEventDescriptor
           descriptorWithTypeCode:cMissingValue];
@@ -65,17 +65,17 @@
 
     case base::Value::Type::BOOLEAN: {
       descriptor =
-          [NSAppleEventDescriptor descriptorWithBoolean:value->GetBool()];
+          [NSAppleEventDescriptor descriptorWithBoolean:value.GetBool()];
       break;
     }
 
     case base::Value::Type::INTEGER: {
-      descriptor = [NSAppleEventDescriptor descriptorWithInt32:value->GetInt()];
+      descriptor = [NSAppleEventDescriptor descriptorWithInt32:value.GetInt()];
       break;
     }
 
     case base::Value::Type::DOUBLE: {
-      double double_value = value->GetDouble();
+      double double_value = value.GetDouble();
       descriptor = [NSAppleEventDescriptor
           descriptorWithDescriptorType:typeIEEE64BitFloatingPoint
                                  bytes:&double_value
@@ -85,7 +85,7 @@
 
     case base::Value::Type::STRING: {
       descriptor = [NSAppleEventDescriptor
-          descriptorWithString:base::SysUTF8ToNSString(value->GetString())];
+          descriptorWithString:base::SysUTF8ToNSString(value.GetString())];
       break;
     }
 
@@ -96,7 +96,7 @@
     case base::Value::Type::DICT: {
       NSAppleEventDescriptor* keyValuePairs =
           [NSAppleEventDescriptor listDescriptor];
-      for (auto iter : value->GetDict()) {
+      for (auto iter : value.GetDict()) {
         AppendValueToListDescriptor(keyValuePairs, base::Value(iter.first));
         AppendValueToListDescriptor(keyValuePairs, iter.second);
       }
@@ -106,7 +106,7 @@
 
     case base::Value::Type::LIST: {
       descriptor = [NSAppleEventDescriptor listDescriptor];
-      for (const auto& item : value->GetList()) {
+      for (const auto& item : value.GetList()) {
         AppendValueToListDescriptor(descriptor, item);
       }
       break;
diff --git a/chrome/browser/ui/cocoa/applescript/apple_event_util_unittest.mm b/chrome/browser/ui/cocoa/applescript/apple_event_util_unittest.mm
index 82f81d77..acaa98a 100644
--- a/chrome/browser/ui/cocoa/applescript/apple_event_util_unittest.mm
+++ b/chrome/browser/ui/cocoa/applescript/apple_event_util_unittest.mm
@@ -232,27 +232,25 @@
     absl::optional<base::Value> value =
         base::JSONReader::Read(cases[i].json_input);
     NSAppleEventDescriptor* descriptor =
-        chrome::mac::ValueToAppleEventDescriptor(&*value);
+        chrome::mac::ValueToAppleEventDescriptor(value.value());
 
-    EXPECT_EQ(cases[i].expected_aedesc_dump,
-              AEDescToString([descriptor aeDesc]))
+    EXPECT_EQ(cases[i].expected_aedesc_dump, AEDescToString(descriptor.aeDesc))
         << "i: " << i;
-    EXPECT_EQ(cases[i].expected_aedesc_type,
-              [descriptor descriptorType]) << "i: " << i;
+    EXPECT_EQ(cases[i].expected_aedesc_type, descriptor.descriptorType)
+        << "i: " << i;
   }
 
   // Test boolean values separately because boolean NSAppleEventDescriptors
   // return different values across different system versions when their
   // -description method is called.
 
-  const bool all_bools[] = { true, false };
-  for (bool b : all_bools) {
+  for (bool b : {true, false}) {
     base::Value value(b);
     NSAppleEventDescriptor* descriptor =
-        chrome::mac::ValueToAppleEventDescriptor(&value);
+        chrome::mac::ValueToAppleEventDescriptor(value);
 
-    EXPECT_EQ(typeBoolean, [descriptor descriptorType]);
-    EXPECT_EQ(b, [descriptor booleanValue]);
+    EXPECT_EQ(typeBoolean, descriptor.descriptorType);
+    EXPECT_EQ(b, descriptor.booleanValue);
   }
 }
 
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.h b/chrome/browser/ui/cocoa/applescript/bookmark_applescript_test_utils.h
similarity index 81%
rename from chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.h
rename to chrome/browser/ui/cocoa/applescript/bookmark_applescript_test_utils.h
index e287b07..fc033f5 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.h
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_applescript_test_utils.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_APPLESCRIPT_UTILS_TEST_H_
-#define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_APPLESCRIPT_UTILS_TEST_H_
+#ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_APPLESCRIPT_TEST_UTILS_H_
+#define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_APPLESCRIPT_TEST_UTILS_H_
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 #import <objc/objc-runtime.h>
 
 #include "base/mac/scoped_nsobject.h"
@@ -19,8 +19,7 @@
 }
 @end
 
-
-// The base class for all our bookmark releated unit tests.
+// The base class for all our bookmark related unit tests.
 class BookmarkAppleScriptTest : public InProcessBrowserTest {
  public:
   BookmarkAppleScriptTest();
@@ -30,7 +29,7 @@
   Profile* profile() const;
 
  protected:
-  base::scoped_nsobject<BookmarkFolderAppleScript> bookmarkBar_;
+  base::scoped_nsobject<BookmarkFolderAppleScript> bookmark_bar_;
 };
 
-#endif  // CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_APPLESCRIPT_UTILS_TEST_H_
+#endif  // CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_APPLESCRIPT_TEST_UTILS_H_
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.mm b/chrome/browser/ui/cocoa/applescript/bookmark_applescript_test_utils.mm
similarity index 67%
rename from chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.mm
rename to chrome/browser/ui/cocoa/applescript/bookmark_applescript_test_utils.mm
index 4b6e5a31..9d623ed 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_applescript_test_utils.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.h"
+#import "chrome/browser/ui/cocoa/applescript/bookmark_applescript_test_utils.h"
 
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "chrome/browser/ui/browser.h"
@@ -10,9 +10,6 @@
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
 
-using bookmarks::BookmarkModel;
-using bookmarks::BookmarkNode;
-
 // Represents the current fake command that is executing.
 static FakeScriptCommand* kFakeCurrentCommand;
 
@@ -22,8 +19,8 @@
   if ((self = [super init])) {
     _originalMethod = class_getClassMethod([NSScriptCommand class],
                                            @selector(currentCommand));
-    _alternateMethod = class_getClassMethod([self class],
-                                            @selector(currentCommand));
+    _alternateMethod =
+        class_getClassMethod([self class], @selector(currentCommand));
     method_exchangeImplementations(_originalMethod, _alternateMethod);
     kFakeCurrentCommand = self;
   }
@@ -42,20 +39,19 @@
 
 @end
 
-BookmarkAppleScriptTest::BookmarkAppleScriptTest() {
-}
+BookmarkAppleScriptTest::BookmarkAppleScriptTest() = default;
 
-BookmarkAppleScriptTest::~BookmarkAppleScriptTest() {
-}
+BookmarkAppleScriptTest::~BookmarkAppleScriptTest() = default;
 
 void BookmarkAppleScriptTest::SetUpOnMainThread() {
   ASSERT_TRUE(profile());
 
-  BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile());
-  const BookmarkNode* root = model->bookmark_bar_node();
-  const std::string modelString("a f1:[ b d c ] d f2:[ e f g ] h ");
-  bookmarks::test::AddNodesFromModelString(model, root, modelString);
-  bookmarkBar_.reset([[BookmarkFolderAppleScript alloc]
+  bookmarks::BookmarkModel* model =
+      BookmarkModelFactory::GetForBrowserContext(profile());
+  const bookmarks::BookmarkNode* root = model->bookmark_bar_node();
+  const std::string model_string("a f1:[ b d c ] d f2:[ e f g ] h ");
+  bookmarks::test::AddNodesFromModelString(model, root, model_string);
+  bookmark_bar_.reset([[BookmarkFolderAppleScript alloc]
       initWithBookmarkNode:model->bookmark_bar_node()]);
 }
 
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript.h b/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript.h
index 76fe36b..db18596 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript.h
@@ -5,16 +5,14 @@
 #ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_FOLDER_APPLESCRIPT_H_
 #define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_FOLDER_APPLESCRIPT_H_
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #import "chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h"
 
 @class BookmarkItemAppleScript;
 
 // Represent a bookmark folder scriptable object in applescript.
-@interface BookmarkFolderAppleScript : BookmarkNodeAppleScript {
-
-}
+@interface BookmarkFolderAppleScript : BookmarkNodeAppleScript
 
 // Bookmark folder manipulation methods.
 // Returns an array of |BookmarkFolderAppleScript*| of all the bookmark folders
@@ -25,12 +23,12 @@
 - (void)insertInBookmarkFolders:(id)aBookmarkFolder;
 
 // Inserts a bookmark folder at some position in the list.
-// Called by applescript which takes care of bounds checking, make sure of it
+// Called by AppleScript which takes care of bounds checking, make sure of it
 // before calling directly.
 - (void)insertInBookmarkFolders:(id)aBookmarkFolder atIndex:(size_t)index;
 
 // Remove a bookmark folder from the list.
-// Called by applescript which takes care of bounds checking, make sure of it
+// Called by AppleScript which takes care of bounds checking, make sure of it
 // before calling directly.
 - (void)removeFromBookmarkFoldersAtIndex:(size_t)index;
 
@@ -43,13 +41,13 @@
 - (void)insertInBookmarkItems:(BookmarkItemAppleScript*)aBookmarkItem;
 
 // Inserts a bookmark item at some position in the list.
-// Called by applescript which takes care of bounds checking, make sure of it
+// Called by AppleScript which takes care of bounds checking, make sure of it
 // before calling directly.
 - (void)insertInBookmarkItems:(BookmarkItemAppleScript*)aBookmarkItem
                       atIndex:(size_t)index;
 
 // Removes a bookmarks folder from the list.
-// Called by applescript which takes care of bounds checking, make sure of it
+// Called by AppleScript which takes care of bounds checking, make sure of it
 // before calling directly.
 - (void)removeFromBookmarkItemsAtIndex:(size_t)index;
 
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript.mm b/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript.mm
index 3436b04..2aabbcab 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript.mm
@@ -20,9 +20,9 @@
 
 - (NSArray*)bookmarkFolders {
   NSMutableArray* bookmarkFolders =
-      [NSMutableArray arrayWithCapacity:_bookmarkNode->children().size()];
+      [NSMutableArray arrayWithCapacity:[self bookmarkNode]->children().size()];
 
-  for (const auto& node : _bookmarkNode->children()) {
+  for (const auto& node : [self bookmarkNode]->children()) {
     if (!node->is_folder())
       continue;
     base::scoped_nsobject<BookmarkFolderAppleScript> bookmarkFolder(
@@ -45,9 +45,10 @@
     return;
 
   const BookmarkNode* node = model->AddFolder(
-      _bookmarkNode, _bookmarkNode->children().size(), std::u16string());
+      [self bookmarkNode], [self bookmarkNode]->children().size(),
+      std::u16string());
   if (!node) {
-    AppleScript::SetError(AppleScript::errCreateBookmarkFolder);
+    AppleScript::SetError(AppleScript::Error::kCreateBookmarkFolder);
     return;
   }
 
@@ -66,9 +67,9 @@
     return;
 
   const BookmarkNode* node =
-      model->AddFolder(_bookmarkNode, position, std::u16string());
+      model->AddFolder([self bookmarkNode], position, std::u16string());
   if (!node) {
-    AppleScript::SetError(AppleScript::errCreateBookmarkFolder);
+    AppleScript::SetError(AppleScript::Error::kCreateBookmarkFolder);
     return;
   }
 
@@ -82,15 +83,15 @@
   if (!model)
     return;
 
-  model->Remove(_bookmarkNode->children()[position].get(),
+  model->Remove([self bookmarkNode]->children()[position].get(),
                 bookmarks::metrics::BookmarkEditSource::kUser);
 }
 
 - (NSArray*)bookmarkItems {
   NSMutableArray* bookmarkItems =
-      [NSMutableArray arrayWithCapacity:_bookmarkNode->children().size()];
+      [NSMutableArray arrayWithCapacity:[self bookmarkNode]->children().size()];
 
-  for (const auto& node : _bookmarkNode->children()) {
+  for (const auto& node : [self bookmarkNode]->children()) {
     if (!node->is_url())
       continue;
     base::scoped_nsobject<BookmarkItemAppleScript> bookmarkItem(
@@ -115,14 +116,15 @@
 
   GURL url = GURL(base::SysNSStringToUTF8([aBookmarkItem URL]));
   if (!url.is_valid()) {
-    AppleScript::SetError(AppleScript::errInvalidURL);
+    AppleScript::SetError(AppleScript::Error::kInvalidURL);
     return;
   }
 
   const BookmarkNode* node = model->AddNewURL(
-      _bookmarkNode, _bookmarkNode->children().size(), std::u16string(), url);
+      [self bookmarkNode], [self bookmarkNode]->children().size(),
+      std::u16string(), url);
   if (!node) {
-    AppleScript::SetError(AppleScript::errCreateBookmarkItem);
+    AppleScript::SetError(AppleScript::Error::kCreateBookmarkItem);
     return;
   }
 
@@ -143,14 +145,14 @@
 
   GURL url(base::SysNSStringToUTF8([aBookmarkItem URL]));
   if (!url.is_valid()) {
-    AppleScript::SetError(AppleScript::errInvalidURL);
+    AppleScript::SetError(AppleScript::Error::kInvalidURL);
     return;
   }
 
   const BookmarkNode* node =
-      model->AddNewURL(_bookmarkNode, position, std::u16string(), url);
+      model->AddNewURL([self bookmarkNode], position, std::u16string(), url);
   if (!node) {
-    AppleScript::SetError(AppleScript::errCreateBookmarkItem);
+    AppleScript::SetError(AppleScript::Error::kCreateBookmarkItem);
     return;
   }
 
@@ -164,7 +166,7 @@
   if (!model)
     return;
 
-  model->Remove(_bookmarkNode->children()[position].get(),
+  model->Remove([self bookmarkNode]->children()[position].get(),
                 bookmarks::metrics::BookmarkEditSource::kUser);
 }
 
@@ -175,8 +177,9 @@
   ++index;
   size_t count = 0;
   while (index) {
-    if (_bookmarkNode->children()[count++]->is_folder())
+    if ([self bookmarkNode]->children()[count++] -> is_folder()) {
       --index;
+    }
   }
   return count - 1;
 }
@@ -188,8 +191,9 @@
   ++index;
   size_t count = 0;
   while (index) {
-    if (_bookmarkNode->children()[count++]->is_url())
+    if ([self bookmarkNode]->children()[count++] -> is_url()) {
       --index;
+    }
   }
   return count - 1;
 }
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript_browsertest.mm b/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript_browsertest.mm
index 8820aed..4ab8450 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript_browsertest.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript_browsertest.mm
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #include "base/mac/scoped_nsobject.h"
 #include "base/strings/sys_string_conversions.h"
-#import "chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.h"
+#import "chrome/browser/ui/cocoa/applescript/bookmark_applescript_test_utils.h"
 #import "chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript.h"
 #import "chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.h"
 #import "chrome/browser/ui/cocoa/applescript/constants_applescript.h"
@@ -17,89 +17,89 @@
 #include "testing/platform_test.h"
 #include "url/gurl.h"
 
-typedef BookmarkAppleScriptTest BookmarkFolderAppleScriptTest;
+using BookmarkFolderAppleScriptTest = BookmarkAppleScriptTest;
+
+namespace AppleScript {
 
 namespace {
 
 // Test all the bookmark folders within.
 IN_PROC_BROWSER_TEST_F(BookmarkFolderAppleScriptTest, BookmarkFolders) {
-  NSArray* bookmarkFolders = [bookmarkBar_.get() bookmarkFolders];
+  NSArray* bookmark_folders = [bookmark_bar_.get() bookmarkFolders];
 
-  EXPECT_EQ(2U, [bookmarkFolders count]);
+  EXPECT_EQ(2U, [bookmark_folders count]);
 
-  BookmarkFolderAppleScript* f1 = bookmarkFolders[0];
-  BookmarkFolderAppleScript* f2 = bookmarkFolders[1];
+  BookmarkFolderAppleScript* f1 = bookmark_folders[0];
+  BookmarkFolderAppleScript* f2 = bookmark_folders[1];
   EXPECT_NSEQ(@"f1", [f1 title]);
   EXPECT_NSEQ(@"f2", [f2 title]);
   EXPECT_EQ(2, [[f1 index] intValue]);
   EXPECT_EQ(4, [[f2 index] intValue]);
 
-  for (BookmarkFolderAppleScript* bookmarkFolder in bookmarkFolders) {
-    EXPECT_EQ([bookmarkFolder container], bookmarkBar_.get());
-    EXPECT_NSEQ(AppleScript::kBookmarkFoldersProperty,
-                [bookmarkFolder containerProperty]);
+  for (BookmarkFolderAppleScript* bookmark_folder in bookmark_folders) {
+    EXPECT_EQ([bookmark_folder container], bookmark_bar_.get());
+    EXPECT_NSEQ(kBookmarkFoldersProperty, [bookmark_folder containerProperty]);
   }
 }
 
 // Insert a new bookmark folder.
 IN_PROC_BROWSER_TEST_F(BookmarkFolderAppleScriptTest, InsertBookmarkFolder) {
-  // Emulate what applescript would do when inserting a new bookmark folder.
+  // Emulate what AppleScript would do when inserting a new bookmark folder.
   // Emulates a script like |set var to make new bookmark folder with
   // properties {title:"foo"}|.
-  base::scoped_nsobject<BookmarkFolderAppleScript> bookmarkFolder(
+  base::scoped_nsobject<BookmarkFolderAppleScript> bookmark_folder(
       [[BookmarkFolderAppleScript alloc] init]);
-  base::scoped_nsobject<NSNumber> var([[bookmarkFolder.get() uniqueID] copy]);
-  [bookmarkFolder.get() setTitle:@"foo"];
-  [bookmarkBar_.get() insertInBookmarkFolders:bookmarkFolder.get()];
+  base::scoped_nsobject<NSNumber> var([[bookmark_folder.get() uniqueID] copy]);
+  [bookmark_folder.get() setTitle:@"foo"];
+  [bookmark_bar_.get() insertInBookmarkFolders:bookmark_folder.get()];
 
   // Represents the bookmark folder after it's added.
-  BookmarkFolderAppleScript* bf = [bookmarkBar_.get() bookmarkFolders][2];
+  BookmarkFolderAppleScript* bf = [bookmark_bar_.get() bookmarkFolders][2];
   EXPECT_NSEQ(@"foo", [bf title]);
-  EXPECT_EQ([bf container], bookmarkBar_.get());
-  EXPECT_NSEQ(AppleScript::kBookmarkFoldersProperty,
-              [bf containerProperty]);
+  EXPECT_EQ([bf container], bookmark_bar_.get());
+  EXPECT_NSEQ(kBookmarkFoldersProperty, [bf containerProperty]);
   EXPECT_NSEQ(var.get(), [bf uniqueID]);
 }
 
 // Insert a new bookmark folder at a particular position.
 IN_PROC_BROWSER_TEST_F(BookmarkFolderAppleScriptTest,
                        InsertBookmarkFolderAtPosition) {
-  // Emulate what applescript would do when inserting a new bookmark folder.
+  // Emulate what AppleScript would do when inserting a new bookmark folder.
   // Emulates a script like |set var to make new bookmark folder with
   // properties {title:"foo"} at after bookmark folder 1|.
-  base::scoped_nsobject<BookmarkFolderAppleScript> bookmarkFolder(
+  base::scoped_nsobject<BookmarkFolderAppleScript> bookmark_folder(
       [[BookmarkFolderAppleScript alloc] init]);
-  base::scoped_nsobject<NSNumber> var([[bookmarkFolder.get() uniqueID] copy]);
-  [bookmarkFolder.get() setTitle:@"foo"];
-  [bookmarkBar_.get() insertInBookmarkFolders:bookmarkFolder.get() atIndex:1];
+  base::scoped_nsobject<NSNumber> var([[bookmark_folder.get() uniqueID] copy]);
+  [bookmark_folder.get() setTitle:@"foo"];
+  [bookmark_bar_.get() insertInBookmarkFolders:bookmark_folder.get() atIndex:1];
 
   // Represents the bookmark folder after it's added.
-  BookmarkFolderAppleScript* bf = [bookmarkBar_.get() bookmarkFolders][1];
+  BookmarkFolderAppleScript* bf = [bookmark_bar_.get() bookmarkFolders][1];
   EXPECT_NSEQ(@"foo", [bf title]);
-  EXPECT_EQ([bf container], bookmarkBar_.get());
-  EXPECT_NSEQ(AppleScript::kBookmarkFoldersProperty, [bf containerProperty]);
+  EXPECT_EQ([bf container], bookmark_bar_.get());
+  EXPECT_NSEQ(kBookmarkFoldersProperty, [bf containerProperty]);
   EXPECT_NSEQ(var.get(), [bf uniqueID]);
 }
 
 // Delete bookmark folders.
 IN_PROC_BROWSER_TEST_F(BookmarkFolderAppleScriptTest, DeleteBookmarkFolders) {
-  unsigned int folderCount = 2, itemCount = 3;
-  for (unsigned int i = 0; i < folderCount; ++i) {
-    EXPECT_EQ(folderCount - i, [[bookmarkBar_.get() bookmarkFolders] count]);
-    EXPECT_EQ(itemCount, [[bookmarkBar_.get() bookmarkItems] count]);
-    [bookmarkBar_.get() removeFromBookmarkFoldersAtIndex:0];
+  unsigned int folder_count = 2, item_count = 3;
+  for (unsigned int i = 0; i < folder_count; ++i) {
+    EXPECT_EQ(folder_count - i, [[bookmark_bar_.get() bookmarkFolders] count]);
+    EXPECT_EQ(item_count, [[bookmark_bar_.get() bookmarkItems] count]);
+    [bookmark_bar_.get() removeFromBookmarkFoldersAtIndex:0];
   }
 }
 
 // Test all the bookmark items within.
 IN_PROC_BROWSER_TEST_F(BookmarkFolderAppleScriptTest, BookmarkItems) {
-  NSArray* bookmarkItems = [bookmarkBar_.get() bookmarkItems];
+  NSArray* bookmark_items = [bookmark_bar_.get() bookmarkItems];
 
-  EXPECT_EQ(3U, [bookmarkItems count]);
+  EXPECT_EQ(3U, [bookmark_items count]);
 
-  BookmarkItemAppleScript* i1 = bookmarkItems[0];
-  BookmarkItemAppleScript* i2 = bookmarkItems[1];
-  BookmarkItemAppleScript* i3 = bookmarkItems[2];
+  BookmarkItemAppleScript* i1 = bookmark_items[0];
+  BookmarkItemAppleScript* i2 = bookmark_items[1];
+  BookmarkItemAppleScript* i3 = bookmark_items[2];
   EXPECT_NSEQ(@"a", [i1 title]);
   EXPECT_NSEQ(@"d", [i2 title]);
   EXPECT_NSEQ(@"h", [i3 title]);
@@ -107,93 +107,94 @@
   EXPECT_EQ(3, [[i2 index] intValue]);
   EXPECT_EQ(5, [[i3 index] intValue]);
 
-  for (BookmarkItemAppleScript* bookmarkItem in bookmarkItems) {
-    EXPECT_EQ([bookmarkItem container], bookmarkBar_.get());
-    EXPECT_NSEQ(AppleScript::kBookmarkItemsProperty,
-                [bookmarkItem containerProperty]);
+  for (BookmarkItemAppleScript* bookmark_item in bookmark_items) {
+    EXPECT_EQ([bookmark_item container], bookmark_bar_.get());
+    EXPECT_NSEQ(kBookmarkItemsProperty, [bookmark_item containerProperty]);
   }
 }
 
 // Insert a new bookmark item.
 IN_PROC_BROWSER_TEST_F(BookmarkFolderAppleScriptTest, InsertBookmarkItem) {
-  // Emulate what applescript would do when inserting a new bookmark folder.
+  // Emulate what AppleScript would do when inserting a new bookmark folder.
   // Emulates a script like |set var to make new bookmark item with
   // properties {title:"Google", URL:"http://google.com"}|.
-  base::scoped_nsobject<BookmarkItemAppleScript> bookmarkItem(
+  base::scoped_nsobject<BookmarkItemAppleScript> bookmark_item(
       [[BookmarkItemAppleScript alloc] init]);
-  base::scoped_nsobject<NSNumber> var([[bookmarkItem.get() uniqueID] copy]);
-  [bookmarkItem.get() setTitle:@"Google"];
-  [bookmarkItem.get() setURL:@"http://google.com"];
-  [bookmarkBar_.get() insertInBookmarkItems:bookmarkItem.get()];
+  base::scoped_nsobject<NSNumber> var([[bookmark_item.get() uniqueID] copy]);
+  [bookmark_item.get() setTitle:@"Google"];
+  [bookmark_item.get() setURL:@"http://google.com"];
+  [bookmark_bar_.get() insertInBookmarkItems:bookmark_item.get()];
 
   // Represents the bookmark item after it's added.
-  BookmarkItemAppleScript* bi = [bookmarkBar_.get() bookmarkItems][3];
+  BookmarkItemAppleScript* bi = [bookmark_bar_.get() bookmarkItems][3];
   EXPECT_NSEQ(@"Google", [bi title]);
   EXPECT_EQ(GURL("http://google.com/"),
             GURL(base::SysNSStringToUTF8([bi URL])));
-  EXPECT_EQ([bi container], bookmarkBar_.get());
-  EXPECT_NSEQ(AppleScript::kBookmarkItemsProperty, [bi containerProperty]);
+  EXPECT_EQ([bi container], bookmark_bar_.get());
+  EXPECT_NSEQ(kBookmarkItemsProperty, [bi containerProperty]);
   EXPECT_NSEQ(var.get(), [bi uniqueID]);
 
-  // Test to see no bookmark item is created when no/invlid URL is entered.
+  // Test to see no bookmark item is created when no/invalid URL is entered.
   base::scoped_nsobject<FakeScriptCommand> fakeScriptCommand(
       [[FakeScriptCommand alloc] init]);
-  bookmarkItem.reset([[BookmarkItemAppleScript alloc] init]);
-  [bookmarkBar_.get() insertInBookmarkItems:bookmarkItem.get()];
-  EXPECT_EQ((int)AppleScript::errInvalidURL,
+  bookmark_item.reset([[BookmarkItemAppleScript alloc] init]);
+  [bookmark_bar_.get() insertInBookmarkItems:bookmark_item.get()];
+  EXPECT_EQ(static_cast<int>(Error::kInvalidURL),
             [fakeScriptCommand.get() scriptErrorNumber]);
 }
 
 // Insert a new bookmark item at a particular position.
 IN_PROC_BROWSER_TEST_F(BookmarkFolderAppleScriptTest,
                        InsertBookmarkItemAtPosition) {
-  // Emulate what applescript would do when inserting a new bookmark item.
-  // Emulates a script like |set var to make new bookmark item with
-  // properties {title:"XKCD", URL:"http://xkcd.org}
-  // at after bookmark item 1|.
-  base::scoped_nsobject<BookmarkItemAppleScript> bookmarkItem(
+  // Emulate what AppleScript would do when inserting a new bookmark item.
+  // Emulates a script like:
+  //
+  //   set var to make new bookmark item with properties
+  //       {title:"XKCD", URL:"http://xkcd.org} at after bookmark item 1
+  base::scoped_nsobject<BookmarkItemAppleScript> bookmark_item(
       [[BookmarkItemAppleScript alloc] init]);
-  base::scoped_nsobject<NSNumber> var([[bookmarkItem.get() uniqueID] copy]);
-  [bookmarkItem.get() setTitle:@"XKCD"];
-  [bookmarkItem.get() setURL:@"http://xkcd.org"];
+  base::scoped_nsobject<NSNumber> var([[bookmark_item.get() uniqueID] copy]);
+  [bookmark_item.get() setTitle:@"XKCD"];
+  [bookmark_item.get() setURL:@"http://xkcd.org"];
 
-  [bookmarkBar_.get() insertInBookmarkItems:bookmarkItem.get() atIndex:1];
+  [bookmark_bar_.get() insertInBookmarkItems:bookmark_item.get() atIndex:1];
 
   // Represents the bookmark item after its added.
-  BookmarkItemAppleScript* bi = [bookmarkBar_.get() bookmarkItems][1];
+  BookmarkItemAppleScript* bi = [bookmark_bar_.get() bookmarkItems][1];
   EXPECT_NSEQ(@"XKCD", [bi title]);
   EXPECT_EQ(GURL("http://xkcd.org/"),
             GURL(base::SysNSStringToUTF8([bi URL])));
-  EXPECT_EQ([bi container], bookmarkBar_.get());
-  EXPECT_NSEQ(AppleScript::kBookmarkItemsProperty,
-              [bi containerProperty]);
+  EXPECT_EQ([bi container], bookmark_bar_.get());
+  EXPECT_NSEQ(kBookmarkItemsProperty, [bi containerProperty]);
   EXPECT_NSEQ(var.get(), [bi uniqueID]);
 
-  // Test to see no bookmark item is created when no/invlid URL is entered.
+  // Test to see no bookmark item is created when no/invalid URL is entered.
   base::scoped_nsobject<FakeScriptCommand> fakeScriptCommand(
       [[FakeScriptCommand alloc] init]);
-  bookmarkItem.reset([[BookmarkItemAppleScript alloc] init]);
-  [bookmarkBar_.get() insertInBookmarkItems:bookmarkItem.get() atIndex:1];
-  EXPECT_EQ((int)AppleScript::errInvalidURL,
+  bookmark_item.reset([[BookmarkItemAppleScript alloc] init]);
+  [bookmark_bar_.get() insertInBookmarkItems:bookmark_item.get() atIndex:1];
+  EXPECT_EQ(static_cast<int>(Error::kInvalidURL),
             [fakeScriptCommand.get() scriptErrorNumber]);
 }
 
 // Delete bookmark items.
 IN_PROC_BROWSER_TEST_F(BookmarkFolderAppleScriptTest, DeleteBookmarkItems) {
-  unsigned int folderCount = 2, itemCount = 3;
-  for (unsigned int i = 0; i < itemCount; ++i) {
-    EXPECT_EQ(folderCount, [[bookmarkBar_.get() bookmarkFolders] count]);
-    EXPECT_EQ(itemCount - i, [[bookmarkBar_.get() bookmarkItems] count]);
-    [bookmarkBar_.get() removeFromBookmarkItemsAtIndex:0];
+  unsigned int folder_count = 2, item_count = 3;
+  for (unsigned int i = 0; i < item_count; ++i) {
+    EXPECT_EQ(folder_count, [[bookmark_bar_.get() bookmarkFolders] count]);
+    EXPECT_EQ(item_count - i, [[bookmark_bar_.get() bookmarkItems] count]);
+    [bookmark_bar_.get() removeFromBookmarkItemsAtIndex:0];
   }
 }
 
 // Set and get title.
 IN_PROC_BROWSER_TEST_F(BookmarkFolderAppleScriptTest, GetAndSetTitle) {
-  NSArray* bookmarkFolders = [bookmarkBar_.get() bookmarkFolders];
-  BookmarkFolderAppleScript* folder1 = bookmarkFolders[0];
+  NSArray* bookmark_folders = [bookmark_bar_.get() bookmarkFolders];
+  BookmarkFolderAppleScript* folder1 = bookmark_folders[0];
   [folder1 setTitle:@"Foo"];
   EXPECT_NSEQ(@"Foo", [folder1 title]);
 }
 
 }  // namespace
+
+}  // namespace AppleScript
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.h b/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.h
index 8bd36c4..f3b76e20 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.h
@@ -5,18 +5,12 @@
 #ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_ITEM_APPLESCRIPT_H_
 #define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_ITEM_APPLESCRIPT_H_
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #import "chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h"
 
 // Represents a bookmark item scriptable object in applescript.
-@interface BookmarkItemAppleScript : BookmarkNodeAppleScript {
- @private
-  // Contains the temporary title when a user creates a new item with
-  // title specified like
-  // |make new bookmarks item with properties {title:"foo"}|.
-  NSString* _tempURL;
-}
+@interface BookmarkItemAppleScript : BookmarkNodeAppleScript
 
 // Assigns a node, sets its unique ID and also copies temporary values.
 - (void)setBookmarkNode:(const bookmarks::BookmarkNode*)aBookmarkNode;
@@ -24,7 +18,7 @@
 // Returns the URL that the bookmark item holds.
 - (NSString*)URL;
 
-// Sets the URL of the bookmark item, displays error in applescript console
+// Sets the URL of the bookmark item, displays error in AppleScript console
 // if URL is invalid.
 - (void)setURL:(NSString*)aURL;
 
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.mm b/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.mm
index 1c844eb7..86c10603 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.mm
@@ -15,8 +15,12 @@
 using bookmarks::BookmarkModel;
 using bookmarks::BookmarkNode;
 
-@interface BookmarkItemAppleScript()
-@property (nonatomic, copy) NSString* tempURL;
+@interface BookmarkItemAppleScript ()
+// Contains the temporary URL when a user creates a new item with the URL
+// specified like:
+//
+//   make new bookmarks item with properties {URL:"foo"}
+@property(nonatomic, copy) NSString* tempURL;
 @end
 
 @implementation BookmarkItemAppleScript
@@ -25,7 +29,7 @@
 
 - (instancetype)init {
   if ((self = [super init])) {
-    [self setTempURL:@""];
+    self.tempURL = @"";
   }
   return self;
 }
@@ -37,14 +41,15 @@
 
 - (void)setBookmarkNode:(const BookmarkNode*)aBookmarkNode {
   [super setBookmarkNode:aBookmarkNode];
-  [self setURL:[self tempURL]];
+  [self setURL:self.tempURL];
 }
 
 - (NSString*)URL {
-  if (!_bookmarkNode)
+  if (![self bookmarkNode]) {
     return _tempURL;
+  }
 
-  return base::SysUTF8ToNSString(_bookmarkNode->url().spec());
+  return base::SysUTF8ToNSString([self bookmarkNode]->url().spec());
 }
 
 - (void)setURL:(NSString*)aURL {
@@ -54,27 +59,28 @@
       base::mac::ObjCCastStrict<AppController>([NSApp delegate]);
   if (!chrome::mac::IsJavaScriptEnabledForProfile([appDelegate lastProfile]) &&
       url.SchemeIs(url::kJavaScriptScheme)) {
-    AppleScript::SetError(AppleScript::errJavaScriptUnsupported);
+    AppleScript::SetError(AppleScript::Error::kJavaScriptUnsupported);
     return;
   }
 
-  // If a scripter sets a URL before the node is added, URL is saved at a
+  // If a scripter sets a URL before the node is added, the URL is saved at a
   // temporary location.
-  if (!_bookmarkNode) {
+  if (![self bookmarkNode]) {
     [self setTempURL:aURL];
     return;
   }
 
   BookmarkModel* model = [self bookmarkModel];
-  if (!model)
-    return;
-
-  if (!url.is_valid()) {
-    AppleScript::SetError(AppleScript::errInvalidURL);
+  if (!model) {
     return;
   }
 
-  model->SetURL(_bookmarkNode, url,
+  if (!url.is_valid()) {
+    AppleScript::SetError(AppleScript::Error::kInvalidURL);
+    return;
+  }
+
+  model->SetURL([self bookmarkNode], url,
                 bookmarks::metrics::BookmarkEditSource::kOther);
 }
 
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript_browsertest.mm b/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript_browsertest.mm
index 2cbb1a1f..cb7738a 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript_browsertest.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript_browsertest.mm
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #include "base/mac/scoped_nsobject.h"
 #include "base/strings/sys_string_conversions.h"
 #include "chrome/browser/profiles/profile.h"
-#import "chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.h"
+#import "chrome/browser/ui/cocoa/applescript/bookmark_applescript_test_utils.h"
 #import "chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.h"
 #import "chrome/browser/ui/cocoa/applescript/error_applescript.h"
 #include "chrome/common/pref_names.h"
@@ -20,30 +20,32 @@
 
 using BookmarkItemAppleScriptTest = BookmarkAppleScriptTest;
 
+namespace AppleScript {
+
 namespace {
 
 // Set and get title.
 IN_PROC_BROWSER_TEST_F(BookmarkItemAppleScriptTest, GetAndSetTitle) {
-  NSArray* bookmarkItems = [bookmarkBar_.get() bookmarkItems];
-  BookmarkItemAppleScript* item1 = bookmarkItems[0];
+  NSArray* bookmark_items = [bookmark_bar_.get() bookmarkItems];
+  BookmarkItemAppleScript* item1 = bookmark_items[0];
   [item1 setTitle:@"Foo"];
   EXPECT_NSEQ(@"Foo", [item1 title]);
 }
 
 // Set and get URL.
 IN_PROC_BROWSER_TEST_F(BookmarkItemAppleScriptTest, GetAndSetURL) {
-  NSArray* bookmarkItems = [bookmarkBar_.get() bookmarkItems];
-  BookmarkItemAppleScript* item1 = bookmarkItems[0];
+  NSArray* bookmark_items = [bookmark_bar_.get() bookmarkItems];
+  BookmarkItemAppleScript* item1 = bookmark_items[0];
   [item1 setURL:@"http://foo-bar.org"];
   EXPECT_EQ(GURL("http://foo-bar.org"),
             GURL(base::SysNSStringToUTF8([item1 URL])));
 
   // If scripter enters invalid URL.
-  base::scoped_nsobject<FakeScriptCommand> fakeScriptCommand(
+  base::scoped_nsobject<FakeScriptCommand> fake_script_command(
       [[FakeScriptCommand alloc] init]);
   [item1 setURL:@"invalid-url.org"];
-  EXPECT_EQ((int)AppleScript::errInvalidURL,
-            [fakeScriptCommand.get() scriptErrorNumber]);
+  EXPECT_EQ(static_cast<int>(Error::kInvalidURL),
+            fake_script_command.get().scriptErrorNumber);
 }
 
 // Creating bookmarks with javascript: URLs is controlled by a preference.
@@ -51,14 +53,14 @@
   PrefService* prefs = profile()->GetPrefs();
   prefs->SetBoolean(prefs::kAllowJavascriptAppleEvents, false);
 
-  NSArray* bookmarkItems = [bookmarkBar_.get() bookmarkItems];
-  BookmarkItemAppleScript* item1 = bookmarkItems[0];
+  NSArray* bookmark_items = [bookmark_bar_.get() bookmarkItems];
+  BookmarkItemAppleScript* item1 = bookmark_items[0];
 
-  base::scoped_nsobject<FakeScriptCommand> fakeScriptCommand(
+  base::scoped_nsobject<FakeScriptCommand> fake_script_command(
       [[FakeScriptCommand alloc] init]);
   [item1 setURL:@"javascript:alert('hi');"];
-  EXPECT_EQ(AppleScript::ErrorCode::errJavaScriptUnsupported,
-            [fakeScriptCommand.get() scriptErrorNumber]);
+  EXPECT_EQ(static_cast<int>(Error::kJavaScriptUnsupported),
+            fake_script_command.get().scriptErrorNumber);
 
   prefs->SetBoolean(prefs::kAllowJavascriptAppleEvents, true);
   [item1 setURL:@"javascript:alert('hi');"];
@@ -67,3 +69,5 @@
 }
 
 }  // namespace
+
+}  // namespace AppleScript
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h b/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h
index b099b60..e348959 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h
@@ -5,9 +5,7 @@
 #ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_NODE_APPLESCRIPT_H_
 #define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BOOKMARK_NODE_APPLESCRIPT_H_
 
-#include "base/memory/raw_ptr.h"
-
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #import "chrome/browser/ui/cocoa/applescript/element_applescript.h"
 
@@ -18,14 +16,7 @@
 
 // Contains all the elements that are common to both a bookmark folder and
 // bookmark item.
-@interface BookmarkNodeAppleScript : ElementAppleScript {
- @protected
-  raw_ptr<const bookmarks::BookmarkNode> _bookmarkNode;  // weak.
-  // Contains the temporary title when a scripter creates a new folder/item with
-  // title specified like
-  // |make new bookmark folder with properties {title:"foo"}|.
-  NSString* _tempTitle;
-}
+@interface BookmarkNodeAppleScript : ElementAppleScript
 
 // Does not actually create a folder/item but just sets its ID, the folder is
 // created in insertInBookmarksFolder: in the corresponding bookmarks folder.
@@ -35,8 +26,9 @@
 - (instancetype)initWithBookmarkNode:
     (const bookmarks::BookmarkNode*)aBookmarkNode;
 
-// Assigns a node, sets its unique ID and also copies temporary values.
+// Assigns/gets a node, sets its unique ID and also copies temporary values.
 - (void)setBookmarkNode:(const bookmarks::BookmarkNode*)aBookmarkNode;
+- (const bookmarks::BookmarkNode*)bookmarkNode;
 
 // Get and Set title.
 - (NSString*)title;
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm b/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm
index 7ad5816..757490e 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm
@@ -7,6 +7,7 @@
 #include "base/check.h"
 #import "base/mac/foundation_util.h"
 #import "base/mac/scoped_nsobject.h"
+#include "base/memory/raw_ptr.h"
 #include "base/strings/sys_string_conversions.h"
 #import "chrome/browser/app_controller_mac.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
@@ -20,11 +21,17 @@
 using bookmarks::BookmarkModel;
 using bookmarks::BookmarkNode;
 
-@interface BookmarkNodeAppleScript()
+@interface BookmarkNodeAppleScript ()
+// Contains the temporary title when a user creates a new item with the title
+// specified like:
+//
+//   make new bookmark folder with properties {title:"foo"}
 @property (nonatomic, copy) NSString* tempTitle;
 @end
 
-@implementation BookmarkNodeAppleScript
+@implementation BookmarkNodeAppleScript {
+  raw_ptr<const bookmarks::BookmarkNode> _bookmarkNode;  // weak.
+}
 
 @synthesize tempTitle = _tempTitle;
 
@@ -57,7 +64,7 @@
 
   if ((self = [super init])) {
     // It is safe to be weak, if a bookmark item/folder goes away
-    // (eg user deleting a folder) the applescript runtime calls
+    // (eg user deleting a folder) the AppleScript runtime calls
     // bookmarkFolders/bookmarkItems in BookmarkFolderAppleScript
     // and this particular bookmark item/folder is never returned.
     _bookmarkNode = aBookmarkNode;
@@ -72,7 +79,7 @@
 - (void)setBookmarkNode:(const BookmarkNode*)aBookmarkNode {
   DCHECK(aBookmarkNode);
   // It is safe to be weak, if a bookmark item/folder goes away
-  // (eg user deleting a folder) the applescript runtime calls
+  // (eg user deleting a folder) the AppleScript runtime calls
   // bookmarkFolders/bookmarkItems in BookmarkFolderAppleScript
   // and this particular bookmark item/folder is never returned.
   _bookmarkNode = aBookmarkNode;
@@ -84,6 +91,10 @@
   [self setTitle:[self tempTitle]];
 }
 
+- (const bookmarks::BookmarkNode*)bookmarkNode {
+  return _bookmarkNode;
+}
+
 - (NSString*)title {
   if (!_bookmarkNode)
     return _tempTitle;
@@ -92,9 +103,11 @@
 }
 
 - (void)setTitle:(NSString*)aTitle {
-  // If the scripter enters |make new bookmarks folder with properties
-  // {title:"foo"}|, the node has not yet been created so title is stored in the
-  // temp title.
+  // If the scripter enters:
+  //
+  //   make new bookmarks folder with properties {title:"foo"}
+  //
+  // the node has not yet been created so title is stored in the temp title.
   if (!_bookmarkNode) {
     [self setTempTitle:aTitle];
     return;
@@ -121,15 +134,15 @@
 
   Profile* lastProfile = [appDelegate lastProfile];
   if (!lastProfile) {
-    AppleScript::SetError(AppleScript::errGetProfile);
-    return NULL;
+    AppleScript::SetError(AppleScript::Error::kGetProfile);
+    return nullptr;
   }
 
   BookmarkModel* model =
       BookmarkModelFactory::GetForBrowserContext(lastProfile);
   if (!model->loaded()) {
-    AppleScript::SetError(AppleScript::errBookmarkModelLoad);
-    return NULL;
+    AppleScript::SetError(AppleScript::Error::kBookmarkModelLoad);
+    return nullptr;
   }
 
   return model;
diff --git a/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.h b/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.h
index 94fbc95..9133391 100644
--- a/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.h
@@ -5,7 +5,7 @@
 #ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BROWSERCRAPPLICATION_APPLESCRIPT_H_
 #define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_BROWSERCRAPPLICATION_APPLESCRIPT_H_
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #import "chrome/browser/chrome_browser_application_mac.h"
 
@@ -24,13 +24,13 @@
 - (void)insertInAppleScriptWindows:(WindowAppleScript*)aWindow;
 
 // Inserts a window at some position in the list.
-// Called by applescript which takes care of bounds checking, make sure of it
+// Called by AppleScript which takes care of bounds checking, make sure of it
 // before calling directly.
 - (void)insertInAppleScriptWindows:(WindowAppleScript*)aWindow
                            atIndex:(int)index;
 
 // Removes a window from the list.
-// Called by applescript which takes care of bounds checking, make sure of it
+// Called by AppleScript which takes care of bounds checking, make sure of it
 // before calling directly.
 - (void)removeFromAppleScriptWindowsAtIndex:(int)index;
 
diff --git a/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.mm b/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.mm
index c5f55f0..9b32d5c 100644
--- a/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.mm
@@ -76,14 +76,14 @@
 
   Profile* lastProfile = [appDelegate lastProfile];
   if (!lastProfile) {
-    AppleScript::SetError(AppleScript::errGetProfile);
+    AppleScript::SetError(AppleScript::Error::kGetProfile);
     return nil;
   }
 
   BookmarkModel* model =
       BookmarkModelFactory::GetForBrowserContext(lastProfile);
   if (!model->loaded()) {
-    AppleScript::SetError(AppleScript::errBookmarkModelLoad);
+    AppleScript::SetError(AppleScript::Error::kBookmarkModelLoad);
     return nil;
   }
 
@@ -101,15 +101,15 @@
 
   Profile* lastProfile = [appDelegate lastProfile];
   if (!lastProfile) {
-    AppleScript::SetError(AppleScript::errGetProfile);
+    AppleScript::SetError(AppleScript::Error::kGetProfile);
     return nil;
   }
 
   BookmarkModel* model =
       BookmarkModelFactory::GetForBrowserContext(lastProfile);
   if (!model->loaded()) {
-    AppleScript::SetError(AppleScript::errBookmarkModelLoad);
-    return NULL;
+    AppleScript::SetError(AppleScript::Error::kBookmarkModelLoad);
+    return nullptr;
   }
 
   BookmarkFolderAppleScript* bookmarksBar =
diff --git a/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript_test.mm b/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript_browsertest.mm
similarity index 83%
rename from chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript_test.mm
rename to chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript_browsertest.mm
index 80d46910..9433bd1 100644
--- a/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript_test.mm
+++ b/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript_browsertest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #include "base/mac/foundation_util.h"
 #include "base/mac/scoped_nsobject.h"
@@ -21,21 +21,21 @@
 #include "testing/gtest_mac.h"
 #include "ui/gfx/geometry/size.h"
 
-typedef InProcessBrowserTest BrowserCrApplicationAppleScriptTest;
+using BrowserCrApplicationAppleScriptTest = InProcessBrowserTest;
 
 // Create windows of different |Type|.
 IN_PROC_BROWSER_TEST_F(BrowserCrApplicationAppleScriptTest, Creation) {
   // Create additional |Browser*| objects of different type.
   Profile* profile = browser()->profile();
-  Browser* b1 = Browser::Create(
-      Browser::CreateParams(Browser::TYPE_POPUP, profile, true));
+  Browser* b1 = Browser::Create(Browser::CreateParams(
+      Browser::TYPE_POPUP, profile, /*user_gesture=*/true));
   Browser* b2 = Browser::Create(Browser::CreateParams::CreateForApp(
-      "Test", true /* trusted_source */, gfx::Rect(), profile, true));
+      "Test", /*trusted_source=*/true, gfx::Rect(), profile,
+      /*user_gesture=*/true));
 
   EXPECT_EQ(3U, [[NSApp appleScriptWindows] count]);
   for (WindowAppleScript* window in [NSApp appleScriptWindows]) {
-    EXPECT_NSEQ(AppleScript::kWindowsProperty,
-                [window containerProperty]);
+    EXPECT_NSEQ(AppleScript::kWindowsProperty, [window containerProperty]);
     EXPECT_NSEQ(NSApp, [window container]);
   }
 
@@ -47,9 +47,10 @@
 // Insert a new window.
 IN_PROC_BROWSER_TEST_F(BrowserCrApplicationAppleScriptTest,
                        DISABLED_InsertWindow) {
-  // Emulate what applescript would do when creating a new window.
-  // Emulate a script like |set var to make new window with properties
-  // {visible:false}|.
+  // Emulate what AppleScript would do when creating a new window.
+  // Emulate a script like:
+  //
+  //   set var to make new window with properties {visible:false}|.
   base::scoped_nsobject<WindowAppleScript> aWindow(
       [[WindowAppleScript alloc] init]);
   base::scoped_nsobject<NSNumber> var([[aWindow.get() uniqueID] copy]);
@@ -62,8 +63,7 @@
   WindowAppleScript* window = [NSApp appleScriptWindows][0];
   EXPECT_NSEQ(@YES, [aWindow.get() valueForKey:@"isVisible"]);
   EXPECT_EQ([window container], NSApp);
-  EXPECT_NSEQ(AppleScript::kWindowsProperty,
-              [window containerProperty]);
+  EXPECT_NSEQ(AppleScript::kWindowsProperty, [window containerProperty]);
   EXPECT_NSEQ(var, [window uniqueID]);
 }
 
@@ -85,7 +85,7 @@
   // Remove all the windows, just created.
   count = (int)[[NSApp appleScriptWindows] count];
   for (int i = 0; i < 5; ++i) {
-    for(int j = 0; j < 3; ++j) {
+    for (int j = 0; j < 3; ++j) {
       [NSApp removeFromAppleScriptWindowsAtIndex:0];
     }
     count = count - 3;
@@ -93,7 +93,7 @@
   }
 }
 
-// Check for objectSpecifer of the root scripting object.
+// Check for object specifier of the root scripting object.
 IN_PROC_BROWSER_TEST_F(BrowserCrApplicationAppleScriptTest, ObjectSpecifier) {
   // Should always return nil to indicate its the root scripting object.
   EXPECT_EQ(nil, [NSApp objectSpecifier]);
@@ -105,8 +105,7 @@
   EXPECT_EQ(2U, [bookmarkFolders count]);
 
   for (BookmarkFolderAppleScript* bookmarkFolder in bookmarkFolders) {
-    EXPECT_EQ(NSApp,
-              [bookmarkFolder container]);
+    EXPECT_EQ(NSApp, [bookmarkFolder container]);
     EXPECT_NSEQ(AppleScript::kBookmarkFoldersProperty,
                 [bookmarkFolder containerProperty]);
   }
diff --git a/chrome/browser/ui/cocoa/applescript/constants_applescript.h b/chrome/browser/ui/cocoa/applescript/constants_applescript.h
index c1f83f3..bbfc05f 100644
--- a/chrome/browser/ui/cocoa/applescript/constants_applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/constants_applescript.h
@@ -5,11 +5,12 @@
 #ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_CONSTANTS_APPLESCRIPT_H_
 #define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_CONSTANTS_APPLESCRIPT_H_
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
-// This file contains the constant that are use to set the property of an
-// applescript scriptable item.
+// The constants that are used to designate the properties of AppleScript
+// scriptable items.
 namespace AppleScript {
+
 // Property to access windows.
 extern NSString* const kWindowsProperty;
 
@@ -28,4 +29,5 @@
 // To indicate a window in incognito mode.
 extern NSString* const kIncognitoWindowMode;
 }
+
 #endif  // CHROME_BROWSER_UI_COCOA_APPLESCRIPT_CONSTANTS_APPLESCRIPT_H_
diff --git a/chrome/browser/ui/cocoa/applescript/constants_applescript.mm b/chrome/browser/ui/cocoa/applescript/constants_applescript.mm
index 5aac1129..ef7b5b0d 100644
--- a/chrome/browser/ui/cocoa/applescript/constants_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/constants_applescript.mm
@@ -5,21 +5,16 @@
 #import "chrome/browser/ui/cocoa/applescript/constants_applescript.h"
 
 namespace AppleScript {
-// Property to access windows.
+
 NSString* const kWindowsProperty = @"appleScriptWindows";
 
-// Property to access tabs.
 NSString* const kTabsProperty = @"tabs";
 
-// Property to access bookmarks folders.
 NSString* const kBookmarkFoldersProperty = @"bookmarkFolders";
 
-// Property to access bookmark items.
 NSString* const kBookmarkItemsProperty = @"bookmarkItems";
 
-// To indicate a window in normal mode.
 NSString* const kNormalWindowMode = @"normal";
 
-// To indicate a window in incognito mode.
 NSString* const kIncognitoWindowMode = @"incognito";
 }
diff --git a/chrome/browser/ui/cocoa/applescript/element_applescript.h b/chrome/browser/ui/cocoa/applescript/element_applescript.h
index 8a6ff26..66383803 100644
--- a/chrome/browser/ui/cocoa/applescript/element_applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/element_applescript.h
@@ -5,32 +5,24 @@
 #ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_ELEMENT_APPLESCRIPT_H_
 #define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_ELEMENT_APPLESCRIPT_H_
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
-// This class is the root class for all the other applescript classes.
+// This class is the root class for all the other AppleScript classes.
 // It takes care of all the infrastructure type operations.
-@interface ElementAppleScript : NSObject {
- @protected
-  // Used by the applescript runtime to identify each unique scriptable object.
-  NSNumber* _uniqueID;
-  // Used by object specifier to find a scriptable object's place in a
-  // collection.
-  id _container;
-  NSString* _containerProperty;
-}
+@interface ElementAppleScript : NSObject
 
 @property(nonatomic, copy) NSNumber* uniqueID;
-@property(nonatomic, retain) id container;
+@property(nonatomic, retain) NSObject* container;
 @property(nonatomic, copy) NSString* containerProperty;
 
-// Calculates the objectspecifier by using the uniqueID, container and
+// Calculates the object specifier by using the uniqueID, container and
 // container property.
 // An object specifier is used to identify objects within a
 // collection.
 - (NSScriptObjectSpecifier*)objectSpecifier;
 
 // Sets both container and property, retains container and copies property.
-- (void)setContainer:(id)value property:(NSString*)property;
+- (void)setContainer:(NSObject*)value property:(NSString*)property;
 
 @end
 
diff --git a/chrome/browser/ui/cocoa/applescript/element_applescript.mm b/chrome/browser/ui/cocoa/applescript/element_applescript.mm
index ffa69b11f..4fb45078 100644
--- a/chrome/browser/ui/cocoa/applescript/element_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/element_applescript.mm
@@ -4,27 +4,32 @@
 
 #import "chrome/browser/ui/cocoa/applescript/element_applescript.h"
 
+#include <Foundation/Foundation.h>
+
+#include "base/mac/foundation_util.h"
+
 @implementation ElementAppleScript
 
 @synthesize uniqueID = _uniqueID;
 @synthesize container = _container;
 @synthesize containerProperty = _containerProperty;
 
-// calling objectSpecifier asks an object to return an object specifier
-// record referring to itself.  You must call setContainer:property: before
+// Calling objectSpecifier asks an object to return an object specifier
+// record referring to itself. You must call setContainer:property: before
 // you can call this method.
 - (NSScriptObjectSpecifier*)objectSpecifier {
-  return [[[NSUniqueIDSpecifier allocWithZone:[self zone]]
-      initWithContainerClassDescription:
-          (NSScriptClassDescription*)[[self container] classDescription]
-                     containerSpecifier:[[self container] objectSpecifier]
-                                    key:[self containerProperty]
-                               uniqueID:[self uniqueID]] autorelease];
+  return [[[NSUniqueIDSpecifier alloc]
+      initWithContainerClassDescription:base::mac::ObjCCast<
+                                            NSScriptClassDescription>(
+                                            self.container.classDescription)
+                     containerSpecifier:self.container.objectSpecifier
+                                    key:self.containerProperty
+                               uniqueID:self.uniqueID] autorelease];
 }
 
-- (void)setContainer:(id)value property:(NSString*)property {
-  [self setContainer:value];
-  [self setContainerProperty:property];
+- (void)setContainer:(NSObject*)value property:(NSString*)property {
+  self.container = value;
+  self.containerProperty = property;
 }
 
 - (void)dealloc {
diff --git a/chrome/browser/ui/cocoa/applescript/error_applescript.h b/chrome/browser/ui/cocoa/applescript/error_applescript.h
index 91f83f3..34cd1930 100644
--- a/chrome/browser/ui/cocoa/applescript/error_applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/error_applescript.h
@@ -5,39 +5,37 @@
 #ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_ERROR_APPLESCRIPT_H_
 #define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_ERROR_APPLESCRIPT_H_
 
-#import <Cocoa/Cocoa.h>
-
 namespace AppleScript {
 
-enum ErrorCode {
+enum class Error {
   // Error when default profile cannot be obtained.
-  errGetProfile = 1,
+  kGetProfile = 1,
   // Error when bookmark model fails to load.
-  errBookmarkModelLoad,
+  kBookmarkModelLoad,
   // Error when bookmark folder cannot be created.
-  errCreateBookmarkFolder,
+  kCreateBookmarkFolder,
   // Error when bookmark item cannot be created.
-  errCreateBookmarkItem,
+  kCreateBookmarkItem,
   // Error when URL entered is invalid.
-  errInvalidURL,
+  kInvalidURL,
   // Error when printing cannot be initiated.
-  errInitiatePrinting,
+  kInitiatePrinting,
   // Error when invalid tab save type is entered.
-  errInvalidSaveType,
+  kInvalidSaveType,
   // Error when invalid browser mode is entered.
-  errInvalidMode,
+  kInvalidMode,
   // Error when tab index is out of bounds.
-  errInvalidTabIndex,
+  kInvalidTabIndex,
   // Error when mode is set after browser window is created.
-  errSetMode,
+  kSetMode,
   // Error when index of browser window is out of bounds.
-  errWrongIndex,
+  kWrongIndex,
   // Error when JavaScript execution is disabled.
-  errJavaScriptUnsupported
+  kJavaScriptUnsupported
 };
 
 // This function sets an error message to the currently executing command.
-void SetError(ErrorCode errorCode);
+void SetError(Error error_code);
 }
 
 #endif  // CHROME_BROWSER_UI_COCOA_APPLESCRIPT_ERROR_APPLESCRIPT_H_
diff --git a/chrome/browser/ui/cocoa/applescript/error_applescript.mm b/chrome/browser/ui/cocoa/applescript/error_applescript.mm
index 4b331670..fb155ff 100644
--- a/chrome/browser/ui/cocoa/applescript/error_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/error_applescript.mm
@@ -4,57 +4,70 @@
 
 #import "chrome/browser/ui/cocoa/applescript/error_applescript.h"
 
+#import <Foundation/Foundation.h>
+
 #include "base/notreached.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
-void AppleScript::SetError(AppleScript::ErrorCode errorCode) {
-  using l10n_util::GetNSString;
+namespace AppleScript {
+
+void SetError(Error error_code) {
   NSScriptCommand* current_command = [NSScriptCommand currentCommand];
-  [current_command setScriptErrorNumber:(int)errorCode];
+  current_command.scriptErrorNumber = static_cast<int>(error_code);
+
   NSString* error_string = @"";
-  switch (errorCode) {
-    case errGetProfile:
-      error_string = GetNSString(IDS_GET_PROFILE_ERROR_APPLESCRIPT_MAC);
-      break;
-    case errBookmarkModelLoad:
-      error_string = GetNSString(IDS_BOOKMARK_MODEL_LOAD_ERROR_APPLESCRIPT_MAC);
-      break;
-    case errCreateBookmarkFolder:
+  switch (error_code) {
+    case Error::kGetProfile:
       error_string =
-          GetNSString(IDS_CREATE_BOOKMARK_FOLDER_ERROR_APPLESCRIPT_MAC);
-        break;
-    case errCreateBookmarkItem:
+          l10n_util::GetNSString(IDS_GET_PROFILE_ERROR_APPLESCRIPT_MAC);
+      break;
+    case Error::kBookmarkModelLoad:
       error_string =
-          GetNSString(IDS_CREATE_BOOKMARK_ITEM_ERROR_APPLESCRIPT_MAC);
-        break;
-    case errInvalidURL:
-      error_string = GetNSString(IDS_INVALID_URL_APPLESCRIPT_MAC);
+          l10n_util::GetNSString(IDS_BOOKMARK_MODEL_LOAD_ERROR_APPLESCRIPT_MAC);
       break;
-    case errInitiatePrinting:
-      error_string = GetNSString(IDS_INITIATE_PRINTING_ERROR_APPLESCRIPT_MAC);
+    case Error::kCreateBookmarkFolder:
+      error_string = l10n_util::GetNSString(
+          IDS_CREATE_BOOKMARK_FOLDER_ERROR_APPLESCRIPT_MAC);
       break;
-    case errInvalidSaveType:
-      error_string = GetNSString(IDS_INVALID_SAVE_TYPE_ERROR_APPLESCRIPT_MAC);
+    case Error::kCreateBookmarkItem:
+      error_string = l10n_util::GetNSString(
+          IDS_CREATE_BOOKMARK_ITEM_ERROR_APPLESCRIPT_MAC);
       break;
-    case errInvalidMode:
-      error_string = GetNSString(IDS_INVALID_MODE_ERROR_APPLESCRIPT_MAC);
+    case Error::kInvalidURL:
+      error_string = l10n_util::GetNSString(IDS_INVALID_URL_APPLESCRIPT_MAC);
       break;
-    case errInvalidTabIndex:
-      error_string = GetNSString(IDS_INVALID_TAB_INDEX_APPLESCRIPT_MAC);
-      break;
-    case errSetMode:
-      error_string = GetNSString(IDS_SET_MODE_APPLESCRIPT_MAC);
-      break;
-    case errWrongIndex:
-      error_string = GetNSString(IDS_WRONG_INDEX_ERROR_APPLESCRIPT_MAC);
-      break;
-    case errJavaScriptUnsupported:
+    case Error::kInitiatePrinting:
       error_string =
-          GetNSString(IDS_JAVASCRIPT_UNSUPPORTED_ERROR_APPLESCRIPT_MAC);
+          l10n_util::GetNSString(IDS_INITIATE_PRINTING_ERROR_APPLESCRIPT_MAC);
+      break;
+    case Error::kInvalidSaveType:
+      error_string =
+          l10n_util::GetNSString(IDS_INVALID_SAVE_TYPE_ERROR_APPLESCRIPT_MAC);
+      break;
+    case Error::kInvalidMode:
+      error_string =
+          l10n_util::GetNSString(IDS_INVALID_MODE_ERROR_APPLESCRIPT_MAC);
+      break;
+    case Error::kInvalidTabIndex:
+      error_string =
+          l10n_util::GetNSString(IDS_INVALID_TAB_INDEX_APPLESCRIPT_MAC);
+      break;
+    case Error::kSetMode:
+      error_string = l10n_util::GetNSString(IDS_SET_MODE_APPLESCRIPT_MAC);
+      break;
+    case Error::kWrongIndex:
+      error_string =
+          l10n_util::GetNSString(IDS_WRONG_INDEX_ERROR_APPLESCRIPT_MAC);
+      break;
+    case Error::kJavaScriptUnsupported:
+      error_string = l10n_util::GetNSString(
+          IDS_JAVASCRIPT_UNSUPPORTED_ERROR_APPLESCRIPT_MAC);
       break;
     default:
       NOTREACHED();
   }
-  [current_command setScriptErrorString:error_string];
+  current_command.scriptErrorString = error_string;
 }
+
+}  // namespace AppleScript
diff --git a/chrome/browser/ui/cocoa/applescript/tab_applescript.h b/chrome/browser/ui/cocoa/applescript/tab_applescript.h
index a0ff499..7f1e453 100644
--- a/chrome/browser/ui/cocoa/applescript/tab_applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/tab_applescript.h
@@ -5,9 +5,7 @@
 #ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_TAB_APPLESCRIPT_H_
 #define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_TAB_APPLESCRIPT_H_
 
-#include "base/memory/raw_ptr.h"
-
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #import "chrome/browser/ui/cocoa/applescript/element_applescript.h"
 
@@ -15,20 +13,8 @@
 class WebContents;
 }
 
-class Profile;
-
 // Represents a tab scriptable item in applescript.
-@interface TabAppleScript : ElementAppleScript {
- @private
-  raw_ptr<content::WebContents> _webContents;  // weak.
-
-  raw_ptr<Profile> _profile;  // weak.
-
-  // Contains the temporary URL when a user creates a new folder/item with
-  // url specified like
-  // |make new tab with properties {url:"http://google.com"}|.
-  NSString* _tempURL;
-}
+@interface TabAppleScript : ElementAppleScript
 
 // Doesn't actually create the tab here but just assigns the ID, tab is created
 // when it calls insertInTabs: of a particular window, it is used in cases
diff --git a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
index 197eb58..2b3d42e 100644
--- a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
@@ -8,6 +8,7 @@
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #import "base/mac/scoped_nsobject.h"
+#include "base/memory/raw_ptr.h"
 #include "base/notreached.h"
 #include "base/strings/sys_string_conversions.h"
 #include "chrome/browser/printing/print_view_manager.h"
@@ -40,7 +41,7 @@
 void ResumeAppleEventAndSendReply(NSAppleEventManagerSuspensionID suspension_id,
                                   base::Value result_value) {
   NSAppleEventDescriptor* result_descriptor =
-      chrome::mac::ValueToAppleEventDescriptor(&result_value);
+      chrome::mac::ValueToAppleEventDescriptor(result_value);
 
   NSAppleEventManager* manager = [NSAppleEventManager sharedAppleEventManager];
   NSAppleEventDescriptor* reply_event =
@@ -53,10 +54,18 @@
 }  // namespace
 
 @interface TabAppleScript()
+// Contains the temporary URL when a user creates a new folder/item with the URL
+// specified like:
+//
+//   make new tab with properties {URL:"http://google.com"}
 @property (nonatomic, copy) NSString* tempURL;
 @end
 
-@implementation TabAppleScript
+@implementation TabAppleScript {
+  raw_ptr<content::WebContents> _webContents;  // weak.
+
+  raw_ptr<Profile> _profile;  // weak.
+}
 
 @synthesize tempURL = _tempURL;
 
@@ -140,13 +149,13 @@
   GURL url(base::SysNSStringToUTF8(aURL));
   if (!chrome::mac::IsJavaScriptEnabledForProfile(_profile) &&
       url.SchemeIs(url::kJavaScriptScheme)) {
-    AppleScript::SetError(AppleScript::errJavaScriptUnsupported);
+    AppleScript::SetError(AppleScript::Error::kJavaScriptUnsupported);
     return;
   }
 
   // check for valid url.
   if (!url.is_empty() && !url.is_valid()) {
-    AppleScript::SetError(AppleScript::errInvalidURL);
+    AppleScript::SetError(AppleScript::Error::kInvalidURL);
     return;
   }
 
@@ -217,8 +226,8 @@
 
 - (void)handlesReloadScriptCommand:(NSScriptCommand*)command {
   NavigationController& navigationController = _webContents->GetController();
-  const bool checkForRepost = true;
-  navigationController.Reload(content::ReloadType::NORMAL, checkForRepost);
+  navigationController.Reload(content::ReloadType::NORMAL,
+                              /*check_for_repost=*/true);
 }
 
 - (void)handlesStopScriptCommand:(NSScriptCommand*)command {
@@ -229,7 +238,7 @@
   bool initiated = printing::PrintViewManager::FromWebContents(_webContents)
                        ->PrintNow(_webContents->GetPrimaryMainFrame());
   if (!initiated) {
-    AppleScript::SetError(AppleScript::errInitiatePrinting);
+    AppleScript::SetError(AppleScript::Error::kInitiatePrinting);
   }
 }
 
@@ -237,7 +246,7 @@
   NSDictionary* dictionary = [command evaluatedArguments];
 
   NSURL* fileURL = dictionary[@"File"];
-  // Scripter has not specifed the location at which to save, so we prompt for
+  // Scripter has not specified the location at which to save, so we prompt for
   // it.
   if (!fileURL) {
     _webContents->OnSavePage();
@@ -260,7 +269,7 @@
     } else if ([saveType isEqualToString:@"complete html"]) {
       savePageType = content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML;
     } else {
-      AppleScript::SetError(AppleScript::errInvalidSaveType);
+      AppleScript::SetError(AppleScript::Error::kInvalidSaveType);
       return;
     }
   }
@@ -286,7 +295,7 @@
 
 - (id)handlesExecuteJavascriptScriptCommand:(NSScriptCommand*)command {
   if (!chrome::mac::IsJavaScriptEnabledForProfile(_profile)) {
-    AppleScript::SetError(AppleScript::errJavaScriptUnsupported);
+    AppleScript::SetError(AppleScript::Error::kJavaScriptUnsupported);
     return nil;
   }
 
@@ -303,7 +312,7 @@
       base::BindOnce(&ResumeAppleEventAndSendReply, suspensionID);
 
   std::u16string script =
-      base::SysNSStringToUTF16([command evaluatedArguments][@"javascript"]);
+      base::SysNSStringToUTF16(command.evaluatedArguments[@"javascript"]);
   frame->ExecuteJavaScriptInIsolatedWorld(script, std::move(callback),
                                           ISOLATED_WORLD_ID_APPLESCRIPT);
 
diff --git a/chrome/browser/ui/cocoa/applescript/tab_applescript_browsertest.mm b/chrome/browser/ui/cocoa/applescript/tab_applescript_browsertest.mm
index 59804ce..011b5b46 100644
--- a/chrome/browser/ui/cocoa/applescript/tab_applescript_browsertest.mm
+++ b/chrome/browser/ui/cocoa/applescript/tab_applescript_browsertest.mm
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #include "base/mac/scoped_nsobject.h"
 #include "base/strings/sys_string_conversions.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
-#import "chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.h"
+#import "chrome/browser/ui/cocoa/applescript/bookmark_applescript_test_utils.h"
 #import "chrome/browser/ui/cocoa/applescript/error_applescript.h"
 #import "chrome/browser/ui/cocoa/applescript/tab_applescript.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
@@ -22,6 +22,8 @@
 
 using TabAppleScriptTest = InProcessBrowserTest;
 
+namespace AppleScript {
+
 namespace {
 
 // Calls the method that handles the "Execute Javascript" command and returns
@@ -54,7 +56,7 @@
 
   PrefService* prefs = profile->GetPrefs();
   prefs->SetBoolean(prefs::kAllowJavascriptAppleEvents, false);
-  EXPECT_EQ(AppleScript::ErrorCode::errJavaScriptUnsupported,
+  EXPECT_EQ(static_cast<int>(Error::kJavaScriptUnsupported),
             ExecuteJavascriptCommand(tab_applescript.get()));
 
   prefs->SetBoolean(prefs::kAllowJavascriptAppleEvents, true);
@@ -62,3 +64,5 @@
 }
 
 }  // namespace
+
+}  // namespace AppleScript
diff --git a/chrome/browser/ui/cocoa/applescript/window_applescript.h b/chrome/browser/ui/cocoa/applescript/window_applescript.h
index 9b11906..f3ae415 100644
--- a/chrome/browser/ui/cocoa/applescript/window_applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/window_applescript.h
@@ -5,9 +5,7 @@
 #ifndef CHROME_BROWSER_UI_COCOA_APPLESCRIPT_WINDOW_APPLESCRIPT_H_
 #define CHROME_BROWSER_UI_COCOA_APPLESCRIPT_WINDOW_APPLESCRIPT_H_
 
-#include "base/memory/raw_ptr.h"
-
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #import "chrome/browser/ui/cocoa/applescript/element_applescript.h"
 
@@ -16,11 +14,7 @@
 @class TabAppleScript;
 
 // Represents a window class.
-@interface WindowAppleScript : ElementAppleScript {
- @private
-  raw_ptr<Browser> _browser;  // weak.
-}
-
+@interface WindowAppleScript : ElementAppleScript
 // Creates a new window, returns nil if there is an error.
 - (instancetype)init;
 
@@ -56,12 +50,12 @@
 - (void)insertInTabs:(TabAppleScript*)aTab;
 
 // Insert a tab at some position in the list.
-// Called by applescript which takes care of bounds checking, make sure of it
+// Called by AppleScript which takes care of bounds checking, make sure of it
 // before calling directly.
 - (void)insertInTabs:(TabAppleScript*)aTab atIndex:(int)index;
 
 // Remove a window from the list.
-// Called by applescript which takes care of bounds checking, make sure of it
+// Called by AppleScript which takes care of bounds checking, make sure of it
 // before calling directly.
 - (void)removeFromTabsAtIndex:(int)index;
 
diff --git a/chrome/browser/ui/cocoa/applescript/window_applescript.mm b/chrome/browser/ui/cocoa/applescript/window_applescript.mm
index 8549698..aa0b182b 100644
--- a/chrome/browser/ui/cocoa/applescript/window_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/window_applescript.mm
@@ -3,12 +3,12 @@
 // found in the LICENSE file.
 
 #import "chrome/browser/ui/cocoa/applescript/window_applescript.h"
-#include "chrome/browser/ui/tabs/tab_strip_user_gesture_details.h"
 
 #include <memory>
 
 #import "base/mac/foundation_util.h"
 #import "base/mac/scoped_nsobject.h"
+#include "base/memory/raw_ptr.h"
 #include "base/notreached.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/time/time.h"
@@ -39,7 +39,10 @@
 - (NSWindow*)nativeHandle;
 @end
 
-@implementation WindowAppleScript
+@implementation WindowAppleScript {
+ @private
+  raw_ptr<Browser> _browser;  // weak.
+}
 
 - (instancetype)init {
   // Check which mode to open a new window.
@@ -51,7 +54,7 @@
   Profile* lastProfile = [appDelegate lastProfile];
 
   if (!lastProfile) {
-    AppleScript::SetError(AppleScript::errGetProfile);
+    AppleScript::SetError(AppleScript::Error::kGetProfile);
     return nil;
   }
 
@@ -63,7 +66,7 @@
     profile = lastProfile;
   } else {
     // Mode cannot be anything else
-    AppleScript::SetError(AppleScript::errInvalidMode);
+    AppleScript::SetError(AppleScript::Error::kInvalidMode);
     return nil;
   }
   // Set the mode to nil, to ensure that it is not set once more.
@@ -104,7 +107,7 @@
 
   if ((self = [super init])) {
     // It is safe to be weak, if a window goes away (eg user closing a window)
-    // the applescript runtime calls appleScriptWindows in
+    // the AppleScript runtime calls appleScriptWindows in
     // BrowserCrApplication and this particular window is never returned.
     _browser = aBrowser;
     base::scoped_nsobject<NSNumber> numID(
@@ -123,7 +126,7 @@
 }
 
 - (NSNumber*)activeTabIndex {
-  // Note: applescript is 1-based, that is lists begin with index 1.
+  // Note: AppleScript is 1-based, that is lists begin with index 1.
   int activeTabIndex = _browser->tab_strip_model()->active_index() + 1;
   if (!activeTabIndex) {
     return nil;
@@ -132,14 +135,14 @@
 }
 
 - (void)setActiveTabIndex:(NSNumber*)anActiveTabIndex {
-  // Note: applescript is 1-based, that is lists begin with index 1.
-  int atIndex = [anActiveTabIndex intValue] - 1;
+  // Note: AppleScript is 1-based, that is lists begin with index 1.
+  int atIndex = anActiveTabIndex.intValue - 1;
   if (atIndex >= 0 && atIndex < _browser->tab_strip_model()->count()) {
     _browser->tab_strip_model()->ActivateTabAt(
         atIndex, TabStripUserGestureDetails(
                      TabStripUserGestureDetails::GestureType::kOther));
   } else
-    AppleScript::SetError(AppleScript::errInvalidTabIndex);
+    AppleScript::SetError(AppleScript::Error::kInvalidTabIndex);
 }
 
 - (NSString*)givenName {
@@ -161,7 +164,7 @@
 - (void)setMode:(NSString*)theMode {
   // cannot set mode after window is created.
   if (theMode) {
-    AppleScript::SetError(AppleScript::errSetMode);
+    AppleScript::SetError(AppleScript::Error::kSetMode);
   }
 }
 
@@ -240,13 +243,13 @@
 }
 
 - (NSNumber*)orderedIndex {
-  return [NSNumber numberWithInt:[[self nativeHandle] orderedIndex]];
+  return @([[self nativeHandle] orderedIndex]);
 }
 
 - (void)setOrderedIndex:(NSNumber*)anIndex {
   int index = [anIndex intValue] - 1;
   if (index < 0 || index >= static_cast<int>(chrome::GetTotalBrowserCount())) {
-    AppleScript::SetError(AppleScript::errWrongIndex);
+    AppleScript::SetError(AppleScript::Error::kWrongIndex);
     return;
   }
   [[self nativeHandle] setOrderedIndex:index];
diff --git a/chrome/browser/ui/cocoa/applescript/window_applescript_test.mm b/chrome/browser/ui/cocoa/applescript/window_applescript_browsertest.mm
similarity index 62%
rename from chrome/browser/ui/cocoa/applescript/window_applescript_test.mm
rename to chrome/browser/ui/cocoa/applescript/window_applescript_browsertest.mm
index d21518e..6957607 100644
--- a/chrome/browser/ui/cocoa/applescript/window_applescript_test.mm
+++ b/chrome/browser/ui/cocoa/applescript/window_applescript_browsertest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
 
 #import "base/mac/foundation_util.h"
 #import "base/mac/scoped_nsobject.h"
@@ -21,23 +21,22 @@
 #import "testing/gtest_mac.h"
 #include "url/gurl.h"
 
-typedef InProcessBrowserTest WindowAppleScriptTest;
+using WindowAppleScriptTest = InProcessBrowserTest;
 
 // Create a window in default/normal mode.
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, DefaultCreation) {
-  base::scoped_nsobject<WindowAppleScript> aWindow(
+  base::scoped_nsobject<WindowAppleScript> window(
       [[WindowAppleScript alloc] init]);
-  EXPECT_TRUE(aWindow.get());
-  NSString* mode = [aWindow.get() mode];
-  EXPECT_NSEQ(AppleScript::kNormalWindowMode,
-              mode);
+  EXPECT_TRUE(window.get());
+  NSString* mode = [window.get() mode];
+  EXPECT_NSEQ(AppleScript::kNormalWindowMode, mode);
 }
 
 // Create a window with a |NULL profile|.
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithNoProfile) {
-  base::scoped_nsobject<WindowAppleScript> aWindow(
-      [[WindowAppleScript alloc] initWithProfile:NULL]);
-  EXPECT_FALSE(aWindow.get());
+  base::scoped_nsobject<WindowAppleScript> window(
+      [[WindowAppleScript alloc] initWithProfile:nullptr]);
+  EXPECT_FALSE(window.get());
 }
 
 // Create a window with a particular profile.
@@ -45,128 +44,128 @@
   AppController* appController =
       base::mac::ObjCCastStrict<AppController>([NSApp delegate]);
   Profile* lastProfile = [appController lastProfile];
-  base::scoped_nsobject<WindowAppleScript> aWindow(
+  base::scoped_nsobject<WindowAppleScript> window(
       [[WindowAppleScript alloc] initWithProfile:lastProfile]);
-  EXPECT_TRUE(aWindow.get());
-  EXPECT_TRUE([aWindow.get() uniqueID]);
+  EXPECT_TRUE(window.get());
+  EXPECT_TRUE([window.get() uniqueID]);
 }
 
 // Create a window with no |Browser*|.
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithNoBrowser) {
-  base::scoped_nsobject<WindowAppleScript> aWindow(
-      [[WindowAppleScript alloc] initWithBrowser:NULL]);
-  EXPECT_FALSE(aWindow.get());
+  base::scoped_nsobject<WindowAppleScript> window(
+      [[WindowAppleScript alloc] initWithBrowser:nullptr]);
+  EXPECT_FALSE(window.get());
 }
 
 // Create a window with |Browser*| already present.
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, CreationWithBrowser) {
-  base::scoped_nsobject<WindowAppleScript> aWindow(
+  base::scoped_nsobject<WindowAppleScript> window(
       [[WindowAppleScript alloc] initWithBrowser:browser()]);
-  EXPECT_TRUE(aWindow.get());
-  EXPECT_TRUE([aWindow.get() uniqueID]);
+  EXPECT_TRUE(window.get());
+  EXPECT_TRUE([window.get() uniqueID]);
 }
 
 // Tabs within the window.
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, Tabs) {
-  base::scoped_nsobject<WindowAppleScript> aWindow(
+  base::scoped_nsobject<WindowAppleScript> window(
       [[WindowAppleScript alloc] initWithBrowser:browser()]);
-  NSArray* tabs = [aWindow.get() tabs];
+  NSArray* tabs = [window.get() tabs];
   EXPECT_EQ(1U, [tabs count]);
   TabAppleScript* tab1 = tabs[0];
-  EXPECT_EQ([tab1 container], aWindow.get());
-  EXPECT_NSEQ(AppleScript::kTabsProperty,
-              [tab1 containerProperty]);
+  EXPECT_EQ([tab1 container], window.get());
+  EXPECT_NSEQ(AppleScript::kTabsProperty, [tab1 containerProperty]);
 }
 
 // Insert a new tab.
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, InsertTab) {
-  // Emulate what applescript would do when creating a new tab.
-  // Emulates a script like |set var to make new tab with
-  // properties URL:"http://google.com"}|.
+  // Emulate what AppleScript would do when creating a new tab.
+  // Emulates a script like:
+  //
+  //   set var to make new tab with properties {URL:"http://google.com"}
   base::scoped_nsobject<TabAppleScript> aTab([[TabAppleScript alloc] init]);
   base::scoped_nsobject<NSNumber> var([[aTab.get() uniqueID] copy]);
   [aTab.get() setURL:@"http://google.com"];
-  base::scoped_nsobject<WindowAppleScript> aWindow(
+  base::scoped_nsobject<WindowAppleScript> window(
       [[WindowAppleScript alloc] initWithBrowser:browser()]);
-  [aWindow.get() insertInTabs:aTab.get()];
+  [window.get() insertInTabs:aTab.get()];
 
   // Represents the tab after it is inserted.
-  TabAppleScript* tab = [aWindow.get() tabs][1];
+  TabAppleScript* tab = [window.get() tabs][1];
   EXPECT_EQ(GURL("http://google.com"),
             GURL(base::SysNSStringToUTF8([tab URL])));
-  EXPECT_EQ([tab container], aWindow.get());
-  EXPECT_NSEQ(AppleScript::kTabsProperty,
-              [tab containerProperty]);
+  EXPECT_EQ([tab container], window.get());
+  EXPECT_NSEQ(AppleScript::kTabsProperty, [tab containerProperty]);
   EXPECT_NSEQ(var.get(), [tab uniqueID]);
 }
 
 // Insert a new tab at a particular position
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, InsertTabAtPosition) {
-  // Emulate what applescript would do when creating a new tab.
-  // Emulates a script like |set var to make new tab with
-  // properties URL:"http://google.com"} at before tab 1|.
+  // Emulate what AppleScript would do when creating a new tab.
+  // Emulates a script like:
+  //
+  //   set var to make new tab with properties
+  //       {URL:"http://google.com"} at before tab 1
   base::scoped_nsobject<TabAppleScript> aTab([[TabAppleScript alloc] init]);
   base::scoped_nsobject<NSNumber> var([[aTab.get() uniqueID] copy]);
   [aTab.get() setURL:@"http://google.com"];
-  base::scoped_nsobject<WindowAppleScript> aWindow(
+  base::scoped_nsobject<WindowAppleScript> window(
       [[WindowAppleScript alloc] initWithBrowser:browser()]);
-  [aWindow.get() insertInTabs:aTab.get() atIndex:0];
+  [window.get() insertInTabs:aTab.get() atIndex:0];
 
   // Represents the tab after it is inserted.
-  TabAppleScript* tab = [aWindow.get() tabs][0];
+  TabAppleScript* tab = [window.get() tabs][0];
   EXPECT_EQ(GURL("http://google.com"),
             GURL(base::SysNSStringToUTF8([tab URL])));
-  EXPECT_EQ([tab container], aWindow.get());
+  EXPECT_EQ([tab container], window.get());
   EXPECT_NSEQ(AppleScript::kTabsProperty, [tab containerProperty]);
   EXPECT_NSEQ(var.get(), [tab uniqueID]);
 }
 
 // Inserting and deleting tabs.
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, InsertAndDeleteTabs) {
-  base::scoped_nsobject<WindowAppleScript> aWindow(
+  base::scoped_nsobject<WindowAppleScript> window(
       [[WindowAppleScript alloc] initWithBrowser:browser()]);
   base::scoped_nsobject<TabAppleScript> aTab;
   int count;
   for (int i = 0; i < 5; ++i) {
     for (int j = 0; j < 3; ++j) {
       aTab.reset([[TabAppleScript alloc] init]);
-      [aWindow.get() insertInTabs:aTab.get()];
+      [window.get() insertInTabs:aTab.get()];
     }
     count = 3 * i + 4;
-    EXPECT_EQ((int)[[aWindow.get() tabs] count], count);
+    EXPECT_EQ((int)[[window.get() tabs] count], count);
   }
 
-  count = (int)[[aWindow.get() tabs] count];
+  count = (int)[[window.get() tabs] count];
   for (int i = 0; i < 5; ++i) {
-    for(int j = 0; j < 3; ++j) {
-      [aWindow.get() removeFromTabsAtIndex:0];
+    for (int j = 0; j < 3; ++j) {
+      [window.get() removeFromTabsAtIndex:0];
     }
     count = count - 3;
-    EXPECT_EQ((int)[[aWindow.get() tabs] count], count);
+    EXPECT_EQ((int)[[window.get() tabs] count], count);
   }
 }
 
 // Getting and setting values from the NSWindow.
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, NSWindowTest) {
-  base::scoped_nsobject<WindowAppleScript> aWindow(
+  base::scoped_nsobject<WindowAppleScript> window(
       [[WindowAppleScript alloc] initWithBrowser:browser()]);
-  [aWindow.get() setValue:@YES forKey:@"isMiniaturized"];
-  EXPECT_TRUE([[aWindow.get() valueForKey:@"isMiniaturized"] boolValue]);
-  [aWindow.get() setValue:@NO forKey:@"isMiniaturized"];
-  EXPECT_FALSE([[aWindow.get() valueForKey:@"isMiniaturized"] boolValue]);
+  [window.get() setValue:@YES forKey:@"isMiniaturized"];
+  EXPECT_TRUE([[window.get() valueForKey:@"isMiniaturized"] boolValue]);
+  [window.get() setValue:@NO forKey:@"isMiniaturized"];
+  EXPECT_FALSE([[window.get() valueForKey:@"isMiniaturized"] boolValue]);
 }
 
 // Getting and setting the active tab.
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, ActiveTab) {
-  base::scoped_nsobject<WindowAppleScript> aWindow(
+  base::scoped_nsobject<WindowAppleScript> window(
       [[WindowAppleScript alloc] initWithBrowser:browser()]);
   base::scoped_nsobject<TabAppleScript> aTab([[TabAppleScript alloc] init]);
-  [aWindow.get() insertInTabs:aTab.get()];
-  [aWindow.get() setActiveTabIndex:@2];
-  EXPECT_EQ(2, [[aWindow.get() activeTabIndex] intValue]);
-  TabAppleScript* tab2 = [aWindow.get() tabs][1];
-  EXPECT_NSEQ([[aWindow.get() activeTab] uniqueID],
-              [tab2 uniqueID]);
+  [window.get() insertInTabs:aTab.get()];
+  [window.get() setActiveTabIndex:@2];
+  EXPECT_EQ(2, [[window.get() activeTabIndex] intValue]);
+  TabAppleScript* tab2 = [window.get() tabs][1];
+  EXPECT_NSEQ([[window.get() activeTab] uniqueID], [tab2 uniqueID]);
 }
 
 // Order of windows.
diff --git a/chrome/browser/ui/login/login_tab_helper.cc b/chrome/browser/ui/login/login_tab_helper.cc
index e6b0efa..057c128f 100644
--- a/chrome/browser/ui/login/login_tab_helper.cc
+++ b/chrome/browser/ui/login/login_tab_helper.cc
@@ -52,11 +52,7 @@
       navigation_handle->IsSameDocument())
     return;
 
-  if (!login_handler_)
-    return;
-
   login_handler_.reset();
-  url_for_login_handler_ = GURL();
 }
 
 void LoginTabHelper::DidFinishNavigation(
@@ -111,7 +107,6 @@
   network_anonymization_key_ =
       navigation_handle->GetIsolationInfo().network_anonymization_key();
 
-  url_for_login_handler_ = navigation_handle->GetURL();
   login_handler_ = LoginHandler::Create(
       navigation_handle->GetAuthChallengeInfo().value(),
       navigation_handle->GetWebContents(),
@@ -217,7 +212,6 @@
 void LoginTabHelper::HandleCredentials(
     const absl::optional<net::AuthCredentials>& credentials) {
   login_handler_.reset();
-  url_for_login_handler_ = GURL();
 
   if (credentials.has_value()) {
     content::StoragePartition* storage_partition =
diff --git a/chrome/browser/ui/login/login_tab_helper.h b/chrome/browser/ui/login/login_tab_helper.h
index 03e032d..d5f418d 100644
--- a/chrome/browser/ui/login/login_tab_helper.h
+++ b/chrome/browser/ui/login/login_tab_helper.h
@@ -88,7 +88,6 @@
   void Reload();
 
   std::unique_ptr<LoginHandler> login_handler_;
-  GURL url_for_login_handler_;
 
   net::AuthChallengeInfo challenge_;
   net::NetworkAnonymizationKey network_anonymization_key_;
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_browsertest.cc b/chrome/browser/ui/views/download/bubble/download_bubble_browsertest.cc
new file mode 100644
index 0000000..23621250
--- /dev/null
+++ b/chrome/browser/ui/views/download/bubble/download_bubble_browsertest.cc
@@ -0,0 +1,95 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/files/file_path.h"
+#include "base/path_service.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/views/download/bubble/download_toolbar_button_view.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/feature_engagement/public/tracker.h"
+#include "components/feature_engagement/test/scoped_iph_feature_list.h"
+#include "components/user_education/test/feature_promo_test_util.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/download_test_observer.h"
+#include "url/gurl.h"
+
+class DownloadBubbleTest : public InProcessBrowserTest {
+ public:
+  DownloadBubbleTest() {
+    test_features_.InitAndEnableFeatures(
+        {feature_engagement::kIPHDownloadToolbarButtonFeature}, {});
+  }
+
+  void SetUpOnMainThread() override {
+    embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+
+  void DownloadAndWait(const GURL& url) {
+    content::DownloadTestObserverTerminal observer(
+        browser()->profile()->GetDownloadManager(), 1,
+        content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
+    ui_test_utils::NavigateToURLWithDisposition(
+        browser(), url, WindowOpenDisposition::CURRENT_TAB,
+        ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
+    observer.WaitForFinished();
+  }
+
+  base::FilePath GetTestDataDirectory() {
+    base::FilePath test_file_directory;
+    base::PathService::Get(chrome::DIR_TEST_DATA, &test_file_directory);
+    return test_file_directory;
+  }
+
+ private:
+  feature_engagement::test::ScopedIphFeatureList test_features_;
+};
+
+// Download bubble does not exist in Ash.
+#if !BUILDFLAG(IS_CHROMEOS_ASH)
+IN_PROC_BROWSER_TEST_F(DownloadBubbleTest, IPHWithNoInteraction) {
+  BrowserView* const browser_view =
+      BrowserView::GetBrowserViewForBrowser(browser());
+  ASSERT_TRUE(user_education::test::WaitForFeatureEngagementReady(
+      browser_view->GetFeaturePromoController()));
+
+  GURL url = embedded_test_server()->GetURL("/download-test1.lib");
+  DownloadAndWait(url);
+
+  browser_view->toolbar()->download_button()->CloseDialog(
+      views::Widget::ClosedReason::kLostFocus);
+
+  EXPECT_TRUE(browser_view->IsFeaturePromoActive(
+      feature_engagement::kIPHDownloadToolbarButtonFeature));
+}
+
+IN_PROC_BROWSER_TEST_F(DownloadBubbleTest, NoIPHWithInteraction) {
+  BrowserView* const browser_view =
+      BrowserView::GetBrowserViewForBrowser(browser());
+  ASSERT_TRUE(user_education::test::WaitForFeatureEngagementReady(
+      browser_view->GetFeaturePromoController()));
+
+  // Simulate an interaction with the download bubble
+  feature_engagement::Tracker* tracker =
+      feature_engagement::TrackerFactory::GetForBrowserContext(
+          browser()->profile());
+  tracker->NotifyEvent("download_bubble_interaction");
+
+  GURL url = embedded_test_server()->GetURL("/download-test1.lib");
+  DownloadAndWait(url);
+
+  browser_view->toolbar()->download_button()->CloseDialog(
+      views::Widget::ClosedReason::kLostFocus);
+
+  EXPECT_FALSE(browser_view->IsFeaturePromoActive(
+      feature_engagement::kIPHDownloadToolbarButtonFeature));
+}
+#endif
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_interactive_uitest.cc b/chrome/browser/ui/views/download/bubble/download_bubble_interactive_uitest.cc
new file mode 100644
index 0000000..323784c
--- /dev/null
+++ b/chrome/browser/ui/views/download/bubble/download_bubble_interactive_uitest.cc
@@ -0,0 +1,57 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/download/download_browsertest_utils.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/test/interaction/interactive_browser_test.h"
+#include "components/safe_browsing/core/common/features.h"
+#include "content/public/test/browser_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace {
+
+class DownloadBubbleInteractiveUiTest : public DownloadTestBase,
+                                        public InteractiveBrowserTestApi {
+ public:
+  DownloadBubbleInteractiveUiTest() {
+    scoped_feature_list_.InitWithFeatures(
+        {safe_browsing::kDownloadBubble, safe_browsing::kDownloadBubbleV2}, {});
+  }
+
+  void SetUpOnMainThread() override {
+    DownloadTestBase::SetUpOnMainThread();
+    embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory());
+    ASSERT_TRUE(embedded_test_server()->Start());
+    private_test_impl().DoTestSetUp();
+    SetContextWidget(
+        BrowserView::GetBrowserViewForBrowser(browser())->GetWidget());
+  }
+
+  void TearDownOnMainThread() override {
+    SetContextWidget(nullptr);
+    private_test_impl().DoTestTearDown();
+    DownloadTestBase::TearDownOnMainThread();
+  }
+
+  auto DownloadTestFile() {
+    GURL url = embedded_test_server()->GetURL(
+        base::StrCat({"/", DownloadTestBase::kDownloadTest1Path}));
+    return base::BindLambdaForTesting(
+        [this, url]() { DownloadAndWait(browser(), url); });
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(DownloadBubbleInteractiveUiTest,
+                       ToolbarIconShownAfterDownload) {
+  RunTestSequence(Do(DownloadTestFile()),
+                  WaitForShow(kDownloadToolbarButtonElementId));
+}
+
+}  // namespace
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
index 5b81a68..cc8a38a 100644
--- a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
+++ b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
@@ -15,12 +15,16 @@
 #include "base/timer/timer.h"
 #include "cc/paint/paint_flags.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/download/bubble/download_bubble_prefs.h"
 #include "chrome/browser/download/bubble/download_bubble_ui_controller.h"
 #include "chrome/browser/download/bubble/download_display_controller.h"
 #include "chrome/browser/download/download_ui_model.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
 #include "chrome/browser/platform_util.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/themes/theme_properties.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/color/chrome_color_id.h"
 #include "chrome/browser/ui/view_ids.h"
 #include "chrome/browser/ui/views/accessibility/non_accessible_image_view.h"
@@ -33,6 +37,8 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/user_education/common/user_education_class_properties.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -56,6 +62,7 @@
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/layout/flex_layout.h"
 #include "ui/views/layout/layout_provider.h"
+#include "ui/views/view_class_properties.h"
 
 namespace {
 
@@ -132,6 +139,7 @@
   GetViewAccessibility().OverrideHasPopup(ax::mojom::HasPopup::kDialog);
   SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_DOWNLOAD_ICON));
   SetVisible(false);
+  SetProperty(views::kElementIdentifierKey, kDownloadToolbarButtonElementId);
 
   badge_image_view_ = AddChildView(std::make_unique<views::ImageView>());
   badge_image_view_->SetPaintToLayer();
@@ -364,6 +372,10 @@
   ShowPendingDownloadStartedAnimation();
 }
 
+bool DownloadToolbarButtonView::ShouldShowInkdropAfterIphInteraction() {
+  return false;
+}
+
 std::unique_ptr<views::View> DownloadToolbarButtonView::GetPrimaryView() {
   if (is_primary_partial_view_) {
     return CreateRowListView(bubble_controller_->GetPartialView());
@@ -415,6 +427,11 @@
     std::unique_ptr<View> bubble_contents_view) {
   if (!bubble_contents_view)
     return;
+  // If the IPH is showing, close it to avoid showing the download dialog over
+  // it.
+  browser_->window()->CloseFeaturePromo(
+      feature_engagement::kIPHDownloadToolbarButtonFeature);
+
   auto bubble_delegate = std::make_unique<views::BubbleDialogDelegate>(
       this, views::BubbleBorder::TOP_RIGHT);
   bubble_delegate->SetTitle(
@@ -444,6 +461,23 @@
   bubble_delegate_ = bubble_delegate.get();
   views::BubbleDialogDelegate::CreateBubble(std::move(bubble_delegate));
   bubble_delegate_->GetWidget()->Show();
+
+  // For IPH bubble. The IPH should show when the partial view is closed, either
+  // manually or automatically.
+  if (is_primary_partial_view_) {
+    bubble_delegate_->SetCloseCallback(
+        base::BindOnce(&DownloadToolbarButtonView::OnPartialViewClosed,
+                       base::Unretained(this)));
+  }
+}
+
+void DownloadToolbarButtonView::OnPartialViewClosed() {
+  if (download::ShouldSuppressDownloadBubbleIph(
+          browser_->profile()->GetOriginalProfile())) {
+    return;
+  }
+  browser_->window()->MaybeShowFeaturePromo(
+      feature_engagement::kIPHDownloadToolbarButtonFeature);
 }
 
 void DownloadToolbarButtonView::CreateAutoCloseTimer() {
@@ -533,7 +567,8 @@
 
 SkColor DownloadToolbarButtonView::GetIconColor() const {
   return icon_color_.value_or(
-      controller_->GetIconInfo().is_active
+      controller_->GetIconInfo().is_active ||
+              GetProperty(user_education::kHasInProductHelpPromoKey)
           ? GetColorProvider()->GetColor(kColorDownloadToolbarButtonActive)
           : GetColorProvider()->GetColor(kColorDownloadToolbarButtonInactive));
 }
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.h b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.h
index 0e107afa..089dcc02 100644
--- a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.h
+++ b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.h
@@ -63,6 +63,7 @@
   void UpdateIcon() override;
   void OnThemeChanged() override;
   void Layout() override;
+  bool ShouldShowInkdropAfterIphInteraction() override;
 
   // DownloadBubbleNavigationHandler:
   void OpenPrimaryDialog() override;
@@ -99,6 +100,9 @@
   void CreateBubbleDialogDelegate(std::unique_ptr<View> bubble_contents_view);
   void OnBubbleDelegateDeleted();
 
+  // Callback invoked when the partial view is closed.
+  void OnPartialViewClosed();
+
   // Creates a timer to track the auto-close task. Does not start the timer.
   void CreateAutoCloseTimer();
 
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc
index adab0d55..8da09b8c 100644
--- a/chrome/browser/ui/views/frame/browser_frame.cc
+++ b/chrome/browser/ui/views/frame/browser_frame.cc
@@ -47,6 +47,7 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h"
 #include "components/user_manager/user_manager.h"
 #endif
 
@@ -396,6 +397,12 @@
 }
 
 absl::optional<SkColor> BrowserFrame::GetUserColor() const {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // ChromeOS SystemWebApps use the OS theme all the time.
+  if (ash::IsSystemWebApp(browser_view_->browser())) {
+    return views::Widget::GetUserColor();
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   const auto* theme_service =
       ThemeServiceFactory::GetForProfile(browser_view_->browser()->profile());
   return theme_service->UsingAutogeneratedTheme()
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_details_view.cc b/chrome/browser/ui/views/passwords/manage_passwords_details_view.cc
index a03acdff..f85fb7d 100644
--- a/chrome/browser/ui/views/passwords/manage_passwords_details_view.cc
+++ b/chrome/browser/ui/views/passwords/manage_passwords_details_view.cc
@@ -10,6 +10,7 @@
 #include "base/functional/callback_forward.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/ui/passwords/ui_utils.h"
 #include "chrome/browser/ui/views/accessibility/non_accessible_image_view.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
@@ -210,12 +211,11 @@
                    : note;
 
   auto note_label = std::make_unique<views::Label>(
-      std::move(note_to_display), views::style::CONTEXT_DIALOG_BODY_TEXT,
+      note_to_display, views::style::CONTEXT_DIALOG_BODY_TEXT,
       views::style::STYLE_SECONDARY);
   note_label->SetMultiLine(true);
-  // TODO(crbug.com/1382017): Review string with UX and use internationalized
-  // string.
-  note_label->SetAccessibleName(u"Password Note");
+  note_label->SetAccessibleName(l10n_util::GetStringFUTF16(
+      IDS_MANAGE_PASSWORDS_NOTE_ACCESSIBLE_NAME, note_to_display));
   note_label->SetVerticalAlignment(gfx::VerticalAlignment::ALIGN_TOP);
   note_label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
   note_label->SetSelectable(true);
@@ -263,8 +263,9 @@
                                views::MaximumFlexSizeRule::kUnbounded));
   *textfield = username_with_error_label_view->AddChildView(
       std::make_unique<views::Textfield>());
-  // TODO(crbug.com/1382017): use internationalized string.
-  (*textfield)->SetAccessibleName(u"Username");
+  (*textfield)
+      ->SetAccessibleName(
+          l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_USERNAME_TEXTFIELD));
   (*textfield)
       ->SetID(static_cast<int>(ManagePasswordsViewIDs::kUsernameTextField));
   *error_label = username_with_error_label_view->AddChildView(
@@ -300,8 +301,8 @@
   *textarea = note_with_error_label_view->AddChildView(
       std::make_unique<views::Textarea>());
   (*textarea)->SetText(form.GetNoteWithEmptyUniqueDisplayName());
-  // TODO(crbug.com/1382017): use internationalized string.
-  (*textarea)->SetAccessibleName(u"Password Note");
+  (*textarea)->SetAccessibleName(
+      l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_NOTE_TEXTFIELD));
   int line_height = views::style::GetLineHeight(views::style::CONTEXT_TEXTFIELD,
                                                 views::style::STYLE_PRIMARY);
   (*textarea)->SetPreferredSize(
@@ -361,6 +362,9 @@
       CreateUsernameLabel(password_form);
   username_label->SetID(
       static_cast<int>(ManagePasswordsViewIDs::kUsernameLabel));
+  username_label->SetAccessibleName(
+      l10n_util::GetStringFUTF16(IDS_MANAGE_PASSWORDS_USERNAME_ACCESSIBLE_NAME,
+                                 username_label->GetText()));
   if (!password_form.username_value.empty()) {
     auto copy_username_button_callback =
         base::BindRepeating(&WriteToClipboard, password_form.username_value)
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_view.cc b/chrome/browser/ui/views/passwords/manage_passwords_view.cc
index 4733694..c50cd84 100644
--- a/chrome/browser/ui/views/passwords/manage_passwords_view.cc
+++ b/chrome/browser/ui/views/passwords/manage_passwords_view.cc
@@ -215,6 +215,10 @@
           /*link_message_id=*/
           IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SYNCED_TO_ACCOUNT,
           open_password_manager_closure);
+    case password_manager::SyncState::
+        kAccountPasswordsActiveWithCustomPassphrase:
+      // Unreachable on desktop platforms.
+      NOTREACHED_NORETURN();
   }
 }
 
diff --git a/chrome/browser/ui/views/passwords/password_items_view.cc b/chrome/browser/ui/views/passwords/password_items_view.cc
index 65eb7f0f..99f5563 100644
--- a/chrome/browser/ui/views/passwords/password_items_view.cc
+++ b/chrome/browser/ui/views/passwords/password_items_view.cc
@@ -374,6 +374,10 @@
           /*link_message_id=*/
           IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SYNCED_TO_ACCOUNT,
           open_password_manager_closure);
+    case password_manager::SyncState::
+        kAccountPasswordsActiveWithCustomPassphrase:
+      // Unreachable on desktop platforms.
+      NOTREACHED_NORETURN();
   }
 }
 
diff --git a/chrome/browser/ui/views/renderer_context_menu/render_view_context_menu_views.cc b/chrome/browser/ui/views/renderer_context_menu/render_view_context_menu_views.cc
index d2b43951..b7522152 100644
--- a/chrome/browser/ui/views/renderer_context_menu/render_view_context_menu_views.cc
+++ b/chrome/browser/ui/views/renderer_context_menu/render_view_context_menu_views.cc
@@ -378,7 +378,13 @@
 
 void RenderViewContextMenuViews::ExecOpenInReadAnything() {
   Browser* browser = GetBrowser();
+  if (!browser) {
+    return;
+  }
   BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
+  if (!browser_view) {
+    return;
+  }
   browser_view->side_panel_coordinator()->Show(
       SidePanelEntry::Id::kReadAnything,
       SidePanelUtil::SidePanelOpenTrigger::kReadAnythingContextMenu);
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
index dfb6570..1498a39 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
@@ -53,7 +53,7 @@
       model_->GetFontModel()->GetFontNameAt(new_index));
 }
 
-ui::ComboboxModel* ReadAnythingController::GetFontComboboxModel() {
+ReadAnythingFontModel* ReadAnythingController::GetFontComboboxModel() {
   return model_->GetFontModel();
 }
 
@@ -135,10 +135,16 @@
 void ReadAnythingController::OnUIReady() {
   ui_ready_ = true;
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
-  if (features::IsReadAnythingWithScreen2xEnabled() &&
-      !component_ready_observer_.IsObserving()) {
-    component_ready_observer_.Observe(
-        screen_ai::ScreenAIInstallState::GetInstance());
+  if (features::IsReadAnythingWithScreen2xEnabled()) {
+    if (screen_ai::ScreenAIInstallState::GetInstance()
+            ->IsComponentAvailable()) {
+      // Notify that the screen ai service is already ready so we can bind to
+      // the content extractor.
+      model_->ScreenAIServiceReady();
+    } else if (!component_ready_observer_.IsObserving()) {
+      component_ready_observer_.Observe(
+          screen_ai::ScreenAIInstallState::GetInstance());
+    }
   }
 #endif
   OnActiveWebContentsChanged();
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h
index 4bc269e..b50e875c 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h
@@ -62,7 +62,7 @@
 
   // ReadAnythingFontCombobox::Delegate:
   void OnFontChoiceChanged(int new_index) override;
-  ui::ComboboxModel* GetFontComboboxModel() override;
+  ReadAnythingFontModel* GetFontComboboxModel() override;
 
   // ReadAnythingToolbarView::Delegate:
   void OnFontSizeChanged(bool increase) override;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc
index 34f01ff..372e7e97c 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc
@@ -14,6 +14,36 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "ui/accessibility/accessibility_features.h"
 
+class MockReadAnythingModelObserver : public ReadAnythingModel::Observer {
+ public:
+  MOCK_METHOD(void,
+              AccessibilityEventReceived,
+              (const content::AXEventNotificationDetails& details),
+              (override));
+  MOCK_METHOD(void,
+              OnActiveAXTreeIDChanged,
+              (const ui::AXTreeID& tree_id, const ukm::SourceId& ukm_source_id),
+              (override));
+  MOCK_METHOD(void,
+              OnAXTreeDestroyed,
+              (const ui::AXTreeID& tree_id),
+              (override));
+  MOCK_METHOD(void,
+              OnReadAnythingThemeChanged,
+              (const std::string& font_name,
+               double font_scale,
+               ui::ColorId foreground_color_id,
+               ui::ColorId background_color_id,
+               ui::ColorId separator_color_id,
+               ui::ColorId dropdown_color_id,
+               read_anything::mojom::LineSpacing line_spacing,
+               read_anything::mojom::LetterSpacing letter_spacing),
+              (override));
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  MOCK_METHOD(void, ScreenAIServiceReady, (), (override));
+#endif
+};
+
 class ReadAnythingControllerTest : public TestWithBrowserView {
  public:
   void SetUp() override {
@@ -101,6 +131,7 @@
   std::unique_ptr<ReadAnythingModel> model_;
   std::unique_ptr<ReadAnythingController> controller_;
   base::test::ScopedFeatureList scoped_feature_list_;
+  MockReadAnythingModelObserver model_observer_;
 };
 
 TEST_F(ReadAnythingControllerTest, ValidIndexUpdatesFontNamePref) {
@@ -252,3 +283,23 @@
   OnUIDestroyed();
   OnUIReady();
 }
+
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+TEST_F(ReadAnythingControllerTest, OnUIReady_ScreenAIReadyCallsModel) {
+  model_->AddObserver(&model_observer_);
+  screen_ai::ScreenAIInstallState::GetInstance()->SetComponentReadyForTesting();
+
+  EXPECT_CALL(model_observer_, ScreenAIServiceReady()).Times(1);
+
+  OnUIReady();
+}
+
+TEST_F(ReadAnythingControllerTest, OnUIReady_ScreenAINotReady) {
+  model_->AddObserver(&model_observer_);
+  screen_ai::ScreenAIInstallState::GetInstance()->ResetForTesting();
+
+  EXPECT_CALL(model_observer_, ScreenAIServiceReady()).Times(0);
+
+  OnUIReady();
+}
+#endif
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.cc
index d0e24c0..88a5102 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.cc
@@ -69,6 +69,13 @@
   return gfx::Size(kMinimumComboboxWidth, CalculatePreferredSize().height());
 }
 
+void ReadAnythingFontCombobox::SetDropdownColors(
+    absl::optional<ui::ColorId> background_color,
+    absl::optional<ui::ColorId> foreground_color) {
+  delegate_->GetFontComboboxModel()->SetForegroundColor(foreground_color);
+  delegate_->GetFontComboboxModel()->SetBackgroundColor(background_color);
+}
+
 BEGIN_METADATA(ReadAnythingFontCombobox, views::Combobox)
 END_METADATA
 
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.h
index a2ebea159..7cfa6fe8c 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.h
@@ -7,6 +7,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/base/models/combobox_model.h"
@@ -18,7 +19,7 @@
   class Delegate {
    public:
     virtual void OnFontChoiceChanged(int new_index) = 0;
-    virtual ui::ComboboxModel* GetFontComboboxModel() = 0;
+    virtual ReadAnythingFontModel* GetFontComboboxModel() = 0;
   };
 
   explicit ReadAnythingFontCombobox(
@@ -27,6 +28,9 @@
   ReadAnythingFontCombobox& operator=(const ReadAnythingFontCombobox&) = delete;
   ~ReadAnythingFontCombobox() override;
 
+  void SetDropdownColors(absl::optional<ui::ColorId> foreground_color,
+                         absl::optional<ui::ColorId> background_color);
+
   // views::Combobox:
   gfx::Size GetMinimumSize() const override;
 
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_button.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_button.cc
index 7a57225..5973c796 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_button.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_button.cc
@@ -70,6 +70,12 @@
   views::InkDrop::Get(this)->SetBaseColor(icon_color);
 }
 
+void ReadAnythingMenuButton::SetDropdownColors(ui::ColorId background_color,
+                                               ui::ColorId foreground_color) {
+  menu_model_->SetSubmenuBackgroundColor(background_color);
+  menu_model_->SetForegroundColor(foreground_color);
+}
+
 BEGIN_METADATA(ReadAnythingMenuButton, MenuButton)
 ADD_PROPERTY_METADATA(ReadAnythingMenuModel*, MenuModel)
 END_METADATA
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_button.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_button.h
index b9c982cc..990bb4c 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_button.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_button.h
@@ -32,6 +32,8 @@
   void SetIcon(const gfx::VectorIcon& icon,
                int icon_size,
                ui::ColorId icon_color);
+  void SetDropdownColors(ui::ColorId background_color,
+                         ui::ColorId foreground_color);
 
  private:
   void ButtonPressed();
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_model.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_model.cc
index 2967adb8..a2435539 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_model.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_model.cc
@@ -35,3 +35,13 @@
 bool ReadAnythingMenuModel::IsValidIndex(size_t index) {
   return false;
 }
+
+absl::optional<ui::ColorId> ReadAnythingMenuModel::GetForegroundColor(
+    size_t index) {
+  return foreground_color_id_;
+}
+
+absl::optional<ui::ColorId> ReadAnythingMenuModel::GetSubmenuBackgroundColor(
+    size_t index) {
+  return submenu_background_color_id_;
+}
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_model.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_model.h
index 9451d5c..2b0c324 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_model.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_menu_model.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_READ_ANYTHING_READ_ANYTHING_MENU_MODEL_H_
 #define CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_READ_ANYTHING_READ_ANYTHING_MENU_MODEL_H_
 
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/base/models/simple_menu_model.h"
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -29,9 +30,22 @@
   absl::optional<size_t> GetSelectedIndex() const { return selected_index_; }
   void SetCallback(base::RepeatingCallback<void()> callback);
 
+  absl::optional<ui::ColorId> GetForegroundColor(size_t index) override;
+  absl::optional<ui::ColorId> GetSubmenuBackgroundColor(size_t index) override;
+
+  void SetForegroundColor(absl::optional<ui::ColorId> foreground_color) {
+    foreground_color_id_ = foreground_color;
+  }
+
+  void SetSubmenuBackgroundColor(absl::optional<ui::ColorId> background_color) {
+    submenu_background_color_id_ = background_color;
+  }
+
  private:
   absl::optional<size_t> selected_index_ = absl::nullopt;
   base::RepeatingClosure callback_;
+  absl::optional<ui::ColorId> foreground_color_id_;
+  absl::optional<ui::ColorId> submenu_background_color_id_;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_READ_ANYTHING_READ_ANYTHING_MENU_MODEL_H_
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
index cdfd07e..98a1de4a 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
@@ -276,6 +276,16 @@
   return font_label;
 }
 
+absl::optional<ui::ColorId> ReadAnythingFontModel::GetDropdownForegroundColorAt(
+    size_t index) const {
+  return foreground_color_id_;
+}
+
+absl::optional<ui::ColorId> ReadAnythingFontModel::GetDropdownBackgroundColorAt(
+    size_t index) const {
+  return background_color_id_;
+}
+
 ReadAnythingFontModel::~ReadAnythingFontModel() = default;
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h
index 409d3d1..66f7ec1 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h
@@ -46,6 +46,19 @@
   std::string GetLabelFontListAt(size_t index);
   size_t GetSelectedIndex() { return selected_index_; }
 
+  absl::optional<ui::ColorId> GetDropdownForegroundColorAt(
+      size_t index) const override;
+  absl::optional<ui::ColorId> GetDropdownBackgroundColorAt(
+      size_t index) const override;
+
+  void SetForegroundColor(absl::optional<ui::ColorId> foreground_color) {
+    foreground_color_id_ = foreground_color;
+  }
+
+  void SetBackgroundColor(absl::optional<ui::ColorId> background_color) {
+    background_color_id_ = background_color;
+  }
+
   // Used by tests only.
   absl::optional<size_t> GetDefaultIndexForTesting();
 
@@ -61,6 +74,9 @@
   std::vector<std::u16string> font_choices_;
 
   size_t selected_index_ = 0;
+
+  absl::optional<ui::ColorId> foreground_color_id_;
+  absl::optional<ui::ColorId> background_color_id_;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc
index d7444a59..439c90bc 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc
@@ -43,6 +43,9 @@
                read_anything::mojom::LineSpacing line_spacing,
                read_anything::mojom::LetterSpacing letter_spacing),
               (override));
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  MOCK_METHOD(void, ScreenAIServiceReady, (), (override));
+#endif
 };
 
 class ReadAnythingModelTest : public TestWithBrowserView {
@@ -260,4 +263,22 @@
   EXPECT_EQ(testIndex, GetFontModel()->GetDefaultIndexForTesting().value());
 }
 
+TEST_F(ReadAnythingModelTest, FontModelHasDefaultNullOptColors) {
+  EXPECT_FALSE(GetFontModel()->GetDropdownForegroundColorAt(0).has_value());
+  EXPECT_FALSE(GetFontModel()->GetDropdownBackgroundColorAt(0).has_value());
+}
+
+TEST_F(ReadAnythingModelTest, FontModelSetsDropdownAndForegroundColors) {
+  ReadAnythingColorsModel* color_model = model_->GetColorsModel();
+  ReadAnythingColorsModel::ColorInfo color_info = color_model->GetColorsAt(2);
+
+  GetFontModel()->SetForegroundColor(color_info.foreground_color_id);
+  GetFontModel()->SetBackgroundColor(color_info.dropdown_color_id);
+
+  EXPECT_EQ(color_info.foreground_color_id,
+            GetFontModel()->GetDropdownForegroundColorAt(0).value());
+  EXPECT_EQ(color_info.dropdown_color_id,
+            GetFontModel()->GetDropdownBackgroundColorAt(0).value());
+}
+
 #endif  // !defined(ADDRESS_SANITIZER)
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc
index cdd6ca1..6a78815 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc
@@ -200,7 +200,13 @@
   letter_spacing_button_->SetIcon(kLetterSpacingIcon, kIconSize,
                                   foreground_color_id);
 
-  // TODO(1266555): Pass the dropdown color to the combobox and menu models.
+  // Update the background colors for the dropdowns.
+  colors_button_->SetDropdownColors(dropdown_color_id, foreground_color_id);
+  letter_spacing_button_->SetDropdownColors(dropdown_color_id,
+                                            foreground_color_id);
+  line_spacing_button_->SetDropdownColors(dropdown_color_id,
+                                          foreground_color_id);
+  font_combobox_->SetDropdownColors(dropdown_color_id, foreground_color_id);
 
   for (views::Separator* separator : separators_) {
     separator->SetColorId(separator_color_id);
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h
index 3b958b56..8d1158c8 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h
@@ -86,7 +86,7 @@
 
   std::unique_ptr<views::View> Separator();
 
-  raw_ptr<views::Combobox> font_combobox_;
+  raw_ptr<ReadAnythingFontCombobox> font_combobox_;
   raw_ptr<ReadAnythingButtonView> decrease_text_size_button_;
   raw_ptr<ReadAnythingButtonView> increase_text_size_button_;
   raw_ptr<ReadAnythingMenuButton> colors_button_;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view_browsertest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view_browsertest.cc
index 21df3b3..134aed7 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view_browsertest.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view_browsertest.cc
@@ -34,7 +34,7 @@
     : public ReadAnythingFontCombobox::Delegate {
  public:
   MOCK_METHOD(void, OnFontChoiceChanged, (int new_index), (override));
-  MOCK_METHOD(ui::ComboboxModel*, GetFontComboboxModel, (), (override));
+  MOCK_METHOD(ReadAnythingFontModel*, GetFontComboboxModel, (), (override));
 };
 
 class MockReadAnythingCoordinator : public ReadAnythingCoordinator {
diff --git a/chrome/browser/ui/views/user_education/browser_user_education_service.cc b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
index 9c88853..035a2e4c 100644
--- a/chrome/browser/ui/views/user_education/browser_user_education_service.cc
+++ b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
@@ -433,6 +433,14 @@
   registry.RegisterFeature(FeaturePromoSpecification::CreateForLegacyPromo(
       &feature_engagement::kIPHPriceTrackingInSidePanelFeature,
       kSidePanelButtonElementId, IDS_PRICE_TRACKING_SIDE_PANEL_IPH));
+
+  // kIPHDownloadToolbarButtonFeature:
+  registry.RegisterFeature(
+      std::move(FeaturePromoSpecification::CreateForSnoozePromo(
+                    feature_engagement::kIPHDownloadToolbarButtonFeature,
+                    kDownloadToolbarButtonElementId, IDS_DOWNLOAD_BUBBLE_PROMO)
+                    .SetBubbleArrow(HelpBubbleArrow::kTopRight)
+                    .SetBubbleTitleText(IDS_DOWNLOAD_BUBBLE_PROMO_TITLE)));
 }
 
 void MaybeRegisterChromeTutorials(
diff --git a/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc b/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc
index 12d37f4..ab4c016a 100644
--- a/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc
+++ b/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc
@@ -5,6 +5,7 @@
 #include <utility>
 
 #include "base/functional/callback_forward.h"
+#include "base/i18n/base_i18n_switches.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
 #include "build/build_config.h"
@@ -15,6 +16,7 @@
 #include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/side_search/side_search_config.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/side_panel/side_panel.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_entry.h"
 #include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
@@ -23,6 +25,7 @@
 #include "chrome/test/interaction/interaction_test_util_browser.h"
 #include "chrome/test/interaction/interactive_browser_test.h"
 #include "chrome/test/interaction/widget_focus_waiter.h"
+#include "components/user_education/common/help_bubble.h"
 #include "components/user_education/common/help_bubble_factory_registry.h"
 #include "components/user_education/common/help_bubble_params.h"
 #include "components/user_education/views/help_bubble_view.h"
@@ -169,3 +172,45 @@
       WaitForHide(
           user_education::HelpBubbleView::kHelpBubbleElementIdForTesting));
 }
+
+namespace {
+constexpr char kSidePanelElementName[] = "Side Panel Element";
+}
+
+class HelpBubbleFactoryRtlWebUIInteractiveUiTest
+    : public HelpBubbleFactoryWebUIInteractiveUiTest {
+ public:
+  HelpBubbleFactoryRtlWebUIInteractiveUiTest() = default;
+  ~HelpBubbleFactoryRtlWebUIInteractiveUiTest() override = default;
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    command_line->AppendSwitchASCII(switches::kForceUIDirection,
+                                    switches::kForceDirectionRTL);
+  }
+};
+
+// This verifies that the "element bounds updated" event gets sent when the side
+// panel is resized, even if none of the elements in the side panel are resized.
+// This is a regression test for crbug.com/1425487.
+IN_PROC_BROWSER_TEST_F(HelpBubbleFactoryRtlWebUIInteractiveUiTest,
+                       ResizeSidePanelSendsUpdate) {
+  RunTestSequence(
+      PressButton(kSidePanelButtonElementId), WaitForShow(kSidePanelElementId),
+      FlushEvents(),
+      SelectDropdownItem(kSidePanelComboboxElementId,
+                         static_cast<int>(SidePanelEntry::Id::kReadingList)),
+      FlushEvents(),
+      InAnyContext(
+          AfterShow(kAddCurrentTabToReadingListElementId,
+                    [](ui::InteractionSequence* seq, ui::TrackedElement* el) {
+                      seq->NameElement(el, kSidePanelElementName);
+                    })),
+      ShowHelpBubble(kAddCurrentTabToReadingListElementId), FlushEvents(),
+      WithView(kSidePanelElementId,
+               [](SidePanel* side_panel) {
+                 side_panel->OnResize(-50, true);
+                 side_panel->GetWidget()->LayoutRootViewIfNecessary();
+               }),
+      WaitForEvent(kSidePanelElementName,
+                   user_education::kHelpBubbleAnchorBoundsChangedEvent));
+}
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
index a91b8af..876ad9d0 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -70,7 +70,6 @@
 #include "chrome/browser/ui/web_applications/web_app_menu_model.h"
 #include "chrome/browser/ui/webui/app_management/app_management_page_handler.h"
 #include "chrome/browser/ui/webui/app_settings/web_app_settings_ui.h"
-#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h"
 #include "chrome/browser/ui/webui/web_app_internals/web_app_internals_handler.h"
 #include "chrome/browser/web_applications/app_service/web_app_publisher_helper.h"
 #include "chrome/browser/web_applications/commands/run_on_os_login_command.h"
@@ -421,20 +420,6 @@
 }
 #endif
 
-#if !BUILDFLAG(IS_CHROMEOS)
-class TestAppLauncherHandler : public AppLauncherHandler {
- public:
-  TestAppLauncherHandler(extensions::ExtensionService* extension_service,
-                         WebAppProvider* provider,
-                         content::TestWebUI* test_web_ui)
-      : AppLauncherHandler(extension_service, provider) {
-    DCHECK(test_web_ui->GetWebContents());
-    DCHECK(test_web_ui->GetWebContents()->GetBrowserContext());
-    set_web_ui(test_web_ui);
-  }
-};
-#endif
-
 class BrowserAddedWaiter final : public BrowserListObserver {
  public:
   BrowserAddedWaiter() { BrowserList::AddObserver(this); }
@@ -1668,20 +1653,17 @@
   AppId app_id = GetAppIdBySiteMode(site);
   ASSERT_TRUE(provider()->registrar_unsafe().GetAppById(app_id))
       << "No app installed for site: " << static_cast<int>(site);
-  ;
 
   content::TestWebUI test_web_ui;
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetWebContentsAt(0);
   DCHECK(web_contents);
   test_web_ui.set_web_contents(web_contents);
-  TestAppLauncherHandler handler(/*extension_service=*/nullptr, provider(),
-                                 &test_web_ui);
-  base::Value::List web_app_ids;
-  web_app_ids.Append(app_id);
+  webapps::AppHomePageHandler app_home_page_handler =
+      GetTestAppHomePageHandler(&test_web_ui);
   content::WebContentsAddedObserver nav_observer;
-  handler.HandleShowAppInfo(web_app_ids);
-  // Wait for new web content to be created.
+  app_home_page_handler.ShowAppSettings(app_id);
+  // Wait for new web contents to be created.
   nav_observer.GetWebContents();
   AfterStateChangeAction();
 #endif
@@ -1690,7 +1672,7 @@
 void WebAppIntegrationTestDriver::CreateShortcutsFromList(Site site) {
 #if BUILDFLAG(IS_CHROMEOS)
   NOTREACHED_NORETURN() << "Not implemented on Chrome OS.";
-#else
+#else  // !BUILDFLAG(IS_CHROMEOS)
   if (!BeforeStateChangeAction(__FUNCTION__)) {
     return;
   }
@@ -1702,25 +1684,25 @@
       browser()->tab_strip_model()->GetWebContentsAt(0);
   DCHECK(web_contents);
   test_web_ui.set_web_contents(web_contents);
-  TestAppLauncherHandler handler(/*extension_service=*/nullptr, provider(),
-                                 &test_web_ui);
-  base::Value::List web_app_ids;
-  web_app_ids.Append(app_id);
+  webapps::AppHomePageHandler app_home_page_handler =
+      GetTestAppHomePageHandler(&test_web_ui);
+  base::test::TestFuture<void> shortcuts_future;
 #if BUILDFLAG(IS_MAC)
-  base::RunLoop loop;
-  handler.HandleCreateAppShortcut(loop.QuitClosure(), web_app_ids);
-  loop.Run();
-#else
+  app_home_page_handler.CreateAppShortcut(app_id,
+                                          shortcuts_future.GetCallback());
+#else   // !BUILDFLAG(IS_MAC)
   views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{},
                                        "CreateChromeApplicationShortcutView");
-  handler.HandleCreateAppShortcut(base::DoNothing(), web_app_ids);
+  app_home_page_handler.CreateAppShortcut(app_id,
+                                          shortcuts_future.GetCallback());
   FlushShortcutTasks();
   views::Widget* widget = waiter.WaitIfNeededAndGet();
   ASSERT_TRUE(widget != nullptr);
   views::test::AcceptDialog(widget);
-#endif
+#endif  // BUILDFLAG(IS_MAC)
+  EXPECT_TRUE(shortcuts_future.Wait());
   AfterStateChangeAction();
-#endif
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 void WebAppIntegrationTestDriver::DeletePlatformShortcut(Site site) {
diff --git a/chrome/browser/ui/web_applications/web_app_browsertest.cc b/chrome/browser/ui/web_applications/web_app_browsertest.cc
index 15f8b3c..041119d 100644
--- a/chrome/browser/ui/web_applications/web_app_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_browsertest.cc
@@ -113,7 +113,6 @@
 #endif
 
 #if BUILDFLAG(IS_MAC)
-#include "chrome/browser/web_applications/os_integration/web_app_shortcut_mac.h"
 #include "ui/base/test/scoped_fake_nswindow_fullscreen.h"
 #endif
 
@@ -1658,13 +1657,10 @@
 };
 
 IN_PROC_BROWSER_TEST_P(WebAppBrowserTestUpdateShortcutResult, UpdateShortcut) {
-#if BUILDFLAG(IS_MAC)
-  base::AutoReset<bool> scope_shortcut_app_update(
-      &g_app_shims_allow_update_and_launch_in_tests, true);
-#endif
+  os_hooks_suppress_.reset();
   base::ScopedAllowBlockingForTesting allow_blocking;
   std::unique_ptr<OsIntegrationTestOverride::BlockingRegistration>
-      test_override =
+      blocking_registration =
           OsIntegrationTestOverride::OverrideForTesting(base::GetHomeDir());
 
   NavigateToURLAndWait(browser(), GetInstallableAppURL());
diff --git a/chrome/browser/ui/webui/ash/cros_components_browsertest.cc b/chrome/browser/ui/webui/ash/cros_components_browsertest.cc
new file mode 100644
index 0000000..6dbc470
--- /dev/null
+++ b/chrome/browser/ui/webui/ash/cros_components_browsertest.cc
@@ -0,0 +1,180 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_ui_controller.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "content/public/browser/webui_config.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/scoped_web_ui_controller_factory_registration.h"
+#include "content/public/test/web_ui_browsertest_util.h"
+
+namespace ash {
+namespace {
+
+static constexpr const char kTestHost[] = "test-host";
+static constexpr const char kTestUrl[] = "chrome://test-host";
+
+// TODO(clamclamyan): Replace import map once @material imports are rewritten.
+static constexpr const char kCrosComponentsHtml[] = R"(
+<script type="importmap">
+{
+  "imports": {
+    "lit": "chrome://resources/mwc/lit/index.js",
+    "@material/": "chrome://resources/mwc/@material/",
+    "chrome://resources/mwc/lit/index.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/decorators.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directive.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/async-append.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/async-replace.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/cache.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/choose.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/class-map.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/guard.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/if-defined.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/join.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/keyed.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/live.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/map.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/range.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/ref.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/repeat.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/style-map.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/template-content.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/unsafe-html.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/unsafe-svg.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/until.js": "chrome://resources/mwc/lit/index.js",
+    "chrome://resources/mwc/lit/directives/when.js": "chrome://resources/mwc/lit/index.js"
+  }
+}
+</script>
+)";
+
+// WebUIController that registers a URLDataSource which serves an html page with
+// our import map and a Trusted Types CSP that allows us to inject script tags.
+class CrosComponentsUI : public content::WebUIController {
+ public:
+  explicit CrosComponentsUI(content::WebUI* web_ui) : WebUIController(web_ui) {
+    auto* browser_context = web_ui->GetWebContents()->GetBrowserContext();
+    content::WebUIDataSource* source =
+        content::WebUIDataSource::CreateAndAdd(browser_context, kTestHost);
+    source->SetRequestFilter(
+        base::BindRepeating([](const std::string& path) { return true; }),
+        base::BindRepeating(
+            [](const std::string& path,
+               content::WebUIDataSource::GotDataCallback callback) {
+              base::RefCountedString* ref_contents =
+                  new base::RefCountedString(kCrosComponentsHtml);
+              std::move(callback).Run(ref_contents);
+            }));
+
+    source->OverrideContentSecurityPolicy(
+        network::mojom::CSPDirectiveName::ScriptSrc,
+        "script-src chrome://resources 'self' 'unsafe-inline';");
+
+    source->OverrideContentSecurityPolicy(
+        network::mojom::CSPDirectiveName::TrustedTypes,
+        "trusted-types lit-html script-js-static;");
+  }
+
+  ~CrosComponentsUI() override = default;
+};
+
+class CrosComponentsUIConfig : public content::WebUIConfig {
+ public:
+  CrosComponentsUIConfig() : WebUIConfig("chrome", kTestHost) {}
+
+  std::unique_ptr<content::WebUIController> CreateWebUIController(
+      content::WebUI* web_ui) override {
+    return std::make_unique<CrosComponentsUI>(web_ui);
+  }
+};
+
+struct ComponentTestData {
+  // The URL of the component.
+  base::StringPiece script_src;
+  // The name of the custom element.
+  base::StringPiece component_name;
+  // Used to generate the test name. GTest names are only allowed to use
+  // alphanumeric characters.
+  base::StringPiece gtest_name;
+};
+
+// Used by GTest to generate the test name.
+std::ostream& operator<<(std::ostream& os,
+                         const ComponentTestData& component_test_data) {
+  os << component_test_data.gtest_name;
+  return os;
+}
+
+class CrosComponentsBrowserTest
+    : public InProcessBrowserTest,
+      public testing::WithParamInterface<ComponentTestData> {
+ public:
+  content::WebContents* GetActiveWebContents() {
+    return browser()->tab_strip_model()->GetActiveWebContents();
+  }
+};
+
+}  // namespace
+
+// The test imports a `script_src` for the component and waits for the custom
+// element with `component_name` to be defined. If the test fails the URL that
+// couldn't be loaded is printed.
+IN_PROC_BROWSER_TEST_P(CrosComponentsBrowserTest, NoRuntimeErrors) {
+  content::ScopedWebUIConfigRegistration registration(
+      std::make_unique<CrosComponentsUIConfig>());
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kTestUrl)));
+
+  static constexpr const char kWaitElementToBeDefined[] = R"(
+(async () => {
+  let injectScript = new Promise((resolve, reject) => {
+    const staticUrlPolicy = trustedTypes.createPolicy(
+      'script-js-static',
+      {createScriptURL: () => '%s'});
+
+    const script = document.createElement('script');
+    script.src = staticUrlPolicy.createScriptURL('')
+    script.type = "module"
+    script.onerror = () => { reject('Failed to load script.'); };
+    script.onload = resolve;
+    document.body.appendChild(script);
+  });
+
+  await injectScript;
+  await customElements.whenDefined('%s');
+
+  return true;
+})();
+)";
+
+  content::DevToolsInspectorLogWatcher log_watcher(GetActiveWebContents());
+  auto result = content::EvalJs(
+      GetActiveWebContents(),
+      base::StringPrintf(kWaitElementToBeDefined, GetParam().script_src.data(),
+                         GetParam().component_name.data()));
+  log_watcher.FlushAndStopWatching();
+
+  EXPECT_EQ(true, result) << log_watcher.last_message() << " - "
+                          << log_watcher.last_url();
+}
+
+static constexpr const ComponentTestData kComponentsTestData[] = {{
+    .script_src = "chrome://resources/cros_components/button/button.js",
+    .component_name = "cros-button",
+    .gtest_name = "CrosButton",
+}};
+
+INSTANTIATE_TEST_SUITE_P(All,
+                         CrosComponentsBrowserTest,
+                         testing::ValuesIn(kComponentsTestData),
+                         testing::PrintToStringParamName());
+
+}  // namespace ash
diff --git a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
index 2f8219f..3c98c831 100644
--- a/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/ash/login/gaia_screen_handler.cc
@@ -1516,10 +1516,10 @@
       error_screen_->SetParentScreen(GaiaView::kScreenId);
       error_screen_->SetHideCallback(base::BindOnce(
           &GaiaScreenHandler::OnErrorScreenHide, weak_factory_.GetWeakPtr()));
-      histogram_helper_->OnErrorShow(error_screen_->GetErrorState());
     }
     // Show `ErrorScreen` or update network error message.
     error_screen_->ShowNetworkErrorMessage(state, reason);
+    histogram_helper_->OnErrorShow(error_screen_->GetErrorState());
   } else {
     HideOfflineMessage(state, reason);
   }
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 4389690..ced1818 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -580,7 +580,7 @@
   }
 }
 
-void BindEcheConnectionStatusObserver(
+void BindEcheConnectionStatusHandler(
     ash::eche_app::EcheAppManager* manager,
     mojo::PendingReceiver<ash::eche_app::mojom::ConnectionStatusObserver>
         receiver) {
@@ -602,7 +602,7 @@
       base::BindRepeating(&BindEcheNotificationGenerator, manager),
       base::BindRepeating(&BindEcheDisplayStreamHandler, manager),
       base::BindRepeating(&BindEcheStreamOrientationObserver, manager),
-      base::BindRepeating(&BindEcheConnectionStatusObserver, manager));
+      base::BindRepeating(&BindEcheConnectionStatusHandler, manager));
 }
 
 template <>
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
index fbfd208..93854b1 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -63,8 +63,6 @@
 #include "components/feed/feed_feature_list.h"
 #include "components/google/core/common/google_util.h"
 #include "components/grit/components_scaled_resources.h"
-#include "components/history_clusters/core/config.h"
-#include "components/image_service/features.h"
 #include "components/image_service/image_service.h"
 #include "components/image_service/image_service_handler.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -231,10 +229,6 @@
                      base::FeatureList::IsEnabled(
                          ntp_features::kNtpHistoryClustersModuleLoad) &&
                          HasCredentials(profile));
-  source->AddBoolean(
-      "isHistoryClustersImagesEnabled",
-      history_clusters::GetConfig().images &&
-          base::FeatureList::IsEnabled(image_service::kImageService));
 
   static constexpr webui::LocalizedString kStrings[] = {
       {"doneButton", IDS_DONE},
diff --git a/chrome/browser/ui/webui/settings/ash/device_section.cc b/chrome/browser/ui/webui/settings/ash/device_section.cc
index c4767b8..3adcf78 100644
--- a/chrome/browser/ui/webui/settings/ash/device_section.cc
+++ b/chrome/browser/ui/webui/settings/ash/device_section.cc
@@ -804,6 +804,7 @@
       {"keyboardKeySearch", IDS_SETTINGS_KEYBOARD_KEY_SEARCH},
       {"keyboardRemapRestoreDefaultsLabel",
        IDS_SETTINGS_KEYBOARD_REMAP_RESTORE_BUTTON_LABEL},
+      {"noKeyboardsConnected", IDS_SETTINGS_KEYBOARD_NO_KEYBOARDS_HELP_MESSAGE},
   };
   html_source->AddLocalizedStrings(keyboard_strings);
 
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chrome/browser/ui/webui/settings/site_settings_handler.cc
index 3b364fa..25124397 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -81,6 +81,7 @@
 #include "content/public/browser/browsing_data_filter_builder.h"
 #include "content/public/browser/browsing_data_remover.h"
 #include "content/public/browser/storage_partition.h"
+#include "content/public/browser/storage_partition_config.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/common/content_features.h"
@@ -882,6 +883,7 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   // Site Details Page does not display the number of cookies for the origin.
   const CookieTreeNode* root = cookies_tree_model_->GetRoot();
+  int64_t size = 0;
   std::string usage_string;
   std::string cookie_string;
   std::string fps_string;
@@ -897,9 +899,7 @@
     if (title != usage_hostname) {
       continue;
     }
-    int64_t size = site->InclusiveSize();
-    if (size != 0)
-      usage_string = base::UTF16ToUTF8(ui::FormatBytes(size));
+    size += site->InclusiveSize();
 
     // Usage info only includes unpartitioned cookies, so each cookie must be
     // inspected.
@@ -944,6 +944,19 @@
     }
     break;
   }
+
+  for (const BrowsingDataModel::BrowsingDataEntryView& entry :
+       *browsing_data_model_) {
+    if (*entry.primary_host != usage_hostname) {
+      continue;
+    }
+    size += entry.data_details->storage_size;
+  }
+
+  if (size > 0) {
+    usage_string = base::UTF16ToUTF8(ui::FormatBytes(size));
+  }
+
   FireWebUIListener("usage-total-changed", base::Value(usage_origin_),
                     base::Value(usage_string), base::Value(cookie_string),
                     base::Value(fps_string), base::Value(fpsPolicy));
@@ -2130,11 +2143,8 @@
 
   num_models_being_built_ = 2;
 
-  content::StoragePartition* storage_partition =
-      profile_->GetDefaultStoragePartition();
   BrowsingDataModel::BuildFromDisk(
-      storage_partition,
-      ChromeBrowsingDataModelDelegate::CreateForProfile(profile_),
+      profile_, ChromeBrowsingDataModelDelegate::CreateForProfile(profile_),
       base::BindOnce(&SiteSettingsHandler::BrowsingDataModelCreated,
                      weak_ptr_factory_.GetWeakPtr()));
 
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.h b/chrome/browser/ui/webui/settings/site_settings_handler.h
index 9489e5f..c0a92b2 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler.h
+++ b/chrome/browser/ui/webui/settings/site_settings_handler.h
@@ -175,6 +175,7 @@
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, HandleGetExtensionName);
 #endif
+  FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, IsolatedWebAppUsageInfo);
 
   // Rebuilds the BrowsingDataModel & CookiesTreeModel. Pending requests are
   // serviced when both models are built.
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
index 22af1ed..d8fe1f02 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -32,6 +32,7 @@
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/bluetooth/bluetooth_chooser_context_factory.h"
+#include "chrome/browser/browsing_data/chrome_browsing_data_model_delegate.h"
 #include "chrome/browser/browsing_topics/browsing_topics_service_factory.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/engagement/site_engagement_service_factory.h"
@@ -284,8 +285,10 @@
         TestingBrowserProcess::GetGlobal());
     EXPECT_TRUE(testing_profile_manager_->SetUp());
     profile_ = testing_profile_manager_->CreateTestingProfile(
-        kTestUserEmail, {{HistoryServiceFactory::GetInstance(),
-                          HistoryServiceFactory::GetDefaultFactory()}});
+        kTestUserEmail,
+        {{HistoryServiceFactory::GetInstance(),
+          HistoryServiceFactory::GetDefaultFactory()}},
+        /*is_main_profile=*/true);
     EXPECT_TRUE(profile_);
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -706,6 +709,34 @@
                                    std::move(fake_browsing_data_model));
   }
 
+  void SetupModelsWithIsolatedWebAppData(
+      const std::string& isolated_web_app_url,
+      int64_t usage) {
+    auto container = std::make_unique<LocalDataContainer>(
+        /*browsing_data_cookie_helper=*/nullptr,
+        /*database_helper=*/nullptr,
+        /*browsing_data_local_storage_helper=*/nullptr,
+        /*session_storage_helper=*/nullptr,
+        /*indexed_db_helper=*/nullptr,
+        /*file_system_helper=*/nullptr,
+        /*quota_helper=*/nullptr,
+        /*service_worker_helper=*/nullptr,
+        /*data_shared_worker_helper=*/nullptr,
+        /*cache_storage_helper=*/nullptr);
+    auto mock_cookies_tree_model = std::make_unique<CookiesTreeModel>(
+        std::move(container), profile()->GetExtensionSpecialStoragePolicy());
+
+    auto fake_browsing_data_model = std::make_unique<FakeBrowsingDataModel>();
+    fake_browsing_data_model->AddBrowsingData(
+        url::Origin::Create(GURL(isolated_web_app_url)),
+        static_cast<BrowsingDataModel::StorageType>(
+            ChromeBrowsingDataModelDelegate::StorageType::kIsolatedWebApp),
+        usage);
+
+    handler()->SetModelsForTesting(std::move(mock_cookies_tree_model),
+                                   std::move(fake_browsing_data_model));
+  }
+
   base::Value::List GetOnStorageFetchedSentList() {
     handler()->ClearAllSitesMapForTesting();
 
@@ -5303,4 +5334,20 @@
   ASSERT_EQ(0U, web_ui()->call_data().size());
 }
 
+TEST_F(SiteSettingsHandlerTest, IsolatedWebAppUsageInfo) {
+  std::string iwa_url =
+      "isolated-app://aerugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaic";
+  SetupModelsWithIsolatedWebAppData(iwa_url, 1000);
+
+  base::Value::List args;
+  args.Append(iwa_url);
+  handler()->HandleFetchUsageTotal(args);
+  handler()->ServicePendingRequests();
+
+  ValidateUsageInfo(
+      /*expected_usage_host=*/iwa_url, /*expected_usage_string=*/"1,000 B",
+      /*expected_cookie_string=*/"",
+      /*expected_fps_member_count_string=*/"", /*expected_fps_policy=*/false);
+}
+
 }  // namespace settings
diff --git a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/player/VideoPlayerMediator.java b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/player/VideoPlayerMediator.java
index cc7e89de..9117475 100644
--- a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/player/VideoPlayerMediator.java
+++ b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/player/VideoPlayerMediator.java
@@ -75,6 +75,8 @@
     }
 
     boolean handleBackPressed() {
+        // TODO(crbug.com/1406012): Remove these metrics or introduce new metrics in other lifecycle
+        //                          hooks because this method never consumes back event.
         boolean isShowingLanguagePicker = mModel.get(VideoPlayerProperties.SHOW_LANGUAGE_PICKER);
         boolean isShowingLoadingScreen = mModel.get(VideoPlayerProperties.SHOW_LOADING_SCREEN);
         boolean isShowingVideoPlayer = !isShowingLanguagePicker && !isShowingLoadingScreen;
diff --git a/chrome/browser/web_applications/isolated_web_apps/get_isolated_web_app_browsing_data_command.cc b/chrome/browser/web_applications/isolated_web_apps/get_isolated_web_app_browsing_data_command.cc
index 3cc1150..716c469 100644
--- a/chrome/browser/web_applications/isolated_web_apps/get_isolated_web_app_browsing_data_command.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/get_isolated_web_app_browsing_data_command.cc
@@ -75,9 +75,10 @@
 
     content::StoragePartition* storage_partition =
         profile_->GetStoragePartition(storage_partition_config);
-    BrowsingDataModel::BuildFromDisk(
+    BrowsingDataModel::BuildFromNonDefaultStoragePartition(
         storage_partition,
-        ChromeBrowsingDataModelDelegate::CreateForProfile(profile_),
+        ChromeBrowsingDataModelDelegate::CreateForStoragePartition(
+            profile_, storage_partition),
         base::BindOnce(&StoragePartitionSizeEstimator::BrowsingDataModelLoaded,
                        weak_ptr_factory_.GetWeakPtr()));
 
diff --git a/chrome/browser/web_applications/os_integration/os_integration_test_override.h b/chrome/browser/web_applications/os_integration/os_integration_test_override.h
index bb17921..f58e7477 100644
--- a/chrome/browser/web_applications/os_integration/os_integration_test_override.h
+++ b/chrome/browser/web_applications/os_integration/os_integration_test_override.h
@@ -169,6 +169,7 @@
 
   // Looks into the current shortcut paths to determine if a shortcut has
   // been created or not. This should only be run on Windows, Mac and Linux.
+  // TODO(crbug.com/1425967): Add PList parsing logic for Mac shortcut checking.
   bool IsShortcutCreated(Profile* profile,
                          const AppId& app_id,
                          const std::string& app_name);
diff --git a/chrome/browser/web_applications/os_integration/shortcut_sub_manager_unittest.cc b/chrome/browser/web_applications/os_integration/shortcut_sub_manager_unittest.cc
index 08c8cdd6..d4e58a2 100644
--- a/chrome/browser/web_applications/os_integration/shortcut_sub_manager_unittest.cc
+++ b/chrome/browser/web_applications/os_integration/shortcut_sub_manager_unittest.cc
@@ -31,10 +31,6 @@
 #include "third_party/skia/include/core/SkColor.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(IS_MAC)
-#include "chrome/browser/web_applications/os_integration/web_app_shortcut_mac.h"
-#endif
-
 namespace web_app {
 
 using ::testing::Eq;
@@ -320,13 +316,6 @@
 }
 
 TEST_P(ShortcutSubManagerExecuteTest, UpdateAppVerifyCorrectShortcuts) {
-#if BUILDFLAG(IS_MAC)
-  // This is required so that app shims with name changes can be updated during
-  // testing.
-  base::AutoReset<bool> scope_shortcut_app_update(
-      &g_app_shims_allow_update_and_launch_in_tests, true);
-#endif
-
   std::map<SquareSizePx, SkBitmap> icon_map;
   icon_map[icon_size::k24] = CreateSolidColorIcon(icon_size::k24, SK_ColorRED);
   icon_map[icon_size::k128] =
@@ -370,6 +359,9 @@
     }
 
     // Verify shortcut changes for both name and color.
+// TODO(crbug.com/1425967): Enable once PList parsing code is added to
+// OsIntegrationTestOverride for Mac shortcut checking.
+#if !BUILDFLAG(IS_MAC)
     ASSERT_TRUE(GetOsIntegrationTestOverride()->IsShortcutCreated(
         profile(), app_id,
         provider().registrar_unsafe().GetAppShortName(app_id)));
@@ -377,6 +369,7 @@
         GetShortcutColor(app_id,
                          provider().registrar_unsafe().GetAppShortName(app_id)),
         testing::Eq(SK_ColorBLUE));
+#endif  // !BUILDFLAG(IS_MAC)
   }
 }
 
diff --git a/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.h b/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.h
index f26a5c76..a344e392 100644
--- a/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.h
+++ b/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.h
@@ -100,11 +100,6 @@
 
 // -----------------------------------------------------------------------------
 
-// Whether to enable update and launch of app shims in tests. (Normally shims
-// are never created or launched in tests). Note that update only creates
-// internal shim bundles, i.e. it does not create new shims in ~/Applications.
-extern bool g_app_shims_allow_update_and_launch_in_tests;
-
 namespace web_app {
 
 enum class LaunchShimUpdateBehavior {
@@ -148,9 +143,9 @@
 void WaitForShimToQuitForTesting(const base::FilePath& shim_path,
                                  const std::string& app_id);
 
-// Return true if launching and updating app shims will fail because of the
-// testing environment.
-bool AppShimLaunchDisabled();
+// Disable app shims in tests if the shortcut folder is not set.
+// Because shims created in ~/Applications will not be cleaned up.
+bool AppShimCreationAndLaunchDisabledForTest();
 
 // Returns a path to the Chrome Apps folder in ~/Applications.
 base::FilePath GetChromeAppsFolder();
diff --git a/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.mm b/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.mm
index 24c6d919..d9df42c4 100644
--- a/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.mm
+++ b/chrome/browser/web_applications/os_integration/web_app_shortcut_mac.mm
@@ -168,8 +168,6 @@
                         callback:std::move(termination_callback)];
 }
 
-bool g_app_shims_allow_update_and_launch_in_tests = false;
-
 namespace web_app {
 
 namespace {
@@ -223,14 +221,6 @@
   return result;
 }
 
-bool AppShimCreationDisabledForTest() {
-  // Disable app shims in tests if the shortcut folder is not set.
-  // Because shims created in ~/Applications will not be cleaned up.
-  return base::CommandLine::ForCurrentProcess()->HasSwitch(
-             switches::kTestType) &&
-         !GetOsIntegrationTestOverride();
-}
-
 bool AppShimRevealDisabledForTest() {
   // Disable app shim reveal in the Finder during tests, to avoid
   // creating Finder windows that are never closed.
@@ -783,8 +773,9 @@
       continue;
     infos.push_back(info);
   }
-  if (!infos.empty())
+  if (!infos.empty()) {
     return infos;
+  }
 
   // LaunchServices can fail to locate a recently-created bundle. Search
   // for an app in the applications folder to handle this case.
@@ -900,9 +891,12 @@
 
 }  // namespace
 
-bool AppShimLaunchDisabled() {
-  return AppShimCreationDisabledForTest() &&
-         !g_app_shims_allow_update_and_launch_in_tests;
+bool AppShimCreationAndLaunchDisabledForTest() {
+  // Note: The kTestType switch is only added on browser tests, but not unit
+  // tests. Unit tests need to set the test override.
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+             switches::kTestType) &&
+         !GetOsIntegrationTestOverride();
 }
 
 base::FilePath GetChromeAppsFolder() {
@@ -968,35 +962,23 @@
 
 base::FilePath WebAppShortcutCreator::GetApplicationsShortcutPath(
     bool avoid_conflicts) const {
-  // If app shims updates are allowed in tests and the OS integration
-  // test override exists, apps should be updated inside the
-  // test override location instead of the web_applications profile
-  // directory.
-  if (g_app_shims_allow_update_and_launch_in_tests) {
-    if (GetOsIntegrationTestOverride()) {
-      base::FilePath applications_dir = GetChromeAppsFolder();
-      if (applications_dir.empty()) {
-        return base::FilePath();
-      }
-      return applications_dir.Append(GetShortcutBasename());
-    }
-    return app_data_dir_.Append(GetShortcutBasename());
+  base::FilePath applications_dir = GetChromeAppsFolder();
+  if (applications_dir.empty()) {
+    return base::FilePath();
   }
 
-  base::FilePath applications_dir = GetChromeAppsFolder();
-  if (applications_dir.empty())
-    return base::FilePath();
-
-  if (!avoid_conflicts)
+  if (!avoid_conflicts) {
     return applications_dir.Append(GetShortcutBasename());
+  }
 
   // Attempt to use the application's title for the file name. Resolve conflicts
   // by appending 1 through kMaxConflictNumber, before giving up and using the
   // concatenated profile and extension for a name name.
   for (int i = 1; i <= kMaxConflictNumber; ++i) {
     base::FilePath path = applications_dir.Append(GetShortcutBasename(i));
-    if (base::DirectoryExists(path))
+    if (base::DirectoryExists(path)) {
       continue;
+    }
     return path;
   }
 
@@ -1008,8 +990,9 @@
 base::FilePath WebAppShortcutCreator::GetShortcutBasename(
     int copy_number) const {
   // For profile-less shortcuts, use the fallback naming scheme to avoid change.
-  if (info_->profile_name.empty())
+  if (info_->profile_name.empty()) {
     return GetFallbackBasename();
+  }
 
   // Strip all preceding '.'s from the path.
   std::u16string title = info_->title;
@@ -1017,8 +1000,9 @@
   while (first_non_dot < title.size() && title[first_non_dot] == '.')
     first_non_dot += 1;
   title = title.substr(first_non_dot);
-  if (title.empty())
+  if (title.empty()) {
     return GetFallbackBasename();
+  }
 
   // Finder will display ':' as '/', so replace all '/' instances with ':'.
   std::replace(title.begin(), title.end(), '/', ':');
@@ -1235,8 +1219,9 @@
   DCHECK_NE(creation_locations.applications_menu_location,
             APP_MENU_LOCATION_HIDDEN);
   std::vector<base::FilePath> updated_app_paths;
-  if (!UpdateShortcuts(true /* create_if_needed */, &updated_app_paths))
+  if (!UpdateShortcuts(true /* create_if_needed */, &updated_app_paths)) {
     return false;
+  }
   if (creation_locations.in_startup) {
     // Only add the first app to run at OS login.
     WebAppAutoLoginUtil::GetInstance()->AddToLoginItems(updated_app_paths[0],
@@ -1546,29 +1531,25 @@
   base::FilePath default_path =
       GetApplicationsShortcutPath(false /* avoid_conflicts */);
 
-  // When testing, use only the default path.
-  if (g_app_shims_allow_update_and_launch_in_tests) {
-    paths.clear();
-    if (base::PathExists(default_path))
-      paths.push_back(default_path);
-    return paths;
-  }
-
   base::FilePath apps_dir = GetChromeAppsFolder();
   auto compare = [default_path, apps_dir](const base::FilePath& a,
                                           const base::FilePath& b) {
-    if (a == b)
+    if (a == b) {
       return false;
+    }
     // The default install path is preferred above all others.
-    if (a == default_path)
+    if (a == default_path) {
       return true;
-    if (b == default_path)
+    }
+    if (b == default_path) {
       return false;
+    }
     // Paths in ~/Applications are preferred to paths not in ~/Applications.
     bool a_in_apps_dir = apps_dir.IsParent(a);
     bool b_in_apps_dir = apps_dir.IsParent(b);
-    if (a_in_apps_dir != b_in_apps_dir)
+    if (a_in_apps_dir != b_in_apps_dir) {
       return a_in_apps_dir > b_in_apps_dir;
+    }
     return a < b;
   };
   std::sort(paths.begin(), paths.end(), compare);
@@ -1604,7 +1585,7 @@
                 ShimLaunchedCallback launched_callback,
                 ShimTerminatedCallback terminated_callback,
                 std::unique_ptr<ShortcutInfo> shortcut_info) {
-  if (AppShimLaunchDisabled() || !shortcut_info) {
+  if (AppShimCreationAndLaunchDisabledForTest() || !shortcut_info) {
     content::GetUIThreadTaskRunner({})->PostTask(
         FROM_HERE,
         base::BindOnce(std::move(launched_callback), base::Process()));
@@ -1707,8 +1688,9 @@
   // `GetChromeAppsFolder()`).
   scoped_refptr<OsIntegrationTestOverride> test_override =
       web_app::GetOsIntegrationTestOverride();
-  if (AppShimCreationDisabledForTest())
+  if (AppShimCreationAndLaunchDisabledForTest()) {
     return true;
+  }
 
   WebAppShortcutCreator shortcut_creator(app_data_path, &shortcut_info);
   return shortcut_creator.CreateShortcuts(creation_reason, creation_locations);
@@ -1750,8 +1732,9 @@
   for (const auto& bundle_info : bundle_infos) {
     WebAppAutoLoginUtil::GetInstance()->RemoveFromLoginItems(
         bundle_info.bundle_path());
-    if (!base::DeletePathRecursively(bundle_info.bundle_path()))
+    if (!base::DeletePathRecursively(bundle_info.bundle_path())) {
       result = false;
+    }
   }
   result_runner->PostTask(FROM_HERE,
                           base::BindOnce(std::move(callback), result));
@@ -1784,20 +1767,16 @@
   // `GetChromeAppsFolder()`).
   scoped_refptr<OsIntegrationTestOverride> test_override =
       web_app::GetOsIntegrationTestOverride();
-  if (AppShimLaunchDisabled())
+  if (AppShimCreationAndLaunchDisabledForTest()) {
     return Result::kOk;
+  }
 
   WebAppShortcutCreator shortcut_creator(app_data_path, &shortcut_info);
   std::vector<base::FilePath> updated_shim_paths;
-  bool create_if_needed = false;
-  // Tests use UpdateAllShortcuts to force shim creation (rather than
-  // relying on asynchronous creation at installation.
-  if (g_app_shims_allow_update_and_launch_in_tests)
-    create_if_needed = true;
-  return (
-      shortcut_creator.UpdateShortcuts(create_if_needed, &updated_shim_paths)
-          ? Result::kOk
-          : Result::kError);
+  return (shortcut_creator.UpdateShortcuts(/*create_if_needed=*/false,
+                                           &updated_shim_paths)
+              ? Result::kOk
+              : Result::kError);
 }
 
 void DeleteAllShortcutsForProfile(const base::FilePath& profile_path) {
@@ -1811,10 +1790,12 @@
   std::list<BundleInfoPlist> bundles_info = BundleInfoPlist::GetAllInPath(
       GetChromeAppsFolder(), true /* recursive */);
   for (const auto& info : bundles_info) {
-    if (!info.IsForCurrentUserDataDir())
+    if (!info.IsForCurrentUserDataDir()) {
       continue;
-    if (!info.IsForProfile(profile_path))
+    }
+    if (!info.IsForProfile(profile_path)) {
       continue;
+    }
     WebAppAutoLoginUtil::GetInstance()->RemoveFromLoginItems(
         info.bundle_path());
     base::DeletePathRecursively(info.bundle_path());
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
index 95213b1..852eb7a 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -206,6 +206,19 @@
   use_conditional_mediation_ = use_conditional_mediation;
 
   PopulateMechanisms(prefer_native_api);
+  if (base::FeatureList::IsEnabled(device::kWebAuthnNewPrioritiesImpl)) {
+    priority_mechanism_index_ = IndexOfPriorityMechanism();
+  } else {
+    priority_mechanism_index_.reset();
+    if (mechanisms_.size() == 1) {
+      priority_mechanism_index_ = 0;
+    } else if (mechanisms_.size() > 1) {
+      const auto it = base::ranges::find_if(mechanisms_, &Mechanism::priority);
+      if (it != mechanisms_.end()) {
+        priority_mechanism_index_ = std::distance(mechanisms_.begin(), it);
+      }
+    }
+  }
 
   if (use_conditional_mediation_) {
     // This is a conditional mediation request.
@@ -242,9 +255,6 @@
 
 void AuthenticatorRequestDialogModel::
     StartGuidedFlowForMostLikelyTransportOrShowMechanismSelection() {
-  const auto priority_mechanism_it =
-      base::ranges::find_if(mechanisms_, &Mechanism::priority);
-
   if (pending_step_) {
     SetCurrentStep(*pending_step_);
     pending_step_.reset();
@@ -255,10 +265,8 @@
     } else {
       SetCurrentStep(Step::kErrorNoAvailableTransports);
     }
-  } else if (mechanisms_.size() == 1) {
-    mechanisms_[0].callback.Run();
-  } else if (priority_mechanism_it != mechanisms_.end()) {
-    priority_mechanism_it->callback.Run();
+  } else if (priority_mechanism_index_) {
+    mechanisms_[*priority_mechanism_index_].callback.Run();
   } else {
     SetCurrentStep(Step::kMechanismSelection);
   }
@@ -578,10 +586,9 @@
                  absl::holds_alternative<Mechanism::AddPhone>(m.type);
         });
     bool windows_was_priority =
-        base::ranges::any_of(mechanisms_, [](const Mechanism& m) -> bool {
-          return m.priority &&
-                 absl::holds_alternative<Mechanism::WindowsAPI>(m.type);
-        });
+        priority_mechanism_index_ &&
+        absl::holds_alternative<Mechanism::WindowsAPI>(
+            mechanisms_[*priority_mechanism_index_].type);
     if (have_other_option && windows_was_priority) {
       have_restarted_due_to_windows_cancel_ = true;
       StartOver();
@@ -1179,7 +1186,7 @@
              device::FidoRequestHandlerBase::RecognizedCredential::
                  kHasRecognizedCredential);
     mechanisms_.emplace_back(
-        Mechanism::WindowsAPI(/*unused*/ true), desc, desc,
+        Mechanism::WindowsAPI(), desc, desc,
         GetTransportIcon(AuthenticatorTransport::kUsbHumanInterfaceDevice),
         base::BindRepeating(&AuthenticatorRequestDialogModel::StartWinNativeApi,
                             base::Unretained(this), mechanisms_.size()),
@@ -1268,6 +1275,124 @@
   DCHECK_LE(base::ranges::count_if(mechanisms_, &Mechanism::priority), 1);
 }
 
+absl::optional<size_t>
+AuthenticatorRequestDialogModel::IndexOfPriorityMechanism() {
+  if (mechanisms_.size() == 1) {
+    return 0;
+  } else if (mechanisms_.empty()) {
+    return absl::nullopt;
+  }
+
+  std::vector<Mechanism::Type> priority_list;
+
+  if (transport_availability_.request_type ==
+      device::FidoRequestType::kGetAssertion) {
+    const bool is_passkey_request =
+        transport_availability_.has_empty_allow_list ||
+        transport_availability_.is_only_hybrid_or_internal;
+    if (!use_conditional_mediation_) {
+      // If there's a match on the platform authenticator, jump to that.
+      if (transport_availability_.has_platform_authenticator_credential ==
+          device::FidoRequestHandlerBase::RecognizedCredential::
+              kHasRecognizedCredential) {
+        priority_list.emplace_back(
+            Mechanism::Transport(AuthenticatorTransport::kInternal));
+      }
+
+      // If it's caBLEv1, or server-linked caBLEv2, jump to that.
+      if (cable_ui_type_) {
+        switch (*cable_ui_type_) {
+          case AuthenticatorRequestDialogModel::CableUIType::
+              CABLE_V2_SERVER_LINK:
+          case AuthenticatorRequestDialogModel::CableUIType::CABLE_V1:
+            priority_list.emplace_back(
+                Mechanism::Transport(AuthenticatorTransport::kHybrid));
+            break;
+          case AuthenticatorRequestDialogModel::CableUIType::
+              CABLE_V2_2ND_FACTOR:
+            break;
+        }
+      }
+
+      // This seems like it might be an error (crbug.com/1426243): kInternal has
+      // priority over caBLE extensions if there's a recognised platform
+      // credential, but Windows doesn't.
+      if (transport_availability_.has_platform_authenticator_credential ==
+          device::FidoRequestHandlerBase::RecognizedCredential::
+              kHasRecognizedCredential) {
+        priority_list.emplace_back(Mechanism::WindowsAPI());
+      }
+
+      // Prefer going straight to Windows native UI for requests that are not
+      // clearly passkeys related,
+      if (!is_passkey_request) {
+        priority_list.emplace_back(Mechanism::WindowsAPI());
+      }
+    }
+
+    if (base::FeatureList::IsEnabled(device::kWebAuthPasskeysUI) &&
+        is_passkey_request && paired_phone_names().empty() &&
+        // On Windows WebAuthn API < 4, we cannot tell in advance if the
+        // platform authenticator can fulfill a get assertion request. In that
+        // case, don't jump to the QR code.
+        (use_conditional_mediation_ ||
+         transport_availability_.has_platform_authenticator_credential ==
+             device::FidoRequestHandlerBase::RecognizedCredential::
+                 kNoRecognizedCredential)) {
+      priority_list.emplace_back(Mechanism::AddPhone());
+    }
+  } else {
+    CHECK_EQ(transport_availability_.request_type,
+             device::FidoRequestType::kMakeCredential);
+    const bool is_passkey_request =
+        resident_key_requirement() !=
+        device::ResidentKeyRequirement::kDiscouraged;
+    if (base::FeatureList::IsEnabled(device::kWebAuthPasskeysUI)) {
+      if (is_passkey_request) {
+        // If attachment=any, then don't jump to suggesting a phone.
+        // TODO(crbug.com/1426628): makeCredential requests should always have
+        // `make_credential_attachment` set. Stop being hesitant.
+        if ((!transport_availability_.make_credential_attachment ||
+             *transport_availability_.make_credential_attachment !=
+                 device::AuthenticatorAttachment::kAny) &&
+            paired_phone_names().empty()) {
+          priority_list.emplace_back(Mechanism::AddPhone());
+        }
+      } else {
+        // This seems like it might be an error (crbug.com/1426244) as we might
+        // still want to jump to platform authenticators for passkey requests if
+        // we don't jump to a phone.
+        if (kShowCreatePlatformPasskeyStep) {
+          priority_list.emplace_back(
+              Mechanism::Transport(AuthenticatorTransport::kInternal));
+        }
+        priority_list.emplace_back(Mechanism::WindowsAPI());
+      }
+    } else {
+      if (kShowCreatePlatformPasskeyStep) {
+        priority_list.emplace_back(
+            Mechanism::Transport(AuthenticatorTransport::kInternal));
+      }
+      if (!is_passkey_request) {
+        priority_list.emplace_back(Mechanism::WindowsAPI());
+      }
+    }
+  }
+
+  for (const auto& priority_mechanism : priority_list) {
+    // A phone should never be triggered immediately.
+    CHECK(!absl::holds_alternative<Mechanism::Phone>(priority_mechanism));
+
+    for (size_t i = 0; i < mechanisms_.size(); i++) {
+      if (priority_mechanism == mechanisms_[i].type) {
+        return i;
+      }
+    }
+  }
+
+  return absl::nullopt;
+}
+
 void AuthenticatorRequestDialogModel::
     HideDialogAndDispatchToPlatformAuthenticator() {
   HideDialog();
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.h b/chrome/browser/webauthn/authenticator_request_dialog_model.h
index 161a7c3..f4992a7 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.h
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.h
@@ -181,11 +181,9 @@
     // These types describe the type of Mechanism.
     using Transport =
         base::StrongAlias<class TransportTag, AuthenticatorTransport>;
-    using WindowsAPI = base::StrongAlias<class WindowsAPITag,
-                                         bool /* unused, but cannot be void */>;
+    using WindowsAPI = base::StrongAlias<class WindowsAPITag, std::monostate>;
     using Phone = base::StrongAlias<class PhoneTag, std::string>;
-    using AddPhone = base::StrongAlias<class AddPhoneTag,
-                                       bool /* unused, but cannot be void */>;
+    using AddPhone = base::StrongAlias<class AddPhoneTag, std::monostate>;
     using Type = absl::variant<Transport, WindowsAPI, Phone, AddPhone>;
 
     Mechanism(Type type,
@@ -696,6 +694,10 @@
   // too much #ifdef soup.
   void PopulateMechanisms(bool prefer_native_api);
 
+  // IndexOfPriorityMechanism returns the index, in |mechanisms_|, of the
+  // Mechanism that should be triggered immediately, if any.
+  absl::optional<size_t> IndexOfPriorityMechanism();
+
   // Identifier for the RenderFrameHost of the frame that initiated the current
   // request.
   content::GlobalRenderFrameHostId frame_host_id_;
@@ -775,6 +777,10 @@
   // sheet and the drop-down menu.
   std::vector<Mechanism> mechanisms_;
 
+  // priority_mechanism_index_ contains an index in `mechanisms_` for the
+  // mechanism that should immediately be triggered, if any.
+  absl::optional<size_t> priority_mechanism_index_;
+
   // current_mechanism_ contains the index of the most recently activated
   // mechanism.
   absl::optional<size_t> current_mechanism_;
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
index 4495fd7..51a02d6 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
@@ -112,6 +112,8 @@
   kPreferNativeAPI,
   kRequireResidentKey,
   kIsConditionalUI,
+  kAttachmentAny,
+  kAttachmentCrossPlatform,
 };
 
 base::StringPiece TransportAvailabilityParamToString(
@@ -141,6 +143,10 @@
       return "kRequireResidentKey";
     case TransportAvailabilityParam::kIsConditionalUI:
       return "kIsConditionalUI";
+    case TransportAvailabilityParam::kAttachmentAny:
+      return "kAttachmentAny";
+    case TransportAvailabilityParam::kAttachmentCrossPlatform:
+      return "kAttachmentCrossPlatform";
   }
 }
 
@@ -198,11 +204,12 @@
       TransportAvailabilityParam::kOnlyHybridOrInternal;
   const auto rk = TransportAvailabilityParam::kRequireResidentKey;
   const auto c_ui = TransportAvailabilityParam::kIsConditionalUI;
+  const auto att_any = TransportAvailabilityParam::kAttachmentAny;
+  const auto att_xplat = TransportAvailabilityParam::kAttachmentCrossPlatform;
   using t = AuthenticatorRequestDialogModel::Mechanism::Transport;
   using p = AuthenticatorRequestDialogModel::Mechanism::Phone;
-  const auto winapi =
-      AuthenticatorRequestDialogModel::Mechanism::WindowsAPI(true);
-  const auto add = AuthenticatorRequestDialogModel::Mechanism::AddPhone(false);
+  const auto winapi = AuthenticatorRequestDialogModel::Mechanism::WindowsAPI();
+  const auto add = AuthenticatorRequestDialogModel::Mechanism::AddPhone();
   const auto usb_ui = Step::kUsbInsertAndActivate;
   const auto mss = Step::kMechanismSelection;
   const auto plat_ui = Step::kNotStarted;
@@ -375,6 +382,24 @@
        {p("a"), add, t(internal), t(usb)},
        mss,
        {qr1st}},
+      // Or if attachment=any
+      {L,
+       mc,
+       {usb, internal, cable},
+       {rk, att_any},
+       {},
+       {add, t(internal), t(usb)},
+       mss,
+       {qr1st}},
+      // But not for any attachment, like platform
+      {L,
+       mc,
+       {usb, internal, cable},
+       {rk, att_xplat},
+       {},
+       {add, t(internal), t(usb)},
+       qr,
+       {qr1st}},
       // If RK=false, go to the default for the platform instead.
       {L,
        mc,
@@ -590,6 +615,24 @@
                        TransportAvailabilityParam::kRequireResidentKey)
             ? device::ResidentKeyRequirement::kRequired
             : device::ResidentKeyRequirement::kDiscouraged;
+    if (base::Contains(test.params,
+                       TransportAvailabilityParam::kAttachmentAny)) {
+      CHECK(transports_info.request_type == RequestType::kMakeCredential);
+      transports_info.make_credential_attachment =
+          device::AuthenticatorAttachment::kAny;
+    }
+    if (base::Contains(test.params,
+                       TransportAvailabilityParam::kAttachmentCrossPlatform)) {
+      CHECK(transports_info.request_type == RequestType::kMakeCredential);
+      CHECK(!transports_info.make_credential_attachment.has_value());
+      transports_info.make_credential_attachment =
+          device::AuthenticatorAttachment::kCrossPlatform;
+    }
+    if (!transports_info.make_credential_attachment.has_value() &&
+        transports_info.request_type == RequestType::kMakeCredential) {
+      transports_info.make_credential_attachment =
+          device::AuthenticatorAttachment::kPlatform;
+    }
 
     AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr);
 
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 30226bd..0a93f56 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1679399815-5fb5cbb65423c40563246609d611d87085b936e1.profdata
+chrome-linux-main-1679421077-5363a88cd05a0194b3e1b1e95262a4fb1f73cb36.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 3b46166..292aa405 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1679407195-accca33b5da69b0f48e6e606d6e2fd5fba3c15a0.profdata
+chrome-mac-arm-main-1679435943-b90a46912d369b54faae84285ce0d43ef413e56d.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 04990b6..e565d75b 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1679399815-9fb13a718906a44ae1a1912bcd17a737089d24ee.profdata
+chrome-mac-main-1679421077-b590fdfad996c92a9c6d3ae297fe76540dc9849b.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 423d376..d5cdbb3 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1679388663-030ca37ba144888231bc7101b9a86a82366727a6.profdata
+chrome-win32-main-1679432328-cafddd5842fa502a69487c8389d75e9d25494285.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 98bfc31..cf205a6b 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1679399815-496178a8ea2546f8b884d8c71e105121f13eb2f5.profdata
+chrome-win64-main-1679432328-1286ac535404033ba282474a3b1da4adb82e5e8f.profdata
diff --git a/chrome/common/chrome_paths.cc b/chrome/common/chrome_paths.cc
index 8f7c1e2..b6a56e6 100644
--- a/chrome/common/chrome_paths.cc
+++ b/chrome/common/chrome_paths.cc
@@ -8,7 +8,6 @@
 #include "base/logging.h"
 #include "base/native_library.h"
 #include "base/no_destructor.h"
-#include "base/notreached.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "base/system/sys_info.h"
@@ -155,7 +154,6 @@
   switch (key) {
     case chrome::DIR_USER_DATA:
       if (!GetDefaultUserDataDirectory(&cur)) {
-        NOTREACHED();
         return false;
       }
       create_dir = true;
@@ -231,7 +229,6 @@
       break;
     case chrome::DIR_ROAMING_USER_DATA:
       if (!GetDefaultRoamingUserDataDirectory(&cur)) {
-        NOTREACHED();
         return false;
       }
       create_dir = true;
diff --git a/chrome/common/importer/ie_importer_utils_win.cc b/chrome/common/importer/ie_importer_utils_win.cc
index afd79ff..fce8abb6 100644
--- a/chrome/common/importer/ie_importer_utils_win.cc
+++ b/chrome/common/importer/ie_importer_utils_win.cc
@@ -12,9 +12,6 @@
     L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\"
     L"Favorites";
 
-const wchar_t kIEStorage2Key[] =
-    L"Software\\Microsoft\\Internet Explorer\\IntelliForms\\Storage2";
-
 const wchar_t kIESettingsMainKey[] =
     L"Software\\Microsoft\\Internet Explorer\\Main";
 
@@ -34,11 +31,6 @@
   return GetPotentiallyOverridenIEKey(kIEFavoritesOrderKey);
 }
 
-std::wstring GetIE7PasswordsKey() {
-  // Return kIEStorage2Key unless an override has been set for tests.
-  return GetPotentiallyOverridenIEKey(kIEStorage2Key);
-}
-
 std::wstring GetIESettingsKey() {
   // Return kIESettingsMainKey unless an override has been set for tests.
   return GetPotentiallyOverridenIEKey(kIESettingsMainKey);
diff --git a/chrome/common/importer/ie_importer_utils_win.h b/chrome/common/importer/ie_importer_utils_win.h
index 1686a12..99d1267 100644
--- a/chrome/common/importer/ie_importer_utils_win.h
+++ b/chrome/common/importer/ie_importer_utils_win.h
@@ -13,10 +13,6 @@
 // Overridable by tests via ImporterTestRegistryOverrider.
 std::wstring GetIEFavoritesOrderKey();
 
-// Returns the key to be used in HKCU to look for IE7 passwords.
-// Overridable by tests via ImporterTestRegistryOverrider.
-std::wstring GetIE7PasswordsKey();
-
 // Returns the key to be used in HKCU to look for IE settings.
 // Overridable by tests via ImporterTestRegistryOverrider.
 std::wstring GetIESettingsKey();
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 0f636b2..3ff57c503 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -840,8 +840,6 @@
     "approaching_eol_incentive_dismissed";
 const char kEolPassedFinalIncentiveDismissed[] =
     "passed_eol_incentive_dismissed";
-const char kEolIncentiveNotificationSilenced[] =
-    "eol_incentive_dont_show_notification";
 
 // A boolean pref that controls whether the PIN autosubmit feature is enabled.
 // This feature, when enabled, exposes the user's PIN length by showing how many
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index cdf9c577..6aa5392 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -296,7 +296,6 @@
 extern const char kSecondEolWarningDismissed[];
 extern const char kEolApproachingIncentiveNotificationDismissed[];
 extern const char kEolPassedFinalIncentiveDismissed[];
-extern const char kEolIncentiveNotificationSilenced[];
 extern const char kPinUnlockFeatureNotificationShown[];
 extern const char kFingerprintUnlockFeatureNotificationShown[];
 extern const char kPinUnlockAutosubmitEnabled[];
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc
index de24377..3cf8a4a 100644
--- a/chrome/common/url_constants.cc
+++ b/chrome/common/url_constants.cc
@@ -393,6 +393,12 @@
 
 const char kEolNotificationURL[] = "https://www.google.com/chromebook/older/";
 
+const char kEolIncentiveNotificationOfferURL[] =
+    "https://www.google.com/chromebook/renew-chromebook-offer";
+
+const char kEolIncentiveNotificationNoOfferURL[] =
+    "https://www.google.com/chromebook/renew-chromebook";
+
 const char kAutoUpdatePolicyURL[] =
     "https://support.google.com/chrome/a?p=auto-update-policy";
 
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h
index edd7347..c3ab345 100644
--- a/chrome/common/url_constants.h
+++ b/chrome/common/url_constants.h
@@ -358,6 +358,12 @@
 // The URL for EOL notification
 extern const char kEolNotificationURL[];
 
+// The URL for the EOL incentive with offer.
+extern const char kEolIncentiveNotificationOfferURL[];
+
+// The URL for the EOL incentive with no offer.
+extern const char kEolIncentiveNotificationNoOfferURL[];
+
 // The URL for Auto Update Policy.
 extern const char kAutoUpdatePolicyURL[];
 
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.cc b/chrome/renderer/accessibility/read_anything_app_controller.cc
index 5fa38b6..75e0460 100644
--- a/chrome/renderer/accessibility/read_anything_app_controller.cc
+++ b/chrome/renderer/accessibility/read_anything_app_controller.cc
@@ -329,20 +329,17 @@
   // Delete all pending updates on the formerly active AXTree.
   // TODO(crbug.com/1266555): If distillation is in progress, cancel the
   // distillation request.
-#if DCHECK_IS_ON()
-  DCHECK(model_.pending_updates().empty() ||
-         model_.pending_updates_bundle_id() == previous_active_tree_id);
-#endif
   model_.ClearPendingUpdates();
-#if DCHECK_IS_ON()
-  model_.SetPendingUpdatesBundleId(ui::AXTreeIDUnknown());
-#endif
 
   // When the UI first constructs, this function may be called before tree_id
   // has been added to the tree list in AccessibilityEventReceived. In that
   // case, do not distill.
   if (model_.active_tree_id() != ui::AXTreeIDUnknown() &&
       model_.ContainsTree(model_.active_tree_id())) {
+    // TODO(b/1266555): Use v8::Function rather than javascript. If possible,
+    // replace this function call with firing an event.
+    std::string script = "chrome.readAnything.showLoading();";
+    render_frame_->ExecuteJavaScript(base::ASCIIToUTF16(script));
     Distill();
   }
 }
@@ -409,10 +406,6 @@
   ui::AXTreeSerializer<const ui::AXNode*> serializer(tree_source.get());
   ui::AXTreeUpdate snapshot;
   CHECK(serializer.SerializeChanges(tree->root(), &snapshot));
-  // TODO(b/1266555): Use v8::Function rather than javascript. If possible,
-  // replace this function call with firing an event.
-  std::string script = "chrome.readAnything.showLoading();";
-  render_frame_->ExecuteJavaScript(base::ASCIIToUTF16(script));
   model_.SetDistillationInProgress(true);
   distiller_->Distill(*tree, snapshot, model_.active_ukm_source_id());
 }
@@ -437,7 +430,6 @@
       !model_.ContainsTree(tree_id) || tree_id == ui::AXTreeIDUnknown()) {
     return;
   }
-  model_.ResetSelection();
   if (!model_.content_node_ids().empty()) {
     // If there are content_node_ids, this means the AXTree was successfully
     // distilled. Post-process in preparation to display the distilled content.
@@ -454,10 +446,7 @@
   Draw();
   // Once drawing is complete, unserialize all of the pending updates on the
   // active tree and send out a new distillation request.
-  model_.UnserializePendingUpdates();
-#if DCHECK_IS_ON()
-  model_.SetPendingUpdatesBundleId(ui::AXTreeIDUnknown());
-#endif
+  model_.UnserializePendingUpdates(tree_id);
 }
 
 void ReadAnythingAppController::Draw() {
@@ -552,7 +541,7 @@
         break;
       }
       ancestors.pop();
-      if (!IsNodeIgnoredForReadAnything(ancestor_id)) {
+      if (!model_.IsNodeIgnoredForReadAnything(ancestor_id)) {
         model_.InsertDisplayNode(ancestor_id);
       }
     }
@@ -566,7 +555,7 @@
     }
     while (next_node != deepest_last_child) {
       next_node = next_node->GetNextUnignoredInTreeOrder();
-      if (!IsNodeIgnoredForReadAnything(next_node->id())) {
+      if (!model_.IsNodeIgnoredForReadAnything(next_node->id())) {
         model_.InsertDisplayNode(next_node->id());
       }
     }
@@ -699,7 +688,7 @@
     ui::AXNodeID ax_node_id) const {
   ui::AXNode* ax_node = model_.GetAXNode(ax_node_id);
   DCHECK(ax_node);
-  if (NodeIsContentNode(ax_node_id)) {
+  if (model_.NodeIsContentNode(ax_node_id)) {
     return ax_node->GetLanguage();
   }
   return ax_node->GetStringAttribute(ax::mojom::StringAttribute::kLanguage);
@@ -758,15 +747,6 @@
   return ax_node->HasTextStyle(ax::mojom::TextStyle::kOverline);
 }
 
-bool ReadAnythingAppController::IsNodeIgnoredForReadAnything(
-    ui::AXNodeID ax_node_id) const {
-  ui::AXNode* ax_node = model_.GetAXNode(ax_node_id);
-  DCHECK(ax_node);
-  // Ignore interactive elements.
-  ax::mojom::Role role = ax_node->GetRole();
-  return ui::IsControl(role) || ui::IsSelect(role);
-}
-
 void ReadAnythingAppController::OnConnected() {
   mojo::PendingReceiver<read_anything::mojom::PageHandlerFactory>
       page_handler_factory_receiver =
@@ -803,6 +783,11 @@
     return;
   }
 
+  // Ignore the selection if it's collapsed, which is created by a simple click.
+  if ((anchor_offset == focus_offset) && (anchor_node_id == focus_node_id)) {
+    return;
+  }
+
   // If the selection change matches the tree's selection, this means it was
   // set by the controller. Javascript selections set by the controller are
   // always forward selections. This means the anchor node always comes before
@@ -857,8 +842,3 @@
   page_handler_.reset();
   page_handler_.Bind(std::move(page_handler));
 }
-
-bool ReadAnythingAppController::NodeIsContentNode(
-    ui::AXNodeID ax_node_id) const {
-  return base::Contains(model_.content_node_ids(), ax_node_id);
-}
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.h b/chrome/renderer/accessibility/read_anything_app_controller.h
index d98d9e0..4f9d5cd 100644
--- a/chrome/renderer/accessibility/read_anything_app_controller.h
+++ b/chrome/renderer/accessibility/read_anything_app_controller.h
@@ -179,10 +179,6 @@
   void SetPageHandlerForTesting(
       mojo::PendingRemote<read_anything::mojom::PageHandler> page_handler);
 
-  // TODO(b/1266555): Move these two to ReadAnythingAppModel.
-  bool IsNodeIgnoredForReadAnything(ui::AXNodeID ax_node_id) const;
-  bool NodeIsContentNode(ui::AXNodeID ax_node_id) const;
-
   content::RenderFrame* render_frame_;
   std::unique_ptr<AXTreeDistiller> distiller_;
   mojo::Remote<read_anything::mojom::PageHandlerFactory> page_handler_factory_;
diff --git a/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc b/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc
index 272e1b5..253bf33 100644
--- a/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc
+++ b/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc
@@ -166,6 +166,8 @@
 
   int EndOffset() { return controller_->EndOffset(); }
 
+  bool HasSelection() { return controller_->model_.has_selection(); }
+
   bool DisplayNodeIdsContains(ui::AXNodeID ax_node_id) {
     return base::Contains(controller_->model_.display_node_ids(), ax_node_id);
   }
@@ -219,10 +221,10 @@
   }
 
   bool IsNodeIgnoredForReadAnything(ui::AXNodeID ax_node_id) {
-    return controller_->IsNodeIgnoredForReadAnything(ax_node_id);
+    return controller_->model_.IsNodeIgnoredForReadAnything(ax_node_id);
   }
 
-  size_t GetNumTrees() { return controller_->model_.NumTreesForTesting(); }
+  size_t GetNumTrees() { return controller_->model_.trees_.size(); }
 
   bool HasTree(ui::AXTreeID tree_id) {
     return controller_->model_.ContainsTree(tree_id);
@@ -237,8 +239,17 @@
     controller_->model_.AddTree(tree_id, std::move(tree));
   }
 
-  size_t GetNumPendingUpdates() {
-    return controller_->model_.pending_updates().size();
+  bool AreAllPendingUpdatesEmpty() {
+    size_t count = 0;
+    for (auto const& [tree_id, updates] :
+         controller_->model_.pending_updates_map_) {
+      count += updates.size();
+    }
+    return count == 0;
+  }
+
+  size_t GetNumPendingUpdates(ui::AXTreeID tree_id) {
+    return controller_->model_.pending_updates_map_[tree_id].size();
   }
 
   ui::AXTreeID tree_id_;
@@ -805,6 +816,65 @@
   ASSERT_EQ(0u, GetNumTrees());
 }
 
+TEST_F(ReadAnythingAppControllerTest, OnAXTreeDestroyed_ClearsPendingUpdates) {
+  // Set the name of each node to be its id.
+  ui::AXTreeUpdate initial_update;
+  SetUpdateTreeID(&initial_update);
+  initial_update.root_id = 1;
+  initial_update.nodes.resize(3);
+  std::vector<int> child_ids;
+  for (int i = 0; i < 3; i++) {
+    int id = i + 2;
+    child_ids.push_back(id);
+    initial_update.nodes[i].id = id;
+    initial_update.nodes[i].role = ax::mojom::Role::kStaticText;
+    initial_update.nodes[i].SetName(base::NumberToString(id));
+    initial_update.nodes[i].SetNameFrom(ax::mojom::NameFrom::kContents);
+  }
+  // Since this update is just cosmetic (it changes the nodes' name but doesn't
+  // change the structure of the tree by adding or removing nodes), the
+  // controller does not distill.
+  EXPECT_CALL(*distiller_, Distill).Times(0);
+  AccessibilityEventReceived({initial_update});
+  EXPECT_EQ("234", GetTextContent(1));
+
+  std::vector<ui::AXTreeUpdate> updates;
+  for (int i = 0; i < 3; i++) {
+    int id = i + 5;
+    child_ids.push_back(id);
+
+    ui::AXTreeUpdate update;
+    SetUpdateTreeID(&update);
+    update.root_id = 1;
+    update.nodes.resize(2);
+    update.nodes[0].id = 1;
+    update.nodes[0].child_ids = child_ids;
+    update.nodes[1].id = id;
+    update.nodes[1].role = ax::mojom::Role::kStaticText;
+    update.nodes[1].SetName(base::NumberToString(id));
+    update.nodes[1].SetNameFrom(ax::mojom::NameFrom::kContents);
+    updates.push_back(update);
+  }
+
+  // Send update 0, which starts distillation.
+  EXPECT_CALL(*distiller_, Distill).Times(1);
+  AccessibilityEventReceived({updates[0]});
+  EXPECT_EQ("2345", GetTextContent(1));
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
+  ASSERT_TRUE(AreAllPendingUpdatesEmpty());
+
+  // Send update 1. Since distillation is in progress, this will not be
+  // unserialized yet.
+  EXPECT_CALL(*distiller_, Distill).Times(0);
+  AccessibilityEventReceived({updates[1]});
+  EXPECT_EQ("2345", GetTextContent(1));
+  EXPECT_EQ(1u, GetNumPendingUpdates(tree_id_));
+
+  // Destroy the tree.
+  OnAXTreeDestroyed(tree_id_);
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
+}
+
 TEST_F(ReadAnythingAppControllerTest,
        DistillationInProgress_TreeUpdateReceivedOnActiveTree) {
   // Set the name of each node to be its id.
@@ -850,32 +920,97 @@
   EXPECT_CALL(*distiller_, Distill).Times(1);
   AccessibilityEventReceived({updates[0]});
   EXPECT_EQ("2345", GetTextContent(1));
-  EXPECT_EQ(0u, GetNumPendingUpdates());
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
+  ASSERT_TRUE(AreAllPendingUpdatesEmpty());
 
   // Send update 1. Since distillation is in progress, this will not be
   // unserialized yet.
   EXPECT_CALL(*distiller_, Distill).Times(0);
   AccessibilityEventReceived({updates[1]});
   EXPECT_EQ("2345", GetTextContent(1));
-  EXPECT_EQ(1u, GetNumPendingUpdates());
+  EXPECT_EQ(1u, GetNumPendingUpdates(tree_id_));
 
   // Send update 2. This is still not unserialized yet.
   EXPECT_CALL(*distiller_, Distill).Times(0);
   AccessibilityEventReceived({updates[2]});
   EXPECT_EQ("2345", GetTextContent(1));
-  EXPECT_EQ(2u, GetNumPendingUpdates());
+  EXPECT_EQ(2u, GetNumPendingUpdates(tree_id_));
 
   // Complete distillation which unserializes the pending updates and distills
   // them.
   EXPECT_CALL(*distiller_, Distill).Times(2);
   OnAXTreeDistilled({1});
   EXPECT_EQ("234567", GetTextContent(1));
-  EXPECT_EQ(0u, GetNumPendingUpdates());
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
+  ASSERT_TRUE(AreAllPendingUpdatesEmpty());
+}
+
+TEST_F(ReadAnythingAppControllerTest,
+       AddPendingUpdatesAfterUnserializingOnSameTree_DoesNotCrash) {
+  // Set the name of each node to be its id.
+  ui::AXTreeUpdate initial_update;
+  SetUpdateTreeID(&initial_update);
+  initial_update.root_id = 1;
+  initial_update.nodes.resize(3);
+  std::vector<int> child_ids;
+  for (int i = 0; i < 3; i++) {
+    int id = i + 2;
+    child_ids.push_back(id);
+    initial_update.nodes[i].id = id;
+    initial_update.nodes[i].role = ax::mojom::Role::kStaticText;
+    initial_update.nodes[i].SetName(base::NumberToString(id));
+    initial_update.nodes[i].SetNameFrom(ax::mojom::NameFrom::kContents);
+  }
+  // Since this update is just cosmetic (it changes the nodes' name but doesn't
+  // change the structure of the tree by adding or removing nodes), the
+  // controller does not distill.
+  EXPECT_CALL(*distiller_, Distill).Times(0);
+  AccessibilityEventReceived({initial_update});
+  EXPECT_EQ("234", GetTextContent(1));
+
+  std::vector<ui::AXTreeUpdate> updates;
+  for (int i = 0; i < 3; i++) {
+    int id = i + 5;
+    child_ids.push_back(id);
+
+    ui::AXTreeUpdate update;
+    SetUpdateTreeID(&update);
+    update.root_id = 1;
+    update.nodes.resize(2);
+    update.nodes[0].id = 1;
+    update.nodes[0].child_ids = child_ids;
+    update.nodes[1].id = id;
+    update.nodes[1].role = ax::mojom::Role::kStaticText;
+    update.nodes[1].SetName(base::NumberToString(id));
+    update.nodes[1].SetNameFrom(ax::mojom::NameFrom::kContents);
+    updates.push_back(update);
+  }
+
+  // Send update 0, which starts distillation.
+  EXPECT_CALL(*distiller_, Distill).Times(1);
+  AccessibilityEventReceived({updates[0]});
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
+  ASSERT_TRUE(AreAllPendingUpdatesEmpty());
+
+  // Send update 1. Since distillation is in progress, this will not be
+  // unserialized yet.
+  EXPECT_CALL(*distiller_, Distill).Times(0);
+  AccessibilityEventReceived({updates[1]});
+  EXPECT_EQ(1u, GetNumPendingUpdates(tree_id_));
+
+  // Ensure that there are no crashes after an accessibility event is received
+  // immediately after distilling.
+  EXPECT_CALL(*distiller_, Distill).Times(1);
+  OnAXTreeDistilled({1});
+  SetDistillationInProgress(true);
+  AccessibilityEventReceived({updates[2]});
+  EXPECT_EQ(1u, GetNumPendingUpdates(tree_id_));
+  ASSERT_FALSE(AreAllPendingUpdatesEmpty());
 }
 
 TEST_F(ReadAnythingAppControllerTest,
        DistillationInProgress_TreeUpdateReceivedOnInactiveTree) {
-  EXPECT_EQ(0u, GetNumPendingUpdates());
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
 
   // Create a new tree.
   ui::AXTreeID tree_id_2 = ui::AXTreeID::CreateNewAXTreeID();
@@ -888,12 +1023,12 @@
   // Updates on inactive trees are processed immediately and are not marked as
   // pending.
   AccessibilityEventReceived({update_2});
-  EXPECT_EQ(0u, GetNumPendingUpdates());
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
 }
 
 TEST_F(ReadAnythingAppControllerTest,
        DistillationInProgress_ActiveTreeIDChanges) {
-  EXPECT_EQ(0u, GetNumPendingUpdates());
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
 
   // Create a couple of updates which add additional nodes to the tree.
   std::vector<ui::AXTreeUpdate> updates;
@@ -917,20 +1052,20 @@
 
   EXPECT_CALL(*distiller_, Distill).Times(1);
   AccessibilityEventReceived({updates[0]});
-  EXPECT_EQ(0u, GetNumPendingUpdates());
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
   EXPECT_CALL(*distiller_, Distill).Times(0);
   AccessibilityEventReceived({updates[1]});
-  EXPECT_EQ(1u, GetNumPendingUpdates());
+  EXPECT_EQ(1u, GetNumPendingUpdates(tree_id_));
   EXPECT_CALL(*distiller_, Distill).Times(0);
   AccessibilityEventReceived({updates[2]});
-  EXPECT_EQ(2u, GetNumPendingUpdates());
+  EXPECT_EQ(2u, GetNumPendingUpdates(tree_id_));
   EXPECT_EQ("5", GetTextContent(1));
 
   // Switching the active AXTreeID deletes the pending updates.
   ui::AXTreeID tree_id_2 = ui::AXTreeID::CreateNewAXTreeID();
   EXPECT_CALL(*distiller_, Distill).Times(0);
   OnActiveAXTreeIDChanged(tree_id_2);
-  EXPECT_EQ(0u, GetNumPendingUpdates());
+  ASSERT_TRUE(AreAllPendingUpdatesEmpty());
 }
 
 TEST_F(ReadAnythingAppControllerTest,
@@ -962,7 +1097,8 @@
 
 TEST_F(ReadAnythingAppControllerTest,
        ChangeActiveTreeWithPendingUpdates_UnknownID) {
-  EXPECT_EQ(0u, GetNumPendingUpdates());
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
+  ASSERT_TRUE(AreAllPendingUpdatesEmpty());
 
   // Create a couple of updates which add additional nodes to the tree.
   std::vector<ui::AXTreeUpdate> updates;
@@ -994,9 +1130,10 @@
   // Add the three updates.
   EXPECT_CALL(*distiller_, Distill).Times(1);
   AccessibilityEventReceived({updates[0]});
-  EXPECT_EQ(0u, GetNumPendingUpdates());
+  EXPECT_EQ(0u, GetNumPendingUpdates(tree_id_));
+  ASSERT_TRUE(AreAllPendingUpdatesEmpty());
   AccessibilityEventReceived(tree_id_, {updates[1], updates[2]});
-  EXPECT_EQ(2u, GetNumPendingUpdates());
+  EXPECT_EQ(2u, GetNumPendingUpdates(tree_id_));
 
   // Switch to a new active tree. Should not crash.
   EXPECT_CALL(*distiller_, Distill).Times(0);
@@ -1037,6 +1174,19 @@
                                 focus_node_id, focus_offset))
       .Times(1);
   OnSelectionChange(anchor_node_id, anchor_offset, focus_node_id, focus_offset);
+}
+
+TEST_F(ReadAnythingAppControllerTest,
+       OnSelectionChange_ClickDoesNotUpdateSelection) {
+  ui::AXNodeID anchor_node_id = 2;
+  int anchor_offset = 15;
+  ui::AXNodeID focus_node_id = 2;
+  int focus_offset = 15;
+  EXPECT_CALL(page_handler_,
+              OnSelectionChange(tree_id_, anchor_node_id, anchor_offset,
+                                focus_node_id, focus_offset))
+      .Times(0);
+  OnSelectionChange(anchor_node_id, anchor_offset, focus_node_id, focus_offset);
   page_handler_.FlushForTesting();
 }
 
@@ -1123,3 +1273,19 @@
   EXPECT_EQ(0, StartOffset());
   EXPECT_EQ(5, EndOffset());  // The length of the word 'Hello'.
 }
+
+TEST_F(ReadAnythingAppControllerTest, Selection_IsCollapsed) {
+  ui::AXTreeUpdate update;
+  SetUpdateTreeID(&update);
+  update.tree_data.sel_anchor_object_id = 2;
+  update.tree_data.sel_focus_object_id = 2;
+  update.tree_data.sel_anchor_offset = 3;
+  update.tree_data.sel_focus_offset = 3;
+  AccessibilityEventReceived({update});
+  OnAXTreeDistilled({});
+  EXPECT_EQ(ui::kInvalidAXNodeID, StartNodeId());
+  EXPECT_EQ(ui::kInvalidAXNodeID, EndNodeId());
+  EXPECT_EQ(-1, StartOffset());
+  EXPECT_EQ(-1, EndOffset());
+  EXPECT_EQ(false, HasSelection());
+}
diff --git a/chrome/renderer/accessibility/read_anything_app_model.cc b/chrome/renderer/accessibility/read_anything_app_model.cc
index a9d7078..07824070 100644
--- a/chrome/renderer/accessibility/read_anything_app_model.cc
+++ b/chrome/renderer/accessibility/read_anything_app_model.cc
@@ -5,7 +5,8 @@
 #include "chrome/renderer/accessibility/read_anything_app_model.h"
 
 #include "base/containers/contains.h"
-
+#include "ui/accessibility/ax_node.h"
+#include "ui/accessibility/ax_role_properties.h"
 #include "ui/accessibility/ax_serializable_tree.h"
 #include "ui/accessibility/ax_tree_update_util.h"
 
@@ -30,19 +31,25 @@
     const std::vector<ui::AXNodeID>& content_node_ids) {
   content_node_ids_ = content_node_ids;
   display_node_ids_.clear();
-  start_node_id_ = ui::kInvalidAXNodeID;
-  end_node_id_ = ui::kInvalidAXNodeID;
-  start_offset_ = -1;
-  end_offset_ = -1;
-  has_selection_ = false;
   distillation_in_progress_ = false;
-}
 
-void ReadAnythingAppModel::ResetSelection() {
+  if (active_tree_id_ == ui::AXTreeIDUnknown() ||
+      !ContainsTree(active_tree_id_)) {
+    return;
+  }
+
   ui::AXSelection selection =
       GetTreeFromId(active_tree_id_)->GetUnignoredSelection();
   has_selection_ = selection.anchor_object_id != ui::kInvalidAXNodeID &&
-                   selection.focus_object_id != ui::kInvalidAXNodeID;
+                   selection.focus_object_id != ui::kInvalidAXNodeID &&
+                   !selection.IsCollapsed();
+  if (!has_selection_) {
+    start_node_id_ = ui::kInvalidAXNodeID;
+    end_node_id_ = ui::kInvalidAXNodeID;
+    start_offset_ = -1;
+    end_offset_ = -1;
+    return;
+  }
 
   // Identify the start and end node ids and offsets. The start node comes
   // earlier than end node in the tree order.
@@ -87,33 +94,39 @@
 
 void ReadAnythingAppModel::EraseTree(ui::AXTreeID tree_id) {
   trees_.erase(tree_id);
-}
 
-size_t ReadAnythingAppModel::NumTreesForTesting() const {
-  return trees_.size();
+  // Ensure any pending updates associated with the erased tree are removed.
+  pending_updates_map_.erase(tree_id);
 }
 
 void ReadAnythingAppModel::AddPendingUpdates(
+    const ui::AXTreeID tree_id,
     const std::vector<ui::AXTreeUpdate>& updates) {
-  pending_updates_.insert(pending_updates_.end(),
-                          std::make_move_iterator(updates.begin()),
-                          std::make_move_iterator(updates.end()));
+  std::vector<ui::AXTreeUpdate> update = GetOrCreatePendingUpdateAt(tree_id);
+  update.insert(update.end(), std::make_move_iterator(updates.begin()),
+                std::make_move_iterator(updates.end()));
+  pending_updates_map_[tree_id] = update;
 }
 
 void ReadAnythingAppModel::ClearPendingUpdates() {
-  pending_updates_.clear();
+  pending_updates_map_.clear();
 }
 
-void ReadAnythingAppModel::UnserializePendingUpdates() {
-#if DCHECK_IS_ON()
-  DCHECK(pending_updates_.empty() ||
-         pending_updates_bundle_id_ == active_tree_id_);
-#endif
-  UnserializeUpdates(std::move(pending_updates_), active_tree_id_);
+void ReadAnythingAppModel::UnserializePendingUpdates(ui::AXTreeID tree_id) {
+  if (!pending_updates_map_.contains(tree_id)) {
+    return;
+  }
+  // TODO(b/1266555): Ensure there are no crashes / unexpected behavior if
+  //  an accessibility event is received on the same tree after unserialization
+  //  has begun.
+  std::vector<ui::AXTreeUpdate> update =
+      pending_updates_map_.extract(tree_id).mapped();
+  DCHECK(update.empty() || tree_id == active_tree_id_);
+  UnserializeUpdates(update, tree_id);
 }
 
 void ReadAnythingAppModel::UnserializeUpdates(
-    std::vector<ui::AXTreeUpdate> updates,
+    const std::vector<ui::AXTreeUpdate>& updates,
     const ui::AXTreeID& tree_id) {
   if (updates.empty()) {
     return;
@@ -157,16 +170,12 @@
   // complete.
   if (tree_id == active_tree_id_) {
     if (distillation_in_progress_) {
-#if DCHECK_IS_ON()
-      DCHECK(pending_updates_.empty() || tree_id == pending_updates_bundle_id_);
-      SetPendingUpdatesBundleId(tree_id);
-#endif
-      AddPendingUpdates(updates);
+      AddPendingUpdates(tree_id, updates);
       return;
     } else {
       // We need to unserialize old updates before we can unserialize the new
       // ones
-      UnserializePendingUpdates();
+      UnserializePendingUpdates(tree_id);
     }
   }
   UnserializeUpdates(std::move(updates), tree_id);
@@ -177,6 +186,28 @@
   return tree->GetFromId(ax_node_id);
 }
 
+bool ReadAnythingAppModel::IsNodeIgnoredForReadAnything(
+    ui::AXNodeID ax_node_id) const {
+  ui::AXNode* ax_node = GetAXNode(ax_node_id);
+  DCHECK(ax_node);
+  // Ignore interactive elements.
+  ax::mojom::Role role = ax_node->GetRole();
+  return ui::IsControl(role) || ui::IsSelect(role);
+}
+
+bool ReadAnythingAppModel::NodeIsContentNode(ui::AXNodeID ax_node_id) const {
+  return base::Contains(content_node_ids_, ax_node_id);
+}
+
+const std::vector<ui::AXTreeUpdate>&
+ReadAnythingAppModel::GetOrCreatePendingUpdateAt(ui::AXTreeID tree_id) {
+  if (!pending_updates_map_.contains(tree_id)) {
+    pending_updates_map_[tree_id] = std::vector<ui::AXTreeUpdate>();
+  }
+
+  return pending_updates_map_[tree_id];
+}
+
 double ReadAnythingAppModel::GetLetterSpacingValue(
     read_anything::mojom::LetterSpacing letter_spacing) const {
   switch (letter_spacing) {
diff --git a/chrome/renderer/accessibility/read_anything_app_model.h b/chrome/renderer/accessibility/read_anything_app_model.h
index d937c3f..ab71d705 100644
--- a/chrome/renderer/accessibility/read_anything_app_model.h
+++ b/chrome/renderer/accessibility/read_anything_app_model.h
@@ -47,19 +47,6 @@
   }
   const ui::AXTreeID& active_tree_id() const { return active_tree_id_; }
 
-  const std::vector<ui::AXTreeUpdate>& pending_updates() const {
-    return pending_updates_;
-  }
-
-#if DCHECK_IS_ON()
-  const ui::AXTreeID& pending_updates_bundle_id() const {
-    return pending_updates_bundle_id_;
-  }
-  void SetPendingUpdatesBundleId(ui::AXTreeID id) {
-    pending_updates_bundle_id_ = id;
-  }
-#endif
-
   void SetDistillationInProgress(bool distillation) {
     distillation_in_progress_ = distillation;
   }
@@ -79,9 +66,10 @@
   }
 
   ui::AXNode* GetAXNode(ui::AXNodeID ax_node_id) const;
+  bool IsNodeIgnoredForReadAnything(ui::AXNodeID ax_node_id) const;
+  bool NodeIsContentNode(ui::AXNodeID ax_node_id) const;
   void OnThemeChanged(read_anything::mojom::ReadAnythingThemePtr new_theme);
 
-  void ResetSelection();
   void InsertDisplayNode(ui::AXNodeID node);
   void Reset(const std::vector<ui::AXNodeID>& content_node_ids);
 
@@ -94,7 +82,7 @@
 
   void EraseTree(ui::AXTreeID tree_id);
 
-  void UnserializePendingUpdates();
+  void UnserializePendingUpdates(ui::AXTreeID tree_id);
 
   void ClearPendingUpdates();
 
@@ -108,12 +96,14 @@
       read_anything::mojom::LetterSpacing letter_spacing) const;
   double GetLineSpacingValue(
       read_anything::mojom::LineSpacing line_spacing) const;
-  void AddPendingUpdates(const std::vector<ui::AXTreeUpdate>& updates);
+  void AddPendingUpdates(const ui::AXTreeID tree_id,
+                         const std::vector<ui::AXTreeUpdate>& updates);
 
-  void UnserializeUpdates(std::vector<ui::AXTreeUpdate> updates,
+  void UnserializeUpdates(const std::vector<ui::AXTreeUpdate>& updates,
                           const ui::AXTreeID& tree_id);
 
-  size_t NumTreesForTesting() const;
+  const std::vector<ui::AXTreeUpdate>& GetOrCreatePendingUpdateAt(
+      ui::AXTreeID tree_id);
 
   // State.
   // AXTrees of web contents in the browser’s tab strip.
@@ -131,14 +121,9 @@
   // new distillation requests during that time.
   bool distillation_in_progress_ = false;
 
-  // A queue of pending updates on the active AXTree, which will be
-  // unserialized once distillation completes.
-  std::vector<ui::AXTreeUpdate> pending_updates_;
-
-#if DCHECK_IS_ON()
-  // The bundle ID for the pending updates.
-  ui::AXTreeID pending_updates_bundle_id_ = ui::AXTreeIDUnknown();
-#endif
+  // A mapping of a tree ID to a queue of pending updates on the active AXTree,
+  // which will be unserialized once distillation completes.
+  std::map<ui::AXTreeID, std::vector<ui::AXTreeUpdate>> pending_updates_map_;
 
   // The node IDs identified as main by the distiller. These are static text
   // nodes when generated by Screen2x. When generated by the rules-based
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 5ea4f9e9..a048723 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -487,6 +487,8 @@
       "../browser/badging/test_badge_manager_delegate.h",
       "../browser/banners/test_app_banner_manager_desktop.cc",
       "../browser/banners/test_app_banner_manager_desktop.h",
+      "../browser/download/download_browsertest_utils.cc",
+      "../browser/download/download_browsertest_utils.h",
       "../browser/performance_manager/test_support/fake_frame_throttling_delegate.cc",
       "../browser/performance_manager/test_support/fake_frame_throttling_delegate.h",
       "../browser/performance_manager/test_support/fake_high_efficiency_mode_toggle_delegate.cc",
@@ -1850,7 +1852,6 @@
       "../browser/dom_distiller/test_distillation_observers.h",
       "../browser/domain_reliability/browsertest.cc",
       "../browser/download/download_browsertest.cc",
-      "../browser/download/download_browsertest.h",
       "../browser/download/download_danger_prompt_browsertest.cc",
       "../browser/download/download_frame_policy_browsertest.cc",
       "../browser/download/download_started_animation_browsertest.cc",
@@ -2712,13 +2713,13 @@
         "../browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper_browsertest.mm",
         "../browser/spellchecker/spell_check_host_chrome_impl_mac_browsertest.cc",
         "../browser/ui/cocoa/accelerators_cocoa_browsertest.mm",
-        "../browser/ui/cocoa/applescript/bookmark_applescript_utils_test.h",
-        "../browser/ui/cocoa/applescript/bookmark_applescript_utils_test.mm",
+        "../browser/ui/cocoa/applescript/bookmark_applescript_test_utils.h",
+        "../browser/ui/cocoa/applescript/bookmark_applescript_test_utils.mm",
         "../browser/ui/cocoa/applescript/bookmark_folder_applescript_browsertest.mm",
         "../browser/ui/cocoa/applescript/bookmark_item_applescript_browsertest.mm",
-        "../browser/ui/cocoa/applescript/browsercrapplication+applescript_test.mm",
+        "../browser/ui/cocoa/applescript/browsercrapplication+applescript_browsertest.mm",
         "../browser/ui/cocoa/applescript/tab_applescript_browsertest.mm",
-        "../browser/ui/cocoa/applescript/window_applescript_test.mm",
+        "../browser/ui/cocoa/applescript/window_applescript_browsertest.mm",
         "../browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm",
         "../browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm",
         "../browser/ui/cocoa/browser_window_mac_browsertest.mm",
@@ -3486,6 +3487,7 @@
         "../browser/ui/views/commerce/ntp_discount_consent_dialog_view_browsertest.cc",
         "../browser/ui/views/commerce/price_tracking_icon_view_browsertest.cc",
         "../browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc",
+        "../browser/ui/views/download/bubble/download_bubble_browsertest.cc",
         "../browser/ui/views/extensions/device_chooser_extension_browsertest.cc",
         "../browser/ui/views/extensions/extension_install_blocked_dialog_view_browsertest.cc",
         "../browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc",
@@ -4217,6 +4219,7 @@
         "../browser/ui/webui/ash/cloud_upload/cloud_upload_dialog_browsertest.h",
         "../browser/ui/webui/ash/cloud_upload/drive_upload_handler_browsertest.cc",
         "../browser/ui/webui/ash/cloud_upload/one_drive_upload_handler_browsertest.cc",
+        "../browser/ui/webui/ash/cros_components_browsertest.cc",
         "../browser/ui/webui/ash/crostini_upgrader/crostini_upgrader_dialog_browsertest.cc",
         "../browser/ui/webui/ash/edu_coexistence/edu_coexistence_login_handler_browsertest.cc",
         "../browser/ui/webui/ash/login/oobe_display_chooser_browsertest.cc",
@@ -4287,6 +4290,7 @@
       }
       if (enable_assistant_integration_tests) {
         sources += [
+          "../browser/ash/app_list/launcher_search_iph_browsertest.cc",
           "../browser/ui/ash/assistant/assistant_browsertest.cc",
           "../browser/ui/ash/assistant/assistant_test_mixin.cc",
           "../browser/ui/ash/assistant/assistant_test_mixin.h",
@@ -4661,6 +4665,7 @@
         "../browser/printing/browser_printing_context_factory_for_test.h",
         "../browser/printing/pdf_nup_converter_client_browsertest.cc",
         "../browser/printing/print_browsertest.cc",
+        "../browser/printing/print_browsertest.h",
         "../browser/printing/print_preview_dialog_controller_browsertest.cc",
         "../browser/printing/pwg_raster_converter_browsertest.cc",
         "../browser/printing/test_print_preview_dialog_cloned_observer.cc",
@@ -4674,6 +4679,11 @@
         "../browser/ui/webui/print_preview/print_preview_ui_browsertest.cc",
       ]
       deps += [ "//printing:test_support" ]
+
+      if (!is_chromeos) {
+        sources +=
+            [ "../browser/printing/system_access_process_print_browsertest.cc" ]
+      }
     }
     if (enable_paint_preview) {
       sources += [
@@ -9964,6 +9974,7 @@
         ]
       } else {
         sources += [
+          "../browser/ui/views/download/bubble/download_bubble_interactive_uitest.cc",
           "../browser/ui/views/global_media_controls/media_dialog_view_interactive_browsertest.cc",
           "../browser/ui/views/relaunch_notification/relaunch_notification_controller_platform_impl_desktop_browsertest.cc",
         ]
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 9ff34ea26..bde3d70 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -235,8 +235,6 @@
         "chromeos/os_feedback_ui/os_feedback_browsertest.js",
         "chromeos/scanning/scanning_app_browsertest.js",
         "chromeos/shimless_rma/shimless_rma_browsertest.js",
-        "nearby_share/nearby_browsertest.js",
-        "nearby_share/shared/nearby_shared_v3_browsertest.js",
       ]
 
       defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
@@ -269,6 +267,8 @@
         "chromeos/personalization_app/personalization_app_controller_browsertest.js",
         "chromeos/print_management/print_management_browsertest.js",
         "chromeos/shortcut_customization/shortcut_customization_browsertest.js",
+        "nearby_share/nearby_browsertest.js",
+        "nearby_share/shared/nearby_shared_v3_browsertest.js",
       ]
     }
     if (!is_chromeos_lacros) {
diff --git a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
index ca59acc..ad97c8d 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
@@ -65,6 +65,14 @@
           {url: 'https://collections.googleusercontent.com/3'},
         ],
       },
+      {
+        description: '',
+        id: 'id_3',
+        name: 'time-of-day',
+        previews: [
+          {url: 'https://collections.googleusercontent.com/tod'},
+        ],
+      },
     ];
 
     /**
@@ -92,6 +100,34 @@
         unitId: BigInt(1),
         type: OnlineImageType.kDark,
       },
+      {
+        assetId: BigInt(3),
+        attribution: ['Image 3'],
+        url: {url: 'https://images.googleusercontent.com/light-1'},
+        unitId: BigInt(3),
+        type: OnlineImageType.kLight,
+      },
+      {
+        assetId: BigInt(4),
+        attribution: ['Image 3'],
+        url: {url: 'https://images.googleusercontent.com/morning-1'},
+        unitId: BigInt(3),
+        type: OnlineImageType.kMorning,
+      },
+      {
+        assetId: BigInt(5),
+        attribution: ['Image 3'],
+        url: {url: 'https://images.googleusercontent.com/afternoon-1'},
+        unitId: BigInt(3),
+        type: OnlineImageType.kLateAfternoon,
+      },
+      {
+        assetId: BigInt(6),
+        attribution: ['Image 3'],
+        url: {url: 'https://images.googleusercontent.com/dark-1'},
+        unitId: BigInt(3),
+        type: OnlineImageType.kDark,
+      },
     ];
 
     this.localImages = [{path: 'LocalImage0.png'}, {path: 'LocalImage1.png'}];
@@ -116,6 +152,7 @@
     this.albumId = '';
 
     this.collectionId = this.collections_![0]!.id;
+    this.timeOfDayCollectionId = this.collections_![3]!.id;
   }
 
   private collections_: WallpaperCollection[]|null;
@@ -139,6 +176,7 @@
   currentWallpaper: CurrentWallpaper;
   albumId: string;
   collectionId: string;
+  timeOfDayCollectionId: string;
   selectWallpaperResponse = true;
   selectGooglePhotosPhotoResponse = true;
   selectGooglePhotosAlbumResponse: SetDailyRefreshResponse = {
diff --git a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts
index a50c659..707fb2bb 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts
@@ -79,6 +79,7 @@
             'id_0': wallpaperProvider.images,
             'id_1': wallpaperProvider.images,
             'id_2': wallpaperProvider.images,
+            'id_3': wallpaperProvider.images,
           },
         },
         personalizationStore.data.wallpaper.backdrop,
@@ -92,6 +93,7 @@
             'id_0': false,
             'id_1': false,
             'id_2': false,
+            'id_3': false,
           },
         },
         personalizationStore.data.wallpaper.loading,
diff --git a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_images_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_images_element_test.ts
index 5fa1845..9275dd3 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_images_element_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_images_element_test.ts
@@ -5,8 +5,8 @@
 import 'chrome://personalization/strings.m.js';
 import 'chrome://webui-test/mojo_webui_test_support.js';
 
-import {OnlineImageType, PersonalizationRouter, WallpaperGridItem, WallpaperImages} from 'chrome://personalization/js/personalization_app.js';
-import {assertDeepEquals, assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {ColorScheme, OnlineImageType, PersonalizationRouter, TimeOfDayWallpaperDialog, WallpaperGridItem, WallpaperImages} from 'chrome://personalization/js/personalization_app.js';
+import {assertDeepEquals, assertEquals, assertNotEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
 
 import {baseSetup, initElement, teardownElement} from './personalization_app_test_utils.js';
@@ -29,8 +29,8 @@
     wallpaperImagesElement = null;
   });
 
-  async function createWithDefaultData() {
-    const collectionId = wallpaperProvider.collections![0]!.id;
+  async function createWithDefaultData(
+      collectionId: string = wallpaperProvider.collections![0]!.id) {
     personalizationStore.data.wallpaper = {
       ...personalizationStore.data.wallpaper,
       backdrop: {
@@ -49,6 +49,29 @@
     return element;
   }
 
+  async function selectTimeOfDayWallpaper() {
+    // Click the first image that is not currently selected.
+    wallpaperImagesElement!.shadowRoot!
+        .querySelector<WallpaperGridItem>(`${
+            WallpaperGridItem
+                .is}[aria-selected='false'][data-is-time-of-day-wallpaper]`)!
+        .click();
+    await waitAfterNextRender(wallpaperImagesElement!);
+    return wallpaperImagesElement;
+  }
+
+  async function clickTimeOfDayWallpaperDialogButton(id: string) {
+    const dialog = wallpaperImagesElement!.shadowRoot!
+                       .querySelector<TimeOfDayWallpaperDialog>(
+                           TimeOfDayWallpaperDialog.is);
+    assertNotEquals(null, dialog, 'dialog element must exist to click button');
+    const button = dialog!.shadowRoot!.getElementById(id);
+    assertNotEquals(null, button, `button with id ${id} must exist`);
+    button!.click();
+    await waitAfterNextRender(wallpaperImagesElement!);
+    return wallpaperImagesElement;
+  }
+
   test('sets aria-selected for current wallpaper asset id', async () => {
     wallpaperImagesElement = await createWithDefaultData();
     const selectedElements: WallpaperGridItem[] =
@@ -211,7 +234,8 @@
             `${WallpaperGridItem.is}:not([hidden])`));
 
     assertDeepEquals(
-        ['Image 0 light', 'Image 2'], elements.map(elem => elem.ariaLabel),
+        ['Image 0 light', 'Image 2', 'Image 3'],
+        elements.map(elem => elem.ariaLabel),
         'elements have correct aria labels for light mode');
 
     assertDeepEquals(
@@ -244,6 +268,80 @@
     assertEquals(
         wallpaperProvider.isInTabletModeResponse, previewMode,
         'preview mode is same as tablet mode');
+    assertEquals(
+        null,
+        wallpaperImagesElement.shadowRoot!.querySelector(
+            TimeOfDayWallpaperDialog.is),
+        'no time of day dialog when selecting a regular image');
+  });
+
+  test('shows dialog when clicking on a time of day wallpaper', async () => {
+    wallpaperImagesElement =
+        await createWithDefaultData(wallpaperProvider.timeOfDayCollectionId);
+
+    await selectTimeOfDayWallpaper();
+    assertNotEquals(
+        null,
+        wallpaperImagesElement.shadowRoot!.querySelector(
+            TimeOfDayWallpaperDialog.is),
+        'dialog element exists');
+  });
+
+  test('do not show time of day dialog with proper settings', async () => {
+    wallpaperImagesElement =
+        await createWithDefaultData(wallpaperProvider.timeOfDayCollectionId);
+    personalizationStore.data.theme.colorModeAutoScheduleEnabled = true;
+    personalizationStore.data.theme.colorSchemeSelected =
+        ColorScheme.kTonalSpot;
+    personalizationStore.notifyObservers();
+    await waitAfterNextRender(wallpaperImagesElement);
+
+    await selectTimeOfDayWallpaper();
+    assertEquals(
+        null,
+        wallpaperImagesElement.shadowRoot!.querySelector(
+            TimeOfDayWallpaperDialog.is),
+        'dialog element does not exist');
+    const [assetId, _] = await wallpaperProvider.whenCalled('selectWallpaper');
+    assertEquals(3n, assetId, 'correct asset id is passed');
+  });
+
+  test(
+      'clicking cancel dismisses the time of day wallpaper dialog',
+      async () => {
+        wallpaperImagesElement = await createWithDefaultData(
+            wallpaperProvider.timeOfDayCollectionId);
+
+        await selectTimeOfDayWallpaper();
+        await clickTimeOfDayWallpaperDialogButton('close');
+        assertEquals(
+            null,
+            wallpaperImagesElement.shadowRoot!.querySelector(
+                TimeOfDayWallpaperDialog.is),
+            'clicking cancel dismisses the dialog');
+        assertEquals(
+            wallpaperProvider.currentWallpaper,
+            personalizationStore.data.wallpaper.currentSelected,
+            'current wallpaper is not updated');
+      });
+
+  test('clicking confirm on the time of day wallpaper dialog', async () => {
+    wallpaperImagesElement =
+        await createWithDefaultData(wallpaperProvider.timeOfDayCollectionId);
+
+    await selectTimeOfDayWallpaper();
+    await clickTimeOfDayWallpaperDialogButton('accept');
+    assertEquals(
+        null,
+        wallpaperImagesElement.shadowRoot!.querySelector(
+            TimeOfDayWallpaperDialog.is),
+        'clicking accept dismisses the dialog');
+    const [assetId, previewMode] =
+        await wallpaperProvider.whenCalled('selectWallpaper');
+    assertEquals(3n, assetId, 'correct asset id is passed');
+    assertEquals(
+        wallpaperProvider.isInTabletModeResponse, previewMode,
+        'preview mode is same as tablet mode');
   });
 
   test('redirects to wallpaper page if no images', async () => {
diff --git a/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js b/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js
index c5753cb4f..100ecc8 100644
--- a/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js
+++ b/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// So that mojo is defined.
 import 'chrome://nearby/nearby_confirmation_page.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {NearbyConfirmationPageElement} from 'chrome://nearby/nearby_confirmation_page.js';
 import {ShareTarget, TransferStatus} from 'chrome://nearby/shared/mojo/nearby_share.mojom-webui.js';
diff --git a/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js b/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js
index 471a425..5958406 100644
--- a/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js
+++ b/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'chrome://webui-test/mojo_webui_test_support.js';
 import 'chrome://nearby/nearby_discovery_page.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {setDiscoveryManagerForTesting} from 'chrome://nearby/discovery_manager.js';
 import {NearbyDiscoveryPageElement} from 'chrome://nearby/nearby_discovery_page.js';
diff --git a/chrome/test/data/webui/nearby_share/nearby_share_app_test.js b/chrome/test/data/webui/nearby_share/nearby_share_app_test.js
index 097729d7..61dd88f5 100644
--- a/chrome/test/data/webui/nearby_share/nearby_share_app_test.js
+++ b/chrome/test/data/webui/nearby_share/nearby_share_app_test.js
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import 'chrome://nearby/app.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {NearbyShareAppElement} from 'chrome://nearby/app.js';
 import {setContactManagerForTesting} from 'chrome://nearby/shared/nearby_contact_manager.js';
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_contact_visibility_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_contact_visibility_test.js
index b12bcf2..990b8a2 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_contact_visibility_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_contact_visibility_test.js
@@ -4,6 +4,7 @@
 
 import 'chrome://nearby/strings.m.js';
 import 'chrome://nearby/shared/nearby_contact_visibility.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {setContactManagerForTesting} from 'chrome://nearby/shared/nearby_contact_manager.js';
 import {DataUsage, FastInitiationNotificationState, Visibility} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js';
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_device_icon_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_device_icon_test.js
index 2722e490..8ea8411b 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_device_icon_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_device_icon_test.js
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import 'chrome://nearby/shared/nearby_device_icon.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {ShareTarget} from 'chrome://nearby/shared/mojo/nearby_share.mojom-webui.js';
 import {ShareTargetType} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_target_types.mojom-webui.js';
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_device_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_device_test.js
index 84fbe8edd..1b6c3d7 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_device_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_device_test.js
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import 'chrome://nearby/shared/nearby_device.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {ShareTarget} from 'chrome://nearby/shared/mojo/nearby_share.mojom-webui.js';
 import {ShareTargetType} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_target_types.mojom-webui.js';
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_onboarding_one_page_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_onboarding_one_page_test.js
index b862fcb..f3870e28 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_onboarding_one_page_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_onboarding_one_page_test.js
@@ -4,6 +4,7 @@
 
 import 'chrome://nearby/strings.m.js';
 import 'chrome://nearby/shared/nearby_onboarding_one_page.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {setNearbyShareSettingsForTesting} from 'chrome://nearby/shared/nearby_share_settings.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_onboarding_page_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_onboarding_page_test.js
index 8152f7b..292b172d 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_onboarding_page_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_onboarding_page_test.js
@@ -4,6 +4,7 @@
 
 import 'chrome://nearby/strings.m.js';
 import 'chrome://nearby/shared/nearby_onboarding_page.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {setNearbyShareSettingsForTesting} from 'chrome://nearby/shared/nearby_share_settings.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_preview_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_preview_test.js
index fcf37e8..7db4a40 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_preview_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_preview_test.js
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import 'chrome://nearby/shared/nearby_preview.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {ShareType} from 'chrome://nearby/shared/mojo/nearby_share_share_type.mojom-webui.js';
 
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_progress_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_progress_test.js
index 4ad81a2..443f6ce 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_progress_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_progress_test.js
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import 'chrome://nearby/shared/nearby_progress.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {ShareTarget} from 'chrome://nearby/shared/mojo/nearby_share.mojom-webui.js';
 import {ShareTargetType} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_target_types.mojom-webui.js';
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_visibility_page_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_visibility_page_test.js
index 99f2d9a..5f7dfdd6 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_visibility_page_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_visibility_page_test.js
@@ -4,6 +4,7 @@
 
 import 'chrome://nearby/strings.m.js';
 import 'chrome://nearby/shared/nearby_visibility_page.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {DataUsage, FastInitiationNotificationState, Visibility} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js';
 import {waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
diff --git a/chrome/test/data/webui/new_tab_page/app_test.ts b/chrome/test/data/webui/new_tab_page/app_test.ts
index f989c119..bab7784 100644
--- a/chrome/test/data/webui/new_tab_page/app_test.ts
+++ b/chrome/test/data/webui/new_tab_page/app_test.ts
@@ -930,6 +930,11 @@
       });
     });
 
+    test('lens upload dialog closed on start', () => {
+      // Assert.
+      assertFalse(!!app.shadowRoot!.querySelector('ntp-lens-upload-dialog'));
+    });
+
     test('realbox is not visible when Lens upload dialog is open', async () => {
       // Arrange.
       callbackRouterRemote.setTheme(createTheme());
@@ -940,6 +945,7 @@
       await flushTasks();
 
       // Assert.
+      assertTrue(!!app.shadowRoot!.querySelector('ntp-lens-upload-dialog'));
       assertStyle($$(app, '#realbox')!, 'visibility', 'hidden');
 
       // Act.
diff --git a/chrome/test/data/webui/new_tab_page/lens_upload_dialog_test.ts b/chrome/test/data/webui/new_tab_page/lens_upload_dialog_test.ts
index 0330a91..f309b06 100644
--- a/chrome/test/data/webui/new_tab_page/lens_upload_dialog_test.ts
+++ b/chrome/test/data/webui/new_tab_page/lens_upload_dialog_test.ts
@@ -24,7 +24,7 @@
   let submitUrlCalled = false;
   let submittedUrl: string|null = null;
 
-  setup(() => {
+  setup(async () => {
     document.body.innerHTML = window.trustedTypes!.emptyHTML;
     metrics = fakeMetricsPrivate();
     windowProxy = installMock(WindowProxy);
@@ -48,6 +48,7 @@
 
     uploadDialog = document.createElement('ntp-lens-upload-dialog');
     wrapperElement.appendChild(uploadDialog);
+    await waitAfterNextRender(uploadDialog);
 
     uploadDialog.$.lensForm.submitUrl = (url: string) => {
       submitUrlCalled = true;
@@ -60,16 +61,7 @@
     submittedUrl = null;
   });
 
-  test('hidden be default', () => {
-    // Assert.
-    assertTrue(uploadDialog.$.dialog.hidden);
-  });
-
-  test('shows when openDialog is called', async () => {
-    // Act.
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
-
+  test('creating ntp lens dialog opens containing dialog element', () => {
     // Assert.
     assertFalse(uploadDialog.$.dialog.hidden);
     assertEquals(
@@ -80,10 +72,6 @@
   });
 
   test('hides when close button is clicked', async () => {
-    // Arrange.
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
-
     // Act.
     const closeButton =
       uploadDialog.shadowRoot!.querySelector('#closeButton') as HTMLElement;
@@ -100,8 +88,6 @@
 
   test('focusing outside the upload dialog closes the dialog', async () => {
     // Arrange.
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
     const event =
         new FocusEvent('focusout', {relatedTarget: outsideClickTarget});
 
@@ -121,8 +107,6 @@
       'focusing inside the upload dialog does not close the dialog',
       async () => {
         // Arrange.
-        uploadDialog.openDialog();
-        await waitAfterNextRender(uploadDialog);
         const event = new FocusEvent(
             'focusout', {relatedTarget: uploadDialog.$.closeButton});
 
@@ -142,8 +126,6 @@
       'focusout with null related target closes the dialog when doc has focus',
       async () => {
         // Arrange.
-        uploadDialog.openDialog();
-        await waitAfterNextRender(uploadDialog);
         const event = new FocusEvent('focusout', {relatedTarget: null});
 
         // Act.
@@ -163,8 +145,6 @@
       'focusout with null related target closes the dialog when doc does not have focus',
       async () => {
         // Arrange.
-        uploadDialog.openDialog();
-        await waitAfterNextRender(uploadDialog);
         const event = new FocusEvent('focusout', {relatedTarget: null});
 
         // Act.
@@ -186,10 +166,6 @@
       });
 
   test('clicking esc key closes the dialog', async () => {
-    // Arrange.
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
-
     // Act.
     document.dispatchEvent(new KeyboardEvent('keydown', {key: 'Escape'}));
 
@@ -204,10 +180,12 @@
 
   test('opening dialog while offline shows offline UI', async () => {
     // Arrange.
+    uploadDialog.remove();
     windowProxy.setResultFor('onLine', false);
 
     // Act.
-    uploadDialog.openDialog();
+    uploadDialog = document.createElement('ntp-lens-upload-dialog');
+    wrapperElement.appendChild(uploadDialog);
     await waitAfterNextRender(uploadDialog);
 
     // Assert.
@@ -221,10 +199,12 @@
       'clicking try again in offline state when online updates UI',
       async () => {
         // Arrange.
+        uploadDialog.remove();
         windowProxy.setResultFor('onLine', false);
 
         // Act.
-        uploadDialog.openDialog();
+        uploadDialog = document.createElement('ntp-lens-upload-dialog');
+        wrapperElement.appendChild(uploadDialog);
         await waitAfterNextRender(uploadDialog);
 
         // Assert. (consistency check)
@@ -243,10 +223,6 @@
       });
 
   test('submit url does not submit with empty url', async () => {
-    // Arrange.
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
-
     // Act.
     clickInputSubmit();
 
@@ -258,8 +234,6 @@
       'submit valid url by clicking submit button should submit ', async () => {
         // Arrange.
         const url = 'http://google.com/image.png';
-        uploadDialog.openDialog();
-        await waitAfterNextRender(uploadDialog);
 
         // Act.
         setInputBoxValue(url);
@@ -273,8 +247,6 @@
   test('pressing enter in input box should submit valid url', async () => {
     // Arrange.
     const url = 'http://google.com/image.png';
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
 
     // Act.
     setInputBoxValue(url);
@@ -288,8 +260,6 @@
   test('pressing enter in search button should submit valid url', async () => {
     // Arrange.
     const url = 'http://google.com/image.png';
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
 
     // Act.
     setInputBoxValue(url);
@@ -304,8 +274,6 @@
   test('pressing space in search button should submit valid url', async () => {
     // Arrange.
     const url = 'http://google.com/image.png';
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
 
     // Act.
     setInputBoxValue(url);
@@ -332,8 +300,6 @@
       'dragenter then dragleave event should transition to normal state',
       async () => {
         // Arrange.
-        uploadDialog.openDialog();
-        await waitAfterNextRender(uploadDialog);
         uploadDialog.$.dragDropArea.dispatchEvent(new DragEvent('dragenter'));
         await waitAfterNextRender(uploadDialog);
         // Act.
@@ -349,8 +315,6 @@
     uploadDialog.$.lensForm.submitFileList = (_fileList: FileList) => {
       submitFileListCalled = true;
     };
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
     // Act.
     const dataTransfer = new DataTransfer();
     const file = new File([], 'image-file.png', {type: 'image/png'});
@@ -363,10 +327,6 @@
   });
 
   test('shows error state when FILE_TYPE error is dispatched', async () => {
-    // Arrange.
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
-
     // Act.
     uploadDialog.$.lensForm.dispatchEvent(new CustomEvent('error', {
       detail: LensErrorType.FILE_TYPE,
@@ -387,10 +347,6 @@
   });
 
   test('clears error state when NO_FILE error is dispatched', async () => {
-    // Arrange.
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
-
     // Act.
     uploadDialog.$.lensForm.dispatchEvent(new CustomEvent('error', {
       detail: LensErrorType.FILE_TYPE,
@@ -404,10 +360,6 @@
   });
 
   test('shows loading state when file is submitted', async () => {
-    // Arrange.
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
-
     // Act.
     uploadDialog.$.lensForm.dispatchEvent(new CustomEvent('loading', {
       detail: LensSubmitType.FILE,
@@ -423,10 +375,6 @@
   });
 
   test('shows loading state when URL is submitted', async () => {
-    // Arrange.
-    uploadDialog.openDialog();
-    await waitAfterNextRender(uploadDialog);
-
     // Act.
     uploadDialog.$.lensForm.dispatchEvent(new CustomEvent('loading', {
       detail: LensSubmitType.URL,
diff --git a/chrome/test/data/webui/new_tab_page/modules/history_clusters/test_support.ts b/chrome/test/data/webui/new_tab_page/modules/history_clusters/test_support.ts
index ea0da2b..b3fe9b7 100644
--- a/chrome/test/data/webui/new_tab_page/modules/history_clusters/test_support.ts
+++ b/chrome/test/data/webui/new_tab_page/modules/history_clusters/test_support.ts
@@ -25,7 +25,7 @@
       visitTime: {internalValue: BigInt(0)},
     },
     hasUrlKeyedImage: hasUrlKeyedImage,
-    isKnownToSync: false,
+    isKnownToSync: true,
   };
 }
 
diff --git a/chrome/test/data/webui/new_tab_page/new_tab_page_browsertest.js b/chrome/test/data/webui/new_tab_page/new_tab_page_browsertest.js
index 2f2c5cad..4266adde9 100644
--- a/chrome/test/data/webui/new_tab_page/new_tab_page_browsertest.js
+++ b/chrome/test/data/webui/new_tab_page/new_tab_page_browsertest.js
@@ -8,7 +8,7 @@
 
 GEN('#include "build/build_config.h"');
 GEN('#include "build/chromeos_buildflags.h"');
-GEN('#include "components/history_clusters/core/features.h"');
+GEN('#include "components/search/ntp_features.h"');
 GEN('#include "content/public/test/browser_test.h"');
 
 class NewTabPageBrowserTest extends PolymerTest {
@@ -398,6 +398,15 @@
   get browsePreload() {
     return 'chrome://new-tab-page/test_loader.html?module=new_tab_page/modules/history_clusters/module_test.js';
   }
+
+  /** @override */
+  get featureList() {
+    return {
+      enabled: [
+        'ntp_features::kNtpHistoryClustersModule',
+      ],
+    };
+  }
 };
 
 TEST_F('NewTabPageModulesHistoryClustersModuleTest', 'All', function() {
@@ -415,7 +424,7 @@
   get featureList() {
     return {
       enabled: [
-        'history_clusters::internal::kJourneysImages',
+        'ntp_features::kNtpHistoryClustersModule',
       ],
     };
   }
@@ -431,6 +440,15 @@
   get browsePreload() {
     return 'chrome://new-tab-page/test_loader.html?module=new_tab_page/modules/history_clusters/suggest_tile_test.js';
   }
+
+  /** @override */
+  get featureList() {
+    return {
+      enabled: [
+        'ntp_features::kNtpHistoryClustersModule',
+      ],
+    };
+  }
 };
 
 TEST_F(
diff --git a/chrome/test/data/webui/settings/autofill_section_test.ts b/chrome/test/data/webui/settings/autofill_section_test.ts
index d532177..b28789c 100644
--- a/chrome/test/data/webui/settings/autofill_section_test.ts
+++ b/chrome/test/data/webui/settings/autofill_section_test.ts
@@ -262,7 +262,7 @@
     const addressList = section.$.addressList;
     const row = addressList.children[0];
     assertTrue(!!row);
-    const menuButton = row!.querySelector<HTMLElement>('#addressMenu');
+    const menuButton = row!.querySelector<HTMLElement>('.address-menu');
     assertTrue(!!menuButton);
     menuButton!.click();
     flush();
diff --git a/chrome/test/data/webui/settings/autofill_section_test_utils.ts b/chrome/test/data/webui/settings/autofill_section_test_utils.ts
index 559a702c..e29dcc79 100644
--- a/chrome/test/data/webui/settings/autofill_section_test_utils.ts
+++ b/chrome/test/data/webui/settings/autofill_section_test_utils.ts
@@ -101,7 +101,7 @@
       'index is too high, not enough addresses in the list');
 
   const menu =
-      addressElements[index]!.querySelector<HTMLElement>('#addressMenu');
+      addressElements[index]!.querySelector<HTMLElement>('.address-menu');
 
   assertTrue(!!menu, 'the row element should contain the menu element');
 
@@ -140,7 +140,7 @@
       'index is too high, not enough addresses in the list');
 
   const menu =
-      addressElements[index]!.querySelector<HTMLElement>('#addressMenu');
+      addressElements[index]!.querySelector<HTMLElement>('.address-menu');
 
   assertTrue(!!menu, 'the row element should contain the menu element');
 
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn
index 2dbe144e..6118864 100644
--- a/chrome/test/data/webui/settings/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -121,14 +121,12 @@
   "os_settings_menu_test.js",
   "os_settings_page_test.js",
   "os_settings_search_box_test.js",
-  "os_settings_ui_test_2.js",
   "os_sync_controls_subpage_test.js",
   "people_page_account_manager_subpage_test.js",
   "per_device_keyboard_subsection_test.js",
   "per_device_keyboard_remap_keys_test.js",
   "per_device_keyboard_test.js",
   "per_device_mouse_subsection_test.js",
-  "per_device_mouse_test.js",
   "per_device_pointing_stick_subsection_test.js",
   "per_device_pointing_stick_test.js",
   "per_device_touchpad_subsection_test.js",
@@ -141,7 +139,6 @@
   "select_to_speak_subpage_tests.js",
   "settings_scheduler_slider_test.js",
   "settings_traffic_counters_test.js",
-  "smart_inputs_page_test.js",
   "smart_privacy_subpage_tests.js",
   "smb_shares_page_tests.js",
   "switch_access_action_assignment_dialog_test.js",
@@ -213,6 +210,8 @@
   "date_time_page/timezone_selector_test.ts",
   "date_time_page/timezone_subpage_test.ts",
 
+  "device_page/per_device_mouse_test.ts",
+
   "internet_page/tether_connection_dialog_test.ts",
 
   "os_a11y_page/audio_and_captions_page_tests.ts",
@@ -231,9 +230,15 @@
 
   "os_files_page/office_page_test.ts",
 
+  "os_languages_page/smart_inputs_page_test.ts",
+
   "os_people_page/add_user_dialog_tests.ts",
 
+  "os_settings_ui/os_settings_ui_about_page_test.js",
+  "os_settings_ui/os_settings_ui_menu_test.js",
   "os_settings_ui/os_settings_ui_test.ts",
+  "os_settings_ui/os_settings_ui_toolbar_test.js",
+  "os_settings_ui/user_action_recorder_test.js",
 
   "parental_controls_page/parental_controls_page_test.ts",
   "parental_controls_page/test_parental_controls_browser_proxy.ts",
diff --git a/chrome/test/data/webui/settings/chromeos/per_device_mouse_test.js b/chrome/test/data/webui/settings/chromeos/device_page/per_device_mouse_test.ts
similarity index 62%
rename from chrome/test/data/webui/settings/chromeos/per_device_mouse_test.js
rename to chrome/test/data/webui/settings/chromeos/device_page/per_device_mouse_test.ts
index 68c56dc..6dcf14a 100644
--- a/chrome/test/data/webui/settings/chromeos/per_device_mouse_test.js
+++ b/chrome/test/data/webui/settings/chromeos/device_page/per_device_mouse_test.ts
@@ -3,57 +3,49 @@
 // found in the LICENSE file.
 
 import {FakeInputDeviceSettingsProvider, fakeMice, setInputDeviceSettingsProviderForTesting, SettingsPerDeviceMouseElement} from 'chrome://os-settings/chromeos/os_settings.js';
-import {assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
 
-suite('PerDeviceMouse', function() {
-  /**
-   * @type {?SettingsPerDeviceMouseElement}
-   */
-  let perDeviceMousePage = null;
-  /**
-   * @type {?FakeInputDeviceSettingsProvider}
-   */
-  let provider = null;
+suite('<settings-per-device-mouse>', function() {
+  let perDeviceMousePage: SettingsPerDeviceMouseElement;
+  let provider: FakeInputDeviceSettingsProvider;
 
   setup(() => {
-    PolymerTest.clearBody();
     provider = new FakeInputDeviceSettingsProvider();
     provider.setFakeMice(fakeMice);
     setInputDeviceSettingsProviderForTesting(provider);
   });
 
   teardown(() => {
-    perDeviceMousePage = null;
-    provider = null;
+    perDeviceMousePage.remove();
   });
 
   function initializePerDeviceMousePage() {
     perDeviceMousePage = document.createElement('settings-per-device-mouse');
-    assertTrue(perDeviceMousePage != null);
+    assertTrue(!!perDeviceMousePage);
     document.body.appendChild(perDeviceMousePage);
     return flushTasks();
   }
 
   test('Mouse page updates with new mice', async () => {
     await initializePerDeviceMousePage();
-    let subsections = perDeviceMousePage.shadowRoot.querySelectorAll(
+    let subsections = perDeviceMousePage.shadowRoot!.querySelectorAll(
         'settings-per-device-mouse-subsection');
     assertEquals(fakeMice.length, subsections.length);
     for (let i = 0; i < subsections.length; i++) {
-      const name = subsections[i].shadowRoot.querySelector('h2').textContent;
-      assertEquals(fakeMice[i].name, name);
+      const name = subsections[i]!.shadowRoot!.querySelector('h2')!.textContent;
+      assertEquals(fakeMice[i]!.name, name);
     }
 
     const newFakeMice = fakeMice.slice(1);
     provider.setFakeMice(newFakeMice);
     await flushTasks();
-    subsections = perDeviceMousePage.shadowRoot.querySelectorAll(
+    subsections = perDeviceMousePage.shadowRoot!.querySelectorAll(
         'settings-per-device-mouse-subsection');
     assertEquals(newFakeMice.length, subsections.length);
     for (let i = 0; i < subsections.length; i++) {
-      const name = subsections[i].shadowRoot.querySelector('h2').textContent;
-      assertEquals(newFakeMice[i].name, name);
+      const name = subsections[i]!.shadowRoot!.querySelector('h2')!.textContent;
+      assertEquals(newFakeMice[i]!.name, name);
     }
   });
 });
diff --git a/chrome/test/data/webui/settings/chromeos/os_languages_page/smart_inputs_page_test.ts b/chrome/test/data/webui/settings/chromeos/os_languages_page/smart_inputs_page_test.ts
new file mode 100644
index 0000000..cb670b8
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/os_languages_page/smart_inputs_page_test.ts
@@ -0,0 +1,65 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://os-settings/chromeos/lazy_load.js';
+
+import {OsSettingsSmartInputsPageElement} from 'chrome://os-settings/chromeos/lazy_load.js';
+import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+import {getDeepActiveElement} from 'chrome://resources/js/util_ts.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertEquals} from 'chrome://webui-test/chai_assert.js';
+import {waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
+
+
+suite('<os-settings-smart-inputs-page>', function() {
+  let smartInputsPage: OsSettingsSmartInputsPageElement;
+
+  function createSmartInputsPage() {
+    smartInputsPage = document.createElement('os-settings-smart-inputs-page');
+    document.body.appendChild(smartInputsPage);
+    flush();
+  }
+
+  teardown(function() {
+    smartInputsPage.remove();
+    Router.getInstance().resetRouteForTesting();
+  });
+
+  test('emojiSuggestAdditionNotNullWhenAllowEmojiSuggestionIsTrue', function() {
+    loadTimeData.overrideValues({allowEmojiSuggestion: true});
+    createSmartInputsPage();
+    assert(smartInputsPage.shadowRoot!.querySelector('#emojiSuggestion'));
+  });
+
+  test('emojiSuggestAdditionNullWhenAllowEmojiSuggestionIsFalse', function() {
+    loadTimeData.overrideValues({allowEmojiSuggestion: false});
+    createSmartInputsPage();
+    assertEquals(
+        null, smartInputsPage.shadowRoot!.querySelector('#emojiSuggestion'));
+  });
+
+  test('Deep link to emoji suggestion toggle', async () => {
+    loadTimeData.overrideValues({
+      allowEmojiSuggestion: true,
+    });
+    createSmartInputsPage();
+
+    const params = new URLSearchParams();
+    params.append('settingId', '1203');
+    Router.getInstance().navigateTo(routes.OS_LANGUAGES_SMART_INPUTS, params);
+
+    flush();
+
+    const deepLinkElement =
+        smartInputsPage.shadowRoot!.querySelector('#emojiSuggestion')!
+            .shadowRoot!.querySelector('cr-toggle');
+    assert(deepLinkElement);
+    await waitAfterNextRender(deepLinkElement);
+    assertEquals(
+        deepLinkElement, getDeepActiveElement(),
+        'Emoji suggestion toggle should be focused for settingId=1203.');
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_about_page_test.js b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_about_page_test.js
new file mode 100644
index 0000000..2472e80
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_about_page_test.js
@@ -0,0 +1,76 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {CrSettingsPrefs, Router, routes, setNearbyShareSettingsForTesting} from 'chrome://os-settings/chromeos/os_settings.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js';
+import {waitBeforeNextRender} from 'chrome://webui-test/polymer_test_util.js';
+
+suite('<os-settings-ui> about page', () => {
+  let ui;
+  let fakeNearbySettings;
+
+  suiteSetup(() => {
+    fakeNearbySettings = new FakeNearbyShareSettings();
+    setNearbyShareSettingsForTesting(fakeNearbySettings);
+  });
+
+  async function createElement() {
+    const element = document.createElement('os-settings-ui');
+    document.body.appendChild(element);
+    await CrSettingsPrefs.initialized;
+    flush();
+    return element;
+  }
+
+  teardown(() => {
+    ui.remove();
+    Router.getInstance().resetRouteForTesting();
+  });
+
+  test(
+      'Clicking "About ChromeOS" menu item should focus About section',
+      async () => {
+        ui = await createElement();
+        const router = Router.getInstance();
+        const settingsMenu = ui.shadowRoot.querySelector('os-settings-menu');
+        assertTrue(!!settingsMenu);
+
+        // As of iron-selector 2.x, need to force iron-selector to update before
+        // clicking items on it, or wait for 'iron-items-changed'
+        const ironSelector =
+            settingsMenu.shadowRoot.querySelector('iron-selector');
+        ironSelector.forceSynchronousItemUpdate();
+
+        const {aboutItem} = settingsMenu.$;
+        aboutItem.click();
+        flush();
+
+        assertEquals(routes.ABOUT_ABOUT, router.currentRoute);
+        assertNotEquals(aboutItem, settingsMenu.shadowRoot.activeElement);
+
+        const settingsMain = ui.shadowRoot.querySelector('os-settings-main');
+        const aboutPage =
+            settingsMain.shadowRoot.querySelector('os-settings-about-page');
+        await waitBeforeNextRender(aboutPage);
+        const aboutSection = aboutPage.shadowRoot.querySelector(
+            'os-settings-section[section="about"]');
+        assertEquals(aboutSection, aboutPage.shadowRoot.activeElement);
+      });
+
+  test('Detailed build info subpage is directly navigable', async () => {
+    Router.getInstance().navigateTo(routes.DETAILED_BUILD_INFO);
+    ui = await createElement();
+    flush();
+
+    const settingsMain = ui.shadowRoot.querySelector('os-settings-main');
+    const aboutPage =
+        settingsMain.shadowRoot.querySelector('os-settings-about-page');
+    const detailedBuildInfoSubpage = aboutPage.shadowRoot.querySelector(
+        'settings-detailed-build-info-subpage');
+    await waitBeforeNextRender(detailedBuildInfoSubpage);
+    assertTrue(!!detailedBuildInfoSubpage);
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_menu_test.js b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_menu_test.js
new file mode 100644
index 0000000..770d0d9
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_menu_test.js
@@ -0,0 +1,160 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {CrSettingsPrefs, Router, routes, setNearbyShareSettingsForTesting} from 'chrome://os-settings/chromeos/os_settings.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
+
+suite('<os-settings-ui> menu', () => {
+  let ui;
+  let fakeNearbySettings;
+
+  suiteSetup(() => {
+    fakeNearbySettings = new FakeNearbyShareSettings();
+    setNearbyShareSettingsForTesting(fakeNearbySettings);
+  });
+
+  async function createElement() {
+    const element = document.createElement('os-settings-ui');
+    document.body.appendChild(element);
+    await CrSettingsPrefs.initialized;
+    flush();
+    return element;
+  }
+
+  teardown(() => {
+    ui.remove();
+    Router.getInstance().resetRouteForTesting();
+  });
+
+  test('Drawer can open and close', async () => {
+    ui = await createElement();
+
+    const drawer = ui.shadowRoot.querySelector('#drawer');
+    assertFalse(drawer.open);
+
+    let menu = ui.shadowRoot.querySelector('#drawer os-settings-menu');
+    assertEquals(null, menu);
+
+    drawer.openDrawer();
+    flush();
+    await eventToPromise('cr-drawer-opened', drawer);
+
+    // Validate that dialog is open and menu is shown so it will animate.
+    assertTrue(drawer.open);
+    menu = ui.shadowRoot.querySelector('#drawer os-settings-menu');
+    assertTrue(!!menu);
+
+    drawer.cancel();
+    // Drawer is closed, but menu is still stamped so its contents remain
+    // visible as the drawer slides out.
+    menu = ui.shadowRoot.querySelector('#drawer os-settings-menu');
+    assertTrue(!!menu);
+  });
+
+  test('Drawer closes when exiting narrow mode', async () => {
+    ui = await createElement();
+    const drawer = ui.shadowRoot.querySelector('#drawer');
+
+    // Mimic narrow mode and open the drawer.
+    ui.isNarrow = true;
+    drawer.openDrawer();
+    flush();
+    await eventToPromise('cr-drawer-opened', drawer);
+    assertTrue(drawer.open);
+
+    // Mimic exiting narrow mode and confirm the drawer is closed
+    ui.isNarrow = false;
+    flush();
+    await eventToPromise('close', drawer);
+    assertFalse(drawer.open);
+  });
+
+  test('Navigating via menu clears current search URL param', async () => {
+    ui = await createElement();
+    const settingsMenu = ui.shadowRoot.querySelector('os-settings-menu');
+
+    // As of iron-selector 2.x, need to force iron-selector to update before
+    // clicking items on it, or wait for 'iron-items-changed'
+    const ironSelector = settingsMenu.shadowRoot.querySelector('iron-selector');
+    ironSelector.forceSynchronousItemUpdate();
+
+    const urlParams = new URLSearchParams('search=foo');
+    const router = Router.getInstance();
+    router.navigateTo(routes.BASIC, urlParams);
+    assertEquals(urlParams.toString(), router.getQueryParameters().toString());
+    settingsMenu.$.personalization.click();
+    assertEquals('', router.getQueryParameters().toString());
+  });
+
+  test('Advanced section in menu and main page behavior', async () => {
+    ui = await createElement();
+    ui.shadowRoot.querySelector('#drawerTemplate').if = true;
+    flush();
+
+    const main = ui.shadowRoot.querySelector('os-settings-main');
+    assertTrue(!!main);
+    const mainPage = main.shadowRoot.querySelector('os-settings-page');
+    assertTrue(!!mainPage);
+    const mainPageAdvancedToggle =
+        mainPage.shadowRoot.querySelector('#advancedToggle');
+    assertTrue(!!mainPageAdvancedToggle);
+    const floatingMenu = ui.shadowRoot.querySelector('#left os-settings-menu');
+    assertTrue(!!floatingMenu);
+    const drawerMenu = ui.shadowRoot.querySelector('#drawer os-settings-menu');
+    assertTrue(!!drawerMenu);
+
+    // Advanced section should not be expanded
+    assertFalse(main.advancedToggleExpanded);
+    assertFalse(drawerMenu.advancedOpened);
+    assertFalse(floatingMenu.advancedOpened);
+
+    mainPageAdvancedToggle.click();
+    flush();
+
+    // Advanced section should be expanded
+    assertTrue(main.advancedToggleExpanded);
+    assertTrue(drawerMenu.advancedOpened);
+    assertTrue(floatingMenu.advancedOpened);
+
+    // Collapse 'Advanced' in the menu.
+    drawerMenu.$.advancedButton.click();
+    flush();
+
+    // Collapsing it in the menu should not collapse it in the main area.
+    assertTrue(main.advancedToggleExpanded);
+    assertFalse(drawerMenu.advancedOpened);
+    assertFalse(floatingMenu.advancedOpened);
+
+    // Expand both 'Advanced's again.
+    drawerMenu.$.advancedButton.click();
+    flush();
+
+    // Collapse 'Advanced' in the main area.
+    main.advancedToggleExpanded = false;
+    flush();
+
+    // Collapsing it in the main area should not collapse it in the menu.
+    assertTrue(drawerMenu.advancedOpened);
+    assertTrue(floatingMenu.advancedOpened);
+    assertFalse(main.advancedToggleExpanded);
+  });
+
+  suite('When in kiosk mode', () => {
+    setup(() => {
+      loadTimeData.overrideValues({
+        isKioskModeActive: true,
+      });
+    });
+
+    test('Menu is hidden', async () => {
+      ui = await createElement();
+      const menu = ui.shadowRoot.querySelector('os-settings-menu');
+      assertEquals(null, menu);
+    });
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_toolbar_test.js b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_toolbar_test.js
new file mode 100644
index 0000000..475b2b9a
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_toolbar_test.js
@@ -0,0 +1,76 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {CrSettingsPrefs, Router, routes, setNearbyShareSettingsForTesting} from 'chrome://os-settings/chromeos/os_settings.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js';
+
+suite('<os-settings-ui> toolbar', () => {
+  let ui;
+  let fakeNearbySettings;
+
+  suiteSetup(() => {
+    fakeNearbySettings = new FakeNearbyShareSettings();
+    setNearbyShareSettingsForTesting(fakeNearbySettings);
+  });
+
+  async function createElement() {
+    const element = document.createElement('os-settings-ui');
+    document.body.appendChild(element);
+    await CrSettingsPrefs.initialized;
+    flush();
+    return element;
+  }
+
+  teardown(() => {
+    ui.remove();
+    Router.getInstance().resetRouteForTesting();
+  });
+
+  test('Toolbar shadow is always shown for subpages', async () => {
+    ui = await createElement();
+    const shadowEl = ui.shadowRoot.querySelector('#cr-container-shadow-top');
+    assertTrue(!!shadowEl, 'Shadow container element should exist');
+
+    assertFalse(
+        shadowEl.classList.contains('has-shadow'),
+        'Main page should not show shadow ' + shadowEl.className);
+
+    Router.getInstance().navigateTo(routes.POWER);
+    flush();
+    assertTrue(
+        shadowEl.classList.contains('has-shadow'),
+        'Sub-page should show shadow ' + shadowEl.className);
+  });
+
+  test('Menu icon shows only in narrow mode', async () => {
+    ui = await createElement();
+    flush();
+
+    const toolbar = ui.shadowRoot.querySelector('os-toolbar');
+    assertTrue(!!toolbar, 'Toolbar should exist');
+
+    ui.isNarrow = true;
+    assertTrue(toolbar.showMenu);
+
+    ui.isNarrow = false;
+    assertFalse(toolbar.showMenu);
+  });
+
+  suite('When in kiosk mode', () => {
+    setup(() => {
+      loadTimeData.overrideValues({
+        isKioskModeActive: true,
+      });
+    });
+
+    test('Toolbar is hidden in kiosk mode', async () => {
+      ui = await createElement();
+      const toolbar = ui.shadowRoot.querySelector('os-toolbar');
+      assertEquals(null, toolbar);
+    });
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui/user_action_recorder_test.js b/chrome/test/data/webui/settings/chromeos/os_settings_ui/user_action_recorder_test.js
new file mode 100644
index 0000000..e675d0b2
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui/user_action_recorder_test.js
@@ -0,0 +1,80 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {CrSettingsPrefs, Router, routes, setNearbyShareSettingsForTesting, setUserActionRecorderForTesting} from 'chrome://os-settings/chromeos/os_settings.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertEquals} from 'chrome://webui-test/chai_assert.js';
+import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js';
+
+import {FakeUserActionRecorder} from '../fake_user_action_recorder.js';
+
+suite('User action recorder', () => {
+  let ui;
+  let fakeUserActionRecorder;
+  let fakeNearbySettings;
+
+  async function createElement() {
+    const element = document.createElement('os-settings-ui');
+    document.body.appendChild(element);
+    await CrSettingsPrefs.initialized;
+    flush();
+    return element;
+  }
+
+  suiteSetup(async () => {
+    fakeNearbySettings = new FakeNearbyShareSettings();
+    setNearbyShareSettingsForTesting(fakeNearbySettings);
+  });
+
+  setup(async () => {
+    fakeUserActionRecorder = new FakeUserActionRecorder();
+    setUserActionRecorderForTesting(fakeUserActionRecorder);
+    ui = await createElement();
+  });
+
+  teardown(() => {
+    ui.remove();
+    Router.getInstance().resetRouteForTesting();
+  });
+
+  test('Records navigation changes', () => {
+    assertEquals(0, fakeUserActionRecorder.navigationCount);
+
+    Router.getInstance().navigateTo(routes.INTERNET);
+    assertEquals(1, fakeUserActionRecorder.navigationCount);
+
+    Router.getInstance().navigateTo(routes.BASIC);
+    assertEquals(2, fakeUserActionRecorder.navigationCount);
+  });
+
+  test('Records blur events', () => {
+    assertEquals(0, fakeUserActionRecorder.pageBlurCount);
+    window.dispatchEvent(new Event('blur'));
+    assertEquals(1, fakeUserActionRecorder.pageBlurCount);
+  });
+
+  test('Records click events', () => {
+    assertEquals(0, fakeUserActionRecorder.clickCount);
+    ui.click();
+    assertEquals(1, fakeUserActionRecorder.clickCount);
+  });
+
+  test('Records focus events', () => {
+    // Focus is already recorded when the page is loaded
+    assertEquals(1, fakeUserActionRecorder.pageFocusCount);
+    window.dispatchEvent(new Event('focus'));
+    assertEquals(2, fakeUserActionRecorder.pageFocusCount);
+  });
+
+  test('Records settings changes', () => {
+    assertEquals(0, fakeUserActionRecorder.settingChangeCount);
+    const prefsEl = ui.shadowRoot.querySelector('#prefs');
+    prefsEl.dispatchEvent(new CustomEvent('user-action-setting-change', {
+      bubbles: true,
+      composed: true,
+      detail: {prefKey: 'foo', prefValue: 'bar'},
+    }));
+    assertEquals(1, fakeUserActionRecorder.settingChangeCount);
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui_test_2.js b/chrome/test/data/webui/settings/chromeos/os_settings_ui_test_2.js
deleted file mode 100644
index 53a3513..0000000
--- a/chrome/test/data/webui/settings/chromeos/os_settings_ui_test_2.js
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {CrSettingsPrefs, Router, routes, setContactManagerForTesting, setNearbyShareSettingsForTesting, setUserActionRecorderForTesting} from 'chrome://os-settings/chromeos/os_settings.js';
-import {assert} from 'chrome://resources/ash/common/assert.js';
-import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitBeforeNextRender} from 'chrome://webui-test/polymer_test_util.js';
-
-import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js';
-import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
-import {FakeContactManager} from 'chrome://webui-test/nearby_share/shared/fake_nearby_contact_manager.js';
-import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js';
-
-import {FakeUserActionRecorder} from './fake_user_action_recorder.js';
-
-suite('os-settings-ui', () => {
-  let ui;
-  let userActionRecorder;
-  /** @type {!FakeContactManager} */
-  let fakeContactManager = null;
-  /** @type {!FakeNearbyShareSettings} */
-  let fakeSettings = null;
-
-  setup(async () => {
-    PolymerTest.clearBody();
-
-    fakeContactManager = new FakeContactManager();
-    setContactManagerForTesting(fakeContactManager);
-    fakeContactManager.setupContactRecords();
-
-    fakeSettings = new FakeNearbyShareSettings();
-    setNearbyShareSettingsForTesting(fakeSettings);
-
-    ui = document.createElement('os-settings-ui');
-    document.body.appendChild(ui);
-    await CrSettingsPrefs.initialized;
-    userActionRecorder = new FakeUserActionRecorder();
-    setUserActionRecorderForTesting(userActionRecorder);
-    ui.shadowRoot.querySelector('#drawerTemplate').if = false;
-    flush();
-  });
-
-  teardown(() => {
-    ui.remove();
-    setUserActionRecorderForTesting(null);
-    Router.getInstance().resetRouteForTesting();
-  });
-
-  test('top container shadow always shows for sub-pages', () => {
-    const element = ui.shadowRoot.querySelector('#cr-container-shadow-top');
-    assertTrue(!!element, 'Shadow container element always exists');
-
-    assertFalse(
-        element.classList.contains('has-shadow'),
-        'Main page should not show shadow ' + element.className);
-
-    Router.getInstance().navigateTo(routes.POWER);
-    flush();
-    assertTrue(
-        element.classList.contains('has-shadow'),
-        'Sub-page should show shadow ' + element.className);
-  });
-
-  test('showing menu in toolbar is dependent on narrow mode', () => {
-    const toolbar = assert(ui.shadowRoot.querySelector('os-toolbar'));
-    ui.isNarrow = true;
-    assertTrue(toolbar.showMenu);
-
-    ui.isNarrow = false;
-    assertFalse(toolbar.showMenu);
-  });
-
-  test('app drawer', async () => {
-    assertEquals(
-        null, ui.shadowRoot.querySelector('cr-drawer os-settings-menu'));
-    const drawer = ui.shadowRoot.querySelector('#drawer');
-    assertFalse(drawer.open);
-
-    drawer.openDrawer();
-    flush();
-    await eventToPromise('cr-drawer-opened', drawer);
-
-    // Validate that dialog is open and menu is shown so it will animate.
-    assertTrue(drawer.open);
-    assertTrue(!!ui.shadowRoot.querySelector('cr-drawer os-settings-menu'));
-
-    drawer.cancel();
-    // Drawer is closed, but menu is still stamped so its contents remain
-    // visible as the drawer slides out.
-    assertTrue(!!ui.shadowRoot.querySelector('cr-drawer os-settings-menu'));
-  });
-
-  test('app drawer closes when exiting narrow mode', async () => {
-    const drawer = ui.shadowRoot.querySelector('#drawer');
-    const toolbar = ui.shadowRoot.querySelector('os-toolbar');
-
-    // Mimic narrow mode and open the drawer.
-    ui.isNarrow = true;
-    drawer.openDrawer();
-    flush();
-    await eventToPromise('cr-drawer-opened', drawer);
-
-    ui.isNarrow = false;
-    flush();
-    await eventToPromise('close', drawer);
-    assertFalse(drawer.open);
-  });
-
-  test('advanced UIs stay in sync', () => {
-    const main = ui.shadowRoot.querySelector('os-settings-main');
-    const floatingMenu = ui.shadowRoot.querySelector('#left os-settings-menu');
-    assertTrue(!!main);
-    assertTrue(!!floatingMenu);
-
-    assertFalse(!!ui.shadowRoot.querySelector('cr-drawer os-settings-menu'));
-    assertFalse(ui.advancedOpenedInMain_);
-    assertFalse(ui.advancedOpenedInMenu_);
-    assertFalse(floatingMenu.advancedOpened);
-    assertFalse(main.advancedToggleExpanded);
-
-    main.advancedToggleExpanded = true;
-    flush();
-
-    assertFalse(!!ui.shadowRoot.querySelector('cr-drawer os-settings-menu'));
-    assertTrue(ui.advancedOpenedInMain_);
-    assertTrue(ui.advancedOpenedInMenu_);
-    assertTrue(floatingMenu.advancedOpened);
-    assertTrue(main.advancedToggleExpanded);
-
-    ui.shadowRoot.querySelector('#drawerTemplate').if = true;
-    flush();
-
-    const drawerMenu =
-        ui.shadowRoot.querySelector('cr-drawer os-settings-menu');
-    assertTrue(!!drawerMenu);
-    assertTrue(floatingMenu.advancedOpened);
-    assertTrue(drawerMenu.advancedOpened);
-
-    // Collapse 'Advanced' in the menu.
-    drawerMenu.$.advancedButton.click();
-    flush();
-
-    // Collapsing it in the menu should not collapse it in the main area.
-    assertFalse(drawerMenu.advancedOpened);
-    assertFalse(floatingMenu.advancedOpened);
-    assertFalse(ui.advancedOpenedInMenu_);
-    assertTrue(main.advancedToggleExpanded);
-    assertTrue(ui.advancedOpenedInMain_);
-
-    // Expand both 'Advanced's again.
-    drawerMenu.$.advancedButton.click();
-
-    // Collapse 'Advanced' in the main area.
-    main.advancedToggleExpanded = false;
-    flush();
-
-    // Collapsing it in the main area should not collapse it in the menu.
-    assertFalse(ui.advancedOpenedInMain_);
-    assertTrue(drawerMenu.advancedOpened);
-    assertTrue(floatingMenu.advancedOpened);
-    assertTrue(ui.advancedOpenedInMenu_);
-  });
-
-  // Test that navigating via the paper menu always clears the current
-  // search URL parameter.
-  test('clearsUrlSearchParam', function() {
-    const settingsMenu = ui.shadowRoot.querySelector('os-settings-menu');
-
-    // As of iron-selector 2.x, need to force iron-selector to update before
-    // clicking items on it, or wait for 'iron-items-changed'
-    const ironSelector = settingsMenu.shadowRoot.querySelector('iron-selector');
-    ironSelector.forceSynchronousItemUpdate();
-
-    const urlParams = new URLSearchParams('search=foo');
-    Router.getInstance().navigateTo(routes.BASIC, urlParams);
-    assertEquals(
-        urlParams.toString(),
-        Router.getInstance().getQueryParameters().toString());
-    settingsMenu.$.osPeople.click();
-    assertEquals('', Router.getInstance().getQueryParameters().toString());
-  });
-
-  test('Clicking About menu item should focus About section', async () => {
-    const router = Router.getInstance();
-    const settingsMenu = ui.shadowRoot.querySelector('os-settings-menu');
-
-    // As of iron-selector 2.x, need to force iron-selector to update before
-    // clicking items on it, or wait for 'iron-items-changed'
-    const ironSelector = settingsMenu.shadowRoot.querySelector('iron-selector');
-    ironSelector.forceSynchronousItemUpdate();
-
-    const {aboutItem} = settingsMenu.$;
-    aboutItem.click();
-
-    flush();
-    assertEquals(routes.ABOUT_ABOUT, router.currentRoute);
-    assertNotEquals(aboutItem, settingsMenu.shadowRoot.activeElement);
-
-    const settingsMain = ui.shadowRoot.querySelector('os-settings-main');
-    const aboutPage =
-        settingsMain.shadowRoot.querySelector('os-settings-about-page');
-    await waitBeforeNextRender(aboutPage);
-    const aboutSection =
-        aboutPage.shadowRoot.querySelector(
-            'os-settings-section[section="about"]');
-    assertEquals(aboutSection, aboutPage.shadowRoot.activeElement);
-  });
-
-  test(
-      'Detailed build info page is directly navigable and renders',
-      async () => {
-        const router = Router.getInstance();
-        router.navigateTo(routes.DETAILED_BUILD_INFO);
-
-        const settingsMain = ui.shadowRoot.querySelector('os-settings-main');
-        const aboutPage =
-            settingsMain.shadowRoot.querySelector('os-settings-about-page');
-        const detailedBuildInfoPage = aboutPage.shadowRoot.querySelector(
-            'settings-detailed-build-info-subpage');
-        await waitBeforeNextRender(detailedBuildInfoPage);
-        assertTrue(isVisible(detailedBuildInfoPage));
-      });
-
-  test('userActionRouteChange', function() {
-    assertEquals(userActionRecorder.navigationCount, 0);
-    Router.getInstance().navigateTo(routes.BASIC);
-    flush();
-    assertEquals(userActionRecorder.navigationCount, 1);
-    Router.getInstance().navigateTo(routes.BASIC);
-    flush();
-    assertEquals(userActionRecorder.navigationCount, 1);
-  });
-
-  test('userActionBlurEvent', function() {
-    assertEquals(userActionRecorder.pageBlurCount, 0);
-    ui.fire('blur');
-    assertEquals(userActionRecorder.pageBlurCount, 1);
-  });
-
-  test('userActionClickEvent', () => {
-    assertEquals(userActionRecorder.clickCount, 0);
-    ui.fire('click');
-    assertEquals(userActionRecorder.clickCount, 1);
-  });
-
-  test('userActionFocusEvent', function() {
-    assertEquals(userActionRecorder.pageFocusCount, 0);
-    ui.fire('focus');
-    assertEquals(userActionRecorder.pageFocusCount, 1);
-  });
-
-  test('userActionPrefChange', function() {
-    assertEquals(userActionRecorder.settingChangeCount, 0);
-    ui.shadowRoot.querySelector('#prefs').dispatchEvent(new CustomEvent(
-        'user-action-setting-change',
-        {bubbles: true, composed: true, detail: {}}));
-    assertEquals(userActionRecorder.settingChangeCount, 1);
-  });
-
-  test('toolbar and nav menu are hidden in kiosk mode', function() {
-    loadTimeData.overrideValues({
-      isKioskModeActive: true,
-    });
-
-    ui.remove();
-    Router.getInstance().resetRouteForTesting();
-    PolymerTest.clearBody();
-    ui = document.createElement('os-settings-ui');
-    document.body.appendChild(ui);
-    flush();
-
-    // Toolbar should be hidden.
-    assertFalse(isVisible(ui.shadowRoot.querySelector('os-toolbar')));
-    // All navigation settings menus should be hidden.
-    assertFalse(isVisible(ui.shadowRoot.querySelector('os-settings-menu')));
-  });
-});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
index 84945165..5066c226 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
@@ -261,6 +261,7 @@
  ['DateTimePage', 'date_time_page_tests.js'],
  ['DateTimePageTimezoneSelector', 'date_time_page/timezone_selector_test.js'],
  ['DateTimePageTimezoneSubpage', 'date_time_page/timezone_subpage_test.js'],
+ ['DevicePagePerDeviceMouse', 'device_page/per_device_mouse_test.js'],
  [
    'DisplayAndMagnificationPage',
    'display_and_magnification_page_tests.js',
@@ -406,16 +407,23 @@
    'os_clear_personalization_data_page_test.js'
  ],
  ['OsFilesPageOfficePage', 'os_files_page/office_page_test.js'],
+ [
+   'OsLanguagesPageSmartInputsPage',
+   'os_languages_page/smart_inputs_page_test.js'
+ ],
  ['OsLanguagesPageV2', 'os_languages_page_v2_tests.js'],
  ['OsPairedBluetoothList', 'os_paired_bluetooth_list_tests.js'],
  ['OsPairedBluetoothListItem', 'os_paired_bluetooth_list_item_tests.js'],
  ['OsPeoplePageAddUserDialog', 'os_people_page/add_user_dialog_tests.js'],
  ['OsSettingsPage', 'os_settings_page_test.js'],
  ['OsSettingsUi', 'os_settings_ui/os_settings_ui_test.js'],
- /*
-   Flaky failures: https://crbug.com/1373052
-   ['OsSettingsUi2', 'os_settings_ui_test_2.js'],
- */
+ ['OsSettingsUiAboutPage', 'os_settings_ui/os_settings_ui_about_page_test.js'],
+ ['OsSettingsUiMenu', 'os_settings_ui/os_settings_ui_menu_test.js'],
+ ['OsSettingsUiToolbar', 'os_settings_ui/os_settings_ui_toolbar_test.js'],
+ [
+   'OsSettingsUiUserActionRecorder',
+   'os_settings_ui/user_action_recorder_test.js'
+ ],
  ['OsSettingsMain', 'os_settings_main_test.js'],
  ['OsSearchPage', 'os_search_page_test.js'],
  ['OsSettingsSearchBox', 'os_settings_search_box_test.js'],
@@ -450,12 +458,14 @@
    'per_device_keyboard_subsection_test.js',
    {enabled: ['ash::features::kInputDeviceSettingsSplit']},
  ],
- ['PerDeviceMouse', 'per_device_mouse_test.js'],
  [
    'PerDeviceMouseSubsection', 'per_device_mouse_subsection_test.js',
    {enabled: ['ash::features::kInputDeviceSettingsSplit']}
  ],
- ['PerDevicePointingStick', 'per_device_pointing_stick_test.js'],
+ [
+   'PerDevicePointingStick', 'per_device_pointing_stick_test.js',
+   {enabled: ['ash::features::kInputDeviceSettingsSplit']}
+ ],
  [
    'PerDevicePointingStickSubsection',
    'per_device_pointing_stick_subsection_test.js',
@@ -486,7 +496,6 @@
    {enabled: ['features::kAccessibilitySelectToSpeakPageMigration']},
  ],
  ['SettingsTrafficCounters', 'settings_traffic_counters_test.js'],
- ['SmartInputsPage', 'smart_inputs_page_test.js'],
  ['SmbPage', 'smb_shares_page_tests.js'],
  ['SmartPrivacySubpage', 'smart_privacy_subpage_tests.js'],
  [
diff --git a/chrome/test/data/webui/settings/chromeos/per_device_keyboard_test.js b/chrome/test/data/webui/settings/chromeos/per_device_keyboard_test.js
index 0f02cc1..1455b01 100644
--- a/chrome/test/data/webui/settings/chromeos/per_device_keyboard_test.js
+++ b/chrome/test/data/webui/settings/chromeos/per_device_keyboard_test.js
@@ -2,9 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {DevicePageBrowserProxyImpl, FakeInputDeviceSettingsProvider, fakeKeyboards, Router, routes, setInputDeviceSettingsProviderForTesting, SettingsPerDeviceKeyboardElement} from 'chrome://os-settings/chromeos/os_settings.js';
+import {DevicePageBrowserProxyImpl, fakeKeyboards, fakeKeyboards2, Router, routes, SettingsPerDeviceKeyboardElement} from 'chrome://os-settings/chromeos/os_settings.js';
 import {assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
+import {isVisible} from 'chrome://webui-test/test_util.js';
 
 import {TestDevicePageBrowserProxy} from './test_device_page_browser_proxy.js';
 
@@ -13,30 +14,23 @@
    * @type {?SettingsPerDeviceKeyboardElement}
    */
   let perDeviceKeyboardPage = null;
-  /**
-   * @type {?FakeInputDeviceSettingsProvider}
-   */
-  let provider = null;
 
   setup(() => {
     PolymerTest.clearBody();
-    provider = new FakeInputDeviceSettingsProvider();
-    provider.setFakeKeyboards(fakeKeyboards);
-    setInputDeviceSettingsProviderForTesting(provider);
   });
 
   teardown(() => {
     perDeviceKeyboardPage = null;
-    provider = null;
     Router.getInstance().resetRouteForTesting();
   });
 
-  function initializePerDeviceKeyboardPage() {
+  function initializePerDeviceKeyboardPage(keyboards = fakeKeyboards) {
     DevicePageBrowserProxyImpl.setInstanceForTesting(
         new TestDevicePageBrowserProxy());
     perDeviceKeyboardPage =
         document.createElement('settings-per-device-keyboard');
     assertTrue(perDeviceKeyboardPage != null);
+    perDeviceKeyboardPage.keyboards = keyboards;
     document.body.appendChild(perDeviceKeyboardPage);
     return flushTasks();
   }
@@ -47,12 +41,12 @@
         'settings-per-device-keyboard-subsection');
     assertEquals(fakeKeyboards.length, subsections.length);
 
-    const newFakeKeyboards = fakeKeyboards.slice(1);
-    provider.setFakeKeyboards(newFakeKeyboards);
+    // Check the number of subsections when the keyboard list is updated.
+    perDeviceKeyboardPage.keyboards = fakeKeyboards2;
     await flushTasks();
     subsections = perDeviceKeyboardPage.shadowRoot.querySelectorAll(
         'settings-per-device-keyboard-subsection');
-    assertEquals(newFakeKeyboards.length, subsections.length);
+    assertEquals(fakeKeyboards2.length, subsections.length);
   });
 
   test(
@@ -87,4 +81,17 @@
         .click();
     assertEquals(routes.OS_LANGUAGES_INPUT, Router.getInstance().currentRoute);
   });
+
+  test('Help message shown when no keyboards are connected', async () => {
+    await initializePerDeviceKeyboardPage();
+    perDeviceKeyboardPage.keyboards = [];
+    await flushTasks();
+    assertTrue(isVisible(perDeviceKeyboardPage.shadowRoot.querySelector(
+        '#noKeyboardsConnectedContainer')));
+    assertEquals(
+        'No keyboard detected',
+        perDeviceKeyboardPage.shadowRoot
+            .querySelector('#noKeyboardsConnectedMessage')
+            .innerText.trim());
+  });
 });
diff --git a/chrome/test/data/webui/settings/chromeos/per_device_pointing_stick_test.js b/chrome/test/data/webui/settings/chromeos/per_device_pointing_stick_test.js
index 51cbd6e..9214704 100644
--- a/chrome/test/data/webui/settings/chromeos/per_device_pointing_stick_test.js
+++ b/chrome/test/data/webui/settings/chromeos/per_device_pointing_stick_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {FakeInputDeviceSettingsProvider, fakePointingSticks, setInputDeviceSettingsProviderForTesting, SettingsPerDevicePointingStickElement} from 'chrome://os-settings/chromeos/os_settings.js';
+import {fakePointingSticks, fakePointingSticks2, SettingsPerDevicePointingStickElement} from 'chrome://os-settings/chromeos/os_settings.js';
 import {assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
 
@@ -11,27 +11,21 @@
    * @type {?SettingsPerDevicePointingStickElement}
    */
   let perDevicePointingStickPage = null;
-  /**
-   * @type {?FakeInputDeviceSettingsProvider}
-   */
-  let provider = null;
 
   setup(() => {
     PolymerTest.clearBody();
-    provider = new FakeInputDeviceSettingsProvider();
-    provider.setFakePointingSticks(fakePointingSticks);
-    setInputDeviceSettingsProviderForTesting(provider);
   });
 
   teardown(() => {
     perDevicePointingStickPage = null;
-    provider = null;
   });
 
-  function initializePerDevicePointingStickPage() {
+  function initializePerDevicePointingStickPage(
+      pointingSticks = fakePointingSticks) {
     perDevicePointingStickPage =
         document.createElement('settings-per-device-pointing-stick');
     assertTrue(perDevicePointingStickPage != null);
+    perDevicePointingStickPage.pointingSticks = pointingSticks;
     document.body.appendChild(perDevicePointingStickPage);
     return flushTasks();
   }
@@ -42,12 +36,12 @@
         'settings-per-device-pointing-stick-subsection');
     assertEquals(fakePointingSticks.length, subsections.length);
 
-    const newFakePointingSticks = fakePointingSticks.slice(1);
-    provider.setFakePointingSticks(newFakePointingSticks);
+    // Check the number of subsections when the pointing stick list is updated.
+    perDevicePointingStickPage.pointingSticks = fakePointingSticks2;
     await flushTasks();
     subsections = perDevicePointingStickPage.shadowRoot.querySelectorAll(
         'settings-per-device-pointing-stick-subsection');
-    assertEquals(newFakePointingSticks.length, subsections.length);
+    assertEquals(fakePointingSticks2.length, subsections.length);
   });
 
   test(
diff --git a/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js b/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js
deleted file mode 100644
index 6e46db6..0000000
--- a/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'chrome://os-settings/chromeos/lazy_load.js';
-
-import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
-import {getDeepActiveElement} from 'chrome://resources/ash/common/util.js';
-import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
-
-let smartInputsPage;
-
-function createSmartInputsPage() {
-  PolymerTest.clearBody();
-  smartInputsPage = document.createElement('os-settings-smart-inputs-page');
-  document.body.appendChild(smartInputsPage);
-  flush();
-}
-
-suite('SmartInputsPage', function() {
-  teardown(function() {
-    smartInputsPage.remove();
-    Router.getInstance().resetRouteForTesting();
-  });
-
-  test('emojiSuggestAdditionNotNullWhenAllowEmojiSuggestionIsTrue', function() {
-    loadTimeData.overrideValues({allowEmojiSuggestion: true});
-    createSmartInputsPage();
-    assertTrue(!!smartInputsPage.shadowRoot.querySelector('#emojiSuggestion'));
-  });
-
-  test('emojiSuggestAdditionNullWhenAllowEmojiSuggestionIsFalse', function() {
-    loadTimeData.overrideValues({allowEmojiSuggestion: false});
-    createSmartInputsPage();
-    assertFalse(!!smartInputsPage.shadowRoot.querySelector('#emojiSuggestion'));
-  });
-
-  test('Deep link to emoji suggestion toggle', async () => {
-    loadTimeData.overrideValues({
-      allowEmojiSuggestion: true,
-    });
-    createSmartInputsPage();
-
-    const params = new URLSearchParams();
-    params.append('settingId', '1203');
-    Router.getInstance().navigateTo(
-        routes.OS_LANGUAGES_SMART_INPUTS, params);
-
-    flush();
-
-    const deepLinkElement =
-        smartInputsPage.shadowRoot.querySelector('#emojiSuggestion')
-            .shadowRoot.querySelector('cr-toggle');
-    await waitAfterNextRender(deepLinkElement);
-    assertEquals(
-        deepLinkElement, getDeepActiveElement(),
-        'Emoji suggestion toggle should be focused for settingId=1203.');
-  });
-});
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index c1d6e67..a7458e72 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -1042,13 +1042,6 @@
    ],
  ],
  [
-   'PrivacyGuideIntegration',
-   'privacy_guide_integration_test.js',
-   [
-     'PrivacyGuideEligibleReachedMetricsTests',
-   ],
- ],
- [
    'PrivacyGuideFragments',
    'privacy_guide_fragments_test.js',
    [
@@ -1063,6 +1056,13 @@
  ],
 ].forEach(test => registerTestSuites(...test));
 
+// TODO(https://crbug.com/1426530): Re-enable when no longer flaky.
+GEN('#if !BUILDFLAG(IS_LINUX) || defined(NDEBUG)');
+registerTestSuites(
+    'PrivacyGuideIntegration', 'privacy_guide_integration_test.js',
+    ['PrivacyGuideEligibleReachedMetricsTests']);
+GEN('#endif');
+
 // TODO(crbug.com/1403969): SecurityPage_SafeBrowsing suite is flaky on Mac.
 // TODO(crbug.com/1404109): SecurityPage_SafeBrowsing suite is flaky on Linux.
 GEN('#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_LINUX)');
diff --git a/chrome/test/media_router/media_router_e2e_browsertest.cc b/chrome/test/media_router/media_router_e2e_browsertest.cc
index a07431a8..447fb97 100644
--- a/chrome/test/media_router/media_router_e2e_browsertest.cc
+++ b/chrome/test/media_router/media_router_e2e_browsertest.cc
@@ -56,6 +56,10 @@
   MediaRouterIntegrationBrowserTest::TearDownOnMainThread();
 }
 
+bool MediaRouterE2EBrowserTest::RequiresMediaRouteProviders() const {
+  return true;
+}
+
 void MediaRouterE2EBrowserTest::OnRouteResponseReceived(
     mojom::RoutePresentationConnectionPtr,
     const RouteRequestResult& result) {
diff --git a/chrome/test/media_router/media_router_e2e_browsertest.h b/chrome/test/media_router/media_router_e2e_browsertest.h
index ad356293..ea3506d8 100644
--- a/chrome/test/media_router/media_router_e2e_browsertest.h
+++ b/chrome/test/media_router/media_router_e2e_browsertest.h
@@ -23,7 +23,6 @@
 //
 // Use the following command to run e2e browser tests:
 // ./out/Default/browser_tests --user-data-dir=<empty user data dir>
-//   --extension-unpacked=<mr extension dir>
 //   --receiver=<chromecast device name>
 //   --enable-pixel-output-in-tests --run-manual
 //   --gtest_filter=MediaRouterE2EBrowserTest.<test case name>
@@ -39,6 +38,9 @@
   void SetUpOnMainThread() override;
   void TearDownOnMainThread() override;
 
+  // MediaRouterIntegrationBrowserTest Overrides
+  bool RequiresMediaRouteProviders() const override;
+
   // Callback from MediaRouter when a response to a media route request is
   // received.
   void OnRouteResponseReceived(mojom::RoutePresentationConnectionPtr,
diff --git a/chrome/test/media_router/media_router_integration_browsertest.cc b/chrome/test/media_router/media_router_integration_browsertest.cc
index 1dab36b3..1658e8cd 100644
--- a/chrome/test/media_router/media_router_integration_browsertest.cc
+++ b/chrome/test/media_router/media_router_integration_browsertest.cc
@@ -126,8 +126,10 @@
       switches::kAutoplayPolicy,
       // Needed to allow a video to autoplay from a browser test.
       switches::autoplay::kNoUserGestureRequiredPolicy);
-  // Disable built-in media route providers.
-  command_line->AppendSwitch(kDisableMediaRouteProvidersForTestSwitch);
+  if (!RequiresMediaRouteProviders()) {
+    // Disable built-in media route providers.
+    command_line->AppendSwitch(kDisableMediaRouteProvidersForTestSwitch);
+  }
 }
 
 void MediaRouterIntegrationBrowserTest::SetUp() {
@@ -482,6 +484,10 @@
   ASSERT_EQ(session_id, reconnected_session_id);
 }
 
+bool MediaRouterIntegrationBrowserTest::RequiresMediaRouteProviders() const {
+  return false;
+}
+
 // TODO(crbug.com/1238758): Test is flaky on Windows and Linux.
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
 #define MAYBE_Basic MANUAL_Basic
diff --git a/chrome/test/media_router/media_router_integration_browsertest.h b/chrome/test/media_router/media_router_integration_browsertest.h
index edd84764..e4211f1 100644
--- a/chrome/test/media_router/media_router_integration_browsertest.h
+++ b/chrome/test/media_router/media_router_integration_browsertest.h
@@ -183,6 +183,10 @@
 
   void WaitUntilNoRoutes(content::WebContents* web_contents);
 
+  // Returns whether actual media route providers (as opposed to
+  // TestMediaRouteProvider) should be loaded.
+  virtual bool RequiresMediaRouteProviders() const;
+
   // Test API for manipulating the UI.
   raw_ptr<MediaRouterUiForTestBase, DanglingUntriaged> test_ui_ = nullptr;
 
diff --git a/chrome/test/webapps/data/actions.md b/chrome/test/webapps/data/actions.md
index e07ebf2..d55589ad 100644
--- a/chrome/test/webapps/data/actions.md
+++ b/chrome/test/webapps/data/actions.md
@@ -114,7 +114,6 @@
 | maybe_close_pwa |  |  | 143 | Implemented | Close the current app window if there is one open. |  |
 | open_app_settings | Site | open_app_settings_from_chrome_apps($1) & open_app_settings_from_app_menu($1) | 95 | Parameterized | Launch chrome://app-settings/<app-id> page | phillis@ |
 | open_app_settings_from_app_menu | Site |  | 97 | Implemented |  | phillis@ |
-| open_app_settings_from_chrome_apps | Site |  | 96 | Implemented |  | phillis@ |
 | open_in_chrome |  |  | 71 | Implemented | Click on the 'open in chrome' link in the 3-dot menu of the app window | cliffordcheng@, P1 |
 | set_open_in_tab | Site | set_open_in_tab_from_app_settings($1) & set_open_in_tab_from_app_home($1) | 148 | Parameterized | All methods to toggle an app to open in a tab in the same window. | dibyapal@ |
 | set_open_in_tab_from_app_settings | Site |  | 149 | Implemented | Toggle the "open in window"  option in the chrome://app-settings/<app-id> page to disable an app from opening in a separate window, so that the app opens in a tab in the same window. | dibyapal@ |
@@ -122,7 +121,6 @@
 | set_open_in_window_from_app_settings | Site |  | 150 | Implemented | Toggle the "open in window" option in the chrome://app-settings/<app-id> page to enable an app to launch in a separate window. | dibyapal@ |
 | check_window_color_correct | Site |  | 77 | Not Implemented | The color of the window is correct. | P3 |
 | check_window_icon_correct | Site |  | 78 | Not Implemented |  | P3 |
-| create_shortcuts_from_list | Site |  | 72 | Implemented | "create shortcuts" in chrome://apps. Win/Mac/Linux only. | P2 |
 | delete_platform_shortcut | Site |  | 74 | Implemented | Delete the shortcut that lives on the operating system. Win/Mac/Linux only. | P2 |
 | delete_profile |  |  | 83 | Not Implemented | Delete the user profile. | P4 |
 | # Launching |
@@ -187,4 +185,6 @@
 | disable_run_on_os_login_from_app_home | Site |  | 152 | Implemented | Unchecks the `launch at startup` checkbox from the chrome://apps context menu by right clicking an app icon. | dibyapal@ |
 | check_user_cannot_set_run_on_os_login_app_home | Site | | 157 | Implemented | Checks that the user cannot set the `launch at startup` checkbox from the chrome://apps context menu by right clicking an app icon. | dibyapal@ |
 | install_locally | Site |  | 46 | Implemented | Find the app in the app list (chrome://apps) and install it by right-clicking on the app and selecting the 'install' option. Win/Mac/Linux only. |  |
-| uninstall_from_list | Site |  | 10 | Implemented | Uninstall the webapp from wherever apps are listed by chrome. On WML, this is from chrome://apps, and on ChromeOS, this is from the 'launcher' |  |
\ No newline at end of file
+| uninstall_from_list | Site |  | 10 | Implemented | Uninstall the webapp from wherever apps are listed by chrome. On WML, this is from chrome://apps, and on ChromeOS, this is from the 'launcher' |  |
+| create_shortcuts_from_list | Site |  | 72 | Implemented | "create shortcuts" in chrome://apps. Win/Mac/Linux only. | P2 |
+| open_app_settings_from_chrome_apps | Site |  | 96 | Implemented |  | phillis@ |
\ No newline at end of file
diff --git a/chrome/updater/app/app_install.cc b/chrome/updater/app/app_install.cc
index b7cd8e9..49d2d0c8 100644
--- a/chrome/updater/app/app_install.cc
+++ b/chrome/updater/app/app_install.cc
@@ -91,8 +91,8 @@
     : splash_screen_maker_(std::move(splash_screen_maker)),
       app_install_controller_maker_(app_install_controller_maker),
       external_constants_(CreateExternalConstants()) {
-  DCHECK(splash_screen_maker_);
-  DCHECK(app_install_controller_maker_);
+  CHECK(splash_screen_maker_);
+  CHECK(app_install_controller_maker_);
 }
 
 AppInstall::~AppInstall() = default;
@@ -104,7 +104,6 @@
 
 void AppInstall::FirstTaskRun() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(base::SequencedTaskRunner::HasCurrentDefault());
 
   if (WrongUser(updater_scope())) {
     VLOG(0) << "The current user is not compatible with the current scope. "
diff --git a/chrome/updater/app/app_install_win.cc b/chrome/updater/app/app_install_win.cc
index b184d61b..bb6e33d8 100644
--- a/chrome/updater/app/app_install_win.cc
+++ b/chrome/updater/app/app_install_win.cc
@@ -105,7 +105,7 @@
 InstallProgressSilentObserver::InstallProgressSilentObserver(
     ui::OmahaWndEvents* events_sink)
     : events_sink_(events_sink) {
-  DCHECK(events_sink_);
+  CHECK(events_sink_);
 }
 
 void InstallProgressSilentObserver::OnCheckingForUpdate() {
@@ -161,7 +161,7 @@
 void InstallProgressSilentObserver::OnComplete(
     const ObserverCompletionInfo& observer_info) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(events_sink_);
+  CHECK(events_sink_);
   VLOG(1) << __func__;
 
   // TODO(crbug.com/1286580): Launch `post_install_launch_command_line` for
@@ -184,7 +184,7 @@
   InstallProgressObserverIPC(InstallProgressObserver* observer,
                              DWORD observer_thread_id)
       : observer_(observer), observer_thread_id_(observer_thread_id) {
-    DCHECK(observer);
+    CHECK(observer);
   }
 
   InstallProgressObserverIPC(const InstallProgressObserverIPC&) = delete;
@@ -207,7 +207,7 @@
   // Overrides for InstallProgressObserver.
   void OnCheckingForUpdate() override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    DCHECK(observer_);
+    CHECK(observer_);
     PostClosure(base::BindOnce(&InstallProgressObserver::OnUpdateAvailable,
                                base::Unretained(observer_), std::u16string(),
                                std::u16string(), std::u16string()));
@@ -217,7 +217,7 @@
                          const std::u16string& app_name,
                          const std::u16string& version_string) override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    DCHECK(observer_);
+    CHECK(observer_);
     PostClosure(base::BindOnce(&InstallProgressObserver::OnUpdateAvailable,
                                base::Unretained(observer_), app_id, app_name,
                                version_string));
@@ -233,7 +233,7 @@
                      int time_remaining_ms,
                      int pos) override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    DCHECK(observer_);
+    CHECK(observer_);
     PostClosure(base::BindOnce(&InstallProgressObserver::OnDownloading,
                                base::Unretained(observer_), app_id, app_name,
                                time_remaining_ms, pos));
@@ -249,7 +249,7 @@
                           const std::u16string& app_name,
                           bool* can_start_install) override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    DCHECK(observer_);
+    CHECK(observer_);
 
     // TODO(crbug.com/1014591): handle `can_start_install`.
     PostClosure(base::BindOnce(&InstallProgressObserver::OnWaitingToInstall,
@@ -262,7 +262,7 @@
                     int time_remaining_ms,
                     int pos) override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    DCHECK(observer_);
+    CHECK(observer_);
 
     // TODO(crbug.com/1014594): implement progress.
     PostClosure(base::BindOnce(&InstallProgressObserver::OnInstalling,
@@ -274,7 +274,7 @@
 
   void OnComplete(const ObserverCompletionInfo& observer_info) override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    DCHECK(observer_);
+    CHECK(observer_);
     PostClosure(base::BindOnce(&InstallProgressObserver::OnComplete,
                                base::Unretained(observer_), observer_info));
   }
@@ -693,7 +693,7 @@
 void AppInstallControllerImpl::StateChange(
     const UpdateService::UpdateState& update_state) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(install_progress_observer_ipc_);
+  CHECK(install_progress_observer_ipc_);
 
   CHECK_EQ(app_id_, update_state.app_id);
 
@@ -845,7 +845,7 @@
 // Creates the install progress observer. The observer has thread affinity. It
 // must be created, process its messages, and be destroyed on the same thread.
 void AppInstallControllerImpl::InitializeUI() {
-  DCHECK(ui_task_runner_->RunsTasksInCurrentSequence());
+  CHECK(ui_task_runner_->RunsTasksInCurrentSequence());
 
   base::ScopedDisallowBlocking no_blocking_allowed_on_ui_thread;
 
@@ -885,7 +885,7 @@
 }
 
 void AppInstallControllerImpl::RunUI() {
-  DCHECK(ui_task_runner_->RunsTasksInCurrentSequence());
+  CHECK(ui_task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(GetUIThreadID(), GetCurrentThreadId());
 
   ui_message_loop_->Run();
diff --git a/chrome/updater/app/app_recover.cc b/chrome/updater/app/app_recover.cc
index a1165992..02d9055 100644
--- a/chrome/updater/app/app_recover.cc
+++ b/chrome/updater/app/app_recover.cc
@@ -17,6 +17,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/path_service.h"
 #include "base/process/launch.h"
+#include "base/strings/string_util.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/version.h"
@@ -92,7 +93,7 @@
   std::vector<RegistrationRequest> apps;
   bool found_browser_registration = false;
   for (const std::string& app : data->GetAppIds()) {
-    if (app == kUpdaterAppId) {
+    if (base::EqualsCaseInsensitiveASCII(app, kUpdaterAppId)) {
       continue;
     }
     RegistrationRequest registration;
diff --git a/chrome/updater/app/app_uninstall.cc b/chrome/updater/app/app_uninstall.cc
index 7774b2f..1c2328b 100644
--- a/chrome/updater/app/app_uninstall.cc
+++ b/chrome/updater/app/app_uninstall.cc
@@ -159,6 +159,7 @@
     if (!global_prefs_) {
       VLOG(0) << "Failed to acquire global prefs; shutting down.";
       Shutdown(kErrorFailedToLockPrefsMutex);
+      return;
     }
     auto persisted_data = base::MakeRefCounted<PersistedData>(
         updater_scope(), global_prefs_->GetPrefService());
diff --git a/chrome/updater/app/server/win/com_classes.cc b/chrome/updater/app/server/win/com_classes.cc
index 7116ef3..6cdf590 100644
--- a/chrome/updater/app/server/win/com_classes.cc
+++ b/chrome/updater/app/server/win/com_classes.cc
@@ -40,20 +40,20 @@
 }  // namespace
 
 STDMETHODIMP UpdateStateImpl::get_state(LONG* state) {
-  DCHECK(state);
+  CHECK(state);
   *state = static_cast<LONG>(update_state_.state);
   return S_OK;
 }
 
 STDMETHODIMP UpdateStateImpl::get_appId(BSTR* app_id) {
-  DCHECK(app_id);
+  CHECK(app_id);
   *app_id =
       base::win::ScopedBstr(base::UTF8ToWide(update_state_.app_id)).Release();
   return S_OK;
 }
 
 STDMETHODIMP UpdateStateImpl::get_nextVersion(BSTR* next_version) {
-  DCHECK(next_version);
+  CHECK(next_version);
   *next_version =
       base::win::ScopedBstr(
           update_state_.next_version.IsValid()
@@ -64,43 +64,43 @@
 }
 
 STDMETHODIMP UpdateStateImpl::get_downloadedBytes(LONGLONG* downloaded_bytes) {
-  DCHECK(downloaded_bytes);
+  CHECK(downloaded_bytes);
   *downloaded_bytes = LONGLONG{update_state_.downloaded_bytes};
   return S_OK;
 }
 
 STDMETHODIMP UpdateStateImpl::get_totalBytes(LONGLONG* total_bytes) {
-  DCHECK(total_bytes);
+  CHECK(total_bytes);
   *total_bytes = LONGLONG{update_state_.total_bytes};
   return S_OK;
 }
 
 STDMETHODIMP UpdateStateImpl::get_installProgress(LONG* install_progress) {
-  DCHECK(install_progress);
+  CHECK(install_progress);
   *install_progress = LONG{update_state_.install_progress};
   return S_OK;
 }
 
 STDMETHODIMP UpdateStateImpl::get_errorCategory(LONG* error_category) {
-  DCHECK(error_category);
+  CHECK(error_category);
   *error_category = static_cast<LONG>(update_state_.error_category);
   return S_OK;
 }
 
 STDMETHODIMP UpdateStateImpl::get_errorCode(LONG* error_code) {
-  DCHECK(error_code);
+  CHECK(error_code);
   *error_code = LONG{update_state_.error_code};
   return S_OK;
 }
 
 STDMETHODIMP UpdateStateImpl::get_extraCode1(LONG* extra_code1) {
-  DCHECK(extra_code1);
+  CHECK(extra_code1);
   *extra_code1 = LONG{update_state_.extra_code1};
   return S_OK;
 }
 
 STDMETHODIMP UpdateStateImpl::get_installerText(BSTR* installer_text) {
-  DCHECK(installer_text);
+  CHECK(installer_text);
   *installer_text =
       base::win::ScopedBstr(base::UTF8ToWide(update_state_.installer_text))
           .Release();
@@ -109,7 +109,7 @@
 
 STDMETHODIMP UpdateStateImpl::get_installerCommandLine(
     BSTR* installer_cmd_line) {
-  DCHECK(installer_cmd_line);
+  CHECK(installer_cmd_line);
   *installer_cmd_line =
       base::win::ScopedBstr(base::UTF8ToWide(update_state_.installer_cmd_line))
           .Release();
@@ -117,13 +117,13 @@
 }
 
 STDMETHODIMP CompleteStatusImpl::get_statusCode(LONG* code) {
-  DCHECK(code);
+  CHECK(code);
   *code = code_;
   return S_OK;
 }
 
 STDMETHODIMP CompleteStatusImpl::get_statusMessage(BSTR* message) {
-  DCHECK(message);
+  CHECK(message);
   *message = base::win::ScopedBstr(message_).Release();
   return S_OK;
 }
@@ -133,7 +133,7 @@
 }
 
 HRESULT UpdaterImpl::GetVersion(BSTR* version) {
-  DCHECK(version);
+  CHECK(version);
 
   // Return the hardcoded version instead of calling the corresponding
   // non-blocking function of `UpdateServiceImpl`. This results in some
diff --git a/chrome/updater/app/server/win/com_classes_legacy.cc b/chrome/updater/app/server/win/com_classes_legacy.cc
index f880bd2..418bf1f 100644
--- a/chrome/updater/app/server/win/com_classes_legacy.cc
+++ b/chrome/updater/app/server/win/com_classes_legacy.cc
@@ -114,7 +114,7 @@
 
   // Overrides for IAppVersionWeb.
   IFACEMETHODIMP get_version(BSTR* version) override {
-    DCHECK(version);
+    CHECK(version);
 
     *version = base::win::ScopedBstr(version_).Release();
     return S_OK;
@@ -185,21 +185,21 @@
 
   // Overrides for ICurrentState.
   IFACEMETHODIMP get_stateValue(LONG* state_value) override {
-    DCHECK(state_value);
+    CHECK(state_value);
 
     *state_value = state_value_;
     return S_OK;
   }
 
   IFACEMETHODIMP get_availableVersion(BSTR* available_version) override {
-    DCHECK(available_version);
+    CHECK(available_version);
 
     *available_version = base::win::ScopedBstr(available_version_).Release();
     return S_OK;
   }
 
   IFACEMETHODIMP get_bytesDownloaded(ULONG* bytes_downloaded) override {
-    DCHECK(bytes_downloaded);
+    CHECK(bytes_downloaded);
 
     *bytes_downloaded = bytes_downloaded_;
     return S_OK;
@@ -207,7 +207,7 @@
 
   IFACEMETHODIMP get_totalBytesToDownload(
       ULONG* total_bytes_to_download) override {
-    DCHECK(total_bytes_to_download);
+    CHECK(total_bytes_to_download);
 
     *total_bytes_to_download = total_bytes_to_download_;
     return S_OK;
@@ -215,14 +215,14 @@
 
   IFACEMETHODIMP get_downloadTimeRemainingMs(
       LONG* download_time_remaining_ms) override {
-    DCHECK(download_time_remaining_ms);
+    CHECK(download_time_remaining_ms);
 
     *download_time_remaining_ms = download_time_remaining_ms_;
     return S_OK;
   }
 
   IFACEMETHODIMP get_nextRetryTime(ULONGLONG* next_retry_time) override {
-    DCHECK(next_retry_time);
+    CHECK(next_retry_time);
 
     *next_retry_time = next_retry_time_;
     return S_OK;
@@ -230,7 +230,7 @@
 
   IFACEMETHODIMP get_installProgress(
       LONG* install_progress_percentage) override {
-    DCHECK(install_progress_percentage);
+    CHECK(install_progress_percentage);
 
     *install_progress_percentage = install_progress_percentage_;
     return S_OK;
@@ -238,42 +238,42 @@
 
   IFACEMETHODIMP get_installTimeRemainingMs(
       LONG* install_time_remaining_ms) override {
-    DCHECK(install_time_remaining_ms);
+    CHECK(install_time_remaining_ms);
 
     *install_time_remaining_ms = install_time_remaining_ms_;
     return S_OK;
   }
 
   IFACEMETHODIMP get_isCanceled(VARIANT_BOOL* is_canceled) override {
-    DCHECK(is_canceled);
+    CHECK(is_canceled);
 
     *is_canceled = is_canceled_;
     return S_OK;
   }
 
   IFACEMETHODIMP get_errorCode(LONG* error_code) override {
-    DCHECK(error_code);
+    CHECK(error_code);
 
     *error_code = error_code_;
     return S_OK;
   }
 
   IFACEMETHODIMP get_extraCode1(LONG* extra_code1) override {
-    DCHECK(extra_code1);
+    CHECK(extra_code1);
 
     *extra_code1 = extra_code1_;
     return S_OK;
   }
 
   IFACEMETHODIMP get_completionMessage(BSTR* completion_message) override {
-    DCHECK(completion_message);
+    CHECK(completion_message);
 
     *completion_message = base::win::ScopedBstr(completion_message_).Release();
     return S_OK;
   }
 
   IFACEMETHODIMP get_installerResultCode(LONG* installer_result_code) override {
-    DCHECK(installer_result_code);
+    CHECK(installer_result_code);
 
     *installer_result_code = installer_result_code_;
     return S_OK;
@@ -281,7 +281,7 @@
 
   IFACEMETHODIMP get_installerResultExtraCode1(
       LONG* installer_result_extra_code1) override {
-    DCHECK(installer_result_extra_code1);
+    CHECK(installer_result_extra_code1);
 
     *installer_result_extra_code1 = installer_result_extra_code1_;
     return S_OK;
@@ -289,7 +289,7 @@
 
   IFACEMETHODIMP get_postInstallLaunchCommandLine(
       BSTR* post_install_launch_command_line) override {
-    DCHECK(post_install_launch_command_line);
+    CHECK(post_install_launch_command_line);
 
     *post_install_launch_command_line =
         base::win::ScopedBstr(post_install_launch_command_line_).Release();
@@ -297,14 +297,14 @@
   }
 
   IFACEMETHODIMP get_postInstallUrl(BSTR* post_install_url) override {
-    DCHECK(post_install_url);
+    CHECK(post_install_url);
 
     *post_install_url = base::win::ScopedBstr(post_install_url_).Release();
     return S_OK;
   }
 
   IFACEMETHODIMP get_postInstallAction(LONG* post_install_action) override {
-    DCHECK(post_install_action);
+    CHECK(post_install_action);
 
     *post_install_action = post_install_action_;
     return S_OK;
@@ -418,7 +418,7 @@
 
   // Overrides for IAppWeb.
   IFACEMETHODIMP get_appId(BSTR* app_id) override {
-    DCHECK(app_id);
+    CHECK(app_id);
 
     *app_id = base::win::ScopedBstr(base::ASCIIToWide(app_id_)).Release();
     return S_OK;
@@ -492,7 +492,7 @@
   }
 
   IFACEMETHODIMP get_currentState(IDispatch** current_state) override {
-    DCHECK(current_state);
+    CHECK(current_state);
 
     base::AutoLock lock{lock_};
 
@@ -777,7 +777,7 @@
 
 STDMETHODIMP LegacyOnDemandImpl::createAppBundleWeb(
     IDispatch** app_bundle_web) {
-  DCHECK(app_bundle_web);
+  CHECK(app_bundle_web);
 
   return Microsoft::WRL::MakeAndInitialize<AppBundleWebImpl>(app_bundle_web);
 }
@@ -856,7 +856,7 @@
 }
 
 STDMETHODIMP LegacyAppCommandWebImpl::get_status(UINT* status) {
-  DCHECK(status);
+  CHECK(status);
 
   if (!process_.IsValid()) {
     *status = COMMAND_STATUS_INIT;
@@ -870,7 +870,7 @@
 }
 
 STDMETHODIMP LegacyAppCommandWebImpl::get_exitCode(DWORD* exit_code) {
-  DCHECK(exit_code);
+  CHECK(exit_code);
 
   int code = -1;
   if (!process_.IsValid() ||
@@ -928,7 +928,7 @@
 
 // IPolicyStatus.
 STDMETHODIMP PolicyStatusImpl::get_lastCheckPeriodMinutes(DWORD* minutes) {
-  DCHECK(minutes);
+  CHECK(minutes);
 
   PolicyStatus<base::TimeDelta> period = policy_service_->GetLastCheckPeriod();
   if (!period) {
@@ -944,10 +944,10 @@
     DWORD* start_min,
     DWORD* duration_min,
     VARIANT_BOOL* are_updates_suppressed) {
-  DCHECK(start_hour);
-  DCHECK(start_min);
-  DCHECK(duration_min);
-  DCHECK(are_updates_suppressed);
+  CHECK(start_hour);
+  CHECK(start_min);
+  CHECK(duration_min);
+  CHECK(are_updates_suppressed);
 
   PolicyStatus<UpdatesSuppressedTimes> updates_suppressed_times =
       policy_service_->GetUpdatesSuppressedTimes();
@@ -969,7 +969,7 @@
 }
 
 STDMETHODIMP PolicyStatusImpl::get_downloadPreferenceGroupPolicy(BSTR* pref) {
-  DCHECK(pref);
+  CHECK(pref);
 
   PolicyStatus<std::string> download_preference =
       policy_service_->GetDownloadPreferenceGroupPolicy();
@@ -983,7 +983,7 @@
 }
 
 STDMETHODIMP PolicyStatusImpl::get_packageCacheSizeLimitMBytes(DWORD* limit) {
-  DCHECK(limit);
+  CHECK(limit);
 
   PolicyStatus<int> cache_size_limit =
       policy_service_->GetPackageCacheSizeLimitMBytes();
@@ -996,7 +996,7 @@
 }
 
 STDMETHODIMP PolicyStatusImpl::get_packageCacheExpirationTimeDays(DWORD* days) {
-  DCHECK(days);
+  CHECK(days);
 
   PolicyStatus<int> cache_life_limit =
       policy_service_->GetPackageCacheExpirationTimeDays();
@@ -1011,7 +1011,7 @@
 STDMETHODIMP PolicyStatusImpl::get_effectivePolicyForAppInstalls(
     BSTR app_id,
     DWORD* policy) {
-  DCHECK(policy);
+  CHECK(policy);
 
   PolicyStatus<int> install_policy =
       policy_service_->GetPolicyForAppInstalls(base::WideToASCII(app_id));
@@ -1025,7 +1025,7 @@
 
 STDMETHODIMP PolicyStatusImpl::get_effectivePolicyForAppUpdates(BSTR app_id,
                                                                 DWORD* policy) {
-  DCHECK(policy);
+  CHECK(policy);
 
   PolicyStatus<int> update_policy =
       policy_service_->GetPolicyForAppUpdates(base::WideToASCII(app_id));
@@ -1039,7 +1039,7 @@
 
 STDMETHODIMP PolicyStatusImpl::get_targetVersionPrefix(BSTR app_id,
                                                        BSTR* prefix) {
-  DCHECK(prefix);
+  CHECK(prefix);
 
   PolicyStatus<std::string> target_version_prefix =
       policy_service_->GetTargetVersionPrefix(base::WideToASCII(app_id));
@@ -1056,7 +1056,7 @@
 STDMETHODIMP PolicyStatusImpl::get_isRollbackToTargetVersionAllowed(
     BSTR app_id,
     VARIANT_BOOL* rollback_allowed) {
-  DCHECK(rollback_allowed);
+  CHECK(rollback_allowed);
 
   PolicyStatus<bool> is_rollback_allowed =
       policy_service_->IsRollbackToTargetVersionAllowed(
@@ -1071,7 +1071,7 @@
 }
 
 STDMETHODIMP PolicyStatusImpl::get_updaterVersion(BSTR* version) {
-  DCHECK(version);
+  CHECK(version);
 
   *version = base::win::ScopedBstr(kUpdaterVersionUtf16).Release();
   return S_OK;
@@ -1129,7 +1129,7 @@
 }  // namespace
 
 STDMETHODIMP PolicyStatusImpl::get_lastCheckedTime(DATE* last_checked) {
-  DCHECK(last_checked);
+  CHECK(last_checked);
 
   using PolicyStatusImplPtr = Microsoft::WRL::ComPtr<PolicyStatusImpl>;
   auto result = base::MakeRefCounted<LastCheckedTimeResult>();
@@ -1193,7 +1193,7 @@
 
 STDMETHODIMP PolicyStatusImpl::get_lastCheckPeriodMinutes(
     IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<int>::Get(base::BindRepeating(
       &PolicyService::DeprecatedGetLastCheckPeriodMinutes, policy_service_));
   return policy_status.has_value()
@@ -1204,8 +1204,8 @@
 STDMETHODIMP PolicyStatusImpl::get_updatesSuppressedTimes(
     IPolicyStatusValue** value,
     VARIANT_BOOL* are_updates_suppressed) {
-  DCHECK(value);
-  DCHECK(are_updates_suppressed);
+  CHECK(value);
+  CHECK(are_updates_suppressed);
 
   auto policy_status =
       PolicyStatusResult<UpdatesSuppressedTimes>::Get(base::BindRepeating(
@@ -1228,7 +1228,7 @@
 
 STDMETHODIMP PolicyStatusImpl::get_downloadPreferenceGroupPolicy(
     IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<std::string>::Get(base::BindRepeating(
       &PolicyService::GetDownloadPreferenceGroupPolicy, policy_service_));
   return policy_status.has_value()
@@ -1238,7 +1238,7 @@
 
 STDMETHODIMP PolicyStatusImpl::get_packageCacheSizeLimitMBytes(
     IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<int>::Get(base::BindRepeating(
       &PolicyService::GetPackageCacheSizeLimitMBytes, policy_service_));
   return policy_status.has_value()
@@ -1248,7 +1248,7 @@
 
 STDMETHODIMP PolicyStatusImpl::get_packageCacheExpirationTimeDays(
     IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<int>::Get(base::BindRepeating(
       &PolicyService::GetPackageCacheExpirationTimeDays, policy_service_));
   return policy_status.has_value()
@@ -1257,7 +1257,7 @@
 }
 
 STDMETHODIMP PolicyStatusImpl::get_proxyMode(IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<std::string>::Get(
       base::BindRepeating(&PolicyService::GetProxyMode, policy_service_));
   return policy_status.has_value()
@@ -1266,7 +1266,7 @@
 }
 
 STDMETHODIMP PolicyStatusImpl::get_proxyPacUrl(IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<std::string>::Get(
       base::BindRepeating(&PolicyService::GetProxyPacUrl, policy_service_));
   return policy_status.has_value()
@@ -1275,7 +1275,7 @@
 }
 
 STDMETHODIMP PolicyStatusImpl::get_proxyServer(IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<std::string>::Get(
       base::BindRepeating(&PolicyService::GetProxyServer, policy_service_));
   return policy_status.has_value()
@@ -1286,7 +1286,7 @@
 STDMETHODIMP PolicyStatusImpl::get_effectivePolicyForAppInstalls(
     BSTR app_id,
     IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<int>::Get(
       base::BindRepeating(&PolicyService::GetPolicyForAppInstalls,
                           policy_service_, base::WideToASCII(app_id)));
@@ -1298,7 +1298,7 @@
 STDMETHODIMP PolicyStatusImpl::get_effectivePolicyForAppUpdates(
     BSTR app_id,
     IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<int>::Get(
       base::BindRepeating(&PolicyService::GetPolicyForAppUpdates,
                           policy_service_, base::WideToASCII(app_id)));
@@ -1310,7 +1310,7 @@
 STDMETHODIMP PolicyStatusImpl::get_targetVersionPrefix(
     BSTR app_id,
     IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<std::string>::Get(
       base::BindRepeating(&PolicyService::GetTargetVersionPrefix,
                           policy_service_, base::WideToASCII(app_id)));
@@ -1322,7 +1322,7 @@
 STDMETHODIMP PolicyStatusImpl::get_isRollbackToTargetVersionAllowed(
     BSTR app_id,
     IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<bool>::Get(
       base::BindRepeating(&PolicyService::IsRollbackToTargetVersionAllowed,
                           policy_service_, base::WideToASCII(app_id)));
@@ -1333,7 +1333,7 @@
 
 STDMETHODIMP PolicyStatusImpl::get_targetChannel(BSTR app_id,
                                                  IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status = PolicyStatusResult<std::string>::Get(
       base::BindRepeating(&PolicyService::GetTargetChannel, policy_service_,
                           base::WideToASCII(app_id)));
@@ -1345,7 +1345,7 @@
 STDMETHODIMP PolicyStatusImpl::get_forceInstallApps(
     VARIANT_BOOL is_machine,
     IPolicyStatusValue** value) {
-  DCHECK(value);
+  CHECK(value);
   auto policy_status =
       PolicyStatusResult<std::vector<std::string>>::Get(base::BindRepeating(
           &PolicyService::GetForceInstallApps, policy_service_));
@@ -1423,14 +1423,14 @@
 
 // IPolicyStatusValue.
 STDMETHODIMP PolicyStatusValueImpl::get_source(BSTR* source) {
-  DCHECK(source);
+  CHECK(source);
 
   *source = base::win::ScopedBstr(source_).Release();
   return S_OK;
 }
 
 STDMETHODIMP PolicyStatusValueImpl::get_value(BSTR* value) {
-  DCHECK(value);
+  CHECK(value);
 
   *value = base::win::ScopedBstr(value_).Release();
   return S_OK;
@@ -1438,21 +1438,21 @@
 
 STDMETHODIMP PolicyStatusValueImpl::get_hasConflict(
     VARIANT_BOOL* has_conflict) {
-  DCHECK(has_conflict);
+  CHECK(has_conflict);
 
   *has_conflict = has_conflict_;
   return S_OK;
 }
 
 STDMETHODIMP PolicyStatusValueImpl::get_conflictSource(BSTR* conflict_source) {
-  DCHECK(conflict_source);
+  CHECK(conflict_source);
 
   *conflict_source = base::win::ScopedBstr(conflict_source_).Release();
   return S_OK;
 }
 
 STDMETHODIMP PolicyStatusValueImpl::get_conflictValue(BSTR* conflict_value) {
-  DCHECK(conflict_value);
+  CHECK(conflict_value);
 
   *conflict_value = base::win::ScopedBstr(conflict_value_).Release();
   return S_OK;
diff --git a/chrome/updater/app/server/win/server.cc b/chrome/updater/app/server/win/server.cc
index 87472f9a..bda0aef 100644
--- a/chrome/updater/app/server/win/server.cc
+++ b/chrome/updater/app/server/win/server.cc
@@ -62,7 +62,7 @@
                           const base::FilePath& updater_path,
                           HKEY root,
                           WorkItemList* list) {
-  DCHECK(list);
+  CHECK(list);
 
   base::CommandLine uninstall_if_unused_command(updater_path);
 
@@ -145,7 +145,7 @@
                       const base::FilePath& temp_path,
                       HKEY root,
                       WorkItemList* list) {
-  DCHECK(list);
+  CHECK(list);
 
   const absl::optional<base::FilePath> target_path =
       GetGoogleUpdateExePath(scope);
diff --git a/chrome/updater/crash_client.cc b/chrome/updater/crash_client.cc
index 19c232c..cb50f67d 100644
--- a/chrome/updater/crash_client.cc
+++ b/chrome/updater/crash_client.cc
@@ -73,7 +73,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   static bool initialized = false;
-  DCHECK(!initialized);
+  CHECK(!initialized);
   initialized = true;
 
   if (!InitializeDatabaseOnly(updater_scope))
@@ -127,7 +127,7 @@
                                            &env_usage_stats) &&
        env_usage_stats == kUsageStatsEnabledValueEnabled)) {
     crashpad::Settings* crashpad_settings = database_->GetSettings();
-    DCHECK(crashpad_settings);
+    CHECK(crashpad_settings);
     crashpad_settings->SetUploadsEnabled(true);
   }
 
diff --git a/chrome/updater/crash_reporter.cc b/chrome/updater/crash_reporter.cc
index b434a82..285758be 100644
--- a/chrome/updater/crash_reporter.cc
+++ b/chrome/updater/crash_reporter.cc
@@ -10,6 +10,7 @@
 #include <string>
 #include <vector>
 
+#include "base/check.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
@@ -67,7 +68,7 @@
 void StartCrashReporter(UpdaterScope updater_scope,
                         const std::string& version) {
   static bool started = false;
-  DCHECK(!started);
+  CHECK(!started);
   started = true;
 
   base::FilePath handler_path;
@@ -99,7 +100,7 @@
 
 int CrashReporterMain() {
   base::CommandLine command_line = *base::CommandLine::ForCurrentProcess();
-  DCHECK(command_line.HasSwitch(kCrashHandlerSwitch));
+  CHECK(command_line.HasSwitch(kCrashHandlerSwitch));
 
   // Disable rate-limiting until this is fixed:
   //   https://bugs.chromium.org/p/crashpad/issues/detail?id=23
diff --git a/chrome/updater/device_management/dm_response_validator.cc b/chrome/updater/device_management/dm_response_validator.cc
index 4aeefcd..bb9a003b 100644
--- a/chrome/updater/device_management/dm_response_validator.cc
+++ b/chrome/updater/device_management/dm_response_validator.cc
@@ -426,7 +426,7 @@
     const enterprise_management::PolicyData& policy_data,
     PolicyValidationResult& validation_result) const {
   // Policy type was validated previously.
-  DCHECK(policy_data.has_policy_type());
+  CHECK(policy_data.has_policy_type());
 
   if (base::EqualsCaseInsensitiveASCII(policy_data.policy_type(),
                                        kGoogleUpdatePolicyType)) {
diff --git a/chrome/updater/device_management/dm_storage.cc b/chrome/updater/device_management/dm_storage.cc
index fc5bc81..cb2b971 100644
--- a/chrome/updater/device_management/dm_storage.cc
+++ b/chrome/updater/device_management/dm_storage.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/base64.h"
+#include "base/check.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -85,7 +86,7 @@
     : policy_cache_root_(policy_cache_root),
       policy_info_file_(policy_cache_root_.AppendASCII(kPolicyInfoFileName)),
       token_service_(std::move(token_service)) {
-  DCHECK(token_service_);
+  CHECK(token_service_);
 }
 
 DMStorage::~DMStorage() {
diff --git a/chrome/updater/ipc/update_service_proxy_posix.cc b/chrome/updater/ipc/update_service_proxy_posix.cc
index b8e2c20e..a5c9d655 100644
--- a/chrome/updater/ipc/update_service_proxy_posix.cc
+++ b/chrome/updater/ipc/update_service_proxy_posix.cc
@@ -104,13 +104,13 @@
 
   // Overrides for mojom::StateChangeObserver.
   void OnStateChange(mojom::UpdateStatePtr state_mojom) override {
-    DCHECK(complete_callback_) << "OnStateChange received after OnComplete";
+    CHECK(complete_callback_) << "OnStateChange received after OnComplete";
     state_change_callback_.Run(MakeUpdateState(state_mojom));
   }
 
   void OnComplete(mojom::UpdateService::Result result) override {
-    DCHECK(complete_callback_) << "OnComplete received without a valid "
-                                  "callback. Was OnComplete run twice?";
+    CHECK(complete_callback_) << "OnComplete received without a valid "
+                                 "callback. Was OnComplete run twice?";
     if (complete_callback_) {
       std::move(complete_callback_)
           .Run(static_cast<updater::UpdateService::Result>(result));
diff --git a/chrome/updater/linux/systemd_util.cc b/chrome/updater/linux/systemd_util.cc
index 7296bc5..75e80e45 100644
--- a/chrome/updater/linux/systemd_util.cc
+++ b/chrome/updater/linux/systemd_util.cc
@@ -173,7 +173,7 @@
 
 void SystemdService::OnSocketReadable() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(server_socket_.is_valid());
+  CHECK(server_socket_.is_valid());
 
   base::ScopedFD remote_fd(accept(server_socket_.get(), nullptr, nullptr));
   if (!remote_fd.is_valid()) {
diff --git a/chrome/updater/persisted_data.cc b/chrome/updater/persisted_data.cc
index 82ddf0d239..9dae89f 100644
--- a/chrome/updater/persisted_data.cc
+++ b/chrome/updater/persisted_data.cc
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "base/base64.h"
+#include "base/check.h"
 #include "base/check_op.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
@@ -54,9 +55,8 @@
 
 PersistedData::PersistedData(UpdaterScope scope, PrefService* pref_service)
     : scope_(scope), pref_service_(pref_service) {
-  DCHECK(pref_service_);
-  DCHECK(
-      pref_service_->FindPreference(update_client::kPersistedDataPreference));
+  CHECK(pref_service_);
+  CHECK(pref_service_->FindPreference(update_client::kPersistedDataPreference));
 }
 
 PersistedData::~PersistedData() {
@@ -71,7 +71,7 @@
 void PersistedData::SetProductVersion(const std::string& id,
                                       const base::Version& pv) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(pv.IsValid());
+  CHECK(pv.IsValid());
   SetString(id, kPV, pv.GetString());
 }
 
diff --git a/chrome/updater/policy/service.h b/chrome/updater/policy/service.h
index 1e65c04e..7722a867 100644
--- a/chrome/updater/policy/service.h
+++ b/chrome/updater/policy/service.h
@@ -62,7 +62,7 @@
   explicit operator bool() const { return effective_policy_.has_value(); }
   // Convenience method to extract the effective policy's value.
   const T& policy() {
-    DCHECK(effective_policy_);
+    CHECK(effective_policy_);
     return effective_policy_->policy;
   }
   const T& policy_or(const T& fallback) {
diff --git a/chrome/updater/remove_uninstalled_apps_task.cc b/chrome/updater/remove_uninstalled_apps_task.cc
index 9eb0233..cce1ceb05 100644
--- a/chrome/updater/remove_uninstalled_apps_task.cc
+++ b/chrome/updater/remove_uninstalled_apps_task.cc
@@ -15,6 +15,7 @@
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/sequence_checker.h"
+#include "base/strings/string_util.h"
 #include "base/task/thread_pool.h"
 #include "base/version.h"
 #include "chrome/updater/configurator.h"
@@ -55,9 +56,10 @@
     scoped_refptr<updater::PersistedData> persisted_data) {
   std::vector<AppInfo> apps;
   for (const std::string& app_id : persisted_data->GetAppIds()) {
-    if (app_id != kUpdaterAppId)
+    if (!base::EqualsCaseInsensitiveASCII(app_id, kUpdaterAppId)) {
       apps.emplace_back(app_id, persisted_data->GetProductVersion(app_id),
                         persisted_data->GetExistenceCheckerPath(app_id));
+    }
   }
   return apps;
 }
diff --git a/chrome/updater/test/data/README.md b/chrome/updater/test/data/README.md
index e6c7c2d..064b35c83 100644
--- a/chrome/updater/test/data/README.md
+++ b/chrome/updater/test/data/README.md
@@ -1,9 +1,3 @@
-# google\_update\_win.cc.patch
-Debugging the legacy on-demand Windows client in Chrome requires a
-patch to get rid of some DCHECKs in the code. Developers can apply the
-patch `google_update_win.cc.patch` in a local branch and rebuild
-Chrome with it. Don't land the patch with your changes!
-
 # selfupdate\_test\_key.der
 A DER-formatted PKCS #8 PrivateKeyInfo for an RSA key used to sign the self-
 update CRX used in integration tests. You can regenerate it by running:
diff --git a/chrome/updater/test/data/google_update_win.cc.patch b/chrome/updater/test/data/google_update_win.cc.patch
deleted file mode 100644
index 57cc04a2..0000000
--- a/chrome/updater/test/data/google_update_win.cc.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-diff --git a/chrome/browser/google/google_update_win.cc b/chrome/browser/google/google_update_win.cc
-index c881ad2873d7..69e74f902b85 100644
---- a/chrome/browser/google/google_update_win.cc
-+++ b/chrome/browser/google/google_update_win.cc
-@@ -723,7 +723,7 @@ bool UpdateCheckDriver::IsFinalState(
-     return true;
-   }
-   if (state_value == STATE_INSTALL_COMPLETE) {
--    DCHECK(install_update_if_possible_);
-+    // Hack DCHECK(install_update_if_possible_);
-     *upgrade_status = UPGRADE_SUCCESSFUL;
-     return true;
-   }
-@@ -743,7 +743,10 @@ bool UpdateCheckDriver::IsIntermediateState(
-   // NO_UPDATE will have been handled in IsFinalState if not doing an install,
-   // as will STATE_INSTALL_COMPLETE when doing an install. All other states
-   // following UPDATE_AVAILABLE will only happen when an install is to be done.
--  DCHECK(state_value < STATE_UPDATE_AVAILABLE || install_update_if_possible_);
-+
-+  // Hack DCHECK(state_value < STATE_UPDATE_AVAILABLE ||
-+  // install_update_if_possible_);
-+
-   *progress = 0;
- 
-   switch (state_value) {
diff --git a/chrome/updater/test/integration_tests.cc b/chrome/updater/test/integration_tests.cc
index e4d587d9..b83a113 100644
--- a/chrome/updater/test/integration_tests.cc
+++ b/chrome/updater/test/integration_tests.cc
@@ -877,7 +877,7 @@
 #if !defined(COMPONENT_BUILD)
 // TODO(crbug.com/1398845) Enable test once version-skewed updater is available
 // for unbranded Linux.
-#if !(BUILDFLAG(IS_LINUX) && BUILDFLAG(CHROMIUM_BRANDING))
+#if !BUILDFLAG(IS_LINUX) || BUILDFLAG(GOOGLE_CHROME_BRANDING)
 // TODO(crbug.com/1097297) Enable these tests once the `Brand the updater and
 // qualification app ids` change is available on CIPD.
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
@@ -960,7 +960,7 @@
 #endif  // IS_WIN
 }
 
-#endif  // !(BUILDFLAG(IS_LINUX) && BUILDFLAG(CHROMIUM_BRANDING))
+#endif  // !BUILDFLAG(IS_LINUX) || BUILDFLAG(GOOGLE_CHROME_BRANDING)
 #endif
 #endif
 
diff --git a/chrome/updater/test/integration_tests_impl.cc b/chrome/updater/test/integration_tests_impl.cc
index dff8a470..c485564 100644
--- a/chrome/updater/test/integration_tests_impl.cc
+++ b/chrome/updater/test/integration_tests_impl.cc
@@ -131,7 +131,7 @@
       R"(    })"
       R"(  ])"
       R"(}})",
-      app_id.c_str(),
+      base::ToLowerASCII(app_id).c_str(),
       !install_data_index.empty()
           ? base::StringPrintf(
                 R"(     "data":[{ "status":"ok", "name":"install", )"
@@ -624,7 +624,10 @@
 
 bool RequestMatcherRegex(const std::string& request_body_regex,
                          const std::string& request_body) {
-  if (!re2::RE2::PartialMatch(request_body, request_body_regex)) {
+  re2::RE2::Options opt;
+  opt.set_case_sensitive(false);
+  if (!re2::RE2::PartialMatch(request_body,
+                              re2::RE2(request_body_regex, opt))) {
     VLOG(0) << "Request match failed.";
     ADD_FAILURE() << "Request with body: " << request_body
                   << " did not match expected regex " << request_body_regex;
diff --git a/chrome/updater/update_service_impl.cc b/chrome/updater/update_service_impl.cc
index 9a78479..f15625d4 100644
--- a/chrome/updater/update_service_impl.cc
+++ b/chrome/updater/update_service_impl.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/barrier_closure.h"
+#include "base/check.h"
 #include "base/containers/contains.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/queue.h"
@@ -245,7 +246,7 @@
                                     base::OnceCallback<void(int)> callback) {
   VLOG(1) << __func__;
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (request.app_id != kUpdaterAppId) {
+  if (!base::EqualsCaseInsensitiveASCII(request.app_id, kUpdaterAppId)) {
     persisted_data_->SetHadApps();
   }
   persisted_data_->RegisterApp(request);
@@ -282,7 +283,10 @@
 
   // The installer should make an updater registration, but in case it halts
   // before it does, synthesize a registration if necessary here.
-  if (!base::Contains(persisted_data_->GetAppIds(), kUpdaterAppId)) {
+  if (!base::Contains(persisted_data_->GetAppIds(),
+                      base::ToLowerASCII(kUpdaterAppId),
+                      static_cast<std::string (*)(base::StringPiece)>(
+                          &base::ToLowerASCII))) {
     RegistrationRequest updater_request;
     updater_request.app_id = kUpdaterAppId;
     updater_request.version = base::Version(kUpdaterVersion);
@@ -365,7 +369,7 @@
   }
   std::vector<std::string> force_install_apps =
       force_install_apps_status.policy();
-  DCHECK(!force_install_apps.empty());
+  CHECK(!force_install_apps.empty());
 
   std::vector<std::string> installed_app_ids = persisted_data_->GetAppIds();
   base::ranges::sort(force_install_apps);
@@ -448,7 +452,9 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   const auto app_ids = persisted_data_->GetAppIds();
-  DCHECK(base::Contains(app_ids, kUpdaterAppId));
+  CHECK(base::Contains(
+      app_ids, base::ToLowerASCII(kUpdaterAppId),
+      static_cast<std::string (*)(base::StringPiece)>(&base::ToLowerASCII)));
 
   const Priority priority = Priority::kBackground;
   ShouldBlockUpdateForMeteredNetwork(
@@ -485,7 +491,7 @@
                                  state_update, std::move(callback));
     return;
   }
-  if (registration.app_id != kUpdaterAppId) {
+  if (!base::EqualsCaseInsensitiveASCII(registration.app_id, kUpdaterAppId)) {
     persisted_data_->SetHadApps();
   }
   if (!persisted_data_->GetProductVersion(registration.app_id).IsValid()) {
diff --git a/chrome/updater/update_service_internal_impl_qualifying.cc b/chrome/updater/update_service_internal_impl_qualifying.cc
index 05e2a94..1209c90 100644
--- a/chrome/updater/update_service_internal_impl_qualifying.cc
+++ b/chrome/updater/update_service_internal_impl_qualifying.cc
@@ -14,6 +14,7 @@
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/sequence_checker.h"
+#include "base/strings/string_util.h"
 #include "base/task/thread_pool.h"
 #include "base/version.h"
 #include "chrome/updater/check_for_updates_task.h"
@@ -105,7 +106,7 @@
         config_, GetUpdaterScope(),
         base::BindOnce(&UpdateServiceImpl::Update,
                        base::MakeRefCounted<UpdateServiceImpl>(config_),
-                       kQualificationAppId, "",
+                       base::ToLowerASCII(kQualificationAppId), "",
                        UpdateService::Priority::kBackground,
                        UpdateService::PolicySameVersionUpdate::kNotAllowed,
                        base::DoNothing()))
diff --git a/chrome/updater/update_usage_stats_task_win.cc b/chrome/updater/update_usage_stats_task_win.cc
index 4ac63ffc..24fc2972 100644
--- a/chrome/updater/update_usage_stats_task_win.cc
+++ b/chrome/updater/update_usage_stats_task_win.cc
@@ -20,7 +20,7 @@
 bool UpdateUsageStatsTask::UsageStatsAllowed(
     const std::vector<std::string>& app_ids) const {
   for (auto app_id : app_ids) {
-    if (app_id == kUpdaterAppId) {
+    if (base::EqualsCaseInsensitiveASCII(app_id, kUpdaterAppId)) {
       continue;
     }
     std::wstring app_id_u16;
diff --git a/chrome/updater/util/win_util.cc b/chrome/updater/util/win_util.cc
index 4baf8b7..c2c1d87 100644
--- a/chrome/updater/util/win_util.cc
+++ b/chrome/updater/util/win_util.cc
@@ -78,7 +78,7 @@
   }
   bool is_split_token = elevation_type == TokenElevationTypeFull ||
                         elevation_type == TokenElevationTypeLimited;
-  DCHECK(is_split_token || elevation_type == TokenElevationTypeDefault);
+  CHECK(is_split_token || elevation_type == TokenElevationTypeDefault);
   return base::ok(is_split_token);
 }
 
@@ -175,8 +175,8 @@
 bool CompareOSVersionsInternal(const OSVERSIONINFOEX& os,
                                DWORD type_mask,
                                BYTE oper) {
-  DCHECK(type_mask);
-  DCHECK(oper);
+  CHECK(type_mask);
+  CHECK(oper);
 
   ULONGLONG cond_mask = 0;
   cond_mask = ::VerSetConditionMask(cond_mask, VER_MAJORVERSION, oper);
@@ -221,7 +221,7 @@
 HRESULT CreateUniqueEventInEnvironment(const std::wstring& var_name,
                                        UpdaterScope scope,
                                        HANDLE* unique_event) {
-  DCHECK(unique_event);
+  CHECK(unique_event);
 
   const std::wstring event_name = base::ASCIIToWide(base::GenerateGUID());
   NamedObjectAttributes attr =
@@ -240,7 +240,7 @@
 HRESULT OpenUniqueEventFromEnvironment(const std::wstring& var_name,
                                        UpdaterScope scope,
                                        HANDLE* unique_event) {
-  DCHECK(unique_event);
+  CHECK(unique_event);
 
   wchar_t event_name[MAX_PATH] = {0};
   if (!::GetEnvironmentVariable(var_name.c_str(), event_name,
@@ -258,9 +258,9 @@
 }
 
 HRESULT CreateEvent(NamedObjectAttributes* event_attr, HANDLE* event_handle) {
-  DCHECK(event_handle);
-  DCHECK(event_attr);
-  DCHECK(!event_attr->name.empty());
+  CHECK(event_handle);
+  CHECK(event_attr);
+  CHECK(!event_attr->name.empty());
   *event_handle = ::CreateEvent(&event_attr->sa,
                                 true,   // manual reset
                                 false,  // not signaled
@@ -274,7 +274,7 @@
 
 NamedObjectAttributes GetNamedObjectAttributes(const wchar_t* base_name,
                                                UpdaterScope scope) {
-  DCHECK(base_name);
+  CHECK(base_name);
 
   switch (scope) {
     case UpdaterScope::kUser: {
@@ -493,7 +493,7 @@
   HResultOr<bool> result = IsTokenAdmin(token.get());
   if (!result.has_value()) {
     HRESULT hr = result.error();
-    DCHECK(FAILED(hr));
+    CHECK(FAILED(hr));
     LOG(ERROR) << __func__ << ": IsTokenAdmin failed: " << std::hex << hr;
   }
   return result;
@@ -560,7 +560,7 @@
                                      const std::wstring& verb) {
   VLOG(1) << __func__ << ": path: " << file_path
           << ", parameters:" << parameters << ", verb:" << verb;
-  DCHECK(!file_path.empty());
+  CHECK(!file_path.empty());
 
   const HWND hwnd = CreateForegroundParentWindowForUAC();
   const base::ScopedClosureRunner destroy_window(base::BindOnce(
@@ -804,7 +804,7 @@
 }
 
 bool CompareOSVersions(const OSVERSIONINFOEX& os_version, BYTE oper) {
-  DCHECK(oper);
+  CHECK(oper);
 
   constexpr DWORD kOSTypeMask = VER_MAJORVERSION | VER_MINORVERSION |
                                 VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR;
@@ -994,7 +994,7 @@
 }
 
 bool IsGuid(const std::wstring& s) {
-  DCHECK(!s.empty());
+  CHECK(!s.empty());
 
   GUID guid = {0};
   return SUCCEEDED(::IIDFromString(&s[0], &guid));
diff --git a/chrome/updater/win/action_handler.cc b/chrome/updater/win/action_handler.cc
index 61955f51..880e1bd 100644
--- a/chrome/updater/win/action_handler.cc
+++ b/chrome/updater/win/action_handler.cc
@@ -5,6 +5,7 @@
 #include <string>
 #include <utility>
 
+#include "base/check.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
@@ -44,7 +45,7 @@
 void ActionHandler::Handle(const base::FilePath& action,
                            const std::string&,
                            Callback callback) {
-  DCHECK(!action.empty());
+  CHECK(!action.empty());
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE,
       {base::MayBlock(), base::WithBaseSyncPrimitives(),
diff --git a/chrome/updater/win/installer/installer.cc b/chrome/updater/win/installer/installer.cc
index a0c41b3..7e8a407 100644
--- a/chrome/updater/win/installer/installer.cc
+++ b/chrome/updater/win/installer/installer.cc
@@ -20,6 +20,7 @@
 
 // TODO(crbug.com/1128529): remove the dependencies on //base/ to reduce the
 // code size.
+#include "base/check.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -190,9 +191,9 @@
 ProcessExitResult BuildCommandLineArguments(const wchar_t* cmd_line,
                                             wchar_t* cmd_line_args,
                                             size_t cmd_line_args_capacity) {
-  DCHECK(cmd_line);
-  DCHECK(cmd_line_args);
-  DCHECK(cmd_line_args_capacity);
+  CHECK(cmd_line);
+  CHECK(cmd_line_args);
+  CHECK(cmd_line_args_capacity);
 
   *cmd_line_args = '\0';
   CommandString args;
@@ -254,8 +255,8 @@
 // Executes updater.exe, waits for it to finish and returns the exit code.
 ProcessExitResult RunSetup(const wchar_t* setup_path,
                            const wchar_t* cmd_line_args) {
-  DCHECK(setup_path && *setup_path);
-  DCHECK(cmd_line_args && *cmd_line_args);
+  CHECK(setup_path && *setup_path);
+  CHECK(cmd_line_args && *cmd_line_args);
 
   CommandString cmd_line;
 
@@ -272,8 +273,8 @@
 }
 
 ProcessExitResult HandleRunElevated(const base::CommandLine& command_line) {
-  DCHECK(!::IsUserAnAdmin());
-  DCHECK(!command_line.HasSwitch(kCmdLinePrefersUser));
+  CHECK(!::IsUserAnAdmin());
+  CHECK(!command_line.HasSwitch(kCmdLinePrefersUser));
 
   if (command_line.HasSwitch(kCmdLineExpectElevated)) {
     VLOG(1) << __func__ << "Unexpected elevation loop! "
@@ -297,7 +298,7 @@
 }
 
 ProcessExitResult HandleRunDeElevated(const base::CommandLine& command_line) {
-  DCHECK(::IsUserAnAdmin());
+  CHECK(::IsUserAnAdmin());
 
   if (command_line.HasSwitch(kCmdLineExpectDeElevated)) {
     VLOG(1) << __func__ << "Unexpected de-elevation loop! "
@@ -307,7 +308,7 @@
 
   base::win::ScopedCOMInitializer com_initializer(
       base::win::ScopedCOMInitializer::kMTA);
-  DCHECK(com_initializer.Succeeded());
+  CHECK(com_initializer.Succeeded());
 
   // Deelevate the metainstaller.
   HRESULT hr =
diff --git a/chrome/updater/win/protocol_parser_xml.cc b/chrome/updater/win/protocol_parser_xml.cc
index 705719e..0a01b9c 100644
--- a/chrome/updater/win/protocol_parser_xml.cc
+++ b/chrome/updater/win/protocol_parser_xml.cc
@@ -360,7 +360,7 @@
 
 bool ProtocolParserXML::DoParse(const std::string& response_xml,
                                 Results* results) {
-  DCHECK(results);
+  CHECK(results);
 
   Microsoft::WRL::ComPtr<IXMLDOMDocument> xmldoc;
   HRESULT hr = ::CoCreateInstance(CLSID_DOMDocument30, nullptr, CLSCTX_ALL,
diff --git a/chrome/updater/win/setup/setup.cc b/chrome/updater/win/setup/setup.cc
index 5a79f0c5..3bcd6e9 100644
--- a/chrome/updater/win/setup/setup.cc
+++ b/chrome/updater/win/setup/setup.cc
@@ -10,6 +10,7 @@
 #include <string>
 #include <vector>
 
+#include "base/check.h"
 #include "base/command_line.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
@@ -63,7 +64,7 @@
 // TODO(crbug.com/1069976): use specific return values for different code paths.
 int Setup(UpdaterScope scope) {
   VLOG(1) << __func__ << ", scope: " << scope;
-  DCHECK(!IsSystemInstall(scope) || ::IsUserAnAdmin());
+  CHECK(!IsSystemInstall(scope) || ::IsUserAnAdmin());
   auto scoped_com_initializer =
       std::make_unique<base::win::ScopedCOMInitializer>(
           base::win::ScopedCOMInitializer::kMTA);
diff --git a/chrome/updater/win/setup/setup_util.cc b/chrome/updater/win/setup/setup_util.cc
index 77f3270..48494b29 100644
--- a/chrome/updater/win/setup/setup_util.cc
+++ b/chrome/updater/win/setup/setup_util.cc
@@ -154,13 +154,13 @@
 std::wstring GetTaskName(UpdaterScope scope) {
   scoped_refptr<TaskScheduler> task_scheduler =
       TaskScheduler::CreateInstance(scope);
-  DCHECK(task_scheduler);
+  CHECK(task_scheduler);
   return task_scheduler->FindFirstTaskName(GetTaskNamePrefix(scope));
 }
 
 void UnregisterWakeTask(UpdaterScope scope) {
   auto task_scheduler = TaskScheduler::CreateInstance(scope);
-  DCHECK(task_scheduler);
+  CHECK(task_scheduler);
 
   const std::wstring task_name = GetTaskName(scope);
   if (task_name.empty()) {
@@ -264,7 +264,7 @@
 void AddComServerWorkItems(const base::FilePath& com_server_path,
                            bool is_internal,
                            WorkItemList* list) {
-  DCHECK(list);
+  CHECK(list);
   VLOG(1) << __func__ << ": " << com_server_path << ": " << is_internal;
 
   if (com_server_path.empty()) {
@@ -289,7 +289,7 @@
 void AddComServiceWorkItems(const base::FilePath& com_service_path,
                             bool internal_service,
                             WorkItemList* list) {
-  DCHECK(::IsUserAnAdmin());
+  CHECK(::IsUserAnAdmin());
   VLOG(1) << __func__ << ": " << com_service_path << ": " << internal_service;
 
   if (com_service_path.empty()) {
@@ -422,7 +422,7 @@
 void RegisterUserRunAtStartup(const std::wstring& run_value_name,
                               const base::CommandLine& command,
                               WorkItemList* list) {
-  DCHECK(list);
+  CHECK(list);
   VLOG(1) << __func__;
 
   list->AddSetRegValueWorkItem(HKEY_CURRENT_USER, REGSTR_PATH_RUN, 0,
@@ -447,7 +447,7 @@
 bool RegisterWakeTaskWorkItem::DoImpl() {
   scoped_refptr<TaskScheduler> task_scheduler =
       TaskScheduler::CreateInstance(scope_);
-  DCHECK(task_scheduler);
+  CHECK(task_scheduler);
 
   // Task already exists.
   if (!GetTaskName(scope_).empty()) {
@@ -461,7 +461,7 @@
     return false;
   }
 
-  DCHECK(!task_scheduler->IsTaskRegistered(task_name.c_str()));
+  CHECK(!task_scheduler->IsTaskRegistered(task_name.c_str()));
 
   if (!task_scheduler->RegisterTask(
           task_name.c_str(), GetTaskDisplayName(scope_).c_str(), run_command_,
@@ -479,7 +479,7 @@
   }
 
   auto task_scheduler = TaskScheduler::CreateInstance(scope_);
-  DCHECK(task_scheduler);
+  CHECK(task_scheduler);
   task_scheduler->DeleteTask(task_name_.c_str());
 }
 
diff --git a/chrome/updater/win/setup/uninstall.cc b/chrome/updater/win/setup/uninstall.cc
index eb134ac..8864c2d04f 100644
--- a/chrome/updater/win/setup/uninstall.cc
+++ b/chrome/updater/win/setup/uninstall.cc
@@ -11,6 +11,7 @@
 #include <string>
 #include <vector>
 
+#include "base/check.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
@@ -51,7 +52,7 @@
 }
 
 void DeleteComService(bool uninstall_all) {
-  DCHECK(::IsUserAnAdmin());
+  CHECK(::IsUserAnAdmin());
 
   for (const GUID& appid :
        JoinVectors(GetSideBySideServers(UpdaterScope::kSystem),
@@ -146,7 +147,7 @@
 // the function uninstalls only the internal updater.
 int UninstallImpl(UpdaterScope scope, bool uninstall_all) {
   VLOG(1) << __func__ << ", scope: " << scope;
-  DCHECK(!IsSystemInstall(scope) || ::IsUserAnAdmin());
+  CHECK(!IsSystemInstall(scope) || ::IsUserAnAdmin());
 
   auto scoped_com_initializer =
       std::make_unique<base::win::ScopedCOMInitializer>(
diff --git a/chrome/updater/win/task_scheduler.cc b/chrome/updater/win/task_scheduler.cc
index e7aafbb4..84d6a81e 100644
--- a/chrome/updater/win/task_scheduler.cc
+++ b/chrome/updater/win/task_scheduler.cc
@@ -15,6 +15,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/check.h"
 #include "base/check_op.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
@@ -69,7 +70,7 @@
 
 bool UTCFileTimeToLocalSystemTime(const FILETIME& file_time_utc,
                                   SYSTEMTIME* system_time_local) {
-  DCHECK(system_time_local);
+  CHECK(system_time_local);
   SYSTEMTIME system_time_utc = {};
   if (!::FileTimeToSystemTime(&file_time_utc, &system_time_utc) ||
       !::SystemTimeToTzSpecificLocalTime(nullptr, &system_time_utc,
@@ -81,7 +82,7 @@
 }
 
 bool GetCurrentUser(base::win::ScopedBstr* user_name) {
-  DCHECK(user_name);
+  CHECK(user_name);
   ULONG user_name_size = 256;
   // Paranoia... ;-)
   DCHECK_EQ(sizeof(OLECHAR), sizeof(WCHAR));
@@ -122,16 +123,16 @@
   TaskSchedulerV2(UpdaterScope scope, bool use_task_subfolders)
       : scope_(scope), use_task_subfolders_(use_task_subfolders) {
     task_service_ = GetTaskService();
-    DCHECK(task_service_);
+    CHECK(task_service_);
     task_folder_ = GetUpdaterTaskFolder();
-    DCHECK(task_folder_);
+    CHECK(task_folder_);
   }
   TaskSchedulerV2(const TaskSchedulerV2&) = delete;
   TaskSchedulerV2& operator=(const TaskSchedulerV2&) = delete;
 
   // TaskScheduler overrides.
   bool IsTaskRegistered(const wchar_t* task_name) override {
-    DCHECK(task_name);
+    CHECK(task_name);
     if (!task_folder_) {
       return false;
     }
@@ -141,8 +142,8 @@
 
   bool GetNextTaskRunTime(const wchar_t* task_name,
                           base::Time* next_run_time) override {
-    DCHECK(task_name);
-    DCHECK(next_run_time);
+    CHECK(task_name);
+    CHECK(next_run_time);
     if (!task_folder_) {
       return false;
     }
@@ -194,7 +195,7 @@
   }
 
   bool SetTaskEnabled(const wchar_t* task_name, bool enabled) override {
-    DCHECK(task_name);
+    CHECK(task_name);
     if (!task_folder_) {
       return false;
     }
@@ -217,7 +218,7 @@
   }
 
   bool IsTaskEnabled(const wchar_t* task_name) override {
-    DCHECK(task_name);
+    CHECK(task_name);
     if (!task_folder_) {
       return false;
     }
@@ -241,7 +242,7 @@
   }
 
   bool IsTaskRunning(const wchar_t* task_name) override {
-    DCHECK(task_name);
+    CHECK(task_name);
 
     if (!task_folder_) {
       return false;
@@ -271,7 +272,7 @@
   }
 
   bool GetTaskNameList(std::vector<std::wstring>* task_names) override {
-    DCHECK(task_names);
+    CHECK(task_names);
     if (!task_folder_) {
       return false;
     }
@@ -283,7 +284,7 @@
   }
 
   std::wstring FindFirstTaskName(const std::wstring& task_prefix) override {
-    DCHECK(!task_prefix.empty());
+    CHECK(!task_prefix.empty());
 
     std::vector<std::wstring> task_names;
     if (!GetTaskNameList(&task_names)) {
@@ -300,8 +301,8 @@
   }
 
   bool GetTaskInfo(const wchar_t* task_name, TaskInfo* info) override {
-    DCHECK(task_name);
-    DCHECK(info);
+    CHECK(task_name);
+    CHECK(info);
     if (!task_folder_) {
       return false;
     }
@@ -370,7 +371,7 @@
   }
 
   bool DeleteTask(const wchar_t* task_name) override {
-    DCHECK(task_name);
+    CHECK(task_name);
     if (!task_folder_) {
       return false;
     }
@@ -403,7 +404,7 @@
       return false;
     }
 
-    DCHECK(!IsTaskRegistered(task_name));
+    CHECK(!IsTaskRegistered(task_name));
 
     if (!use_task_subfolders_) {
       return true;
@@ -422,12 +423,12 @@
                     const base::CommandLine& run_command,
                     TriggerType trigger_type,
                     bool hidden) override {
-    DCHECK(task_name);
-    DCHECK(task_description);
+    CHECK(task_name);
+    CHECK(task_description);
 
     // Create the task definition object to create the task.
     Microsoft::WRL::ComPtr<ITaskDefinition> task;
-    DCHECK(task_service_);
+    CHECK(task_service_);
     HRESULT hr = task_service_->NewTask(0, &task);
     if (FAILED(hr)) {
       PLOG(ERROR) << "Can't create new task. " << std::hex << hr;
@@ -687,7 +688,7 @@
     Microsoft::WRL::ComPtr<IRegisteredTask> registered_task;
     base::win::ScopedVariant user(user_name.Get());
 
-    DCHECK(task_folder_);
+    CHECK(task_folder_);
     hr = task_folder_->RegisterTaskDefinition(
         base::win::ScopedBstr(task_name).Get(), task.Get(),
         TASK_CREATE_OR_UPDATE,
@@ -701,7 +702,7 @@
       return false;
     }
 
-    DCHECK(IsTaskRegistered(task_name));
+    CHECK(IsTaskRegistered(task_name));
 
     VLOG(1) << __func__ << ":" << task_name << ": "
             << run_command.GetCommandLineString();
@@ -709,7 +710,7 @@
   }
 
   bool StartTask(const wchar_t* task_name) override {
-    DCHECK(task_name);
+    CHECK(task_name);
 
     if (!task_folder_) {
       return false;
@@ -736,7 +737,7 @@
   }
 
   std::wstring GetTaskSubfolderName() override {
-    DCHECK(use_task_subfolders_);
+    CHECK(use_task_subfolders_);
 
     return base::StrCat(
         {GetTaskCompanyFolder(), L"\\" PRODUCT_FULLNAME_STRING});
@@ -766,7 +767,7 @@
   class TaskIterator {
    public:
     explicit TaskIterator(ITaskFolder* task_folder) {
-      DCHECK(task_folder);
+      CHECK(task_folder);
       HRESULT hr = task_folder->GetTasks(TASK_ENUM_HIDDEN, &tasks_);
       if (FAILED(hr)) {
         if (!IsFileOrPathNotFoundError(hr)) {
@@ -787,7 +788,7 @@
     // Increment to the next valid item in the task list. Skip entries for
     // which we cannot retrieve a name.
     void Next() {
-      DCHECK(!done_);
+      CHECK(!done_);
       task_.Reset();
       name_.clear();
       if (++task_index_ >= num_tasks_) {
@@ -824,7 +825,7 @@
     // Provide access to the current task.
     IRegisteredTask* operator->() const {
       IRegisteredTask* result = task_.Get();
-      DCHECK(result);
+      CHECK(result);
       return result;
     }
 
@@ -867,7 +868,7 @@
   // task folders have a "System" suffix, and User task folders have a "User"
   // suffix.
   std::wstring GetTaskCompanyFolder() const {
-    DCHECK(use_task_subfolders_);
+    CHECK(use_task_subfolders_);
 
     return base::StrCat({L"\\" COMPANY_SHORTNAME_STRING,
                          IsSystemInstall(scope_) ? L"System" : L"User"});
@@ -889,8 +890,8 @@
 
   // Return the description of the task.
   HRESULT GetTaskDescription(IRegisteredTask* task, std::wstring* description) {
-    DCHECK(task);
-    DCHECK(description);
+    CHECK(task);
+    CHECK(description);
 
     base::win::ScopedBstr task_name_bstr;
     HRESULT hr = task->get_Name(task_name_bstr.Receive());
@@ -932,8 +933,8 @@
   // actions are silently ignored.
   bool GetTaskExecActions(IRegisteredTask* task,
                           std::vector<TaskExecAction>* actions) {
-    DCHECK(task);
-    DCHECK(actions);
+    CHECK(task);
+    CHECK(actions);
     Microsoft::WRL::ComPtr<ITaskDefinition> task_definition;
     HRESULT hr = task->get_Definition(&task_definition);
     if (FAILED(hr)) {
@@ -1032,8 +1033,8 @@
 
   // Return the log-on type required for the task's actions to be run.
   HRESULT GetTaskLogonType(IRegisteredTask* task, uint32_t* logon_type) {
-    DCHECK(task);
-    DCHECK(logon_type);
+    CHECK(task);
+    CHECK(logon_type);
     Microsoft::WRL::ComPtr<ITaskDefinition> task_info;
     HRESULT hr = task->get_Definition(&task_info);
     if (FAILED(hr)) {
@@ -1124,8 +1125,8 @@
 
   // Return the UserId of the task.
   HRESULT GetTaskUserId(IRegisteredTask* task, std::wstring* user_id) {
-    DCHECK(task);
-    DCHECK(user_id);
+    CHECK(task);
+    CHECK(user_id);
 
     Microsoft::WRL::ComPtr<ITaskDefinition> task_info;
     HRESULT hr = task->get_Definition(&task_info);
@@ -1155,8 +1156,8 @@
   }
 
   HRESULT GetTaskTriggerType(IRegisteredTask* task, TriggerType* trigger_type) {
-    DCHECK(task);
-    DCHECK(trigger_type);
+    CHECK(task);
+    CHECK(trigger_type);
 
     Microsoft::WRL::ComPtr<ITaskDefinition> task_info;
     HRESULT hr = task->get_Definition(&task_info);
diff --git a/chrome/updater/win/test/test_process_main.cc b/chrome/updater/win/test/test_process_main.cc
index bf06fec3..c1c46cca 100644
--- a/chrome/updater/win/test/test_process_main.cc
+++ b/chrome/updater/win/test/test_process_main.cc
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "base/check.h"
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/notreached.h"
@@ -23,7 +24,7 @@
 
 base::WaitableEvent EventForSwitch(const base::CommandLine& command_line,
                                    const char switch_value[]) {
-  DCHECK(command_line.HasSwitch(switch_value));
+  CHECK(command_line.HasSwitch(switch_value));
 
   const std::wstring event_name =
       command_line.GetSwitchValueNative(switch_value);
@@ -88,7 +89,7 @@
 
 int main(int, char**) {
   bool success = base::CommandLine::Init(0, nullptr);
-  DCHECK(success);
+  CHECK(success);
 
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
 
diff --git a/chrome/updater/win/ui/complete_wnd.cc b/chrome/updater/win/ui/complete_wnd.cc
index b999ab4..58e0fd19 100644
--- a/chrome/updater/win/ui/complete_wnd.cc
+++ b/chrome/updater/win/ui/complete_wnd.cc
@@ -5,6 +5,7 @@
 #include "chrome/updater/win/ui/complete_wnd.h"
 
 #include "base/check.h"
+#include "base/check_op.h"
 #include "base/strings/string_util.h"
 #include "chrome/updater/win/ui/l10n_util.h"
 #include "chrome/updater/win/ui/resources/updater_installer_strings.h"
@@ -57,8 +58,8 @@
                                      WORD id,
                                      HWND wnd_ctl,
                                      BOOL& handled) {
-  DCHECK(id == IDC_CLOSE);
-  DCHECK(is_complete());
+  CHECK_EQ(id, IDC_CLOSE);
+  CHECK(is_complete());
 
   CloseWindow();
 
@@ -70,7 +71,7 @@
                                       WORD id,
                                       HWND wnd_ctl,
                                       BOOL& handled) {
-  DCHECK(events_sink_);
+  CHECK(events_sink_);
   if (events_sink_) {
     events_sink_->DoLaunchBrowser(help_url_);
   }
@@ -93,7 +94,7 @@
 
   SetDlgItemText(IDC_CLOSE, GetLocalizedString(IDS_UPDATER_CLOSE_BASE).c_str());
 
-  DCHECK(!text.empty());
+  CHECK(!text.empty());
 
   // FormatMessage() converts all LFs to CRLFs, which are rendered as little
   // squares in UI. To avoid this, convert all CRLFs to LFs.
diff --git a/chrome/updater/win/ui/owner_draw_controls.cc b/chrome/updater/win/ui/owner_draw_controls.cc
index c4a32ee..9b2c7adb 100644
--- a/chrome/updater/win/ui/owner_draw_controls.cc
+++ b/chrome/updater/win/ui/owner_draw_controls.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/check.h"
+#include "base/check_op.h"
 #include "chrome/updater/win/ui/l10n_util.h"
 #include "chrome/updater/win/ui/resources/updater_installer_strings.h"
 #include "chrome/updater/win/ui/ui_util.h"
@@ -37,8 +38,8 @@
   handled = false;
 
   tool_tip_window_.Create(m_hWnd);
-  DCHECK(tool_tip_window_.IsWindow());
-  DCHECK(!tool_tip_text_.IsEmpty());
+  CHECK(tool_tip_window_.IsWindow());
+  CHECK(!tool_tip_text_.IsEmpty());
 
   tool_tip_window_.SetDelayTime(TTDT_AUTOMATIC, 2000);
   tool_tip_window_.Activate(TRUE);
@@ -345,8 +346,8 @@
                                                 const int button_margin,
                                                 CaptionButton* button,
                                                 CRect* button_rect) {
-  DCHECK(button);
-  DCHECK(button_rect);
+  CHECK(button);
+  CHECK(button_rect);
 
   if (!button->IsWindow()) {
     return;
@@ -414,7 +415,7 @@
 void OwnerDrawTitleBar::CreateOwnerDrawTitleBar(HWND parent_hwnd,
                                                 HWND title_bar_spacer_hwnd,
                                                 COLORREF bk_color) {
-  DCHECK(parent_hwnd);
+  CHECK(parent_hwnd);
 
   CRect title_bar_client_rect =
       ComputeTitleBarClientRect(parent_hwnd, title_bar_spacer_hwnd);
@@ -423,9 +424,9 @@
   // dialog box window. DS_MODALFRAME and WS_BORDER are incompatible with this
   // title bar. WS_DLGFRAME is recommended as well.
   const LONG parent_style = ::GetWindowLong(parent_hwnd, GWL_STYLE);
-  DCHECK(!(parent_style & DS_MODALFRAME));
-  DCHECK(!(parent_style & WS_BORDER));
-  DCHECK(parent_style & WS_DLGFRAME);
+  CHECK(!(parent_style & DS_MODALFRAME));
+  CHECK(!(parent_style & WS_BORDER));
+  CHECK(parent_style & WS_DLGFRAME);
 
   title_bar_window_.set_bk_color(bk_color);
   title_bar_window_.Create(
@@ -434,13 +435,13 @@
 }
 
 void OwnerDrawTitleBar::RecalcLayout() {
-  DCHECK(title_bar_window_.IsWindow());
+  CHECK(title_bar_window_.IsWindow());
   title_bar_window_.RecalcLayout();
 }
 
 CRect OwnerDrawTitleBar::ComputeTitleBarClientRect(HWND parent_hwnd,
                                                    HWND title_bar_spacer_hwnd) {
-  DCHECK(parent_hwnd);
+  CHECK(parent_hwnd);
 
   CRect parent_client_rect;
   ::GetClientRect(parent_hwnd, &parent_client_rect);
@@ -463,7 +464,7 @@
   text_color_ = text_color;
   bk_color_ = bk_color;
 
-  DCHECK(bk_brush_.IsNull());
+  CHECK(bk_brush_.IsNull());
   bk_brush_.CreateSolidBrush(bk_color_);
 }
 
@@ -531,7 +532,7 @@
     LONG bar_rect_left(bar_rect_right -
                        client_rect.Width() * kMarqueeWidth / kBarWidth);
     progress_bar_rect.left = std::max(bar_rect_left, client_rect.left);
-    DCHECK(progress_bar_rect.left <= progress_bar_rect.right);
+    CHECK_LE(progress_bar_rect.left, progress_bar_rect.right);
   }
 
   WTL::CRgn rgn = ::CreateRectRgnIndirect(&client_rect);
@@ -547,7 +548,7 @@
   // Since the region is rectangles, instead of using FillRgn, this code gets
   // all the rectangles in the 'rgn' and fills them by hand.
   const int rgndata_size = rgn.GetRegionData(nullptr, 0);
-  DCHECK(rgndata_size);
+  CHECK(rgndata_size);
   std::vector<uint8_t> rgndata_buff(rgndata_size);
   RGNDATA& rgndata = *reinterpret_cast<RGNDATA*>(&rgndata_buff[0]);
 
diff --git a/chrome/updater/win/ui/progress_wnd.cc b/chrome/updater/win/ui/progress_wnd.cc
index e4afc7f0..617552a 100644
--- a/chrome/updater/win/ui/progress_wnd.cc
+++ b/chrome/updater/win/ui/progress_wnd.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/updater/win/ui/progress_wnd.h"
 
+#include "base/check.h"
+#include "base/check_op.h"
 #include "base/notreached.h"
 #include "base/process/launch.h"
 #include "base/ranges/algorithm.h"
@@ -73,8 +75,8 @@
 InstallStoppedWnd::InstallStoppedWnd(WTL::CMessageLoop* message_loop,
                                      HWND parent)
     : message_loop_(message_loop), parent_(parent) {
-  DCHECK(message_loop);
-  DCHECK(::IsWindow(parent));
+  CHECK(message_loop);
+  CHECK(::IsWindow(parent));
 }
 
 InstallStoppedWnd::~InstallStoppedWnd() {
@@ -90,7 +92,7 @@
 
 HRESULT InstallStoppedWnd::CloseWindow() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(IsWindow());
+  CHECK(IsWindow());
   ::EnableWindow(parent_, true);
   return DestroyWindow() ? S_OK : HRESULTFromLastError();
 }
@@ -117,7 +119,7 @@
 }
 
 LRESULT InstallStoppedWnd::OnClickButton(WORD, WORD id, HWND, BOOL& handled) {
-  DCHECK(id == IDOK || id == IDCANCEL);
+  CHECK(id == IDOK || id == IDCANCEL);
   ::PostMessage(parent_, WM_INSTALL_STOPPED, id, 0);
   handled = true;
   return 0;
@@ -137,7 +139,7 @@
 
 ProgressWnd::~ProgressWnd() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!IsWindow());
+  CHECK(!IsWindow());
   cur_state_ = States::STATE_END;
 }
 
@@ -215,8 +217,8 @@
                                      WORD id,
                                      HWND wnd_ctl,
                                      BOOL& handled) {
-  DCHECK(id == IDC_BUTTON1 || id == IDC_BUTTON2 || id == IDC_CLOSE);
-  DCHECK(events_sink_);
+  CHECK(id == IDC_BUTTON1 || id == IDC_BUTTON2 || id == IDC_CLOSE);
+  CHECK(events_sink_);
 
   switch (id) {
     case IDC_BUTTON1:
@@ -270,8 +272,8 @@
                                       BOOL& handled) {
   install_stopped_wnd_.reset();
 
-  DCHECK(msg == WM_INSTALL_STOPPED);
-  DCHECK(wparam == IDOK || wparam == IDCANCEL);
+  CHECK_EQ(msg, WM_INSTALL_STOPPED);
+  CHECK(wparam == IDOK || wparam == IDCANCEL);
   switch (wparam) {
     case IDOK:
       break;
@@ -350,7 +352,7 @@
     return;
   }
 
-  DCHECK(0 <= pos && pos <= 100);
+  CHECK(0 <= pos && pos <= 100);
 
   cur_state_ = States::STATE_DOWNLOADING;
 
@@ -466,7 +468,7 @@
 }
 
 void ProgressWnd::DeterminePostInstallUrls(const ObserverCompletionInfo& info) {
-  DCHECK(post_install_urls_.empty());
+  CHECK(post_install_urls_.empty());
   post_install_urls_.clear();
 
   for (const AppCompletionInfo& app_info : info.apps_info) {
@@ -478,7 +480,7 @@
       post_install_urls_.push_back(app_info.post_install_url);
     }
   }
-  DCHECK(!post_install_urls_.empty());
+  CHECK(!post_install_urls_.empty());
 }
 
 CompletionCodes ProgressWnd::GetBundleOverallCompletionCode(
@@ -489,7 +491,7 @@
     return info.completion_code;
   }
 
-  DCHECK(info.completion_code == CompletionCodes::COMPLETION_CODE_SUCCESS);
+  CHECK_EQ(info.completion_code, CompletionCodes::COMPLETION_CODE_SUCCESS);
 
   return info.apps_info.empty()
              ? kCompletionCodesActionPriority[0]
@@ -649,8 +651,8 @@
     return S_OK;
   }
 
-  DCHECK(SUCCEEDED(app_info.error_code));
-  DCHECK(!app_info.is_noupdate);
+  CHECK(SUCCEEDED(app_info.error_code));
+  CHECK(!app_info.is_noupdate);
 
   auto process =
       base::LaunchProcess(app_info.post_install_launch_command_line, {});
diff --git a/chrome/updater/win/ui/splash_screen.cc b/chrome/updater/win/ui/splash_screen.cc
index 7f86aff..11fe7f8 100644
--- a/chrome/updater/win/ui/splash_screen.cc
+++ b/chrome/updater/win/ui/splash_screen.cc
@@ -7,6 +7,8 @@
 #include <cstdint>
 #include <utility>
 
+#include "base/check.h"
+#include "base/check_op.h"
 #include "base/logging.h"
 #include "base/notreached.h"
 #include "base/task/sequenced_task_runner.h"
@@ -30,7 +32,7 @@
 constexpr int kAlphaScales[] = {0, 30, 47, 62, 75, 85, 93, kDefaultAlphaScale};
 
 uint8_t AlphaScaleToAlphaValue(int alpha_scale) {
-  DCHECK(alpha_scale >= 0 && alpha_scale <= 100);
+  CHECK(alpha_scale >= 0 && alpha_scale <= 100);
   return static_cast<uint8_t>(alpha_scale * 255 / 100);
 }
 
@@ -54,8 +56,8 @@
 
   // TODO(crbug.com/1059094) this assert may fire when the dtor is called
   // while the window is fading out.
-  DCHECK(state_ == WindowState::STATE_CREATED ||
-         state_ == WindowState::STATE_CLOSED);
+  CHECK(state_ == WindowState::STATE_CREATED ||
+        state_ == WindowState::STATE_CLOSED);
 }
 
 void SplashScreen::Show() {
@@ -66,7 +68,7 @@
     return;
   }
 
-  DCHECK(IsWindow());
+  CHECK(IsWindow());
   ShowWindow(SW_SHOWNORMAL);
   SwitchToState(WindowState::STATE_SHOW_NORMAL);
 }
@@ -113,8 +115,8 @@
 
 HRESULT SplashScreen::Initialize() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!IsWindow());
-  DCHECK(state_ == WindowState::STATE_CREATED);
+  CHECK(!IsWindow());
+  CHECK_EQ(state_, WindowState::STATE_CREATED);
 
   if (!Create(nullptr)) {
     return E_FAIL;
@@ -176,7 +178,7 @@
 
     // Remove Close/Minimize/Maximize from the system menu.
     HMENU menu(::GetSystemMenu(*this, false));
-    DCHECK(menu);
+    CHECK(menu);
     ::RemoveMenu(menu, SC_CLOSE, MF_BYCOMMAND);
     ::RemoveMenu(menu, SC_MINIMIZE, MF_BYCOMMAND);
     ::RemoveMenu(menu, SC_MAXIMIZE, MF_BYCOMMAND);
@@ -196,7 +198,7 @@
 
 LRESULT SplashScreen::OnTimer(UINT, WPARAM, LPARAM, BOOL& handled) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(state_ == WindowState::STATE_FADING);
+  CHECK_EQ(state_, WindowState::STATE_FADING);
   DCHECK_GT(alpha_index_, 0);
   if (--alpha_index_) {
     ::SetLayeredWindowAttributes(
@@ -220,7 +222,7 @@
 LRESULT SplashScreen::OnDestroy(UINT, WPARAM, LPARAM, BOOL& handled) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (timer_created_) {
-    DCHECK(IsWindow());
+    CHECK(IsWindow());
     KillTimer(kClosingTimerID);
   }
   std::move(on_close_closure_).Run();
@@ -239,7 +241,7 @@
       alpha_index_ = std::size(kAlphaScales) - 1;
       break;
     case WindowState::STATE_FADING:
-      DCHECK(IsWindow());
+      CHECK(IsWindow());
       timer_created_ = SetTimer(kClosingTimerID, kTimerInterval, nullptr) != 0;
       if (!timer_created_) {
         Close();
diff --git a/chrome/updater/win/ui/ui.cc b/chrome/updater/win/ui/ui.cc
index 1ee3aae..3d972a2 100644
--- a/chrome/updater/win/ui/ui.cc
+++ b/chrome/updater/win/ui/ui.cc
@@ -7,6 +7,7 @@
 #include <stdint.h>
 #include <functional>
 
+#include "base/check.h"
 #include "base/logging.h"
 #include "chrome/updater/updater_scope.h"
 #include "chrome/updater/util/win_util.h"
@@ -31,7 +32,7 @@
 void EnableFlatButtons(HWND hwnd_parent) {
   struct Local {
     static BOOL CALLBACK EnumProc(HWND hwnd, LPARAM) {
-      DCHECK(hwnd);
+      CHECK(hwnd);
       CWindow wnd(hwnd);
       const DWORD style = wnd.GetStyle();
       if (style & BS_FLAT) {
@@ -47,7 +48,7 @@
 void HideWindowChildren(HWND hwnd_parent) {
   struct Local {
     static BOOL CALLBACK EnumProc(HWND hwnd, LPARAM) {
-      DCHECK(hwnd);
+      CHECK(hwnd);
       ShowWindow(hwnd, SW_HIDE);
       return true;
     }
@@ -63,12 +64,12 @@
       is_close_enabled_(true),
       events_sink_(nullptr),
       scope_(UpdaterScope::kUser) {
-  DCHECK(message_loop);
+  CHECK(message_loop);
 }
 
 OmahaWnd::~OmahaWnd() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!IsWindow());
+  CHECK(!IsWindow());
 }
 
 HRESULT OmahaWnd::Initialize() {
@@ -96,7 +97,7 @@
 
   // Disable the Maximize System Menu item.
   HMENU menu = ::GetSystemMenu(*this, false);
-  DCHECK(menu);
+  CHECK(menu);
   ::EnableMenuItem(menu, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED);
 
   progress_bar_.SubclassWindow(GetDlgItem(IDC_PROGRESS));
@@ -209,7 +210,7 @@
   }
 
   HWND hwnd = GetDlgItem(control_id);
-  DCHECK(hwnd);
+  CHECK(hwnd);
   ::ShowWindow(hwnd, attributes.is_visible ? SW_SHOW : SW_HIDE);
   ::EnableWindow(hwnd, attributes.is_enabled ? true : false);
   if (attributes.is_button && attributes.is_default) {
@@ -231,7 +232,7 @@
 
 HRESULT OmahaWnd::EnableSystemCloseButton(bool enable) {
   HMENU menu = ::GetSystemMenu(*this, false);
-  DCHECK(menu);
+  CHECK(menu);
   uint32_t flags = MF_BYCOMMAND;
   flags |= enable ? MF_ENABLED : MF_GRAYED;
   ::EnableMenuItem(menu, SC_CLOSE, flags);
diff --git a/chrome/updater/win/ui/ui_displayed_event.cc b/chrome/updater/win/ui/ui_displayed_event.cc
index b5e3884..6f9dd7b 100644
--- a/chrome/updater/win/ui/ui_displayed_event.cc
+++ b/chrome/updater/win/ui/ui_displayed_event.cc
@@ -13,7 +13,7 @@
 namespace updater::ui {
 
 HRESULT UIDisplayedEventManager::CreateEvent(UpdaterScope scope) {
-  DCHECK(!IsEventHandleInitialized());
+  CHECK(!IsEventHandleInitialized());
   return CreateUniqueEventInEnvironment(
       kLegacyUiDisplayedEventEnvironmentVariableName, scope,
       ScopedKernelHANDLE::Receiver(GetUIDisplayedEvent()).get());
@@ -21,7 +21,7 @@
 
 HRESULT UIDisplayedEventManager::GetEvent(UpdaterScope scope,
                                           HANDLE* ui_displayed_event) {
-  DCHECK(ui_displayed_event);
+  CHECK(ui_displayed_event);
   *ui_displayed_event = nullptr;
   if (IsEventHandleInitialized()) {
     *ui_displayed_event = GetUIDisplayedEvent().get();
@@ -53,7 +53,7 @@
     }
   }
 
-  DCHECK(IsEventHandleInitialized());
+  CHECK(IsEventHandleInitialized());
   ::SetEvent(GetUIDisplayedEvent().get());
 }
 
diff --git a/chrome/updater/win/ui/ui_util.cc b/chrome/updater/win/ui/ui_util.cc
index b65a7fd..f971c2c1 100644
--- a/chrome/updater/win/ui/ui_util.cc
+++ b/chrome/updater/win/ui/ui_util.cc
@@ -23,7 +23,7 @@
 BOOL CALLBACK FindProcessWindowsEnumProc(HWND hwnd, LPARAM lparam) {
   FindProcessWindowsRecord* enum_record =
       reinterpret_cast<FindProcessWindowsRecord*>(lparam);
-  DCHECK(enum_record);
+  CHECK(enum_record);
 
   DWORD process_id = 0;
   ::GetWindowThreadProcessId(hwnd, &process_id);
@@ -56,7 +56,7 @@
 bool FindProcessWindows(uint32_t process_id,
                         uint32_t window_flags,
                         std::vector<HWND>* windows) {
-  DCHECK(windows);
+  CHECK(windows);
   windows->clear();
   FindProcessWindowsRecord enum_record = {0};
   enum_record.process_id = process_id;
@@ -85,8 +85,8 @@
 }
 
 HRESULT SetWindowIcon(HWND hwnd, WORD icon_id, HICON* hicon) {
-  DCHECK(hwnd);
-  DCHECK(hicon);
+  CHECK(hwnd);
+  CHECK(hicon);
 
   *hicon = nullptr;
 
diff --git a/chrome/updater/win/ui/yes_no_dialog.cc b/chrome/updater/win/ui/yes_no_dialog.cc
index d42dd06..bc1d011 100644
--- a/chrome/updater/win/ui/yes_no_dialog.cc
+++ b/chrome/updater/win/ui/yes_no_dialog.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/updater/win/ui/yes_no_dialog.h"
 
+#include "base/check.h"
 #include "base/logging.h"
 #include "base/notreached.h"
 #include "chrome/updater/win/ui/l10n_util.h"
@@ -16,11 +17,11 @@
 
 YesNoDialog::YesNoDialog(WTL::CMessageLoop* message_loop, HWND parent)
     : message_loop_(message_loop), parent_(parent), yes_clicked_(false) {
-  DCHECK(message_loop);
+  CHECK(message_loop);
 }
 
 YesNoDialog::~YesNoDialog() {
-  DCHECK(!IsWindow());
+  CHECK(!IsWindow());
 }
 
 BOOL YesNoDialog::PreTranslateMessage(MSG* msg) {
@@ -29,7 +30,7 @@
 
 HRESULT YesNoDialog::Initialize(const std::wstring& yes_no_title,
                                 const std::wstring& yes_no_text) {
-  DCHECK(!IsWindow());
+  CHECK(!IsWindow());
 
   if (!Create(parent_)) {
     return E_FAIL;
@@ -66,8 +67,8 @@
 }
 
 HRESULT YesNoDialog::Show() {
-  DCHECK(IsWindow());
-  DCHECK(!IsWindowVisible());
+  CHECK(IsWindow());
+  CHECK(!IsWindowVisible());
 
   CenterWindow(nullptr);
   ShowWindow(SW_SHOWNORMAL);
@@ -79,7 +80,7 @@
                                      WORD id,
                                      HWND wnd_ctl,
                                      BOOL& handled) {
-  DCHECK(id == IDOK || id == IDCANCEL);
+  CHECK(id == IDOK || id == IDCANCEL);
 
   switch (id) {
     case IDOK:
diff --git a/chrome/updater/win/user_info.cc b/chrome/updater/win/user_info.cc
index bc3e784..813dbd9 100644
--- a/chrome/updater/win/user_info.cc
+++ b/chrome/updater/win/user_info.cc
@@ -38,13 +38,13 @@
 }
 
 HRESULT GetProcessUserSid(CSid* sid) {
-  DCHECK(sid);
+  CHECK(sid);
 
   CAccessToken token;
   if (!token.GetProcessToken(TOKEN_QUERY) || !token.GetUser(sid)) {
     HRESULT hr = HRESULTFromLastError();
     std::wstring thread_sid;
-    DCHECK(FAILED(GetThreadUserSid(&thread_sid)));
+    CHECK(FAILED(GetThreadUserSid(&thread_sid)));
     return hr;
   }
 
@@ -58,7 +58,7 @@
 }
 
 HRESULT GetThreadUserSid(std::wstring* sid) {
-  DCHECK(sid);
+  CHECK(sid);
   CAccessToken access_token;
   CSid user_sid;
   if (access_token.GetThreadToken(TOKEN_READ) &&
diff --git a/chromecast/net/connectivity_checker_impl.cc b/chromecast/net/connectivity_checker_impl.cc
index 23662607..9ec15e8f 100644
--- a/chromecast/net/connectivity_checker_impl.cc
+++ b/chromecast/net/connectivity_checker_impl.cc
@@ -228,13 +228,12 @@
       &ConnectivityCheckerImpl::OnConnectivityCheckComplete, weak_this_);
   url_loader_->DownloadHeadersOnly(url_loader_factory_.get(),
                                    std::move(callback));
-
-  timeout_.Reset(base::BindOnce(&ConnectivityCheckerImpl::OnUrlRequestTimeout,
-                                weak_this_));
   // Exponential backoff for timeout in 3, 6 and 12 sec.
   const base::TimeDelta timeout =
       kRequestTimeout *
       std::pow(2, std::min(check_errors_, static_cast<unsigned int>(2)));
+  timeout_.Reset(base::BindOnce(&ConnectivityCheckerImpl::OnUrlRequestTimeout,
+                                weak_this_, timeout));
   base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
       FROM_HERE, timeout_.callback(), timeout);
 }
@@ -357,11 +356,11 @@
                                 disconnected_probe_period_);
 }
 
-void ConnectivityCheckerImpl::OnUrlRequestTimeout() {
+void ConnectivityCheckerImpl::OnUrlRequestTimeout(base::TimeDelta timeout) {
   DCHECK(task_runner_->BelongsToCurrentThread());
   DCHECK(url_loader_);
   url_loader_ = nullptr;
-  LOG(ERROR) << "time out";
+  LOG(WARNING) << "timed out after " << timeout;
   OnUrlRequestError(ErrorType::REQUEST_TIMEOUT);
 }
 
diff --git a/chromecast/net/connectivity_checker_impl.h b/chromecast/net/connectivity_checker_impl.h
index fc8a035..98c5376f 100644
--- a/chromecast/net/connectivity_checker_impl.h
+++ b/chromecast/net/connectivity_checker_impl.h
@@ -132,8 +132,9 @@
   // Called when URL request failed.
   void OnUrlRequestError(ErrorType type);
 
-  // Called when URL request timed out.
-  void OnUrlRequestTimeout();
+  // Called when URL request timed out. |Timeout| stores how long we waited
+  // for the URL request to finish before giving up.
+  void OnUrlRequestTimeout(base::TimeDelta timeout);
 
   void CheckInternal();
 
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index e838c502..8c125ef0 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-15389.0.0
\ No newline at end of file
+15390.0.0
\ No newline at end of file
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc b/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc
index 88638eca..f616ff4 100644
--- a/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc
+++ b/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc
@@ -86,9 +86,6 @@
   FileMetadata::Type type = FileMetadata::Type::kFile;
   bool pinned = false;
   bool available_offline = false;
-  // Whether to send a status update for this drive item. If false this will get
-  // filtered out when converting `DriveItem` in `MakeSyncingStatus`.
-  bool status_update = true;
 };
 
 int64_t DriveItem::counter = 0;
@@ -204,49 +201,14 @@
  protected:
   ~DriveFsPinManagerTest() override {
     logging::SetMinLogLevel(original_log_level_);
-    logging::SetLogMessageHandler(original_log_handler_);
   }
 
   DriveFsPinManagerTest() {
-    logging::SetLogMessageHandler(&LogMessageHandler);
     logging::SetMinLogLevel(-3);
     CHECK(temp_dir_.CreateUniqueTempDir());
     gcache_dir_ = temp_dir_.GetPath().Append("GCache");
   }
 
-  // A no-op log message handler. This is put in place in order to force the
-  // generation of log messages and exercise more code in unit tests.
-  static bool LogMessageHandler([[maybe_unused]] const int severity,
-                                [[maybe_unused]] const char* const file,
-                                [[maybe_unused]] const int line,
-                                [[maybe_unused]] const size_t message_start,
-                                [[maybe_unused]] const std::string& str) {
-    return false;
-  }
-
-  static SyncingStatusPtr MakeSyncingStatus(
-      const vector<DriveItem>& items,
-      ItemEvent::State state = ItemEvent::State::kQueued) {
-    SyncingStatusPtr status = SyncingStatus::New();
-
-    vector<ItemEventPtr> events;
-    for (const DriveItem& item : items) {
-      if (item.pinned || !item.status_update) {
-        continue;
-      }
-      ItemEventPtr event = ItemEvent::New();
-      event->is_download = true;
-      event->stable_id = item.stable_id;
-      event->path = item.path.value();
-      event->state = state;
-      event->bytes_to_transfer = item.size;
-      events.push_back(std::move(event));
-    }
-
-    status->item_events = std::move(events);
-    return status;
-  }
-
   static void SetState(vector<ItemEventPtr>& events,
                        const ItemEvent::State state) {
     for (ItemEventPtr& event : events) {
@@ -260,8 +222,6 @@
                                base::Unretained(&space_getter_));
   }
 
-  const logging::LogMessageHandlerFunction original_log_handler_ =
-      logging::GetLogMessageHandler();
   const int original_log_level_ = logging::GetMinLogLevel();
   TaskEnvironment task_environment_{TaskEnvironment::TimeSource::MOCK_TIME};
   base::ScopedTempDir temp_dir_;
diff --git a/chromeos/ash/components/network/metrics/hotspot_metrics_helper.cc b/chromeos/ash/components/network/metrics/hotspot_metrics_helper.cc
index 4ce9002..c9acaaff 100644
--- a/chromeos/ash/components/network/metrics/hotspot_metrics_helper.cc
+++ b/chromeos/ash/components/network/metrics/hotspot_metrics_helper.cc
@@ -74,6 +74,10 @@
     "Network.Ash.Hotspot.Upstream.Cellular.Enabled.UpstreamStatus";
 
 // static
+const char HotspotMetricsHelper::kHotspotDisableReasonHistogram[] =
+    "Network.Ash.Hotspot.Upstream.Cellular.Disabled.Reason";
+
+// static
 void HotspotMetricsHelper::RecordSetTetheringEnabledResult(
     bool enabled,
     hotspot_config::mojom::HotspotControlResult result) {
@@ -107,6 +111,7 @@
   base::UmaHistogramMediumTimes(kHotspotEnableLatency, latency);
 }
 
+// static
 HotspotMetricsHelper::HotspotMetricsSetEnabledResult
 HotspotMetricsHelper::GetSetEnabledMetricsResult(
     const hotspot_config::mojom::HotspotControlResult& result) {
@@ -140,6 +145,7 @@
   }
 }
 
+// static
 HotspotMetricsHelper::HotspotMetricsCheckReadinessResult
 HotspotMetricsHelper::GetCheckReadinessMetricsResult(
     const HotspotCapabilitiesProvider::CheckTetheringReadinessResult& result) {
@@ -160,6 +166,7 @@
   }
 }
 
+// static
 HotspotMetricsHelper::HotspotMetricsSetConfigResult
 HotspotMetricsHelper::GetSetConfigMetricsResult(
     const hotspot_config::mojom::SetHotspotConfigResult& result) {
@@ -175,6 +182,32 @@
   }
 }
 
+// static
+HotspotMetricsHelper::HotspotMetricsDisableReason
+HotspotMetricsHelper::GetMetricsDisableReason(
+    const hotspot_config::mojom::DisableReason& reason) {
+  using hotspot_config::mojom::DisableReason;
+
+  switch (reason) {
+    case DisableReason::kAutoDisabled:
+      return HotspotMetricsDisableReason::kAutoDisabled;
+    case DisableReason::kInternalError:
+      return HotspotMetricsDisableReason::kInternalError;
+    case DisableReason::kUserInitiated:
+      return HotspotMetricsDisableReason::kUserInitiated;
+    case DisableReason::kWifiEnabled:
+      return HotspotMetricsDisableReason::kWifiEnabled;
+    case DisableReason::kProhibitedByPolicy:
+      return HotspotMetricsDisableReason::kProhibitedByPolicy;
+    case DisableReason::kUpstreamNetworkNotAvailable:
+      return HotspotMetricsDisableReason::kUpstreamNetworkNotAvailable;
+    case DisableReason::kSuspended:
+      return HotspotMetricsDisableReason::kSuspended;
+    case DisableReason::kRestart:
+      return HotspotMetricsDisableReason::kRestart;
+  }
+}
+
 HotspotMetricsHelper::HotspotMetricsHelper() = default;
 
 HotspotMetricsHelper::~HotspotMetricsHelper() {
@@ -339,6 +372,12 @@
       HotspotMetricsUpstreamStatus::kWifiWithCellularConnected);
 }
 
+void HotspotMetricsHelper::LogDisableReason(
+    const hotspot_config::mojom::DisableReason& reason) {
+  base::UmaHistogramEnumeration(kHotspotDisableReasonHistogram,
+                                GetMetricsDisableReason(reason));
+}
+
 void HotspotMetricsHelper::OnHotspotTurnedOn(bool wifi_turned_off) {
   is_hotspot_active_ = true;
   LogUpstreamStatus();
@@ -352,6 +391,7 @@
 void HotspotMetricsHelper::OnHotspotTurnedOff(
     hotspot_config::mojom::DisableReason reason) {
   is_hotspot_active_ = false;
+  LogDisableReason(reason);
   LogUsageDuration();
   LogMaxClientCount();
   max_client_count_ = 0;
diff --git a/chromeos/ash/components/network/metrics/hotspot_metrics_helper.h b/chromeos/ash/components/network/metrics/hotspot_metrics_helper.h
index 8c628c4d..7e87ef44 100644
--- a/chromeos/ash/components/network/metrics/hotspot_metrics_helper.h
+++ b/chromeos/ash/components/network/metrics/hotspot_metrics_helper.h
@@ -74,6 +74,8 @@
                            HotspotIsDeviceManagedHistogram);
   FRIEND_TEST_ALL_PREFIXES(HotspotMetricsHelperTest,
                            HotspotEnabledUpstreamStatusHistogram);
+  FRIEND_TEST_ALL_PREFIXES(HotspotMetricsHelperTest,
+                           HotspotDisableReasonHistogram);
   FRIEND_TEST_ALL_PREFIXES(HotspotControllerTest, EnableTetheringSuccess);
   FRIEND_TEST_ALL_PREFIXES(HotspotControllerTest,
                            EnableTetheringReadinessCheckFailure);
@@ -88,6 +90,7 @@
   enum class HotspotMetricsSetEnabledResult;
   enum class HotspotMetricsSetConfigResult;
   enum class HotspotMetricsCheckReadinessResult;
+  enum class HotspotMetricsDisableReason;
 
   static const char kHotspotAllowStatusHistogram[];
   static const char kHotspotAllowStatusAtLoginHistogram[];
@@ -103,6 +106,7 @@
   static const char kHotspotIsDeviceManaged[];
   static const char kHotspotEnableLatency[];
   static const char kHotspotUpstreamStatusWhenEnabled[];
+  static const char kHotspotDisableReasonHistogram[];
   static const base::TimeDelta kLogAllowStatusAtLoginTimeout;
 
   static HotspotMetricsCheckReadinessResult GetCheckReadinessMetricsResult(
@@ -111,6 +115,8 @@
       const hotspot_config::mojom::HotspotControlResult& result);
   static HotspotMetricsSetConfigResult GetSetConfigMetricsResult(
       const hotspot_config::mojom::SetHotspotConfigResult& result);
+  static HotspotMetricsDisableReason GetMetricsDisableReason(
+      const hotspot_config::mojom::DisableReason& reason);
 
   // Represents the hotspot allow status on device. Note:
   // kDisallowNoCellularUpstream is not logged in the metric because it means
@@ -177,6 +183,20 @@
     kMaxValue = kWifiWithCellularNotConnected,
   };
 
+  // Represents the hotspot disable reason. These values are persisted to logs.
+  // Entries should not be renumbered and numeric values should never be used.
+  enum class HotspotMetricsDisableReason {
+    kAutoDisabled = 0,
+    kInternalError = 1,
+    kUserInitiated = 2,
+    kWifiEnabled = 3,
+    kProhibitedByPolicy = 4,
+    kUpstreamNetworkNotAvailable = 5,
+    kSuspended = 6,
+    kRestart = 7,
+    kMaxValue = kRestart,
+  };
+
   // HotspotCapabilitiesProvider::Observer:
   void OnHotspotCapabilitiesChanged() override;
 
@@ -197,6 +217,7 @@
   void LogMaxClientCount();
   void LogIsDeviceManaged();
   void LogUpstreamStatus();
+  void LogDisableReason(const hotspot_config::mojom::DisableReason& reason);
 
   // Retrieves the latest hotspot allow status and converts to
   // HotspotMetricsAllowStatus enum. Return absl::nullopt if it is disallowed
diff --git a/chromeos/ash/components/network/metrics/hotspot_metrics_helper_unittest.cc b/chromeos/ash/components/network/metrics/hotspot_metrics_helper_unittest.cc
index 01760d1..4331044b 100644
--- a/chromeos/ash/components/network/metrics/hotspot_metrics_helper_unittest.cc
+++ b/chromeos/ash/components/network/metrics/hotspot_metrics_helper_unittest.cc
@@ -330,4 +330,33 @@
       /*expected_count=*/1);
 }
 
+TEST_F(HotspotMetricsHelperTest, HotspotDisableReasonHistogram) {
+  PrepareEnableHotspotForTesting();
+  hotspot_controller_->EnableHotspot(base::DoNothing());
+  base::RunLoop().RunUntilIdle();
+
+  SetHotspotStateInShill(shill::kTetheringStateActive);
+  hotspot_controller_->DisableHotspot(
+      base::DoNothing(), hotspot_config::mojom::DisableReason::kUserInitiated);
+  base::RunLoop().RunUntilIdle();
+  histogram_tester_.ExpectBucketCount(
+      HotspotMetricsHelper::kHotspotDisableReasonHistogram,
+      HotspotMetricsHelper::HotspotMetricsDisableReason::kUserInitiated, 1);
+
+  SetHotspotStateInShill(shill::kTetheringStateIdle);
+  // Verifies that the disabel reason is logged if hotspot is torn down by
+  // internal error.
+  base::Value::Dict status_dict;
+  status_dict.Set(shill::kTetheringStatusStateProperty,
+                  shill::kTetheringStateIdle);
+  status_dict.Set(shill::kTetheringStatusIdleReasonProperty,
+                  shill::kTetheringIdleReasonError);
+  network_state_test_helper_.manager_test()->SetManagerProperty(
+      shill::kTetheringStatusProperty, base::Value(status_dict.Clone()));
+  base::RunLoop().RunUntilIdle();
+  histogram_tester_.ExpectBucketCount(
+      HotspotMetricsHelper::kHotspotDisableReasonHistogram,
+      HotspotMetricsHelper::HotspotMetricsDisableReason::kInternalError, 1);
+}
+
 }  // namespace ash
diff --git a/chromeos/ash/components/phonehub/fake_recent_apps_interaction_handler.cc b/chromeos/ash/components/phonehub/fake_recent_apps_interaction_handler.cc
index f360586..312ce28 100644
--- a/chromeos/ash/components/phonehub/fake_recent_apps_interaction_handler.cc
+++ b/chromeos/ash/components/phonehub/fake_recent_apps_interaction_handler.cc
@@ -37,9 +37,9 @@
   recent_app_click_observer_count_--;
 }
 
-void FakeRecentAppsInteractionHandler::SetConnectionStatusObserver(
-    eche_app::EcheConnectionStatusObserver* eche_connection_status_observer) {
-  eche_connection_status_observer_count_++;
+void FakeRecentAppsInteractionHandler::SetConnectionStatusHandler(
+    eche_app::EcheConnectionStatusHandler* eche_connection_status_handler) {
+  eche_connection_status_handler_count_++;
 }
 
 void FakeRecentAppsInteractionHandler::OnFeatureStateChanged(
diff --git a/chromeos/ash/components/phonehub/fake_recent_apps_interaction_handler.h b/chromeos/ash/components/phonehub/fake_recent_apps_interaction_handler.h
index c959660..dfb314c 100644
--- a/chromeos/ash/components/phonehub/fake_recent_apps_interaction_handler.h
+++ b/chromeos/ash/components/phonehub/fake_recent_apps_interaction_handler.h
@@ -7,7 +7,7 @@
 
 #include <stdint.h>
 
-#include "ash/webui/eche_app_ui/eche_connection_status_observer.h"
+#include "ash/webui/eche_app_ui/eche_connection_status_handler.h"
 #include "base/time/time.h"
 #include "chromeos/ash/components/phonehub/notification.h"
 #include "chromeos/ash/components/phonehub/recent_apps_interaction_handler.h"
@@ -35,8 +35,8 @@
     return recent_app_click_observer_count_;
   }
 
-  size_t eche_connection_status_observer_count() const {
-    return eche_connection_status_observer_count_;
+  size_t eche_connection_status_handler_count() const {
+    return eche_connection_status_handler_count_;
   }
 
   void NotifyRecentAppClicked(
@@ -44,9 +44,8 @@
       eche_app::mojom::AppStreamLaunchEntryPoint entrypoint) override;
   void AddRecentAppClickObserver(RecentAppClickObserver* observer) override;
   void RemoveRecentAppClickObserver(RecentAppClickObserver* observer) override;
-  void SetConnectionStatusObserver(
-      eche_app::EcheConnectionStatusObserver* eche_connection_status_observer)
-      override;
+  void SetConnectionStatusHandler(eche_app::EcheConnectionStatusHandler*
+                                      eche_connection_status_handler) override;
   void NotifyRecentAppAddedOrUpdated(
       const Notification::AppMetadata& app_metadata,
       base::Time last_accessed_timestamp) override;
@@ -59,7 +58,7 @@
   void ComputeAndUpdateUiState();
 
   size_t recent_app_click_observer_count_ = 0;
-  size_t eche_connection_status_observer_count_ = 0;
+  size_t eche_connection_status_handler_count_ = 0;
   multidevice_setup::mojom::FeatureState feature_state_ =
       multidevice_setup::mojom::FeatureState::kDisabledByUser;
 
diff --git a/chromeos/ash/components/phonehub/recent_apps_interaction_handler.h b/chromeos/ash/components/phonehub/recent_apps_interaction_handler.h
index a4b9822..abe03a6 100644
--- a/chromeos/ash/components/phonehub/recent_apps_interaction_handler.h
+++ b/chromeos/ash/components/phonehub/recent_apps_interaction_handler.h
@@ -7,7 +7,7 @@
 
 #include <stdint.h>
 
-#include "ash/webui/eche_app_ui/eche_connection_status_observer.h"
+#include "ash/webui/eche_app_ui/eche_connection_status_handler.h"
 #include "base/gtest_prod_util.h"
 #include "base/observer_list.h"
 #include "base/observer_list_types.h"
@@ -67,9 +67,9 @@
   virtual void AddRecentAppClickObserver(RecentAppClickObserver* observer);
   virtual void RemoveRecentAppClickObserver(RecentAppClickObserver* observer);
 
-  virtual void SetConnectionStatusObserver(
-      eche_app::EcheConnectionStatusObserver*
-          eche_connection_status_observer) = 0;
+  virtual void SetConnectionStatusHandler(
+      eche_app::EcheConnectionStatusHandler*
+          eche_connection_status_handler) = 0;
 
   virtual void NotifyRecentAppClicked(
       const Notification::AppMetadata& app_metadata,
diff --git a/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl.cc b/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl.cc
index 6043d72..79af9cb8 100644
--- a/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl.cc
+++ b/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl.cc
@@ -54,8 +54,8 @@
 
 RecentAppsInteractionHandlerImpl::~RecentAppsInteractionHandlerImpl() {
   if (features::IsEcheNetworkConnectionStateEnabled() &&
-      eche_connection_status_observer_) {
-    eche_connection_status_observer_->RemoveObserver(this);
+      eche_connection_status_handler_) {
+    eche_connection_status_handler_->RemoveObserver(this);
   }
 
   multidevice_setup_client_->RemoveObserver(this);
@@ -106,13 +106,13 @@
   ComputeAndUpdateUiState();
 }
 
-void RecentAppsInteractionHandlerImpl::SetConnectionStatusObserver(
-    eche_app::EcheConnectionStatusObserver* eche_connection_status_observer) {
-  eche_connection_status_observer_ = eche_connection_status_observer;
+void RecentAppsInteractionHandlerImpl::SetConnectionStatusHandler(
+    eche_app::EcheConnectionStatusHandler* eche_connection_status_handler) {
+  eche_connection_status_handler_ = eche_connection_status_handler;
 
   if (features::IsEcheNetworkConnectionStateEnabled() &&
-      eche_connection_status_observer_) {
-    eche_connection_status_observer_->AddObserver(this);
+      eche_connection_status_handler_) {
+    eche_connection_status_handler_->AddObserver(this);
   }
 }
 
diff --git a/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl.h b/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl.h
index 9107ade..b3b4139 100644
--- a/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl.h
+++ b/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl.h
@@ -29,7 +29,7 @@
     : public RecentAppsInteractionHandler,
       public multidevice_setup::MultiDeviceSetupClient::Observer,
       public MultideviceFeatureAccessManager::Observer,
-      public eche_app::EcheConnectionStatusObserver::Observer {
+      public eche_app::EcheConnectionStatusHandler::Observer {
  public:
   static void RegisterPrefs(PrefRegistrySimple* registry);
 
@@ -49,9 +49,8 @@
       const Notification::AppMetadata& app_metadata,
       base::Time last_accessed_timestamp) override;
   std::vector<Notification::AppMetadata> FetchRecentAppMetadataList() override;
-  void SetConnectionStatusObserver(
-      eche_app::EcheConnectionStatusObserver* eche_connection_status_observer)
-      override;
+  void SetConnectionStatusHandler(eche_app::EcheConnectionStatusHandler*
+                                      eche_connection_status_handler) override;
 
   // MultiDeviceSetupClient::Observer:
   void OnFeatureStatesChanged(
@@ -65,7 +64,7 @@
   void OnNotificationAccessChanged() override;
   void OnAppsAccessChanged() override;
 
-  // eche_app::EcheConnectionStatusObserver::Observer:
+  // eche_app::EcheConnectionStatusHandler::Observer:
   void OnConnectionStatusChanged(
       eche_app::mojom::ConnectionStatus connection_status) override;
 
@@ -110,7 +109,7 @@
   PrefService* pref_service_;
   multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client_;
   MultideviceFeatureAccessManager* multidevice_feature_access_manager_;
-  eche_app::EcheConnectionStatusObserver* eche_connection_status_observer_ =
+  eche_app::EcheConnectionStatusHandler* eche_connection_status_handler_ =
       nullptr;
 
   base::WeakPtrFactory<RecentAppsInteractionHandlerImpl> weak_ptr_factory_{
diff --git a/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl_unittest.cc b/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl_unittest.cc
index 5f2e1da..526f1ce 100644
--- a/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl_unittest.cc
+++ b/chromeos/ash/components/phonehub/recent_apps_interaction_handler_impl_unittest.cc
@@ -7,7 +7,7 @@
 #include <memory>
 
 #include "ash/constants/ash_features.h"
-#include "ash/webui/eche_app_ui/eche_connection_status_observer.h"
+#include "ash/webui/eche_app_ui/eche_connection_status_handler.h"
 #include "base/test/scoped_feature_list.h"
 #include "chromeos/ash/components/phonehub/fake_multidevice_feature_access_manager.h"
 #include "chromeos/ash/components/phonehub/notification.h"
@@ -77,11 +77,11 @@
         &fake_multidevice_feature_access_manager_);
     interaction_handler_->AddRecentAppClickObserver(&fake_click_handler_);
 
-    eche_connection_status_observer_ =
-        std::make_unique<eche_app::EcheConnectionStatusObserver>();
+    eche_connection_status_handler_ =
+        std::make_unique<eche_app::EcheConnectionStatusHandler>();
 
-    interaction_handler_->SetConnectionStatusObserver(
-        eche_connection_status_observer_.get());
+    interaction_handler_->SetConnectionStatusHandler(
+        eche_connection_status_handler_.get());
   }
 
   void TearDown() override {
@@ -243,7 +243,7 @@
   }
 
   void NotifyConnectionStatusChanged(ConnectionStatus connection_status) {
-    eche_connection_status_observer_->OnConnectionStatusChanged(
+    eche_connection_status_handler_->OnConnectionStatusChanged(
         connection_status);
   }
 
@@ -262,8 +262,8 @@
 
  private:
   FakeClickHandler fake_click_handler_;
-  std::unique_ptr<eche_app::EcheConnectionStatusObserver>
-      eche_connection_status_observer_;
+  std::unique_ptr<eche_app::EcheConnectionStatusHandler>
+      eche_connection_status_handler_;
   std::unique_ptr<RecentAppsInteractionHandlerImpl> interaction_handler_;
   TestingPrefServiceSimple pref_service_;
   FakeMultideviceFeatureAccessManager fake_multidevice_feature_access_manager_;
diff --git a/chromeos/ash/components/test/ash_test_suite.cc b/chromeos/ash/components/test/ash_test_suite.cc
index fb13dd9..6a24633 100644
--- a/chromeos/ash/components/test/ash_test_suite.cc
+++ b/chromeos/ash/components/test/ash_test_suite.cc
@@ -16,7 +16,6 @@
 #include "ui/base/resource/resource_scale_factor.h"
 #include "ui/base/ui_base_paths.h"
 #include "ui/display/display_switches.h"
-#include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_switches.h"
 #include "ui/gl/test/gl_surface_test_support.h"
 #include "ui/lottie/resource.h"
@@ -34,9 +33,7 @@
   // Force software-gl. This is necessary for tests that trigger launching ash
   // in its own process
   base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
-  cmd_line->AppendSwitchASCII(switches::kUseGL, gl::kGLImplementationANGLEName);
-  cmd_line->AppendSwitchASCII(switches::kUseANGLE,
-                              gl::kANGLEImplementationSwiftShaderName);
+  cmd_line->AppendSwitch(switches::kOverrideUseSoftwareGLForTests);
   cmd_line->AppendSwitch(switches::kRejectSquareDisplay);
 
   gl::GLSurfaceTestSupport::InitializeOneOff();
diff --git a/chromeos/ash/services/assistant/public/cpp/features.cc b/chromeos/ash/services/assistant/public/cpp/features.cc
index 20632a0..2d94d14 100644
--- a/chromeos/ash/services/assistant/public/cpp/features.cc
+++ b/chromeos/ash/services/assistant/public/cpp/features.cc
@@ -56,6 +56,10 @@
              "LibAssistantDLC",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+BASE_FEATURE(kEnableAssistantLearnMore,
+             "AssistantLearnMore",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 bool IsAppSupportEnabled() {
   return base::FeatureList::IsEnabled(
       assistant::features::kAssistantAppSupport);
@@ -108,4 +112,8 @@
   return base::FeatureList::IsEnabled(kEnableLibAssistantDLC);
 }
 
+bool IsAssistantLearnMoreEnabled() {
+  return base::FeatureList::IsEnabled(kEnableAssistantLearnMore);
+}
+
 }  // namespace ash::assistant::features
diff --git a/chromeos/ash/services/assistant/public/cpp/features.h b/chromeos/ash/services/assistant/public/cpp/features.h
index 1239395..6e698b0 100644
--- a/chromeos/ash/services/assistant/public/cpp/features.h
+++ b/chromeos/ash/services/assistant/public/cpp/features.h
@@ -53,6 +53,9 @@
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 BASE_DECLARE_FEATURE(kEnableLibAssistantDLC);
 
+COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
+BASE_DECLARE_FEATURE(kEnableAssistantLearnMore);
+
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAppSupportEnabled();
 
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAudioEraserEnabled();
@@ -80,6 +83,8 @@
 
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsLibAssistantDLCEnabled();
 
+COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAssistantLearnMoreEnabled();
+
 }  // namespace ash::assistant::features
 
 // TODO(b/258750971): remove when internal assistant codes are migrated to
diff --git a/chromeos/ash/services/network_health/public/cpp/network_health_helper.cc b/chromeos/ash/services/network_health/public/cpp/network_health_helper.cc
index 7e2c29b..47ac4510 100644
--- a/chromeos/ash/services/network_health/public/cpp/network_health_helper.cc
+++ b/chromeos/ash/services/network_health/public/cpp/network_health_helper.cc
@@ -79,10 +79,14 @@
       &NetworkHealthHelper::NetworkListReceived, base::Unretained(this)));
 }
 
-bool NetworkHealthHelper::IsPortalState() {
+bool NetworkHealthHelper::IsWiFiPortalState() {
   if (!default_network_) {
     return false;
   }
+  if (default_network_->type !=
+      chromeos::network_config::mojom::NetworkType::kWiFi) {
+    return false;
+  }
   using PortalState = chromeos::network_config::mojom::PortalState;
   auto portal_state = default_network_->portal_state;
   return portal_state == PortalState::kPortal ||
diff --git a/chromeos/ash/services/network_health/public/cpp/network_health_helper.h b/chromeos/ash/services/network_health/public/cpp/network_health_helper.h
index f3fc9bb..89d3339f 100644
--- a/chromeos/ash/services/network_health/public/cpp/network_health_helper.h
+++ b/chromeos/ash/services/network_health/public/cpp/network_health_helper.h
@@ -28,8 +28,9 @@
   NetworkHealthHelper& operator=(const NetworkHealthHelper&) = delete;
   ~NetworkHealthHelper() override;
 
-  // Returns the portal state of the default network if set, or false.
-  bool IsPortalState();
+  // Returns the portal state of the default network if the default network is
+  // set and is a WiFi network, otherwise returns false.
+  bool IsWiFiPortalState();
 
   // chromeos::network_health::mojom::NetworkEventsObserver:
   void OnConnectionStateChanged(
diff --git a/chromeos/ash/services/network_health/public/cpp/network_health_helper_unittest.cc b/chromeos/ash/services/network_health/public/cpp/network_health_helper_unittest.cc
index d53c401..2f11a64f 100644
--- a/chromeos/ash/services/network_health/public/cpp/network_health_helper_unittest.cc
+++ b/chromeos/ash/services/network_health/public/cpp/network_health_helper_unittest.cc
@@ -47,6 +47,10 @@
   }
 
   NetworkHealthHelper* helper() { return helper_.get(); }
+  network_config::CrosNetworkConfigTestHelper*
+  cros_network_config_test_helper() {
+    return cros_network_config_test_helper_.get();
+  }
 
   std::string SetupWiFiService(const std::string& state) {
     return cros_network_config_test_helper_->network_state_helper()
@@ -82,14 +86,20 @@
   EXPECT_EQ(default_network->state, mojom::NetworkState::kOnline);
 }
 
-TEST_F(NetworkHealthHelperTest, RequestIsPortalState) {
-  EXPECT_FALSE(helper()->IsPortalState());
+TEST_F(NetworkHealthHelperTest, RequestIsWiFiPortalState) {
+  EXPECT_FALSE(helper()->IsWiFiPortalState());
 
   std::string path = SetupWiFiService(shill::kStateOnline);
-  EXPECT_FALSE(helper()->IsPortalState());
+  EXPECT_FALSE(helper()->IsWiFiPortalState());
 
   SetWiFiState(path, shill::kStateRedirectFound);
-  EXPECT_TRUE(helper()->IsPortalState());
+  EXPECT_TRUE(helper()->IsWiFiPortalState());
+
+  // Ethernet in a portal state should return false.
+  SetWiFiState(path, shill::kStateIdle);
+  cros_network_config_test_helper()->network_state_helper().ConfigureService(
+      R"({"GUID": "eth_guid", "Type": "ethernet", "State": "redirect-found"})");
+  EXPECT_FALSE(helper()->IsWiFiPortalState());
 }
 
 }  // namespace ash::network_health
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index 7e7b442..69c1022d 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -2616,6 +2616,20 @@
           Zone <ph name="ZONE_NUMBER">$1<ex>1</ex></ph>
         </message>
 
+        <!-- Personalization App Time of Day strings -->
+        <message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_TITLE" desc="Title for the dialog confirming user's selection of a Time of Day wallpaper.">
+          Confirm preset
+        </message>
+        <message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONTENT" desc="Content for the dialog confirming user's selection of a Time of Day wallpaper.">
+          Selecting this wallpaper will turn on auto dark mode and wallpaper color matching.
+        </message>
+        <message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_BACK_BUTTON" desc="Label for the button to close the dialog confirming user's selection of a Time of Day wallpaper.">
+          Back
+        </message>
+        <message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONFIRM_BUTTON" desc="Label for the button to accept the dialog confirming user's selection of a Time of Day wallpaper.">
+          Confirm
+        </message>
+
         <!-- Personalization App Search Results -->
         <message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_TITLE" desc="Text for search result item which, when clicked, navigates the user to personalization app.">
           Personalization
diff --git a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_BACK_BUTTON.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_BACK_BUTTON.png.sha1
new file mode 100644
index 0000000..68498dc
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_BACK_BUTTON.png.sha1
@@ -0,0 +1 @@
+0e725217471014030c8651c428f82aabc20e8c93
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONFIRM_BUTTON.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONFIRM_BUTTON.png.sha1
new file mode 100644
index 0000000..68498dc
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONFIRM_BUTTON.png.sha1
@@ -0,0 +1 @@
+0e725217471014030c8651c428f82aabc20e8c93
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONTENT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONTENT.png.sha1
new file mode 100644
index 0000000..68498dc
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONTENT.png.sha1
@@ -0,0 +1 @@
+0e725217471014030c8651c428f82aabc20e8c93
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_TITLE.png.sha1
new file mode 100644
index 0000000..68498dc
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_TITLE.png.sha1
@@ -0,0 +1 @@
+0e725217471014030c8651c428f82aabc20e8c93
\ No newline at end of file
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni
index b19d3576..1fe91b1 100644
--- a/chromeos/tast_control.gni
+++ b/chromeos/tast_control.gni
@@ -327,9 +327,6 @@
   "crostini.AppVscode.bullseye_clamshell_stable",
   "crostini.AppVscode.clamshell_stable",
 
-  # https://crbug.com/1424388
-  "health.ProbeFanInfo",
-
   # READ COMMENT AT TOP BEFORE ADDING NEW TESTS HERE.
 ]
 
diff --git a/components/BUILD.gn b/components/BUILD.gn
index ce851d4..1587c86 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -198,6 +198,7 @@
     "//components/reporting/storage:unit_tests",
     "//components/reporting/util:unit_tests",
     "//components/safe_browsing/core/browser:safe_browsing_metrics_collector_unittest",
+    "//components/safe_browsing/core/browser/password_protection:unit_tests",
     "//components/safe_search_api:unit_tests",
     "//components/saved_tab_groups:unit_tests",
     "//components/scheduling_metrics:unit_tests",
diff --git a/components/autofill/core/browser/autofill_data_util.cc b/components/autofill/core/browser/autofill_data_util.cc
index 47c438d..a32a16e 100644
--- a/components/autofill/core/browser/autofill_data_util.cc
+++ b/components/autofill/core/browser/autofill_data_util.cc
@@ -21,6 +21,7 @@
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/geo/autofill_country.h"
 #include "components/autofill/core/browser/webdata/autofill_table.h"
+#include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/grit/components_scaled_resources.h"
 #include "components/strings/grit/components_strings.h"
 #include "third_party/icu/source/common/unicode/uscript.h"
@@ -57,10 +58,36 @@
     {autofill::kVisaCard, "visa", IDR_AUTOFILL_CC_VISA, IDS_AUTOFILL_CC_VISA},
 };
 
+const PaymentRequestData kPaymentRequestDataForNewNetworkImages[]{
+    {autofill::kAmericanExpressCard, "amex", IDR_AUTOFILL_METADATA_CC_AMEX,
+     IDR_AUTOFILL_METADATA_CC_AMEX},
+    {autofill::kDinersCard, "diners", IDR_AUTOFILL_METADATA_CC_DINERS,
+     IDR_AUTOFILL_METADATA_CC_DINERS},
+    {autofill::kDiscoverCard, "discover", IDR_AUTOFILL_METADATA_CC_DISCOVER,
+     IDR_AUTOFILL_METADATA_CC_DISCOVER},
+    {autofill::kEloCard, "elo", IDR_AUTOFILL_CC_ELO, IDS_AUTOFILL_CC_ELO},
+    {autofill::kJCBCard, "jcb", IDR_AUTOFILL_METADATA_CC_JCB,
+     IDR_AUTOFILL_METADATA_CC_JCB},
+    {autofill::kMasterCard, "mastercard", IDR_AUTOFILL_METADATA_CC_MASTERCARD,
+     IDR_AUTOFILL_METADATA_CC_MASTERCARD},
+    {autofill::kMirCard, "mir", IDR_AUTOFILL_METADATA_CC_MIR,
+     IDR_AUTOFILL_METADATA_CC_MIR},
+    {autofill::kTroyCard, "troy", IDR_AUTOFILL_METADATA_CC_TROY,
+     IDR_AUTOFILL_METADATA_CC_TROY},
+    {autofill::kUnionPay, "unionpay", IDR_AUTOFILL_METADATA_CC_UNIONPAY,
+     IDR_AUTOFILL_METADATA_CC_UNIONPAY},
+    {autofill::kVisaCard, "visa", IDR_AUTOFILL_METADATA_CC_VISA,
+     IDR_AUTOFILL_METADATA_CC_VISA},
+};
+
 const PaymentRequestData kGenericPaymentRequestData = {
     autofill::kGenericCard, "generic", IDR_AUTOFILL_CC_GENERIC,
     IDS_AUTOFILL_CC_GENERIC};
 
+const PaymentRequestData kGenericPaymentRequestDataForNewNetworkImages = {
+    autofill::kGenericCard, "generic", IDR_AUTOFILL_METADATA_CC_GENERIC,
+    IDR_AUTOFILL_METADATA_CC_GENERIC};
+
 const char* const name_prefixes[] = {
     "1lt",     "1st", "2lt", "2nd",    "3rd",  "admiral", "capt",
     "captain", "col", "cpt", "dr",     "gen",  "general", "lcdr",
@@ -475,26 +502,44 @@
 
 const PaymentRequestData& GetPaymentRequestData(
     const std::string& issuer_network) {
-  for (const PaymentRequestData& data : kPaymentRequestData) {
+  bool use_new_data = base::FeatureList::IsEnabled(
+      autofill::features::kAutofillEnableNewCardArtAndNetworkImages);
+
+  for (const PaymentRequestData& data :
+       use_new_data ? kPaymentRequestDataForNewNetworkImages
+                    : kPaymentRequestData) {
     if (issuer_network == data.issuer_network)
       return data;
   }
-  return kGenericPaymentRequestData;
+  return use_new_data ? kGenericPaymentRequestDataForNewNetworkImages
+                      : kGenericPaymentRequestData;
 }
 
 const char* GetIssuerNetworkForBasicCardIssuerNetwork(
     const std::string& basic_card_issuer_network) {
-  for (const PaymentRequestData& data : kPaymentRequestData) {
+  bool use_new_data = base::FeatureList::IsEnabled(
+      autofill::features::kAutofillEnableNewCardArtAndNetworkImages);
+
+  for (const PaymentRequestData& data :
+       use_new_data ? kPaymentRequestDataForNewNetworkImages
+                    : kPaymentRequestData) {
     if (basic_card_issuer_network == data.basic_card_issuer_network) {
       return data.issuer_network;
     }
   }
-  return kGenericPaymentRequestData.issuer_network;
+  return use_new_data
+             ? kGenericPaymentRequestDataForNewNetworkImages.issuer_network
+             : kGenericPaymentRequestData.issuer_network;
 }
 
 bool IsValidBasicCardIssuerNetwork(
     const std::string& basic_card_issuer_network) {
-  return base::Contains(kPaymentRequestData, basic_card_issuer_network,
+  bool use_new_data = base::FeatureList::IsEnabled(
+      autofill::features::kAutofillEnableNewCardArtAndNetworkImages);
+
+  return base::Contains(use_new_data ? kPaymentRequestDataForNewNetworkImages
+                                     : kPaymentRequestData,
+                        basic_card_issuer_network,
                         &PaymentRequestData::basic_card_issuer_network);
 }
 
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc
index 4ff8285c..aa54a6f 100644
--- a/components/autofill/core/browser/autofill_field.cc
+++ b/components/autofill/core/browser/autofill_field.cc
@@ -307,7 +307,7 @@
 
 AutofillType AutofillField::ComputedType() const {
   // If autocomplete=tel/tel-* and server confirms it really is a phone field,
-  // we always user the server prediction as html types are not very reliable.
+  // we always use the server prediction as html types are not very reliable.
   if ((GroupTypeOfHtmlFieldType(html_type_, html_mode_) ==
            FieldTypeGroup::kPhoneBilling ||
        GroupTypeOfHtmlFieldType(html_type_, html_mode_) ==
@@ -354,7 +354,7 @@
                           !(server_type() == NAME_LAST &&
                             heuristic_type() == CREDIT_CARD_NAME_LAST);
 
-    // Either way, retain a preference for the the CVC heuristic over the
+    // Either way, retain a preference for the CVC heuristic over the
     // server's password predictions (http://crbug.com/469007)
     believe_server =
         believe_server && !(AutofillType(server_type()).group() ==
diff --git a/components/autofill/core/browser/data_model/credit_card.cc b/components/autofill/core/browser/data_model/credit_card.cc
index 6e78d5f..dd563ec 100644
--- a/components/autofill/core/browser/data_model/credit_card.cc
+++ b/components/autofill/core/browser/data_model/credit_card.cc
@@ -213,31 +213,47 @@
 
 // static
 int CreditCard::IconResourceId(const std::string& network) {
+  bool should_show_metadata_icon = base::FeatureList::IsEnabled(
+      features::kAutofillEnableNewCardArtAndNetworkImages);
+
   if (network == kAmericanExpressCard)
-    return IDR_AUTOFILL_CC_AMEX;
+    return should_show_metadata_icon ? IDR_AUTOFILL_METADATA_CC_AMEX
+                                     : IDR_AUTOFILL_CC_AMEX;
   if (network == kDinersCard)
-    return IDR_AUTOFILL_CC_DINERS;
-  if (network == kDiscoverCard)
-    return IDR_AUTOFILL_CC_DISCOVER;
+    return should_show_metadata_icon ? IDR_AUTOFILL_METADATA_CC_DINERS
+                                     : IDR_AUTOFILL_CC_DINERS;
+  if (network == kDiscoverCard) {
+    return should_show_metadata_icon ? IDR_AUTOFILL_METADATA_CC_DISCOVER
+                                     : IDR_AUTOFILL_CC_DISCOVER;
+  }
   if (network == kEloCard)
     return IDR_AUTOFILL_CC_ELO;
   if (network == kJCBCard)
-    return IDR_AUTOFILL_CC_JCB;
-  if (network == kMasterCard)
-    return IDR_AUTOFILL_CC_MASTERCARD;
+    return should_show_metadata_icon ? IDR_AUTOFILL_METADATA_CC_JCB
+                                     : IDR_AUTOFILL_CC_JCB;
+  if (network == kMasterCard) {
+    return should_show_metadata_icon ? IDR_AUTOFILL_METADATA_CC_MASTERCARD
+                                     : IDR_AUTOFILL_CC_MASTERCARD;
+  }
   if (network == kMirCard)
-    return IDR_AUTOFILL_CC_MIR;
+    return should_show_metadata_icon ? IDR_AUTOFILL_METADATA_CC_MIR
+                                     : IDR_AUTOFILL_CC_MIR;
   if (network == kTroyCard)
-    return IDR_AUTOFILL_CC_TROY;
-  if (network == kUnionPay)
-    return IDR_AUTOFILL_CC_UNIONPAY;
+    return should_show_metadata_icon ? IDR_AUTOFILL_METADATA_CC_TROY
+                                     : IDR_AUTOFILL_CC_TROY;
+  if (network == kUnionPay) {
+    return should_show_metadata_icon ? IDR_AUTOFILL_METADATA_CC_UNIONPAY
+                                     : IDR_AUTOFILL_CC_UNIONPAY;
+  }
   if (network == kVisaCard)
-    return IDR_AUTOFILL_CC_VISA;
+    return should_show_metadata_icon ? IDR_AUTOFILL_METADATA_CC_VISA
+                                     : IDR_AUTOFILL_CC_VISA;
 
   // If you hit this DCHECK, the above list of cases needs to be updated to
   // include a new card.
   DCHECK_EQ(kGenericCard, network);
-  return IDR_AUTOFILL_CC_GENERIC;
+  return should_show_metadata_icon ? IDR_AUTOFILL_METADATA_CC_GENERIC
+                                   : IDR_AUTOFILL_CC_GENERIC;
 }
 
 // static
diff --git a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareHelper.java b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareHelper.java
index c8a04f3b..c64aeb2 100644
--- a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareHelper.java
+++ b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareHelper.java
@@ -20,6 +20,7 @@
 import android.content.res.Resources.NotFoundException;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
+import android.os.Build;
 import android.text.TextUtils;
 
 import androidx.annotation.IntDef;
@@ -29,16 +30,22 @@
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.IntentUtils;
+import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
+import org.chromium.base.UnownedUserData;
+import org.chromium.base.UnownedUserDataKey;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.components.browser_ui.share.ShareParams.TargetChosenCallback;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.base.WindowAndroid.IntentCallback;
 
+import java.lang.ref.WeakReference;
+
 /**
  * A helper class that helps to start an intent to share titles and URLs.
  */
 public class ShareHelper {
+    private static final String TAG = "AndroidShare";
     /** The task ID of the activity that triggered the share action. */
     private static final String EXTRA_TASK_ID = "org.chromium.chrome.extra.TASK_ID";
 
@@ -126,19 +133,22 @@
     }
 
     /**
-     * Receiver to record the chosen component when sharing an Intent.
+     * BroadcastReceiver to record the chosen component when sharing an Intent.
      */
-    public static class TargetChosenReceiver extends BroadcastReceiver implements IntentCallback {
-        private static final Object LOCK = new Object();
-
-        private static String sTargetChosenReceiveAction;
-        private static TargetChosenReceiver sLastRegisteredReceiver;
-
+    public static class TargetChosenReceiver
+            extends BroadcastReceiver implements IntentCallback, UnownedUserData {
+        private static final UnownedUserDataKey<TargetChosenReceiver> TARGET_CHOSEN_RECEIVER_KEY =
+                new UnownedUserDataKey<>(TargetChosenReceiver.class);
         @Nullable
         private TargetChosenCallback mCallback;
+        private WeakReference<Context> mAttachedContext;
+        private WeakReference<WindowAndroid> mAttachedWindow;
+        private String mReceiverAction;
 
         protected TargetChosenReceiver(@Nullable TargetChosenCallback callback) {
             mCallback = callback;
+            mAttachedContext = new WeakReference<>(null);
+            mAttachedWindow = new WeakReference<>(null);
         }
 
         /**
@@ -149,37 +159,40 @@
          */
         protected void sendChooserIntent(WindowAndroid window, Intent sharingIntent) {
             ThreadUtils.assertOnUiThread();
-            final Context context = ContextUtils.getApplicationContext();
-            final String packageName = context.getPackageName();
-            synchronized (LOCK) {
-                if (sTargetChosenReceiveAction == null) {
-                    sTargetChosenReceiveAction =
-                            packageName + "/" + TargetChosenReceiver.class.getName() + "_ACTION";
-                }
-                if (sLastRegisteredReceiver != null) {
-                    context.unregisterReceiver(sLastRegisteredReceiver);
-                    // Must cancel the callback (to satisfy guarantee that exactly one method of
-                    // TargetChosenCallback is called).
-                    sLastRegisteredReceiver.cancel();
-                }
-                sLastRegisteredReceiver = this;
-                ContextUtils.registerNonExportedBroadcastReceiver(context, sLastRegisteredReceiver,
-                        new IntentFilter(sTargetChosenReceiveAction));
-            }
+            Activity activity = window.getActivity().get();
+            assert activity != null;
+            final String packageName = activity.getPackageName();
+            mReceiverAction = packageName + "/" + TargetChosenReceiver.class.getName()
+                    + activity.getTaskId() + "_ACTION";
 
-            Intent chooserIntent =
-                    getChooserIntent(window, sharingIntent, sTargetChosenReceiveAction);
-            ShareHelper.fireIntent(window, chooserIntent, sLastRegisteredReceiver);
+            TargetChosenReceiver prevReceiver = TARGET_CHOSEN_RECEIVER_KEY.retrieveDataFromHost(
+                    window.getUnownedUserDataHost());
+            if (prevReceiver != null) {
+                Log.e(TAG, "Another BroadcastReceiver already exists in the window.");
+                // In case where the receiver is not unregistered correctly, cancel the callback
+                // (to satisfy guarantee that exactly one method of TargetChosenCallback is called).
+                prevReceiver.cancel();
+                prevReceiver.detach();
+            }
+            TARGET_CHOSEN_RECEIVER_KEY.attachToHost(window.getUnownedUserDataHost(), this);
+            mAttachedWindow = new WeakReference<>(window);
+
+            ContextUtils.registerNonExportedBroadcastReceiver(
+                    activity, this, new IntentFilter(mReceiverAction));
+            mAttachedContext = new WeakReference<>(activity);
+
+            Intent chooserIntent = getChooserIntent(window, sharingIntent);
+            ShareHelper.fireIntent(window, chooserIntent, this);
         }
 
         /** Create the chooser intent via {@link android.content.Intent.createChooser} */
-        protected Intent getChooserIntent(
-                WindowAndroid window, Intent sharingIntent, String targetChosenAction) {
-            Intent intent = createSendBackIntentWithFilteredAction(targetChosenAction);
+        protected Intent getChooserIntent(WindowAndroid window, Intent sharingIntent) {
+            Intent intent = createSendBackIntentWithFilteredAction();
             Activity activity = window.getActivity().get();
-            final PendingIntent pendingIntent = PendingIntent.getBroadcast(activity, 0, intent,
-                    PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
-                            | IntentUtils.getPendingIntentMutabilityFlag(true));
+            final PendingIntent pendingIntent =
+                    PendingIntent.getBroadcast(activity, activity.getTaskId(), intent,
+                            PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
+                                    | IntentUtils.getPendingIntentMutabilityFlag(true));
             return Intent.createChooser(sharingIntent,
                     activity.getString(R.string.share_link_chooser_title),
                     pendingIntent.getIntentSender());
@@ -190,32 +203,34 @@
          * received after the PendingIntent is sent. The input action is used to match
          * the {@link IntentFilter} that this broadcast receiver is interested with.
          */
-        private Intent createSendBackIntentWithFilteredAction(String filteredAction) {
+        protected Intent createSendBackIntentWithFilteredAction() {
             final Context context = ContextUtils.getApplicationContext();
-            Intent intent = new Intent(filteredAction);
+            Intent intent = new Intent(mReceiverAction);
             intent.setPackage(context.getPackageName());
-            IntentUtils.addTrustedIntentExtras(intent);
+            // Adding intent extras since non-exported broadcast listener does not exist pre-T.
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
+                IntentUtils.addTrustedIntentExtras(intent);
+            }
             return intent;
         }
 
+        protected void onReceiveInternal(Context context, Intent intent) {}
+
         @Override
         public void onReceive(Context context, Intent intent) {
             ThreadUtils.assertOnUiThread();
             // Ignore intents that's not initiated from Chrome.
-            if (!IntentUtils.isTrustedIntentFromSelf(intent)) return;
-
-            synchronized (LOCK) {
-                if (sLastRegisteredReceiver != this) {
-                    return;
-                }
-                ContextUtils.getApplicationContext().unregisterReceiver(sLastRegisteredReceiver);
-                sLastRegisteredReceiver = null;
+            if (isUntrustedIntent(intent)) {
+                return;
             }
+
+            onReceiveInternal(context, intent);
             ComponentName target = intent.getParcelableExtra(Intent.EXTRA_CHOSEN_COMPONENT);
             if (mCallback != null) {
                 mCallback.onTargetChosen(target);
                 mCallback = null;
             }
+            detach();
         }
 
         @Override
@@ -236,19 +251,28 @@
             if (resultCode == Activity.RESULT_CANCELED) {
                 cancel();
             }
+
+            // Always detach this receiver from the attaching context, since the current sharing
+            // journey is completed.
+            detach();
         }
 
-        @VisibleForTesting
-        public static void resetForTesting() {
-            ThreadUtils.assertOnUiThread();
-            synchronized (LOCK) {
-                sTargetChosenReceiveAction = null;
-                if (sLastRegisteredReceiver != null) {
-                    ContextUtils.getApplicationContext().unregisterReceiver(
-                            sLastRegisteredReceiver);
-                    sLastRegisteredReceiver.cancel();
-                }
-                sLastRegisteredReceiver = null;
+        private boolean isUntrustedIntent(Intent intent) {
+            return Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU
+                    && !IntentUtils.isTrustedIntentFromSelf(intent);
+        }
+
+        private void detach() {
+            assert mCallback == null : "Callback is never called before this receiver is detached.";
+
+            if (mAttachedContext.get() != null) {
+                mAttachedContext.get().unregisterReceiver(this);
+                mAttachedContext.clear();
+            }
+            if (mAttachedWindow.get() != null) {
+                TARGET_CHOSEN_RECEIVER_KEY.detachFromHost(
+                        mAttachedWindow.get().getUnownedUserDataHost());
+                mAttachedWindow.clear();
             }
         }
 
diff --git a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareParams.java b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareParams.java
index 2f81676..709381d 100644
--- a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareParams.java
+++ b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareParams.java
@@ -369,11 +369,13 @@
      */
     public static interface TargetChosenCallback {
         /**
-         * Called when the user chooses a target in the share dialog.
+         * Called when the user chooses a target in the share dialog. When this is called when a
+         * custom action is selected on the system share sheet (e.g. Copy, Edit), the
+         * |chosenComponent| can be null.
          *
          * Note that if the user cancels the share dialog, this callback is never called.
          */
-        public void onTargetChosen(ComponentName chosenComponent);
+        public void onTargetChosen(@Nullable ComponentName chosenComponent);
 
         /**
          * Called when the user cancels the share dialog.
diff --git a/components/browsing_data/content/browsing_data_model.cc b/components/browsing_data/content/browsing_data_model.cc
index 5d4f05e0..2b8dd6513 100644
--- a/components/browsing_data/content/browsing_data_model.cc
+++ b/components/browsing_data/content/browsing_data_model.cc
@@ -10,8 +10,10 @@
 #include "base/memory/weak_ptr.h"
 #include "components/services/storage/public/mojom/storage_usage_info.mojom.h"
 #include "components/services/storage/shared_storage/shared_storage_manager.h"
+#include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/storage_partition.h"
+#include "content/public/browser/storage_partition_config.h"
 #include "services/network/network_context.h"
 #include "services/network/public/mojom/clear_data_filter.mojom.h"
 #include "services/network/public/mojom/trust_tokens.mojom.h"
@@ -389,6 +391,25 @@
 BrowsingDataModel::~BrowsingDataModel() = default;
 
 void BrowsingDataModel::BuildFromDisk(
+    content::BrowserContext* browser_context,
+    std::unique_ptr<Delegate> delegate,
+    base::OnceCallback<void(std::unique_ptr<BrowsingDataModel>)>
+        complete_callback) {
+  BuildFromStoragePartition(browser_context->GetDefaultStoragePartition(),
+                            std::move(delegate), std::move(complete_callback));
+}
+
+void BrowsingDataModel::BuildFromNonDefaultStoragePartition(
+    content::StoragePartition* storage_partition,
+    std::unique_ptr<Delegate> delegate,
+    base::OnceCallback<void(std::unique_ptr<BrowsingDataModel>)>
+        complete_callback) {
+  DCHECK(!storage_partition->GetConfig().is_default());
+  BuildFromStoragePartition(storage_partition, std::move(delegate),
+                            std::move(complete_callback));
+}
+
+void BrowsingDataModel::BuildFromStoragePartition(
     content::StoragePartition* storage_partition,
     std::unique_ptr<Delegate> delegate,
     base::OnceCallback<void(std::unique_ptr<BrowsingDataModel>)>
diff --git a/components/browsing_data/content/browsing_data_model.h b/components/browsing_data/content/browsing_data_model.h
index 2e03025..15bbe15 100644
--- a/components/browsing_data/content/browsing_data_model.h
+++ b/components/browsing_data/content/browsing_data_model.h
@@ -18,6 +18,7 @@
 #include "url/origin.h"
 
 namespace content {
+class BrowserContext;
 class StoragePartition;
 }
 
@@ -169,8 +170,16 @@
   size_t size() const { return browsing_data_entries_.size(); }
 
   // Consults supported storage backends to create and populate a Model based
-  // on the current state of `storage_partition`.
+  // on the current state of `browser_context`.
   static void BuildFromDisk(
+      content::BrowserContext* browser_context,
+      std::unique_ptr<Delegate> delegate,
+      base::OnceCallback<void(std::unique_ptr<BrowsingDataModel>)>
+          complete_callback);
+
+  // Consults supported storage backends to create and populate a Model based
+  // on the current state of `storage_partition`.
+  static void BuildFromNonDefaultStoragePartition(
       content::StoragePartition* storage_partition,
       std::unique_ptr<Delegate> delegate,
       base::OnceCallback<void(std::unique_ptr<BrowsingDataModel>)>
@@ -205,6 +214,12 @@
  protected:
   friend class BrowsingDataModelTest;
 
+  static void BuildFromStoragePartition(
+      content::StoragePartition* storage_partition,
+      std::unique_ptr<Delegate> delegate,
+      base::OnceCallback<void(std::unique_ptr<BrowsingDataModel>)>
+          complete_callback);
+
   // Private as one of the static BuildX functions should be used instead.
   explicit BrowsingDataModel(
       content::StoragePartition* storage_partition,
diff --git a/components/browsing_data/core/counters/passwords_counter.cc b/components/browsing_data/core/counters/passwords_counter.cc
index 5929a39..c6b66bf 100644
--- a/components/browsing_data/core/counters/passwords_counter.cc
+++ b/components/browsing_data/core/counters/passwords_counter.cc
@@ -27,6 +27,8 @@
   switch (password_manager_util::GetPasswordSyncState(sync_service)) {
     case password_manager::SyncState::kNotSyncing:
     case password_manager::SyncState::kAccountPasswordsActiveNormalEncryption:
+    case password_manager::SyncState::
+        kAccountPasswordsActiveWithCustomPassphrase:
       return false;
     case password_manager::SyncState::kSyncingNormalEncryption:
     case password_manager::SyncState::kSyncingWithCustomPassphrase:
diff --git a/components/content_settings/core/browser/cookie_settings.cc b/components/content_settings/core/browser/cookie_settings.cc
index af095bf..185a247 100644
--- a/components/content_settings/core/browser/cookie_settings.cc
+++ b/components/content_settings/core/browser/cookie_settings.cc
@@ -218,7 +218,12 @@
       base::FeatureList::IsEnabled(blink::features::kStorageAccessAPI);
   if (block && storage_access_api_enabled &&
       ShouldConsiderStorageAccessGrants(overrides)) {
-    if (url::IsSameOriginWith(url, first_party_url) ||
+    // The Storage Access API allows access in A(B(A)) case (or similar). Do the
+    // same-origin check first for performance reasons.
+    const url::Origin origin = url::Origin::Create(url);
+    const url::Origin first_party_origin = url::Origin::Create(first_party_url);
+    if (origin.IsSameOriginWith(first_party_origin) ||
+        net::SchemefulSite(origin) == net::SchemefulSite(first_party_origin) ||
         host_content_settings_map_->GetContentSetting(
             url, first_party_url, ContentSettingsType::STORAGE_ACCESS) ==
             CONTENT_SETTING_ALLOW) {
diff --git a/components/content_settings/core/browser/cookie_settings_unittest.cc b/components/content_settings/core/browser/cookie_settings_unittest.cc
index fa8d6f7..c5eb2d3 100644
--- a/components/content_settings/core/browser/cookie_settings_unittest.cc
+++ b/components/content_settings/core/browser/cookie_settings_unittest.cc
@@ -334,12 +334,12 @@
           /*top_frame_origin=*/absl::nullopt, GetCookieSettingOverrides()));
   EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kBlockedSite));
 
-  // A(B(A)) context. The inner frame is same-origin with the top-level frame,
+  // A(B(subA)) context. The inner frame is same-site with the top-level frame,
   // but there's an intermediate cross-site frame.
   EXPECT_EQ(IsForceAllowThirdPartyCookies() || IsStorageAccessGrantEligible(),
             cookie_settings_->IsFullCookieAccessAllowed(
-                kBlockedSite, net::SiteForCookies(),
-                /*top_frame_origin=*/url::Origin::Create(kBlockedSite),
+                kHttpsSubdomainSite, net::SiteForCookies(),
+                /*top_frame_origin=*/url::Origin::Create(kHttpsSite),
                 GetCookieSettingOverrides()));
 }
 
diff --git a/components/content_settings/core/common/BUILD.gn b/components/content_settings/core/common/BUILD.gn
index c509de8..aabf15f 100644
--- a/components/content_settings/core/common/BUILD.gn
+++ b/components/content_settings/core/common/BUILD.gn
@@ -55,6 +55,7 @@
   sources = [
     "content_settings_pattern_parser_unittest.cc",
     "content_settings_pattern_unittest.cc",
+    "content_settings_utils_unittest.cc",
     "cookie_settings_base_unittest.cc",
   ]
 
diff --git a/components/content_settings/core/common/content_settings_utils.cc b/components/content_settings/core/common/content_settings_utils.cc
index 276eaf5..32e0028 100644
--- a/components/content_settings/core/common/content_settings_utils.cc
+++ b/components/content_settings/core/common/content_settings_utils.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/values.h"
+#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
@@ -38,6 +39,25 @@
   return setting;
 }
 
+ContentSettingsPattern URLToSchemefulSitePattern(const GURL& url) {
+  std::string registrable_domain = GetDomainAndRegistry(
+      url, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
+
+  auto builder = ContentSettingsPattern::CreateBuilder();
+
+  if (registrable_domain.empty()) {
+    registrable_domain = url.host();
+  } else {
+    builder->WithDomainWildcard();
+  }
+
+  return builder->WithScheme(url.scheme())
+      ->WithHost(registrable_domain)
+      ->WithPathWildcard()
+      ->WithPortWildcard()
+      ->Build();
+}
+
 base::Value ContentSettingToValue(ContentSetting setting) {
   if (setting <= CONTENT_SETTING_DEFAULT ||
       setting >= CONTENT_SETTING_NUM_SETTINGS) {
diff --git a/components/content_settings/core/common/content_settings_utils.h b/components/content_settings/core/common/content_settings_utils.h
index 6513911..173b388 100644
--- a/components/content_settings/core/common/content_settings_utils.h
+++ b/components/content_settings/core/common/content_settings_utils.h
@@ -18,6 +18,10 @@
 // Converts |value| to |ContentSetting|.
 ContentSetting ValueToContentSetting(const base::Value& value);
 
+// Converts a given url to a ContentSettingsPattern that represents a site, i.e.
+// with domain, path, and port wildcards.
+ContentSettingsPattern URLToSchemefulSitePattern(const GURL& url);
+
 // Returns a base::Value representation of |setting| if |setting| is
 // a valid content setting. Otherwise, returns an empty value.
 base::Value ContentSettingToValue(ContentSetting setting);
diff --git a/components/content_settings/core/common/content_settings_utils_unittest.cc b/components/content_settings/core/common/content_settings_utils_unittest.cc
new file mode 100644
index 0000000..2f22ad7
--- /dev/null
+++ b/components/content_settings/core/common/content_settings_utils_unittest.cc
@@ -0,0 +1,85 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/content_settings/core/common/content_settings_utils.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace content_settings {
+namespace {
+
+TEST(ContentSettingsUtilsTest, URLToSchemefulSitePattern) {
+  // Only uses the eTLD+1 (aka registrable domain)
+  EXPECT_EQ(
+      "http://[*.]google.com",
+      URLToSchemefulSitePattern(GURL("http://mail.google.com")).ToString());
+  EXPECT_EQ("http://[*.]google.com",
+            URLToSchemefulSitePattern(GURL("http://www.foo.mail.google.com"))
+                .ToString());
+  EXPECT_EQ("http://[*.]google.com",
+            URLToSchemefulSitePattern(GURL("http://google.com")).ToString());
+
+  // Includes the (right) scheme
+  EXPECT_EQ("http://[*.]google.com",
+            URLToSchemefulSitePattern(GURL("http://google.com")).ToString());
+  EXPECT_EQ("https://[*.]google.com",
+            URLToSchemefulSitePattern(GURL("https://google.com")).ToString());
+
+  // Strips the port
+  EXPECT_EQ(
+      "http://[*.]google.com",
+      URLToSchemefulSitePattern(GURL("http://google.com:3000")).ToString());
+  EXPECT_EQ("http://[*.]google.com",
+            URLToSchemefulSitePattern(GURL("http://google.com:80")).ToString());
+  EXPECT_EQ(
+      "https://[*.]google.com",
+      URLToSchemefulSitePattern(GURL("https://google.com:443")).ToString());
+
+  // Strips the path
+  EXPECT_EQ(
+      "http://[*.]google.com",
+      URLToSchemefulSitePattern(GURL("http://google.com/example/")).ToString());
+  EXPECT_EQ(
+      "http://[*.]google.com",
+      URLToSchemefulSitePattern(GURL("http://google.com/example/example.html"))
+          .ToString());
+
+  // Opaque origins shouldn't match anything.
+  EXPECT_EQ("", URLToSchemefulSitePattern(
+                    GURL("data:text/html,<body>Hello World</body>"))
+                    .ToString());
+
+  // This should mirror SchemefulSite which considers file URLs
+  // equal, ignoring the path.
+  EXPECT_EQ("file:///*",
+            URLToSchemefulSitePattern(GURL("file:///foo/bar.html")).ToString());
+
+  EXPECT_EQ(
+      "https://127.0.0.1",
+      URLToSchemefulSitePattern(GURL("https://127.0.0.1:8080")).ToString());
+  EXPECT_EQ("https://[::1]",
+            URLToSchemefulSitePattern(GURL("https://[::1]:8080")).ToString());
+
+  EXPECT_EQ(
+      "https://localhost",
+      URLToSchemefulSitePattern(GURL("https://localhost:3000")).ToString());
+
+  // Invalid patterns
+  EXPECT_FALSE(
+      URLToSchemefulSitePattern(GURL("invalid://test:3000")).IsValid());
+  EXPECT_FALSE(
+      URLToSchemefulSitePattern(GURL("invalid://test.com/path")).IsValid());
+
+  // URL patterns that are not currently matched
+  EXPECT_EQ("", URLToSchemefulSitePattern(
+                    GURL("filesystem:http://www.google.com/temporary/"))
+                    .ToString());
+  EXPECT_EQ("", URLToSchemefulSitePattern(GURL("chrome://test")).ToString());
+  EXPECT_EQ("",
+            URLToSchemefulSitePattern(GURL("devtools://devtools/")).ToString());
+}
+
+}  // namespace
+}  // namespace content_settings
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/NQETest.java b/components/cronet/android/test/javatests/src/org/chromium/net/NQETest.java
index 04cc501..017610f5 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/NQETest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/NQETest.java
@@ -26,7 +26,7 @@
 import org.chromium.base.Log;
 import org.chromium.base.metrics.UmaRecorderHolder;
 import org.chromium.base.test.util.DisabledTest;
-import org.chromium.base.test.util.MetricsUtils.HistogramDelta;
+import org.chromium.base.test.util.HistogramWatcher;
 import org.chromium.net.CronetTestRule.OnlyRunNativeCronet;
 import org.chromium.net.MetricsTestUtil.TestExecutor;
 import org.chromium.net.test.EmbeddedTestServer;
@@ -192,11 +192,14 @@
 
         // Hackish workaround to crbug.com/1338919
         UmaRecorderHolder.onLibraryLoaded();
-        HistogramDelta writeCountHistogram = new HistogramDelta("NQE.Prefs.WriteCount", 1);
-        assertEquals(0, writeCountHistogram.getDelta()); // Sanity check.
-
-        HistogramDelta readCountHistogram = new HistogramDelta("NQE.Prefs.ReadCount", 1);
-        assertEquals(0, readCountHistogram.getDelta()); // Sanity check.
+        var writeCountHistogram = HistogramWatcher.newBuilder()
+                                          .expectIntRecord("NQE.Prefs.WriteCount", 1)
+                                          .allowExtraRecordsForHistogramsAbove()
+                                          .build();
+        var readCountHistogram = HistogramWatcher.newBuilder()
+                                         .expectIntRecord("NQE.Prefs.ReadCount", 1)
+                                         .allowExtraRecordsForHistogramsAbove()
+                                         .build();
 
         TestUrlRequestCallback callback = new TestUrlRequestCallback();
         UrlRequest.Builder builder =
@@ -216,7 +219,7 @@
         assertTrue(throughputListener.throughputObservationCount() > 0);
 
         // Prefs must be read at startup.
-        assertTrue(readCountHistogram.getDelta() > 0);
+        readCountHistogram.assertExpected();
 
         // Check RTT observation count after throughput observation has been received. This ensures
         // that executor has finished posting the RTT observation to the RTT listeners.
@@ -262,7 +265,7 @@
         assertTrue(prefsFileContainsString("network_qualities"));
 
         cronetEngine.shutdown();
-        assertTrue(writeCountHistogram.getDelta() > 0);
+        writeCountHistogram.assertExpected();
     }
 
     @Test
@@ -301,18 +304,31 @@
 
             // Hackish workaround to crbug.com/1338919
             if (i == 0) UmaRecorderHolder.onLibraryLoaded();
-            HistogramDelta writeCountHistogram = new HistogramDelta("NQE.Prefs.WriteCount", 1);
-            assertEquals(0, writeCountHistogram.getDelta()); // Sanity check.
 
-            HistogramDelta readCountHistogram = new HistogramDelta("NQE.Prefs.ReadCount", 1);
-            assertEquals(0, readCountHistogram.getDelta()); // Sanity check.
+            HistogramWatcher readCountHistogram = HistogramWatcher.newBuilder()
+                                                          .expectIntRecord("NQE.Prefs.ReadCount", 1)
+                                                          .allowExtraRecordsForHistogramsAbove()
+                                                          .build();
 
-            HistogramDelta readPrefsSizeHistogram = new HistogramDelta("NQE.Prefs.ReadSize", 1);
-            assertEquals(0, readPrefsSizeHistogram.getDelta()); // Sanity check.
+            // Stored network quality in the pref should be read in the second iteration.
+            HistogramWatcher readPrefsSizeHistogram;
+            if (i == 0) {
+                readPrefsSizeHistogram = HistogramWatcher.newBuilder()
+                                                 .expectIntRecord("NQE.Prefs.ReadSize", 0)
+                                                 .build();
+            } else {
+                readPrefsSizeHistogram = HistogramWatcher.newBuilder()
+                                                 .expectIntRecord("NQE.Prefs.ReadSize", 1)
+                                                 .allowExtraRecordsForHistogramsAbove()
+                                                 .build();
+            }
 
             // NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE: 3
-            HistogramDelta cachedRttHistogram = new HistogramDelta("NQE.RTT.ObservationSource", 3);
-            assertEquals(0, cachedRttHistogram.getDelta()); // Sanity check.
+            HistogramWatcher cachedRttHistogram =
+                    HistogramWatcher.newBuilder()
+                            .expectIntRecord("NQE.RTT.ObservationSource", 3)
+                            .allowExtraRecordsForHistogramsAbove()
+                            .build();
 
             TestUrlRequestCallback callback = new TestUrlRequestCallback();
             UrlRequest.Builder builder =
@@ -325,7 +341,7 @@
             rttListener.waitUntilFirstUrlRequestRTTReceived();
 
             // Prefs must be read at startup.
-            assertTrue(readCountHistogram.getDelta() > 0);
+            readCountHistogram.assertExpected();
 
             // Check RTT observation count after throughput observation has been received. This
             // ensures
@@ -344,10 +360,9 @@
                 assertTrue(prefsFileContainsString("network_qualities"));
             }
 
-            // Stored network quality in the pref should be read in the second iteration.
-            assertEquals(readPrefsSizeHistogram.getDelta() > 0, i > 0);
+            readPrefsSizeHistogram.assertExpected();
             if (i > 0) {
-                assertTrue(cachedRttHistogram.getDelta() > 0);
+                cachedRttHistogram.assertExpected();
             }
         }
     }
diff --git a/components/error_page_strings.grdp b/components/error_page_strings.grdp
index bdc359b..86860b93 100644
--- a/components/error_page_strings.grdp
+++ b/components/error_page_strings.grdp
@@ -89,8 +89,8 @@
       <ph name="PLATFORM_TEXT">$1<ex>Goto the wrench menu and choose Fix It.</ex></ph>
     </message>
   </if>
-  <message name="IDS_ERRORPAGES_SUGGESTION_CAPTIVE_PORTAL_SIGNIN" desc="ChromeOS instructions for signing in to a captive portal.">
-    <ph name="BEGIN_LINK">&lt;a href="#buttons" onclick="javascript:portalSignin()"&gt;</ph>Signing in<ph name="END_LINK">&lt;/a&gt;</ph> to the network
+  <message name="IDS_ERRORPAGES_SUGGESTION_CAPTIVE_PORTAL_SIGNIN" desc="ChromeOS instructions for signing in to a WiFi captive portal.">
+    <ph name="BEGIN_LINK">&lt;a href="#buttons" onclick="javascript:portalSignin()"&gt;</ph>Signing in<ph name="END_LINK">&lt;/a&gt;</ph> to the WiFi network
   </message>
   <if expr="is_chromeos">
     <message name="IDS_ERRORPAGES_SUGGESTION_PROXY_DISABLE_PLATFORM" desc="ChromeOS instructions for disabling use of a proxy server.">
diff --git a/components/error_page_strings_grdp/IDS_ERRORPAGES_SUGGESTION_CAPTIVE_PORTAL_SIGNIN.png.sha1 b/components/error_page_strings_grdp/IDS_ERRORPAGES_SUGGESTION_CAPTIVE_PORTAL_SIGNIN.png.sha1
index e24a843f..4ccf39e1 100644
--- a/components/error_page_strings_grdp/IDS_ERRORPAGES_SUGGESTION_CAPTIVE_PORTAL_SIGNIN.png.sha1
+++ b/components/error_page_strings_grdp/IDS_ERRORPAGES_SUGGESTION_CAPTIVE_PORTAL_SIGNIN.png.sha1
@@ -1 +1 @@
-f0824d753fe97a40f8275412123e9a0d12ff81c6
\ No newline at end of file
+fd848f55fb35c3aeff575757ef0c6155fda17041
\ No newline at end of file
diff --git a/components/exo/server/BUILD.gn b/components/exo/server/BUILD.gn
index 92f809a..6c261b6 100644
--- a/components/exo/server/BUILD.gn
+++ b/components/exo/server/BUILD.gn
@@ -37,6 +37,7 @@
     "//base/test:test_support",
     "//components/exo",
     "//components/exo:test_support",
+    "//components/exo/wayland:test_support",
     "//testing/gmock",
     "//testing/gtest",
     "//ui/aura",
diff --git a/components/exo/server/wayland_server_controller.cc b/components/exo/server/wayland_server_controller.cc
index d84cf9e..25f3967 100644
--- a/components/exo/server/wayland_server_controller.cc
+++ b/components/exo/server/wayland_server_controller.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/atomic_sequence_num.h"
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -24,8 +25,14 @@
 
 namespace {
 WaylandServerController* g_instance = nullptr;
+
+WaylandServerController::ServerToken GetToken() {
+  static base::AtomicSequenceNumber number;
+  return number.GetNext();
 }
 
+}  // namespace
+
 // static
 std::unique_ptr<WaylandServerController>
 WaylandServerController::CreateIfNecessary(
@@ -115,4 +122,41 @@
   servers_.erase(path);
 }
 
+void WaylandServerController::ListenOnSocket(
+    std::unique_ptr<SecurityDelegate> security_delegate,
+    base::ScopedFD socket,
+    base::OnceCallback<void(bool, ServerToken)> callback) {
+  std::unique_ptr<wayland::Server> server =
+      wayland::Server::Create(display_.get(), std::move(security_delegate));
+  auto* server_ptr = server.get();
+  auto start_callback = base::BindOnce(&WaylandServerController::OnSocketAdded,
+                                       weak_factory_.GetWeakPtr(),
+                                       std::move(server), std::move(callback));
+  server_ptr->StartWithFdAsync(std::move(socket), std::move(start_callback));
+}
+
+void WaylandServerController::OnSocketAdded(
+    std::unique_ptr<wayland::Server> server,
+    base::OnceCallback<void(bool, ServerToken)> callback,
+    bool success,
+    const base::FilePath& path) {
+  if (!success) {
+    std::move(callback).Run(false, -1);
+    return;
+  }
+  // TODO(b/270254359): remove the FilePath field from StartCallback, this was
+  // needed for the old approach but not the current one.
+  DCHECK(path == base::FilePath{});
+
+  ServerToken token = GetToken();
+  DCHECK(token >= 0);
+  on_demand_servers_.emplace(token, std::move(server));
+  std::move(callback).Run(true, token);
+}
+
+void WaylandServerController::CloseSocket(ServerToken server) {
+  DCHECK(on_demand_servers_.contains(server));
+  on_demand_servers_.erase(server);
+}
+
 }  // namespace exo
diff --git a/components/exo/server/wayland_server_controller.h b/components/exo/server/wayland_server_controller.h
index 1d7d237..bac51d05 100644
--- a/components/exo/server/wayland_server_controller.h
+++ b/components/exo/server/wayland_server_controller.h
@@ -28,6 +28,10 @@
 
 class WaylandServerController {
  public:
+  // Token that clients use to identify servers that they created using
+  // CreateServer().
+  using ServerToken = int;
+
   static std::unique_ptr<WaylandServerController> CreateForArcIfNecessary(
       std::unique_ptr<DataExchangeDelegate> data_exchange_delegate);
 
@@ -62,23 +66,47 @@
   // |callback| with the success flag indicating whether the request
   // succeeded/failed. If successful, the server and its |security_delegate|
   // will persist until DeleteServer() is called.
+  //
+  // TODO(b/270254359): deprecate this.
   void CreateServer(std::unique_ptr<SecurityDelegate> security_delegate,
                     wayland::Server::StartCallback callback);
 
   // Removes the wayland server with a socket at |path|. This server, along with
   // its security_delegate, will be deleted, and wayland clients will no longer
   // be able to connect to it.
+  //
+  // TODO(b/270254359): deprecate this.
   void DeleteServer(const base::FilePath& path);
 
+  // Creates a wayland server from the given |socket|, with the privileges of
+  // the |security_delegate|. Invokes |callback| with true and a handle to a
+  // wayland sever (for use in CloseSocket() below) on success, false and
+  // nullptr on failure.
+  void ListenOnSocket(std::unique_ptr<SecurityDelegate> security_delegate,
+                      base::ScopedFD socket,
+                      base::OnceCallback<void(bool, ServerToken)> callback);
+
+  // Removes the wayland server that was created by ListenOnSocket() which
+  // returned the given |server|.
+  void CloseSocket(ServerToken server);
+
  private:
   void OnStarted(std::unique_ptr<wayland::Server> server,
                  wayland::Server::StartCallback callback,
                  bool success,
                  const base::FilePath& path);
 
+  void OnSocketAdded(std::unique_ptr<wayland::Server> server,
+                     base::OnceCallback<void(bool, ServerToken)> callback,
+                     bool success,
+                     const base::FilePath& path);
+
   std::unique_ptr<WMHelper> wm_helper_;
   std::unique_ptr<Display> display_;
+  // TODO(b/270254359): remove servers_ map, replace with on_demand_servers_.
   base::flat_map<base::FilePath, std::unique_ptr<wayland::Server>> servers_;
+  base::flat_map<ServerToken, std::unique_ptr<wayland::Server>>
+      on_demand_servers_;
   base::WeakPtrFactory<WaylandServerController> weak_factory_{this};
 };
 
diff --git a/components/exo/server/wayland_server_controller_unittest.cc b/components/exo/server/wayland_server_controller_unittest.cc
index 2a5cf72..eb7ca755 100644
--- a/components/exo/server/wayland_server_controller_unittest.cc
+++ b/components/exo/server/wayland_server_controller_unittest.cc
@@ -18,6 +18,7 @@
 #include "components/exo/security_delegate.h"
 #include "components/exo/test/test_security_delegate.h"
 #include "components/exo/toast_surface_manager.h"
+#include "components/exo/wayland/test/wayland_server_test_base.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace exo {
@@ -44,7 +45,6 @@
 
 TEST_F(WaylandServerControllerTest, RequestServer) {
   WaylandServerController wsc(nullptr, nullptr, nullptr, nullptr);
-
   ASSERT_EQ(WaylandServerController::Get(), &wsc);
 
   base::RunLoop loop;
@@ -71,4 +71,35 @@
   EXPECT_FALSE(base::PathExists(socket_path));
 }
 
+TEST_F(WaylandServerControllerTest, RequestServerByFd) {
+  WaylandServerController wsc(nullptr, nullptr, nullptr, nullptr);
+  ASSERT_EQ(WaylandServerController::Get(), &wsc);
+
+  wayland::test::WaylandServerTestBase::ScopedTempSocket sock;
+
+  base::RunLoop loop;
+  WaylandServerController::ServerToken token = -1;
+  {
+    base::ScopedDisallowBlocking no_blocking;
+    WaylandServerController::Get()->ListenOnSocket(
+        std::make_unique<test::TestSecurityDelegate>(), sock.TakeFd(),
+        base::BindLambdaForTesting(
+            [&loop, &token](bool success,
+                            WaylandServerController::ServerToken result_token) {
+              EXPECT_TRUE(success);
+              token = result_token;
+              loop.Quit();
+            }));
+  }
+  loop.Run();
+  EXPECT_GE(token, 0);
+
+  {
+    base::ScopedDisallowBlocking no_blocking;
+    // Just ensure that closing a socket is nonblocking.
+    WaylandServerController::Get()->CloseSocket(token);
+  }
+  task_environment()->RunUntilIdle();
+}
+
 }  // namespace exo
diff --git a/components/exo/wayland/BUILD.gn b/components/exo/wayland/BUILD.gn
index 4857fef..fbcfad36 100644
--- a/components/exo/wayland/BUILD.gn
+++ b/components/exo/wayland/BUILD.gn
@@ -259,15 +259,10 @@
   deps = [ ":wayland" ]
 }
 
-source_set("unit_tests") {
+source_set("test_support") {
   testonly = true
 
   sources = [
-    "clients/security_delegate_binding_test.cc",
-    "output_metrics_unittest.cc",
-    "server_unittest.cc",
-    "surface_augmenter_unittest.cc",
-    "surface_unittest.cc",
     "test/client_util.cc",
     "test/client_util.h",
     "test/resource_key.h",
@@ -285,6 +280,27 @@
     "test/wayland_server_test.h",
     "test/wayland_server_test_base.cc",
     "test/wayland_server_test_base.h",
+  ]
+
+  deps = [
+    ":client_support",
+    ":wayland",
+    "//base",
+    "//base/test:test_support",
+    "//components/exo",
+    "//components/exo:test_support",
+  ]
+}
+
+source_set("unit_tests") {
+  testonly = true
+
+  sources = [
+    "clients/security_delegate_binding_test.cc",
+    "output_metrics_unittest.cc",
+    "server_unittest.cc",
+    "surface_augmenter_unittest.cc",
+    "surface_unittest.cc",
     "wayland_aura_shell_server_test.cc",
     "wayland_display_observer_unittest.cc",
     "wayland_display_output_unittest.cc",
@@ -298,11 +314,11 @@
 
   deps = [
     ":client_support",
+    ":test_support",
     ":wayland",
     "//ash",
     "//ash:test_support",
     "//ash/public/cpp",
-    "//base",
     "//base/test:test_support",
     "//chromeos/ui/wm",
     "//components/exo",
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc
index de04544..dbcd6857 100644
--- a/components/exo/wayland/server.cc
+++ b/components/exo/wayland/server.cc
@@ -30,6 +30,7 @@
 #include <stylus-tools-unstable-v1-server-protocol.h>
 #include <stylus-unstable-v2-server-protocol.h>
 #include <surface-augmenter-server-protocol.h>
+#include <sys/socket.h>
 #include <text-input-extension-unstable-v1-server-protocol.h>
 #include <text-input-unstable-v1-server-protocol.h>
 #include <touchpad-haptics-unstable-v1-server-protocol.h>
@@ -132,6 +133,11 @@
 constexpr base::FilePath::CharType kCustomServerDir[] =
     FILE_PATH_LITERAL("wayland");
 
+// Number of clients that can be waiting for accept() before we start refusing
+// connections. This is *NOT* the maximum number of clients, just pending ones
+// (see `man 2 listen`).
+constexpr int kMaxPendingConnections = 128;
+
 bool IsDrmAtomicAvailable() {
 #if BUILDFLAG(IS_OZONE)
   auto& host_properties =
@@ -195,9 +201,10 @@
 bool Server::Open(bool default_path) {
   std::string socket_name = kSocketName;
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(switches::kWaylandServerSocket))
+  if (command_line->HasSwitch(switches::kWaylandServerSocket)) {
     socket_name =
         command_line->GetSwitchValueASCII(switches::kWaylandServerSocket);
+  }
 
   if (default_path) {
     char* runtime_dir_str = getenv("XDG_RUNTIME_DIR");
@@ -259,6 +266,23 @@
   return true;
 }
 
+bool Server::OpenFd(base::ScopedFD fd) {
+  if (listen(fd.get(), kMaxPendingConnections) != 0) {
+    PLOG(ERROR) << "listen";
+    return false;
+  }
+
+  if (wl_display_add_socket_fd(wl_display_.get(), fd.get()) != 0) {
+    PLOG(ERROR) << "Failed to add socket " << fd.get() << " to wl_display";
+    return false;
+  }
+
+  // wl_display will only close() a socket that it successfully added, so is is
+  // only safe to release() at this point
+  std::ignore = fd.release();
+  return true;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // Server, public:
 
@@ -293,8 +317,9 @@
                    bind_aura_output_manager);
   wl_global_create(wl_display_.get(), &wl_subcompositor_interface, 1, display_,
                    bind_subcompositor);
-  for (const auto& display : display::Screen::GetScreen()->GetAllDisplays())
+  for (const auto& display : display::Screen::GetScreen()->GetAllDisplays()) {
     OnDisplayAdded(display);
+  }
   wl_global_create(wl_display_.get(), &zcr_vsync_feedback_v1_interface, 1,
                    display_, bind_vsync_feedback);
 
@@ -417,8 +442,9 @@
 void Server::Finalize(StartCallback callback, bool success) {
   // At this point, server creation was successful, so we should instantiate the
   // watcher.
-  if (success)
+  if (success) {
     wayland_watcher_ = std::make_unique<wayland::WaylandWatcher>(this);
+  }
   std::move(callback).Run(success, socket_path_);
 }
 
@@ -480,6 +506,14 @@
   Finalize(std::move(callback), /*success=*/true);
 }
 
+void Server::StartWithFdAsync(base::ScopedFD fd, StartCallback callback) {
+  base::ThreadPool::PostTaskAndReplyWithResult(
+      FROM_HERE, base::MayBlock(),
+      base::BindOnce(&Server::OpenFd, base::Unretained(this), std::move(fd)),
+      base::BindOnce(&Server::Finalize, base::Unretained(this),
+                     std::move(callback)));
+}
+
 bool Server::AddSocket(const std::string& name) {
   DCHECK(!name.empty());
   return !wl_display_add_socket(wl_display_.get(), name.c_str());
@@ -521,8 +555,9 @@
 wl_resource* Server::GetOutputResource(wl_client* client, int64_t display_id) {
   DCHECK_NE(display_id, display::kInvalidDisplayId);
   auto iter = outputs_.find(display_id);
-  if (iter == outputs_.end())
+  if (iter == outputs_.end()) {
     return nullptr;
+  }
   return iter->second.get()->GetOutputResourceForClient(client);
 }
 
diff --git a/components/exo/wayland/server.h b/components/exo/wayland/server.h
index 7596cb6..65d4e58 100644
--- a/components/exo/wayland/server.h
+++ b/components/exo/wayland/server.h
@@ -10,6 +10,7 @@
 
 #include "base/containers/flat_map.h"
 #include "base/files/file_path.h"
+#include "base/files/scoped_file.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/functional/callback.h"
 #include "base/time/time.h"
@@ -66,13 +67,18 @@
   // used to delete it asynchronously as well.
   static void DestroyAsync(std::unique_ptr<Server> server);
 
+  // TODO(b/270254359): deprecate go/secure-exo-ids in favour of
+  // go/securer-exo-ids.
   void StartAsync(StartCallback callback);
   void StartWithDefaultPath(StartCallback callback);
+  void StartWithFdAsync(base::ScopedFD fd, StartCallback callback);
 
   void Initialize();
 
   bool Open(bool default_path);
 
+  bool OpenFd(base::ScopedFD fd);
+
   void Finalize(StartCallback callback, bool success);
 
   // Returns the file descriptor associated with the server.
@@ -100,6 +106,8 @@
     return GetWaylandDisplay();
   }
 
+  // Returns the path to the wayland socket used by this server. Returns "" if
+  // StarTWithDefaultPath() hasn't been called, or StartWithFd() was called.
   const base::FilePath& socket_path() const { return socket_path_; }
 
  protected:
diff --git a/components/exo/wayland/server_unittest.cc b/components/exo/wayland/server_unittest.cc
index ebfb4933..7cf22ca 100644
--- a/components/exo/wayland/server_unittest.cc
+++ b/components/exo/wayland/server_unittest.cc
@@ -22,7 +22,6 @@
 #include "components/exo/security_delegate.h"
 #include "components/exo/wayland/server_util.h"
 #include "components/exo/wayland/test/wayland_server_test_base.h"
-#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace exo::wayland {
@@ -74,26 +73,19 @@
 }
 
 TEST_F(ServerTest, CreateAsync) {
-  using MockServerFunction =
-      testing::MockFunction<void(bool, const base::FilePath&)>;
-
   base::ScopedTempDir non_xdg_dir;
   ASSERT_TRUE(non_xdg_dir.CreateUniqueTempDir());
 
   base::RunLoop run_loop;
   base::FilePath server_socket;
-  MockServerFunction server_callback;
-  EXPECT_CALL(server_callback, Call(testing::_, testing::_))
-      .WillOnce(testing::Invoke([&run_loop, &server_socket](
-                                    bool success, const base::FilePath& path) {
+
+  auto server = CreateServer();
+  server->StartAsync(base::BindLambdaForTesting(
+      [&run_loop, &server_socket](bool success, const base::FilePath& path) {
         EXPECT_TRUE(success);
         server_socket = path;
         run_loop.Quit();
       }));
-
-  auto server = CreateServer();
-  server->StartAsync(base::BindOnce(&MockServerFunction::Call,
-                                    base::Unretained(&server_callback)));
   run_loop.Run();
 
   // Should create a directory for the server.
@@ -105,6 +97,53 @@
   EXPECT_FALSE(base::PathExists(server_socket));
 }
 
+TEST_F(ServerTest, StartFd) {
+  ScopedTempSocket sock;
+
+  auto server = CreateServer();
+  base::RunLoop start_loop;
+  server->StartWithFdAsync(
+      sock.TakeFd(),
+      base::BindLambdaForTesting([&](bool success, const base::FilePath& path) {
+        EXPECT_TRUE(success);
+        EXPECT_EQ(path, base::FilePath{});
+        start_loop.Quit();
+      }));
+  start_loop.Run();
+
+  base::Thread client_thread("client");
+  client_thread.Start();
+
+  wl_display* client_display = nullptr;
+  base::RunLoop connect_loop;
+  client_thread.task_runner()->PostTaskAndReply(
+      FROM_HERE, base::BindLambdaForTesting([&]() {
+        client_display =
+            wl_display_connect(sock.server_path().MaybeAsASCII().c_str());
+        int events = wl_display_roundtrip(client_display);
+        EXPECT_GE(events, 0);
+      }),
+      connect_loop.QuitClosure());
+  connect_loop.Run();
+  EXPECT_NE(client_display, nullptr);
+
+  wl_list* all_clients =
+      wl_display_get_client_list(server->GetWaylandDisplayForTesting());
+  ASSERT_FALSE(wl_list_empty(all_clients));
+  wl_client* client = wl_client_from_link(all_clients->next);
+
+  TestListener client_destruction_listener;
+  wl_client_add_destroy_listener(client, &client_destruction_listener.listener);
+
+  client_thread.task_runner()->PostTask(
+      FROM_HERE, base::BindLambdaForTesting(
+                     [&]() { wl_display_disconnect(client_display); }));
+
+  while (!client_destruction_listener.notified) {
+    server->Dispatch(base::Milliseconds(10));
+  }
+}
+
 TEST_F(ServerTest, Dispatch) {
   auto server = CreateServer();
   bool rv = server->Open(/*default_path=*/false);
diff --git a/components/exo/wayland/test/wayland_server_test_base.cc b/components/exo/wayland/test/wayland_server_test_base.cc
index 6f5f0600..194c188 100644
--- a/components/exo/wayland/test/wayland_server_test_base.cc
+++ b/components/exo/wayland/test/wayland_server_test_base.cc
@@ -6,6 +6,9 @@
 
 #include <stdlib.h>
 
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
 #include <wayland-client-core.h>
 
 #include <memory>
@@ -23,6 +26,44 @@
 namespace wayland {
 namespace test {
 
+WaylandServerTestBase::ScopedTempSocket::ScopedTempSocket() {
+  // We use CHECK here and throughout because this is test code and it should
+  // fail fast.
+  int raw_sock_fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, /*protocol=*/0);
+  CHECK(raw_sock_fd >= 0);
+  fd_.reset(raw_sock_fd);
+
+  char* runtime_dir = getenv("XDG_RUNTIME_DIR");
+  CHECK(runtime_dir);
+  CHECK(socket_dir_.CreateUniqueTempDirUnderPath(base::FilePath(runtime_dir)));
+
+  server_path_ = socket_dir_.GetPath().Append("wl-test");
+
+  // the pathname, with null terminator, has to fit into sun_path, a char[108].
+  CHECK(server_path_.MaybeAsASCII().length() + 1 < 108);
+
+  struct sockaddr_un addr;
+  addr.sun_family = AF_UNIX;
+  strncpy(addr.sun_path, server_path_.MaybeAsASCII().c_str(), 108);
+  int size = offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path);
+  CHECK(bind(fd_.get(), reinterpret_cast<struct sockaddr*>(&addr), size) == 0);
+}
+
+WaylandServerTestBase::ScopedTempSocket::~ScopedTempSocket() {
+  // If TakeFd() was called this is a no-op, otherwise close it first.
+  fd_.reset();
+
+  // Even though it's scoped, manually delete so we can CHECK().
+  //
+  // This will fail intentionally if the socket has open FDs.
+  CHECK(socket_dir_.Delete());
+}
+
+base::ScopedFD WaylandServerTestBase::ScopedTempSocket::TakeFd() {
+  CHECK(fd_.is_valid());
+  return std::move(fd_);
+}
+
 WaylandServerTestBase::WaylandServerTestBase() = default;
 
 WaylandServerTestBase::~WaylandServerTestBase() = default;
diff --git a/components/exo/wayland/test/wayland_server_test_base.h b/components/exo/wayland/test/wayland_server_test_base.h
index 2b0dec8..66623b8 100644
--- a/components/exo/wayland/test/wayland_server_test_base.h
+++ b/components/exo/wayland/test/wayland_server_test_base.h
@@ -26,6 +26,31 @@
 // Base class for tests that create an exo's wayland server.
 class WaylandServerTestBase : public TestBase {
  public:
+  // When using on-demand sockets (described on go/securer-exo-ids) the server
+  // does not own the socket and will not clean it up. This class is used to
+  // help manage creation/cleanup of such sockets
+  class ScopedTempSocket {
+   public:
+    ScopedTempSocket();
+
+    // Not copyable.
+    ScopedTempSocket(const ScopedTempSocket&) = delete;
+    ScopedTempSocket& operator=(const ScopedTempSocket&) = delete;
+
+    ~ScopedTempSocket();
+
+    // Once created, this class owns the socket FD. Use this method to move the
+    // FD out of here (and into a wayland server).
+    base::ScopedFD TakeFd();
+
+    const base::FilePath& server_path() const { return server_path_; }
+
+   private:
+    base::ScopedTempDir socket_dir_;
+    base::FilePath server_path_;
+    base::ScopedFD fd_;
+  };
+
   WaylandServerTestBase();
 
   // Constructs a WaylandServerTestBase with |traits| being forwarded to its
diff --git a/components/exo/wayland/zaura_shell_unittest.cc b/components/exo/wayland/zaura_shell_unittest.cc
index e359c6d5..ab728b31 100644
--- a/components/exo/wayland/zaura_shell_unittest.cc
+++ b/components/exo/wayland/zaura_shell_unittest.cc
@@ -52,6 +52,7 @@
 namespace {
 
 constexpr auto kTransitionDuration = base::Seconds(3);
+constexpr int kTooltipExpectedHeight = 28;
 
 class TestAuraSurface : public AuraSurface {
  public:
@@ -486,7 +487,7 @@
 
   const char* text = "my tooltip";
   gfx::Rect expected_tooltip_position =
-      gfx::Rect(mouse_position, gfx::Size(77, 24));
+      gfx::Rect(mouse_position, gfx::Size(77, kTooltipExpectedHeight));
   views::corewm::TooltipAura::AdjustToCursor(&expected_tooltip_position);
   aura::Window::ConvertRectToTarget(surface->window(),
                                     surface->window()->GetToplevelWindow(),
@@ -519,7 +520,7 @@
 
   const char* text = "my tooltip";
   gfx::Point anchor_point = surface->window()->bounds().bottom_center();
-  gfx::Size expected_tooltip_size = gfx::Size(77, 24);
+  gfx::Size expected_tooltip_size = gfx::Size(77, kTooltipExpectedHeight);
   // Calculate expected tooltip position. For keyboard tooltip, it should be
   // shown right below and in the center of tooltip target window while it must
   // fit inside the display bounds.
@@ -570,7 +571,7 @@
   const char* text = "my tooltip";
   // Size of the tooltip depends on the text to show.
   gfx::Rect expected_tooltip_position =
-      gfx::Rect(mouse_position, gfx::Size(77, 24));
+      gfx::Rect(mouse_position, gfx::Size(77, kTooltipExpectedHeight));
   views::corewm::TooltipAura::AdjustToCursor(&expected_tooltip_position);
   aura::Window::ConvertRectToTarget(surface->window(),
                                     surface->window()->GetToplevelWindow(),
@@ -603,7 +604,7 @@
 
   const char* text = "my tooltip";
   gfx::Point anchor_point = surface->window()->bounds().bottom_center();
-  gfx::Size expected_tooltip_size = gfx::Size(77, 24);
+  gfx::Size expected_tooltip_size = gfx::Size(77, kTooltipExpectedHeight);
   // Calculate expected tooltip position. For keyboard tooltip, it should be
   // shown right below and in the center of tooltip target window while it must
   // fit inside the display bounds.
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc
index 0e2e5b63..dd27293 100644
--- a/components/feature_engagement/public/feature_configurations.cc
+++ b/components/feature_engagement/public/feature_configurations.cc
@@ -276,6 +276,24 @@
     return config;
   }
 
+  if (kIPHDownloadToolbarButtonFeature.name == feature->name) {
+    absl::optional<FeatureConfig> config = FeatureConfig();
+    config->valid = true;
+    config->availability = Comparator(ANY, 0);
+    // Don't show if user has already seen an IPH this session.
+    config->session_rate = Comparator(EQUAL, 0);
+    // Show the promo max once a year if the user hasn't interacted with the
+    // download bubble within the last 21 days.
+    config->trigger = EventConfig("download_bubble_iph_trigger",
+                                  Comparator(EQUAL, 0), 360, 360);
+    config->used = EventConfig("download_bubble_interaction",
+                               Comparator(EQUAL, 0), 21, 360);
+    // Allow snoozing for 7 days, up to 3 times.
+    config->snooze_params.snooze_interval = 7;
+    config->snooze_params.max_limit = 3;
+    return config;
+  }
+
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
         // BUILDFLAG(IS_CHROMEOS)
 
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc
index 6fb484d..0ff0b08b 100644
--- a/components/feature_engagement/public/feature_constants.cc
+++ b/components/feature_engagement/public/feature_constants.cc
@@ -32,6 +32,9 @@
 BASE_FEATURE(kIPHDesktopCustomizeChromeFeature,
              "IPH_DesktopCustomizeChrome",
              base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kIPHDownloadToolbarButtonFeature,
+             "IPH_DownloadToolbarButton",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kIPHExtensionsMenuFeature,
              "IPH_ExtensionsMenu",
              base::FEATURE_DISABLED_BY_DEFAULT);
@@ -478,6 +481,9 @@
 BASE_FEATURE(kIPHGoogleOneOfferNotificationFeature,
              "IPH_GoogleOneOfferNotification",
              base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kIPHLauncherSearchHelpUiFeature,
+             "IPH_LauncherSearchHelpUi",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 #endif
 
 }  // namespace feature_engagement
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h
index d2a6fd8..9e2b987 100644
--- a/components/feature_engagement/public/feature_constants.h
+++ b/components/feature_engagement/public/feature_constants.h
@@ -27,6 +27,7 @@
 BASE_DECLARE_FEATURE(kIPHDesktopSharedHighlightingFeature);
 BASE_DECLARE_FEATURE(kIPHDesktopTabGroupsNewGroupFeature);
 BASE_DECLARE_FEATURE(kIPHDesktopCustomizeChromeFeature);
+BASE_DECLARE_FEATURE(kIPHDownloadToolbarButtonFeature);
 BASE_DECLARE_FEATURE(kIPHExtensionsMenuFeature);
 BASE_DECLARE_FEATURE(kIPHFocusHelpBubbleScreenReaderPromoFeature);
 BASE_DECLARE_FEATURE(kIPHGMCCastStartStopFeature);
@@ -199,6 +200,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 BASE_DECLARE_FEATURE(kIPHGoogleOneOfferNotificationFeature);
+BASE_DECLARE_FEATURE(kIPHLauncherSearchHelpUiFeature);
 #endif
 
 }  // namespace feature_engagement
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc
index eb8a49c..5b38121 100644
--- a/components/feature_engagement/public/feature_list.cc
+++ b/components/feature_engagement/public/feature_list.cc
@@ -136,6 +136,7 @@
     &kIPHBatterySaverModeFeature,
     &kIPHDesktopTabGroupsNewGroupFeature,
     &kIPHDesktopCustomizeChromeFeature,
+    &kIPHDownloadToolbarButtonFeature,
     &kIPHExtensionsMenuFeature,
     &kIPHFocusHelpBubbleScreenReaderPromoFeature,
     &kIPHGMCCastStartStopFeature,
@@ -177,6 +178,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     &kIPHGoogleOneOfferNotificationFeature,
+    &kIPHLauncherSearchHelpUiFeature,
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 };
 }  // namespace
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h
index bff6fd7..b5659e049 100644
--- a/components/feature_engagement/public/feature_list.h
+++ b/components/feature_engagement/public/feature_list.h
@@ -247,6 +247,8 @@
                        "IPH_DesktopCustomizeChrome");
 DEFINE_VARIATION_PARAM(kIPHDesktopTabGroupsNewGroupFeature,
                        "IPH_DesktopTabGroupsNewGroup");
+DEFINE_VARIATION_PARAM(kIPHDownloadToolbarButtonFeature,
+                       "IPH_DownloadToolbarButton");
 DEFINE_VARIATION_PARAM(kIPHExtensionsMenuFeature, "IPH_ExtensionsMenu");
 DEFINE_VARIATION_PARAM(kIPHFocusModeFeature, "IPH_FocusMode");
 DEFINE_VARIATION_PARAM(kIPHGlobalMediaControls, "IPH_GlobalMediaControls");
@@ -307,6 +309,8 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 DEFINE_VARIATION_PARAM(kIPHGoogleOneOfferNotificationFeature,
                        "IPH_GoogleOneOfferNotification");
+DEFINE_VARIATION_PARAM(kIPHLauncherSearchHelpUiFeature,
+                       "IPH_LauncherSearchHelpUi");
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 }  // namespace
@@ -425,6 +429,7 @@
         VARIATION_ENTRY(kIPHBatterySaverModeFeature),
         VARIATION_ENTRY(kIPHDesktopCustomizeChromeFeature),
         VARIATION_ENTRY(kIPHDesktopTabGroupsNewGroupFeature),
+        VARIATION_ENTRY(kIPHDownloadToolbarButtonFeature),
         VARIATION_ENTRY(kIPHExtensionsMenuFeature),
         VARIATION_ENTRY(kIPHFocusModeFeature),
         VARIATION_ENTRY(kIPHGlobalMediaControls),
@@ -467,6 +472,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
         VARIATION_ENTRY(kIPHGoogleOneOfferNotificationFeature),
+        VARIATION_ENTRY(kIPHLauncherSearchHelpUiFeature),
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 };
 
diff --git a/components/gwp_asan/client/guarded_page_allocator.h b/components/gwp_asan/client/guarded_page_allocator.h
index 6413ed1b..163d098 100644
--- a/components/gwp_asan/client/guarded_page_allocator.h
+++ b/components/gwp_asan/client/guarded_page_allocator.h
@@ -261,11 +261,12 @@
   std::atomic<LightweightDetector::MetadataId> next_lightweight_metadata_id_{0};
 
   friend class BaseGpaTest;
-  friend class CrashAnalyzerTest;
+  friend class BaseCrashAnalyzerTest;
   FRIEND_TEST_ALL_PREFIXES(CrashAnalyzerTest, InternalError);
   FRIEND_TEST_ALL_PREFIXES(CrashAnalyzerTest, StackTraceCollection);
   FRIEND_TEST_ALL_PREFIXES(LightweightDetectorAllocatorTest, PoisonAlloc);
   FRIEND_TEST_ALL_PREFIXES(LightweightDetectorAllocatorTest, SlotReuse);
+  FRIEND_TEST_ALL_PREFIXES(LightweightDetectorAnalyzerTest, InternalError);
 };
 
 }  // namespace internal
diff --git a/components/gwp_asan/common/lightweight_detector.h b/components/gwp_asan/common/lightweight_detector.h
index 5cb1861..b012a00 100644
--- a/components/gwp_asan/common/lightweight_detector.h
+++ b/components/gwp_asan/common/lightweight_detector.h
@@ -22,7 +22,7 @@
   //  - Bits 48 - 63 are set to 0xEDED so that access at the address always
   //    results in a memory access error, and the address can be recognized by
   //    the crash handler.
-  static constexpr uint64_t kMetadataIdMarker = 0xEDED000000000000;
+  static constexpr uint64_t kMetadataIdMarker = 0xEFED000000000000;
   static constexpr uint64_t kMetadataIdMarkerMask = 0xFFFF000000000000;
   static constexpr uint64_t kMetadataIdShift = 16;
   static constexpr uint64_t kMetadataIdOffset = 0x8000;
diff --git a/components/gwp_asan/crash_handler/crash.proto b/components/gwp_asan/crash_handler/crash.proto
index 0c7bfa377..d4318ef0 100644
--- a/components/gwp_asan/crash_handler/crash.proto
+++ b/components/gwp_asan/crash_handler/crash.proto
@@ -21,6 +21,7 @@
     DOUBLE_FREE = 3;
     UNKNOWN = 4;
     FREE_INVALID_ADDRESS = 5;
+    LIGHTWEIGHT_USE_AFTER_FREE = 6;
   }
 
   enum Allocator {
diff --git a/components/gwp_asan/crash_handler/crash_analyzer.cc b/components/gwp_asan/crash_handler/crash_analyzer.cc
index 8855326..2c9adb1 100644
--- a/components/gwp_asan/crash_handler/crash_analyzer.cc
+++ b/components/gwp_asan/crash_handler/crash_analyzer.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 #include <algorithm>
+#include <limits>
 #include <memory>
 #include <string>
 #include <vector>
@@ -17,9 +18,11 @@
 #include "build/build_config.h"
 #include "components/gwp_asan/common/allocator_state.h"
 #include "components/gwp_asan/common/crash_key_name.h"
+#include "components/gwp_asan/common/lightweight_detector.h"
 #include "components/gwp_asan/common/pack_stack_trace.h"
 #include "components/gwp_asan/crash_handler/crash.pb.h"
 #include "third_party/crashpad/crashpad/client/annotation.h"
+#include "third_party/crashpad/crashpad/snapshot/cpu_architecture.h"
 #include "third_party/crashpad/crashpad/snapshot/cpu_context.h"
 #include "third_party/crashpad/crashpad/snapshot/exception_snapshot.h"
 #include "third_party/crashpad/crashpad/snapshot/module_snapshot.h"
@@ -52,6 +55,10 @@
     return true;
   }
 
+  if (AnalyzeLightweightDetectorCrash(process_snapshot, proto)) {
+    return true;
+  }
+
   return false;
 }
 
@@ -157,6 +164,114 @@
   return true;
 }
 
+bool CrashAnalyzer::AnalyzeLightweightDetectorCrash(
+    const crashpad::ProcessSnapshot& process_snapshot,
+    gwp_asan::Crash* proto) {
+  AllocatorState valid_state;
+  // The lightweight detector only supports PartitionAlloc.
+  if (!GetAllocatorState(process_snapshot, kPartitionAllocCrashKey,
+                         Crash_Allocator_PARTITIONALLOC, &valid_state)) {
+    return false;
+  }
+
+  if (!valid_state.lightweight_detector_metadata_addr) {
+    // Assume the lightweight detector wasn't enabled.
+    return false;
+  }
+
+  auto* exception = process_snapshot.Exception();
+  if (!exception->Context()->Is64Bit()) {
+    // The lightweight detector isn't used on 32-bit platforms.
+    return false;
+  }
+
+  auto exception_addr = GetAccessAddress(*exception);
+  auto metadata_id = LightweightDetector::ExtractMetadataId(exception_addr);
+
+#if defined(ARCH_CPU_X86_64)
+  // x86-64 CPUs won't report the exact access address if it's non-canonical.
+  // Use a set of platform-specific hints to detect when it's the case
+  // and attempt to extract the ID from the register values at the time of the
+  // crash. See also "Intel 64 and IA-32 Architectures Software Developer’s
+  // Manual", Volume 1, Section 3.3.7.1.
+  if (!metadata_id.has_value() &&
+      exception->Context()->architecture == crashpad::kCPUArchitectureX86_64 &&
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
+      // https://elixir.bootlin.com/linux/v6.2.2/source/arch/x86/kernel/traps.c#L719
+      exception->Exception() == SIGSEGV &&
+      exception->ExceptionInfo() == SI_KERNEL
+#elif BUILDFLAG(IS_MAC)
+      // https://opensource.apple.com/source/xnu/xnu-1699.24.8/osfmk/i386/trap.c
+      exception->Exception() == EXC_BAD_ACCESS &&
+      exception->ExceptionInfo() == EXC_I386_GPFLT
+#elif BUILDFLAG(IS_WIN)
+      // Verified experimentally.
+      exception_addr == std::numeric_limits<uint64_t>::max()
+#endif
+  ) {
+    auto& context = *exception->Context()->x86_64;
+    uint64_t cpu_regs[] = {context.rax, context.rbx, context.rcx, context.rdx,
+                           context.rdi, context.rsi, context.rbp, context.rsp,
+                           context.r8,  context.r9,  context.r10, context.r11,
+                           context.r12, context.r13, context.r14, context.r15,
+                           context.rip};
+
+    for (auto cpu_reg : cpu_regs) {
+      auto new_id = LightweightDetector::ExtractMetadataId(cpu_reg);
+      if (new_id.has_value()) {
+        if (!metadata_id.has_value()) {
+          metadata_id = new_id;
+        } else if (metadata_id != new_id) {
+          proto->set_missing_metadata(true);
+          proto->set_internal_error(
+              "Found conflicting lightweight metadata IDs.");
+          return true;
+        }
+      }
+    }
+  }
+#endif  // defined(ARCH_CPU_X86_64)
+
+  if (!metadata_id.has_value()) {
+    return false;
+  }
+
+  // We overwrite this later if it should be false.
+  proto->set_missing_metadata(true);
+  proto->set_allocator(Crash_Allocator_PARTITIONALLOC);
+
+  size_t slot_count = valid_state.num_lightweight_detector_metadata;
+  auto metadata_arr =
+      std::make_unique<AllocatorState::SlotMetadata[]>(slot_count);
+  if (!process_snapshot.Memory()->Read(
+          valid_state.lightweight_detector_metadata_addr,
+          sizeof(AllocatorState::SlotMetadata) * slot_count,
+          metadata_arr.get())) {
+    proto->set_internal_error("Failed to read lightweight metadata.");
+    return true;
+  }
+
+  auto& metadata = valid_state.GetLightweightSlotMetadataById(
+      *metadata_id, metadata_arr.get());
+  if (metadata.lightweight_id != metadata_id) {
+    proto->set_internal_error(
+        "The computed lightweight metadata index was outdated.");
+    return true;
+  }
+
+  proto->set_missing_metadata(false);
+  proto->set_error_type(Crash_ErrorType_LIGHTWEIGHT_USE_AFTER_FREE);
+  proto->set_allocation_address(metadata.alloc_ptr);
+  proto->set_allocation_size(metadata.alloc_size);
+  if (metadata.dealloc.tid != base::kInvalidThreadId ||
+      metadata.dealloc.trace_len) {
+    ReadAllocationInfo(metadata.stack_trace_pool, metadata.alloc.trace_len,
+                       metadata.dealloc, proto->mutable_deallocation());
+  }
+
+  return true;
+}
+
 bool CrashAnalyzer::AnalyzeCrashedAllocator(
     const crashpad::ProcessSnapshot& process_snapshot,
     const char* crash_key,
diff --git a/components/gwp_asan/crash_handler/crash_analyzer.h b/components/gwp_asan/crash_handler/crash_analyzer.h
index 36cc4ed2..600db21 100644
--- a/components/gwp_asan/crash_handler/crash_analyzer.h
+++ b/components/gwp_asan/crash_handler/crash_analyzer.h
@@ -103,6 +103,13 @@
                                  size_t stack_trace_offset,
                                  const SlotMetadata::AllocationInfo& slot_info,
                                  gwp_asan::Crash_AllocationInfo* proto_info);
+
+  // This method analyzes the AllocatorState of the crashing process. If the
+  // exception is related to the Lightweight UAF Detector it fills out the
+  // |proto| parameter and returns true.
+  static bool AnalyzeLightweightDetectorCrash(
+      const crashpad::ProcessSnapshot& process_snapshot,
+      gwp_asan::Crash* proto);
 };
 
 }  // namespace internal
diff --git a/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc b/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc
index f187229d..069f3177 100644
--- a/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc
+++ b/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc
@@ -35,24 +35,49 @@
 namespace gwp_asan {
 namespace internal {
 
-class CrashAnalyzerTest : public testing::Test {
+namespace {
+
+void SetAccessAddress(crashpad::test::TestExceptionSnapshot& exception,
+                      crashpad::VMAddress address) {
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
+  exception.SetException(SIGSEGV);
+  exception.SetExceptionAddress(address);
+#elif BUILDFLAG(IS_APPLE)
+  exception.SetException(EXC_BAD_ACCESS);
+  exception.SetExceptionAddress(address);
+#elif BUILDFLAG(IS_WIN)
+  exception.SetException(EXCEPTION_ACCESS_VIOLATION);
+  exception.SetCodes({0, address});
+#else
+#error "Unknown platform"
+#endif
+}
+
+}  // namespace
+
+class BaseCrashAnalyzerTest : public testing::Test {
  protected:
-  void SetUp() final {
-    gpa_.Init(1, 1, 1, base::DoNothing(), false,
-              LightweightDetectorState::kDisabled, 0);
-    InitializeSnapshot();
+  using testing::Test::SetUp;
+
+  void SetUp(bool is_partition_alloc,
+             LightweightDetectorState lightweight_detector_state,
+             size_t num_lightweight_detector_metadata) {
+    is_partition_alloc_ = is_partition_alloc;
+    gpa_.Init(1, 1, 1, base::DoNothing(), is_partition_alloc,
+              lightweight_detector_state, num_lightweight_detector_metadata);
   }
 
   // Initializes the ProcessSnapshot so that it appears the given allocator was
-  // used for backing malloc.
-  void InitializeSnapshot() {
+  // used for backing either malloc or PartitionAlloc, depending on
+  // `is_partition_alloc_`.
+  void InitializeSnapshot(crashpad::VMAddress exception_address) {
     std::string crash_key_value = gpa_.GetCrashKey();
     std::vector<uint8_t> crash_key_vector(crash_key_value.begin(),
                                           crash_key_value.end());
 
     std::vector<crashpad::AnnotationSnapshot> annotations;
     annotations.emplace_back(
-        kMallocCrashKey,
+        is_partition_alloc_ ? kPartitionAllocCrashKey : kMallocCrashKey,
         static_cast<uint16_t>(crashpad::Annotation::Type::kString),
         crash_key_vector);
 
@@ -68,6 +93,7 @@
     exception->MutableContext()->architecture =
         crashpad::CPUArchitecture::kCPUArchitectureX86;
 #endif
+    SetAccessAddress(*exception, exception_address);
 
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
     ASSERT_TRUE(connection_.Initialize(getpid()));
@@ -89,6 +115,15 @@
   crashpad::test::FakePtraceConnection connection_;
 #endif
 
+  bool is_partition_alloc_ = false;
+};
+
+class CrashAnalyzerTest : public BaseCrashAnalyzerTest {
+  void SetUp() final {
+    BaseCrashAnalyzerTest::SetUp(/* is_partition_alloc = */ false,
+                                 LightweightDetectorState::kDisabled, 0);
+    InitializeSnapshot(0);
+  }
 };
 
 // Stack trace collection on Android builds with frame pointers enabled does
@@ -161,5 +196,53 @@
   EXPECT_TRUE(proto.missing_metadata());
 }
 
+// The detector is not used on 32-bit systems because pointers there aren't big
+// enough to safely store metadata IDs.
+#if defined(ARCH_CPU_64_BITS)
+class LightweightDetectorAnalyzerTest : public BaseCrashAnalyzerTest {
+  void SetUp() final {
+    BaseCrashAnalyzerTest::SetUp(/* is_partition_alloc = */ true,
+                                 LightweightDetectorState::kEnabled, 1);
+  }
+};
+
+TEST_F(LightweightDetectorAnalyzerTest, UseAfterFree) {
+  uint64_t alloc;
+  gpa_.RecordLightweightDeallocation(&alloc, sizeof(alloc));
+  InitializeSnapshot(alloc);
+
+  gwp_asan::Crash proto;
+  bool proto_present =
+      CrashAnalyzer::GetExceptionInfo(process_snapshot_, &proto);
+  ASSERT_TRUE(proto_present);
+
+  ASSERT_FALSE(proto.has_allocation());
+  ASSERT_TRUE(proto.has_deallocation());
+  EXPECT_FALSE(proto.has_internal_error());
+  ASSERT_TRUE(proto.has_missing_metadata());
+  EXPECT_FALSE(proto.missing_metadata());
+}
+
+TEST_F(LightweightDetectorAnalyzerTest, InternalError) {
+  uint64_t alloc;
+  gpa_.RecordLightweightDeallocation(&alloc, sizeof(alloc));
+  InitializeSnapshot(alloc);
+
+  // Corrupt the metadata ID.
+  ++gpa_.lightweight_detector_metadata_[0].lightweight_id;
+
+  gwp_asan::Crash proto;
+  bool proto_present =
+      CrashAnalyzer::GetExceptionInfo(process_snapshot_, &proto);
+  ASSERT_TRUE(proto_present);
+
+  ASSERT_FALSE(proto.has_allocation());
+  ASSERT_FALSE(proto.has_deallocation());
+  EXPECT_TRUE(proto.has_internal_error());
+  ASSERT_TRUE(proto.has_missing_metadata());
+  EXPECT_TRUE(proto.missing_metadata());
+}
+#endif  // defined(ARCH_CPU_64_BITS)
+
 }  // namespace internal
 }  // namespace gwp_asan
diff --git a/components/gwp_asan/crash_handler/crash_handler.cc b/components/gwp_asan/crash_handler/crash_handler.cc
index f942522c..5add17c 100644
--- a/components/gwp_asan/crash_handler/crash_handler.cc
+++ b/components/gwp_asan/crash_handler/crash_handler.cc
@@ -69,6 +69,8 @@
       return "unknown";
     case Crash::FREE_INVALID_ADDRESS:
       return "free-invalid-address";
+    case Crash::LIGHTWEIGHT_USE_AFTER_FREE:
+      return "lightweight-heap-use-after-free";
     default:
       return "unexpected error type";
   }
diff --git a/components/gwp_asan/crash_handler/crash_handler_unittest.cc b/components/gwp_asan/crash_handler/crash_handler_unittest.cc
index 951c7ef..98033dd 100644
--- a/components/gwp_asan/crash_handler/crash_handler_unittest.cc
+++ b/components/gwp_asan/crash_handler/crash_handler_unittest.cc
@@ -91,11 +91,6 @@
       ->set_system_crash_reporter_forwarding(crashpad::TriState::kDisabled);
 #endif
 
-  base::NoDestructor<GuardedPageAllocator> gpa;
-  gpa->Init(AllocatorState::kMaxMetadata, AllocatorState::kMaxMetadata,
-            kTotalPages, base::DoNothing(), false,
-            LightweightDetectorState::kDisabled, 0);
-
   base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
   base::FilePath directory = cmd_line->GetSwitchValuePath("directory");
   CHECK(!directory.empty());
@@ -113,6 +108,19 @@
     return kSuccess;
   }
 
+  LightweightDetectorState lightweight_detector_state =
+      LightweightDetectorState::kDisabled;
+  size_t num_lightweight_detector_metadata = 0;
+  if (cmd_line->HasSwitch("enable-lightweight-detector")) {
+    lightweight_detector_state = LightweightDetectorState::kEnabled;
+    num_lightweight_detector_metadata = 1;
+  }
+
+  base::NoDestructor<GuardedPageAllocator> gpa;
+  gpa->Init(AllocatorState::kMaxMetadata, AllocatorState::kMaxMetadata,
+            kTotalPages, base::DoNothing(), allocator == "partitionalloc",
+            lightweight_detector_state, num_lightweight_detector_metadata);
+
   std::string gpa_addr = gpa->GetCrashKey();
   static crashpad::Annotation gpa_annotation(
       crashpad::Annotation::Type::kString, annotation_name,
@@ -236,6 +244,10 @@
     // Cause a crash accessing an allocation that no longer has metadata
     // associated with it.
     *(uint8_t*)(ptrs[0]) = 0;
+  } else if (test_name == "LightweightDetectorUseAfterFree") {
+    uint8_t fake_alloc[kAllocationSize];
+    gpa->RecordLightweightDeallocation(&fake_alloc, sizeof(fake_alloc));
+    **(int**)fake_alloc = 0;
   } else {
     LOG(ERROR) << "Unknown test name " << test_name;
   }
@@ -244,18 +256,28 @@
   return kSuccess;
 }
 
+enum class ShouldSanitize : bool { kNo, kYes };
+enum class EnableLightweightDetector : bool { kNo, kYes };
+enum class HasAllocation : bool { kNo, kYes };
+enum class HasDeallocation : bool { kNo, kYes };
+
 struct TestParams {
-  TestParams(const char* allocator, bool sanitize)
-      : allocator(allocator), sanitize(sanitize) {}
+  TestParams(const char* allocator,
+             ShouldSanitize sanitize,
+             EnableLightweightDetector enable_lightweight_detector)
+      : allocator(allocator),
+        sanitize(sanitize),
+        enable_lightweight_detector(enable_lightweight_detector) {}
 
   const char* allocator;
-  bool sanitize;
+  ShouldSanitize sanitize;
+  EnableLightweightDetector enable_lightweight_detector;
 };
 
-class CrashHandlerTest : public base::MultiProcessTest,
-                         public testing::WithParamInterface<TestParams> {
+class BaseCrashHandlerTest : public base::MultiProcessTest,
+                             public testing::WithParamInterface<TestParams> {
  protected:
-  CrashHandlerTest() : params_(GetParam()) {}
+  BaseCrashHandlerTest() : params_(GetParam()) {}
 
   // Launch a child process and wait for it to crash. Set |gwp_asan_found_| if a
   // GWP-ASan data was found and if so, read it into |proto_|.
@@ -289,8 +311,14 @@
     cmd_line.AppendSwitchASCII("test-name", test_name);
     cmd_line.AppendSwitchASCII("allocator", params_.allocator);
 
-    if (params_.sanitize)
+    if (params_.sanitize == ShouldSanitize::kYes) {
       cmd_line.AppendSwitch("sanitize");
+    }
+
+    if (params_.enable_lightweight_detector ==
+        EnableLightweightDetector::kYes) {
+      cmd_line.AppendSwitch("enable-lightweight-detector");
+    }
 
     base::LaunchOptions options;
 #if BUILDFLAG(IS_WIN)
@@ -355,7 +383,9 @@
     }
   }
 
-  void checkProto(Crash_ErrorType error_type, bool has_deallocation) {
+  void checkProto(Crash_ErrorType error_type,
+                  HasAllocation has_allocation,
+                  HasDeallocation has_deallocation) {
     EXPECT_TRUE(proto_.has_error_type());
     EXPECT_EQ(proto_.error_type(), error_type);
 
@@ -364,32 +394,41 @@
     EXPECT_TRUE(proto_.has_allocation_size());
     EXPECT_EQ(proto_.allocation_size(), kAllocationSize);
 
-    EXPECT_TRUE(proto_.has_allocation());
-    EXPECT_TRUE(proto_.allocation().has_thread_id());
-    EXPECT_NE(proto_.allocation().thread_id(),
-              static_cast<uint64_t>(base::kInvalidThreadId));
-    EXPECT_GT(proto_.allocation().stack_trace_size(), 0);
+    EXPECT_EQ(proto_.has_allocation(), has_allocation == HasAllocation::kYes);
+    if (proto_.has_allocation()) {
+      EXPECT_TRUE(proto_.allocation().has_thread_id());
+      EXPECT_NE(proto_.allocation().thread_id(),
+                static_cast<uint64_t>(base::kInvalidThreadId));
+      EXPECT_GT(proto_.allocation().stack_trace_size(), 0);
+    }
 
-    EXPECT_EQ(proto_.has_deallocation(), has_deallocation);
-    if (has_deallocation) {
+    EXPECT_EQ(proto_.has_deallocation(),
+              has_deallocation == HasDeallocation::kYes);
+    if (proto_.has_deallocation()) {
       EXPECT_TRUE(proto_.deallocation().has_thread_id());
       EXPECT_NE(proto_.deallocation().thread_id(),
                 static_cast<uint64_t>(base::kInvalidThreadId));
-      EXPECT_EQ(proto_.allocation().thread_id(),
-                proto_.deallocation().thread_id());
       EXPECT_GT(proto_.deallocation().stack_trace_size(), 0);
     }
 
-    EXPECT_TRUE(proto_.has_region_start());
-    EXPECT_TRUE(proto_.has_region_size());
-    EXPECT_EQ(proto_.region_start() & (base::GetPageSize() - 1), 0U);
-    // We can't have a more precise check of the region size because it depends
-    // on the PartitionAlloc metadata layout.
-    EXPECT_GE(proto_.region_size(),
-              base::GetPageSize() * (2 * kTotalPages + 1));
-    EXPECT_LE(
-        proto_.region_size(),
-        base::GetPageSize() * (2 * AllocatorState::kMaxReservedSlots + 1));
+    if (proto_.has_allocation() && proto_.has_deallocation()) {
+      EXPECT_EQ(proto_.allocation().thread_id(),
+                proto_.deallocation().thread_id());
+    }
+
+    if (proto_.has_region_start() || proto_.has_region_size()) {
+      EXPECT_TRUE(proto_.has_region_start());
+      EXPECT_TRUE(proto_.has_region_size());
+      EXPECT_EQ(proto_.region_start() & (base::GetPageSize() - 1), 0U);
+      // We can't have a more precise check of the region size because it
+      // depends on the PartitionAlloc metadata layout.
+      EXPECT_GE(proto_.region_size(),
+                base::GetPageSize() * (2 * kTotalPages + 1));
+      EXPECT_LE(
+          proto_.region_size(),
+          base::GetPageSize() * (2 * AllocatorState::kMaxReservedSlots + 1));
+    }
+
     EXPECT_TRUE(proto_.has_missing_metadata());
     EXPECT_FALSE(proto_.missing_metadata());
 
@@ -407,6 +446,8 @@
   bool gwp_asan_found_;
 };
 
+class CrashHandlerTest : public BaseCrashHandlerTest {};
+
 #if defined(ADDRESS_SANITIZER) && (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID))
 // ASan intercepts crashes and crashpad doesn't have a chance to see them.
 #define MAYBE_DISABLED(name) DISABLED_ ##name
@@ -416,27 +457,32 @@
 
 TEST_P(CrashHandlerTest, MAYBE_DISABLED(UseAfterFree)) {
   ASSERT_TRUE(gwp_asan_found_);
-  checkProto(Crash_ErrorType_USE_AFTER_FREE, true);
+  checkProto(Crash_ErrorType_USE_AFTER_FREE, HasAllocation::kYes,
+             HasDeallocation::kYes);
 }
 
 TEST_P(CrashHandlerTest, MAYBE_DISABLED(DoubleFree)) {
   ASSERT_TRUE(gwp_asan_found_);
-  checkProto(Crash_ErrorType_DOUBLE_FREE, true);
+  checkProto(Crash_ErrorType_DOUBLE_FREE, HasAllocation::kYes,
+             HasDeallocation::kYes);
 }
 
 TEST_P(CrashHandlerTest, MAYBE_DISABLED(Underflow)) {
   ASSERT_TRUE(gwp_asan_found_);
-  checkProto(Crash_ErrorType_BUFFER_UNDERFLOW, false);
+  checkProto(Crash_ErrorType_BUFFER_UNDERFLOW, HasAllocation::kYes,
+             HasDeallocation::kNo);
 }
 
 TEST_P(CrashHandlerTest, MAYBE_DISABLED(Overflow)) {
   ASSERT_TRUE(gwp_asan_found_);
-  checkProto(Crash_ErrorType_BUFFER_OVERFLOW, false);
+  checkProto(Crash_ErrorType_BUFFER_OVERFLOW, HasAllocation::kYes,
+             HasDeallocation::kNo);
 }
 
 TEST_P(CrashHandlerTest, MAYBE_DISABLED(FreeInvalidAddress)) {
   ASSERT_TRUE(gwp_asan_found_);
-  checkProto(Crash_ErrorType_FREE_INVALID_ADDRESS, false);
+  checkProto(Crash_ErrorType_FREE_INVALID_ADDRESS, HasAllocation::kYes,
+             HasDeallocation::kNo);
   EXPECT_TRUE(proto_.has_free_invalid_address());
 }
 
@@ -464,10 +510,37 @@
                          CrashHandlerTest,
                          testing::Values(
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
-                             TestParams("malloc", true),
+                             TestParams("malloc",
+                                        ShouldSanitize::kYes,
+                                        EnableLightweightDetector::kNo),
 #endif
-                             TestParams("malloc", false),
-                             TestParams("partitionalloc", false)));
+                             TestParams("malloc",
+                                        ShouldSanitize::kNo,
+                                        EnableLightweightDetector::kNo),
+                             TestParams("partitionalloc",
+                                        ShouldSanitize::kNo,
+                                        EnableLightweightDetector::kNo)));
+
+// ASan hides the fault address from the analyzer.
+// The detector is not used on 32-bit systems because pointers there aren't big
+// enough to safely store metadata IDs.
+#if !defined(ADDRESS_SANITIZER) && defined(ARCH_CPU_64_BITS)
+class LightweightDetectorCrashHandlerTest : public BaseCrashHandlerTest {};
+
+TEST_P(LightweightDetectorCrashHandlerTest, LightweightDetectorUseAfterFree) {
+  ASSERT_TRUE(gwp_asan_found_);
+
+  checkProto(Crash_ErrorType_LIGHTWEIGHT_USE_AFTER_FREE, HasAllocation::kNo,
+             HasDeallocation::kYes);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    SingleValueSuite,
+    LightweightDetectorCrashHandlerTest,
+    testing::Values(TestParams("partitionalloc",
+                               ShouldSanitize::kNo,
+                               EnableLightweightDetector::kYes)));
+#endif
 
 }  // namespace
 
diff --git a/components/history/core/browser/features.cc b/components/history/core/browser/features.cc
index 37d4f62..4a6a169 100644
--- a/components/history/core/browser/features.cc
+++ b/components/history/core/browser/features.cc
@@ -52,4 +52,26 @@
     "PrivilegeRepeatableQueries",
     false);
 
+// Whether duplicative visits should be ignored for the repeatable queries. A
+// duplicative visit is a visit to the same search term in an interval smaller
+// than kAutocompleteDuplicateVisitIntervalThreshold.
+const base::FeatureParam<bool> kRepeatableQueriesIgnoreDuplicateVisits(
+    &kOrganicRepeatableQueries,
+    "RepeatableQueriesIgnoreDuplicateVisits",
+    false);
+
+// The maximum number of days since the last visit (in days) in order for a
+// search query to considered as a repeatable query.
+const base::FeatureParam<int> kRepeatableQueriesMaxAgeDays(
+    &kOrganicRepeatableQueries,
+    "RepeatableQueriesMaxAgeDays",
+    90);
+
+// The minimum number of visits for a search query to considered as a
+// repeatable query.
+const base::FeatureParam<int> kRepeatableQueriesMinVisitCount(
+    &kOrganicRepeatableQueries,
+    "RepeatableQueriesMinVisitCount",
+    1);
+
 }  // namespace history
diff --git a/components/history/core/browser/features.h b/components/history/core/browser/features.h
index d869f5d..55ac5565 100644
--- a/components/history/core/browser/features.h
+++ b/components/history/core/browser/features.h
@@ -15,6 +15,9 @@
 extern const base::FeatureParam<int> kMaxNumRepeatableQueries;
 extern const base::FeatureParam<bool> kScaleRepeatableQueriesScores;
 extern const base::FeatureParam<bool> kPrivilegeRepeatableQueries;
+extern const base::FeatureParam<bool> kRepeatableQueriesIgnoreDuplicateVisits;
+extern const base::FeatureParam<int> kRepeatableQueriesMaxAgeDays;
+extern const base::FeatureParam<int> kRepeatableQueriesMinVisitCount;
 
 }  // namespace history
 
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc
index c119429..61fed9a 100644
--- a/components/history/core/browser/history_backend_unittest.cc
+++ b/components/history/core/browser/history_backend_unittest.cc
@@ -27,11 +27,13 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/test/gtest_util.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "components/favicon/core/favicon_backend.h"
 #include "components/favicon_base/favicon_usage_data.h"
+#include "components/history/core/browser/features.h"
 #include "components/history/core/browser/history_backend_client.h"
 #include "components/history/core/browser/history_constants.h"
 #include "components/history/core/browser/history_database_params.h"
@@ -3622,7 +3624,8 @@
 TEST_F(HistoryBackendTest, QueryMostRepeatedQueriesForKeyword) {
   ASSERT_TRUE(backend_.get());
 
-  // Choose the local midnight of today last week as the baseline for the time.
+  // Choose the local midnight of today last week as the baseline for the last
+  // visit time. All searches are less than 7 days old and are done only once.
   base::Time base_time = base::Time::Now().LocalMidnight() - base::Days(7);
   const size_t result_count = 3;
 
@@ -3649,14 +3652,74 @@
   }
 
   {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitAndEnableFeatureWithParameters(
+        history::kOrganicRepeatableQueries,
+        {{history::kRepeatableQueriesMaxAgeDays.name, "7"},
+         {history::kRepeatableQueriesMinVisitCount.name, "1"}});
+
     base::HistogramTester histogram_tester;
     KeywordSearchTermVisitList queries =
         backend_->QueryMostRepeatedQueriesForKeyword(first_keyword_id,
                                                      result_count);
+
     ASSERT_EQ(result_count, queries.size());
     EXPECT_EQ(u"first6", queries[0]->normalized_term);
     EXPECT_EQ(u"first5", queries[1]->normalized_term);
     EXPECT_EQ(u"first4", queries[2]->normalized_term);
+    histogram_tester.ExpectTotalCount("History.QueryMostRepeatedQueriesTimeV2",
+                                      1);
+  }
+  {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitAndEnableFeatureWithParameters(
+        history::kOrganicRepeatableQueries,
+        {{history::kRepeatableQueriesMaxAgeDays.name, "2"},
+         {history::kRepeatableQueriesMinVisitCount.name, "1"}});
+
+    base::HistogramTester histogram_tester;
+    KeywordSearchTermVisitList queries =
+        backend_->QueryMostRepeatedQueriesForKeyword(first_keyword_id,
+                                                     result_count);
+    // Only one search is less than 2 days old.
+    ASSERT_EQ(1U, queries.size());
+    EXPECT_EQ(u"first6", queries[0]->normalized_term);
+    histogram_tester.ExpectTotalCount("History.QueryMostRepeatedQueriesTimeV2",
+                                      1);
+  }
+  {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitAndEnableFeatureWithParameters(
+        history::kOrganicRepeatableQueries,
+        {{history::kRepeatableQueriesMaxAgeDays.name, "7"},
+         {history::kRepeatableQueriesMinVisitCount.name, "1"}});
+
+    base::HistogramTester histogram_tester;
+    KeywordSearchTermVisitList queries =
+        backend_->QueryMostRepeatedQueriesForKeyword(second_keyword_id,
+                                                     result_count);
+
+    ASSERT_EQ(result_count, queries.size());
+    EXPECT_EQ(u"second6", queries[0]->normalized_term);
+    EXPECT_EQ(u"second5", queries[1]->normalized_term);
+    EXPECT_EQ(u"second4", queries[2]->normalized_term);
+
+    histogram_tester.ExpectTotalCount("History.QueryMostRepeatedQueriesTimeV2",
+                                      1);
+  }
+  {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitAndEnableFeatureWithParameters(
+        history::kOrganicRepeatableQueries,
+        {{history::kRepeatableQueriesMaxAgeDays.name, "7"},
+         {history::kRepeatableQueriesMinVisitCount.name, "2"}});
+
+    base::HistogramTester histogram_tester;
+    KeywordSearchTermVisitList queries =
+        backend_->QueryMostRepeatedQueriesForKeyword(second_keyword_id,
+                                                     result_count);
+    // No search is done more than once.
+    ASSERT_EQ(0U, queries.size());
 
     histogram_tester.ExpectTotalCount("History.QueryMostRepeatedQueriesTimeV2",
                                       1);
diff --git a/components/history/core/browser/history_service_unittest.cc b/components/history/core/browser/history_service_unittest.cc
index 01715f3..aec930f5 100644
--- a/components/history/core/browser/history_service_unittest.cc
+++ b/components/history/core/browser/history_service_unittest.cc
@@ -36,7 +36,9 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
+#include "components/history/core/browser/features.h"
 #include "components/history/core/browser/history_backend.h"
 #include "components/history/core/browser/history_database_params.h"
 #include "components/history/core/browser/history_db_task.h"
@@ -568,6 +570,13 @@
 TEST_F(HistoryServiceTest, QueryMostRepeatedQueriesForKeyword) {
   ASSERT_TRUE(history_service_.get());
 
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeatureWithParameters(
+      history::kOrganicRepeatableQueries,
+      {{history::kRepeatableQueriesMaxAgeDays.name, "4"},
+       {history::kRepeatableQueriesMinVisitCount.name, "1"},
+       {history::kRepeatableQueriesIgnoreDuplicateVisits.name, "true"}});
+
   const KeywordID first_keyword_id = 1;
   const KeywordID second_keyword_id = 2;
 
@@ -576,26 +585,28 @@
     const std::u16string term;
     base::Time time;
     const KeywordID keyword_id;
-  } pages[] = {{GURL("http://www.search.com/?q=First"), u"First",
-                base::Time::Now() - base::Days(4), first_keyword_id},
-               {GURL("http://www.search.com/?q=Second"), u"Second",
-                base::Time::Now() - base::Days(3), first_keyword_id},
-               {GURL("http://www.search.com/?q=Third"), u"Third",
-                base::Time::Now() - base::Days(2), first_keyword_id},
-               {GURL("http://www.search.com/?q=Fourth"), u"Fourth",
-                base::Time::Now() - base::Days(1), second_keyword_id}};
+  };
 
-  // Add first page for first keyword.
-  history_service_->AddPage(pages[0].url, pages[0].time,
-                            history::SOURCE_BROWSED);
-  history_service_->SetKeywordSearchTermsForURL(
-      pages[0].url, pages[0].keyword_id, pages[0].term);
+  PageData page_1 = {GURL("http://www.search.com/?q=First"), u"First",
+                     base::Time::Now() - base::Days(4), first_keyword_id};
+  PageData page_2 = {GURL("http://www.search.com/?q=Second"), u"Second",
+                     base::Time::Now() - base::Days(3), first_keyword_id};
+  PageData page_3 = {GURL("http://www.search.com/?q=Second&foo=bar"), u"Second",
+                     base::Time::Now() - base::Days(3), first_keyword_id};
+  PageData page_4 = {GURL("http://www.search.com/?q=Fourth"), u"Fourth",
+                     base::Time::Now() - base::Days(2), first_keyword_id};
+  PageData page_5 = {GURL("http://www.search.com/?q=Fifth"), u"Fifth",
+                     base::Time::Now() - base::Days(1), second_keyword_id};
 
-  // Add second page for first keyword.
-  history_service_->AddPage(pages[1].url, pages[1].time,
-                            history::SOURCE_BROWSED);
-  history_service_->SetKeywordSearchTermsForURL(
-      pages[1].url, pages[1].keyword_id, pages[1].term);
+  // Add first page from them first keyword.
+  history_service_->AddPage(page_1.url, page_1.time, history::SOURCE_BROWSED);
+  history_service_->SetKeywordSearchTermsForURL(page_1.url, page_1.keyword_id,
+                                                page_1.term);
+
+  // Add second page from the first keyword.
+  history_service_->AddPage(page_2.url, page_2.time, history::SOURCE_BROWSED);
+  history_service_->SetKeywordSearchTermsForURL(page_2.url, page_2.keyword_id,
+                                                page_2.term);
 
   {
     base::HistogramTester histogram_tester;
@@ -603,33 +614,33 @@
 
     ASSERT_EQ(1U, most_repeated_queries_.size());
     EXPECT_EQ(u"second", most_repeated_queries_[0]->normalized_term);
+    EXPECT_EQ(1, most_repeated_queries_[0]->visit_count);
 
     histogram_tester.ExpectTotalCount("History.QueryMostRepeatedQueriesTimeV2",
                                       1);
   }
 
-  // Add third page for first keyword.
-  history_service_->AddPage(pages[2].url, pages[2].time,
-                            history::SOURCE_BROWSED);
-  history_service_->SetKeywordSearchTermsForURL(
-      pages[2].url, pages[2].keyword_id, pages[2].term);
+  // Add fourth page from the first keyword.
+  history_service_->AddPage(page_4.url, page_4.time, history::SOURCE_BROWSED);
+  history_service_->SetKeywordSearchTermsForURL(page_4.url, page_4.keyword_id,
+                                                page_4.term);
 
   {
     base::HistogramTester histogram_tester;
     QueryMostRepeatedQueriesForKeyword(first_keyword_id, 1);
 
     ASSERT_EQ(1U, most_repeated_queries_.size());
-    EXPECT_EQ(u"third", most_repeated_queries_[0]->normalized_term);
+    EXPECT_EQ(u"fourth", most_repeated_queries_[0]->normalized_term);
+    EXPECT_EQ(1, most_repeated_queries_[0]->visit_count);
 
     histogram_tester.ExpectTotalCount("History.QueryMostRepeatedQueriesTimeV2",
                                       1);
   }
 
-  // Revisit second page for first keyword, making it the top page.
-  history_service_->AddPage(pages[1].url, pages[1].time,
-                            history::SOURCE_BROWSED);
-  history_service_->SetKeywordSearchTermsForURL(
-      pages[1].url, pages[1].keyword_id, pages[1].term);
+  // Revisit second page from the first keyword, making it the top page.
+  history_service_->AddPage(page_2.url, page_2.time, history::SOURCE_BROWSED);
+  history_service_->SetKeywordSearchTermsForURL(page_2.url, page_2.keyword_id,
+                                                page_2.term);
 
   {
     base::HistogramTester histogram_tester;
@@ -637,16 +648,17 @@
 
     ASSERT_EQ(1U, most_repeated_queries_.size());
     EXPECT_EQ(u"second", most_repeated_queries_[0]->normalized_term);
+    EXPECT_EQ(2, most_repeated_queries_[0]->visit_count);
 
     histogram_tester.ExpectTotalCount("History.QueryMostRepeatedQueriesTimeV2",
                                       1);
   }
 
-  // Add forth page for second keyword. This does not change the top page.
-  history_service_->AddPage(pages[3].url, pages[3].time,
-                            history::SOURCE_BROWSED);
-  history_service_->SetKeywordSearchTermsForURL(
-      pages[3].url, pages[3].keyword_id, pages[3].term);
+  // Add third page from the first keyword. This is considered a duplicative
+  // vist and will be ignored. This does not change the top page.
+  history_service_->AddPage(page_3.url, page_3.time, history::SOURCE_BROWSED);
+  history_service_->SetKeywordSearchTermsForURL(page_3.url, page_3.keyword_id,
+                                                page_3.term);
 
   {
     base::HistogramTester histogram_tester;
@@ -654,6 +666,24 @@
 
     ASSERT_EQ(1U, most_repeated_queries_.size());
     EXPECT_EQ(u"second", most_repeated_queries_[0]->normalized_term);
+    EXPECT_EQ(2, most_repeated_queries_[0]->visit_count);
+
+    histogram_tester.ExpectTotalCount("History.QueryMostRepeatedQueriesTimeV2",
+                                      1);
+  }
+
+  // Add fifth page from the second keyword. This does not change the top page.
+  history_service_->AddPage(page_5.url, page_5.time, history::SOURCE_BROWSED);
+  history_service_->SetKeywordSearchTermsForURL(page_5.url, page_5.keyword_id,
+                                                page_5.term);
+
+  {
+    base::HistogramTester histogram_tester;
+    QueryMostRepeatedQueriesForKeyword(first_keyword_id, 1);
+
+    ASSERT_EQ(1U, most_repeated_queries_.size());
+    EXPECT_EQ(u"second", most_repeated_queries_[0]->normalized_term);
+    EXPECT_EQ(2, most_repeated_queries_[0]->visit_count);
 
     histogram_tester.ExpectTotalCount("History.QueryMostRepeatedQueriesTimeV2",
                                       1);
diff --git a/components/history/core/browser/keyword_search_term_util.cc b/components/history/core/browser/keyword_search_term_util.cc
index 517772b3..8430b72 100644
--- a/components/history/core/browser/keyword_search_term_util.cc
+++ b/components/history/core/browser/keyword_search_term_util.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "base/time/time.h"
+#include "components/history/core/browser/features.h"
 #include "components/history/core/browser/keyword_search_term.h"
 
 namespace history {
@@ -107,6 +108,7 @@
     while (auto next_visit = enumerator.GetNextVisit()) {
       if (last_search_term_ &&
           IsSameSearchTerm(*next_visit, *last_search_term_)) {
+        // Ignore duplicative visits, if applicable.
         if (ignore_duplicate_visits &&
             IsDuplicateVisit(*next_visit, *last_search_term_)) {
           continue;
@@ -187,6 +189,8 @@
   std::unique_ptr<KeywordSearchTermVisit> GetNextSearchTermFromEnumerator(
       KeywordSearchTermVisitEnumerator& enumerator,
       base::Time now) {
+    const bool ignore_duplicate_visits =
+        kRepeatableQueriesIgnoreDuplicateVisits.Get();
     // |next_visit| acts as the fast pointer and |last_search_term_| acts as the
     // slow pointer accumulating the search term score across visits.
     while (auto next_visit = enumerator.GetNextVisit()) {
@@ -195,6 +199,11 @@
           IsSameSearchTerm(*next_visit, *last_search_term_);
       if (is_same_search_term &&
           IsSameTimeslot(*next_visit, *last_search_term_)) {
+        // Ignore duplicative visits, if applicable.
+        if (ignore_duplicate_visits &&
+            IsDuplicateVisit(*next_visit, *last_search_term_)) {
+          continue;
+        }
         // The same timeslot for the same search term:
         // 1. Move |last_search_term_| forward.
         // 2. Add up the search term visit count in the timeslot.
@@ -207,6 +216,11 @@
             last_search_term_->score.value_or(0.0) + score;
 
       } else if (is_same_search_term) {
+        // Ignore duplicative visits, if applicable.
+        if (ignore_duplicate_visits &&
+            IsDuplicateVisit(*next_visit, *last_search_term_)) {
+          continue;
+        }
         // A new timeslot for the same search term:
         // 1. Update the search term score by adding the last timeslot's score.
         // 2. Move |last_search_term_| forward.
@@ -267,6 +281,17 @@
   const base::Time now = base::Time::Now();
   while (auto search_term =
              helper.GetNextSearchTermFromEnumerator(enumerator, now)) {
+    // Exclude searches that have not been repeated in some time.
+    if (now - search_term->last_visit_time >
+        base::Days(kRepeatableQueriesMaxAgeDays.Get())) {
+      continue;
+    }
+
+    // Exclude searches that have not been repeated enough times.
+    if (search_term->visit_count < kRepeatableQueriesMinVisitCount.Get()) {
+      continue;
+    }
+
     search_terms->push_back(std::move(search_term));
   }
   // Populate `search_terms` with the top `count` search terms in descending
diff --git a/components/history_clusters/core/filter_cluster_processor.cc b/components/history_clusters/core/filter_cluster_processor.cc
index b6c8d6a..2f7bcd5 100644
--- a/components/history_clusters/core/filter_cluster_processor.cc
+++ b/components/history_clusters/core/filter_cluster_processor.cc
@@ -33,7 +33,8 @@
          !filter_params.categories_blocklist.empty() ||
          filter_params.is_search_initiated ||
          filter_params.has_related_searches ||
-         filter_params.is_shown_on_prominent_ui_surfaces;
+         filter_params.is_shown_on_prominent_ui_surfaces ||
+         filter_params.max_clusters > 0;
 }
 
 // Returns whether `visit` could possibly be classified as one of the categories
@@ -49,6 +50,22 @@
   return false;
 }
 
+// Returns whether `cluster` could possibly be classified as one of the
+// categories in `categories`.
+bool IsClusterInCategories(const history::Cluster& cluster,
+                           const base::flat_set<std::string>& categories) {
+  for (const auto& visit : cluster.visits) {
+    if (!IsShownVisitCandidate(visit)) {
+      continue;
+    }
+
+    if (IsVisitInCategories(visit, categories)) {
+      return true;
+    }
+  }
+  return false;
+}
+
 }  // namespace
 
 FilterClusterProcessor::FilterClusterProcessor(
@@ -82,6 +99,14 @@
       "History.Clusters.Backend.FilterClusterProcessor.NumClusters.PostFilter" +
           GetHistogramNameSliceForRequestSource(clustering_request_source_),
       clusters->size());
+
+  if (filter_params_->max_clusters > 0) {
+    SortClustersUsingFilterParams(clusters);
+
+    if (clusters->size() > filter_params_->max_clusters) {
+      clusters->resize(filter_params_->max_clusters);
+    }
+  }
 }
 
 bool FilterClusterProcessor::DoesClusterMatchFilter(
@@ -197,4 +222,41 @@
   return matches_filter;
 }
 
+void FilterClusterProcessor::SortClustersUsingFilterParams(
+    std::vector<history::Cluster>* clusters) const {
+  // Within each cluster, sort visits.
+  for (auto& cluster : *clusters) {
+    StableSortVisits(cluster.visits);
+  }
+
+  // After that, sort clusters based on `filter_params_`.
+  base::ranges::stable_sort(*clusters, [this](const auto& c1, const auto& c2) {
+    if (c1.visits.empty()) {
+      return false;
+    }
+    if (c2.visits.empty()) {
+      return true;
+    }
+
+    // Boost categories if provided.
+    if (!filter_params_->categories_boostlist.empty()) {
+      bool c1_has_visit_in_categories =
+          IsClusterInCategories(c1, filter_params_->categories_boostlist);
+      bool c2_has_visit_in_categories =
+          IsClusterInCategories(c2, filter_params_->categories_boostlist);
+
+      if (c1_has_visit_in_categories ^ c2_has_visit_in_categories) {
+        return c1_has_visit_in_categories;
+      }
+    }
+
+    // Otherwise, fall back to reverse chronological.
+    base::Time c1_time = c1.visits.front().annotated_visit.visit_row.visit_time;
+    base::Time c2_time = c2.visits.front().annotated_visit.visit_row.visit_time;
+
+    // Use c1 > c2 to get more recent clusters BEFORE older clusters.
+    return c1_time > c2_time;
+  });
+}
+
 }  // namespace history_clusters
diff --git a/components/history_clusters/core/filter_cluster_processor.h b/components/history_clusters/core/filter_cluster_processor.h
index 23b11ef..0acb192 100644
--- a/components/history_clusters/core/filter_cluster_processor.h
+++ b/components/history_clusters/core/filter_cluster_processor.h
@@ -48,6 +48,10 @@
   // `filter_params_`.
   bool DoesClusterMatchFilter(history::Cluster& cluster) const;
 
+  // Sorts clusters based on `filter_params_`.
+  void SortClustersUsingFilterParams(
+      std::vector<history::Cluster>* clusters) const;
+
   // The clustering request source that requires this filtering. Used for
   // metrics purposes.
   ClusteringRequestSource clustering_request_source_;
diff --git a/components/history_clusters/core/filter_cluster_processor_unittest.cc b/components/history_clusters/core/filter_cluster_processor_unittest.cc
index a85f0b8..953ac99 100644
--- a/components/history_clusters/core/filter_cluster_processor_unittest.cc
+++ b/components/history_clusters/core/filter_cluster_processor_unittest.cc
@@ -34,8 +34,8 @@
   visit2.content_annotations.related_searches = {"relsearch1", "relsearch2"};
   history::AnnotatedVisit visit4 =
       testing::CreateDefaultAnnotatedVisit(4, GURL("https://github.com/2"));
-  visit.content_annotations.model_annotations.categories = {{"category1", 85},
-                                                            {"category3", 82}};
+  visit4.content_annotations.model_annotations.categories = {{"category1", 85},
+                                                             {"category3", 82}};
   visit4.content_annotations.has_url_keyed_image = true;
   visit4.visit_row.is_known_to_sync = true;
   meets_all_criteria.visits = {testing::CreateClusterVisit(visit),
@@ -455,5 +455,145 @@
       ClusterFilterReason::kHasBlockedCategory, 1);
 }
 
+TEST_F(FilterClusterProcessorTest, MaxClustersAppliedNoCategoryBoosting) {
+  history::Cluster cluster1;
+  cluster1.cluster_id = 1;
+  history::AnnotatedVisit visit =
+      testing::CreateDefaultAnnotatedVisit(1, GURL("https://github.com/"));
+  visit.visit_row.is_known_to_sync = true;
+  visit.content_annotations.has_url_keyed_image = true;
+  visit.content_annotations.model_annotations.categories = {{"category1", 90},
+                                                            {"category2", 84}};
+  history::AnnotatedVisit visit2 =
+      testing::CreateDefaultAnnotatedVisit(2, GURL("https://search.com/"));
+  visit2.visit_row.visit_time = base::Time::FromTimeT(3);
+  visit2.content_annotations.search_terms = u"search";
+  visit2.content_annotations.related_searches = {"relsearch1", "relsearch2"};
+  history::AnnotatedVisit visit4 =
+      testing::CreateDefaultAnnotatedVisit(4, GURL("https://github.com/2"));
+  visit4.content_annotations.model_annotations.categories = {{"category1", 85},
+                                                             {"category3", 82}};
+  visit4.content_annotations.has_url_keyed_image = true;
+  visit4.visit_row.is_known_to_sync = true;
+  cluster1.visits = {
+      testing::CreateClusterVisit(visit, /*normalized_url=*/absl::nullopt, 0.1),
+      testing::CreateClusterVisit(visit2, /*normalized_url=*/absl::nullopt,
+                                  1.0),
+      testing::CreateClusterVisit(visit4, /*normalized_url=*/absl::nullopt,
+                                  0.3)};
+
+  history::Cluster cluster2 = cluster1;
+  // Make the visit time before the first cluster and the first visit have a
+  // different visit ID so we can differentiate the two clusters.
+  cluster2.visits[1].annotated_visit.visit_row.visit_id = 123;
+  cluster2.visits[1].annotated_visit.visit_row.visit_time =
+      base::Time::FromTimeT(10);
+
+  QueryClustersFilterParams filter_params;
+  filter_params.max_clusters = 1;
+
+  auto cluster_processor = std::make_unique<FilterClusterProcessor>(
+      ClusteringRequestSource::kNewTabPage, filter_params,
+      /*engagement_score_provider_is_valid=*/true);
+
+  std::vector<history::Cluster> clusters = {cluster1, cluster2};
+  cluster_processor->ProcessClusters(&clusters);
+
+  // The second cluster should be picked since it's later and the visits should
+  // be sorted according to score.
+  EXPECT_THAT(testing::ToVisitResults(clusters),
+              ElementsAre(ElementsAre(
+                  testing::VisitResult(123, 1.0, {}, u"search"),
+                  testing::VisitResult(4, 0.3), testing::VisitResult(1, 0.1))));
+}
+
+TEST_F(FilterClusterProcessorTest, MaxClustersAppliedWithCategoryBoosting) {
+  history::Cluster cluster1;
+  cluster1.cluster_id = 1;
+  history::AnnotatedVisit visit =
+      testing::CreateDefaultAnnotatedVisit(1, GURL("https://github.com/"));
+  visit.visit_row.is_known_to_sync = true;
+  visit.content_annotations.has_url_keyed_image = true;
+  visit.content_annotations.model_annotations.categories = {
+      {"category1", 90}, {"boostedbuthidden", 84}};
+  history::AnnotatedVisit visit2 =
+      testing::CreateDefaultAnnotatedVisit(2, GURL("https://search.com/"));
+  visit2.visit_row.visit_time = base::Time::FromTimeT(100);
+  visit2.content_annotations.search_terms = u"search";
+  visit2.content_annotations.related_searches = {"relsearch1", "relsearch2"};
+  history::AnnotatedVisit visit4 =
+      testing::CreateDefaultAnnotatedVisit(4, GURL("https://github.com/2"));
+  visit4.content_annotations.model_annotations.categories = {{"category1", 85},
+                                                             {"category3", 82}};
+  visit4.content_annotations.has_url_keyed_image = true;
+  visit4.visit_row.is_known_to_sync = true;
+  cluster1.visits = {
+      testing::CreateClusterVisit(visit, /*normalized_url=*/absl::nullopt, 0.0),
+      testing::CreateClusterVisit(visit2, /*normalized_url=*/absl::nullopt,
+                                  1.0),
+      testing::CreateClusterVisit(visit4, /*normalized_url=*/absl::nullopt,
+                                  0.3)};
+
+  history::Cluster cluster2;
+  cluster2.cluster_id = 2;
+  history::AnnotatedVisit c2_visit =
+      testing::CreateDefaultAnnotatedVisit(111, GURL("https://github.com/"));
+  c2_visit.visit_row.is_known_to_sync = true;
+  c2_visit.content_annotations.has_url_keyed_image = true;
+  c2_visit.content_annotations.model_annotations.categories = {
+      {"category1", 90}, {"boosted", 84}};
+  history::AnnotatedVisit c2_visit2 =
+      testing::CreateDefaultAnnotatedVisit(222, GURL("https://search.com/"));
+  c2_visit2.visit_row.visit_time = base::Time::FromTimeT(3);
+  c2_visit2.content_annotations.search_terms = u"search";
+  c2_visit2.content_annotations.related_searches = {"relsearch1", "relsearch2"};
+  history::AnnotatedVisit c2_visit4 =
+      testing::CreateDefaultAnnotatedVisit(444, GURL("https://github.com/2"));
+  c2_visit4.content_annotations.model_annotations.categories = {
+      {"category1", 85}, {"category3", 82}};
+  c2_visit4.content_annotations.has_url_keyed_image = true;
+  c2_visit4.visit_row.is_known_to_sync = true;
+  cluster2.visits = {testing::CreateClusterVisit(
+                         c2_visit, /*normalized_url=*/absl::nullopt, 0.8),
+                     testing::CreateClusterVisit(
+                         c2_visit2, /*normalized_url=*/absl::nullopt, 1.0),
+                     testing::CreateClusterVisit(
+                         c2_visit4, /*normalized_url=*/absl::nullopt, 0.6)};
+
+  history::Cluster cluster3 = cluster2;
+  cluster3.cluster_id = 3;
+  for (auto& cluster_visit : cluster3.visits) {
+    // Increment the visits to differentiate the cluster.
+    cluster_visit.annotated_visit.visit_row.visit_id++;
+    // Change the time to be earlier.
+    cluster_visit.annotated_visit.visit_row.visit_time =
+        base::Time::FromTimeT(1);
+  }
+
+  QueryClustersFilterParams filter_params;
+  filter_params.max_clusters = 2;
+  filter_params.categories_boostlist = {"boosted", "boostedbuthidden"};
+
+  auto cluster_processor = std::make_unique<FilterClusterProcessor>(
+      ClusteringRequestSource::kNewTabPage, filter_params,
+      /*engagement_score_provider_is_valid=*/true);
+
+  std::vector<history::Cluster> clusters = {cluster1, cluster2, cluster3};
+  cluster_processor->ProcessClusters(&clusters);
+
+  // The second and third clusters should be picked since it contains a boosted
+  // category even though they were earlier than the first cluster and the
+  // visits should be sorted according to score. Tiebreaker between multiple
+  // clusters is still time.
+  EXPECT_THAT(
+      testing::ToVisitResults(clusters),
+      ElementsAre(ElementsAre(testing::VisitResult(222, 1.0, {}, u"search"),
+                              testing::VisitResult(111, 0.8),
+                              testing::VisitResult(444, 0.6)),
+                  ElementsAre(testing::VisitResult(223, 1.0, {}, u"search"),
+                              testing::VisitResult(112, 0.8),
+                              testing::VisitResult(445, 0.6))));
+}
+
 }  // namespace
 }  // namespace history_clusters
diff --git a/components/history_clusters/core/history_clusters_debug_jsons.cc b/components/history_clusters/core/history_clusters_debug_jsons.cc
index 1a26ebad..166a8e6 100644
--- a/components/history_clusters/core/history_clusters_debug_jsons.cc
+++ b/components/history_clusters/core/history_clusters_debug_jsons.cc
@@ -63,6 +63,7 @@
                       ? ComputeURLForDeduping(visit.url_row.url()).spec()
                       : visit.content_annotations.search_normalized_url.spec());
   debug_visit.Set("visitSource", base::NumberToString(visit.source));
+  debug_visit.Set("isKnownToSync", visit.visit_row.is_known_to_sync);
 
   // Content annotations.
   base::Value::List debug_categories;
diff --git a/components/history_clusters/core/history_clusters_types.h b/components/history_clusters/core/history_clusters_types.h
index b8d8ee6a..0b914ad 100644
--- a/components/history_clusters/core/history_clusters_types.h
+++ b/components/history_clusters/core/history_clusters_types.h
@@ -32,22 +32,19 @@
   QueryClustersFilterParams(const QueryClustersFilterParams&);
   ~QueryClustersFilterParams();
 
-  // The maximum number of clusters to return. If equal to 0, no max will be
-  // applied. If set to a positive value, the returned clusters will be returned
-  // based on likelihood of subsequent user engagemnent.
-  size_t max_clusters = 0;
+  // Parameters related to the minimum requirements for returned clusters.
 
   // The minimum number of visits within a cluster that have associated images.
   // Note that this also implicitly works as a visit filter such that if fewer
   // than `min_visits_with_images` are in a cluster, it will be filtered out.
   int min_visits_with_images = 0;
 
-  // The categories that a cluster must be a part of for it to be included.
+  // The category IDs that a cluster must be a part of for it to be included.
   // If both `categories_allowlist` and `categories_blocklist` are empty, the
   // returned clusters will not be filtered.
   base::flat_set<std::string> categories_allowlist;
 
-  // The categories that a cluster must not contain for it to be included.
+  // The category IDs that a cluster must not contain for it to be included.
   // If both `categories_allowlist` and `categories_blocklist` are empty, the
   // returned clusters will not be filtered.
   base::flat_set<std::string> categories_blocklist;
@@ -60,6 +57,17 @@
 
   // Whether the returned clusters will be shown on prominent UI surfaces.
   bool is_shown_on_prominent_ui_surfaces = false;
+
+  // Parameters related to ranking clusters after minimum-required filtering
+  // performed.
+
+  // The maximum number of clusters to return. If equal to 0, no max will be
+  // applied. If set to a positive value, the returned clusters will be returned
+  // based on likelihood of subsequent user engagement.
+  size_t max_clusters = 0;
+
+  // The category IDs that boost a cluster's likelihood of being included.
+  base::flat_set<std::string> categories_boostlist;
 };
 
 struct QueryClustersContinuationParams {
diff --git a/components/history_clusters/core/history_clusters_util.cc b/components/history_clusters/core/history_clusters_util.cc
index e6d97ab2b..539b9fbc 100644
--- a/components/history_clusters/core/history_clusters_util.cc
+++ b/components/history_clusters/core/history_clusters_util.cc
@@ -304,13 +304,15 @@
 void CoalesceRelatedSearches(std::vector<history::Cluster>& clusters) {
   constexpr size_t kMaxRelatedSearches = 5;
 
-  for (auto& cluster : clusters) {
+  base::ranges::for_each(clusters, [](auto& cluster) {
     for (const auto& visit : cluster.visits) {
       // Coalesce the unique related searches of this visit into the cluster
       // until the cap is reached.
       for (const auto& search_query :
            visit.annotated_visit.content_annotations.related_searches) {
         if (cluster.related_searches.size() >= kMaxRelatedSearches) {
+          // This return is safe to use because this it's within a lambda.
+          // Don't refactor it to use an outer loop. See crbug.com/1426657.
           return;
         }
 
@@ -319,7 +321,7 @@
         }
       }
     }
-  }
+  });
 }
 
 void SortClusters(std::vector<history::Cluster>* clusters) {
diff --git a/components/history_clusters/core/history_clusters_util_unittest.cc b/components/history_clusters/core/history_clusters_util_unittest.cc
index b6a698c..1ebdb3c 100644
--- a/components/history_clusters/core/history_clusters_util_unittest.cc
+++ b/components/history_clusters/core/history_clusters_util_unittest.cc
@@ -364,6 +364,32 @@
                                    "search5"));
 }
 
+// Verifies crbug.com/1426657.
+TEST(HistoryClustersUtilTest,
+     CoalesceRelatedSearchesHandlesMultipleClustersTruncation) {
+  history::ClusterVisit visit = GetHardcodedClusterVisit(1);
+  visit.annotated_visit.content_annotations.related_searches = {
+      "search1", "search2", "search3", "search4",
+      "search5", "search6", "search7"};
+
+  history::Cluster cluster;
+  cluster.visits = {visit};
+
+  // Deliberately push two instances of the same cluster into the vector.
+  std::vector<history::Cluster> clusters;
+  clusters.push_back(cluster);
+  clusters.push_back(cluster);
+
+  // Verify that we correctly coalesce searches for BOTH clusters.
+  CoalesceRelatedSearches(clusters);
+  EXPECT_THAT(clusters[0].related_searches,
+              testing::ElementsAre("search1", "search2", "search3", "search4",
+                                   "search5"));
+  EXPECT_THAT(clusters[1].related_searches,
+              testing::ElementsAre("search1", "search2", "search3", "search4",
+                                   "search5"));
+}
+
 TEST(HistoryClustersUtilTest, SortClusters) {
   std::vector<history::Cluster> clusters;
   // This first cluster is meant to validate that the higher scoring "visit 1"
diff --git a/components/history_clusters/core/on_device_clustering_backend.cc b/components/history_clusters/core/on_device_clustering_backend.cc
index b29d2537..e8727803 100644
--- a/components/history_clusters/core/on_device_clustering_backend.cc
+++ b/components/history_clusters/core/on_device_clustering_backend.cc
@@ -536,11 +536,6 @@
         std::make_unique<ContentAnnotationsClusterProcessor>(
             &entity_id_to_entity_metadata_map));
   }
-  cluster_processors.push_back(std::make_unique<FilterClusterProcessor>(
-      clustering_request_source, filter_params,
-      engagement_score_provider_is_valid));
-  // TODO(b/265301309): Figure out if we should dedupe in the clustering
-  // processing step instead so that the filter is applied correctly.
 
   // The cluster finalizers to run that affect the appearance of a cluster on a
   // UI surface.
@@ -564,16 +559,12 @@
     }
   }
 
-  if (filter_params.max_clusters > 0) {
-    // TODO(b/265301665): Do something better than reverse-chron by
-    // highest-scoring visit.
-    SortClusters(&clusters);
-
-    if (filter_params.max_clusters < clusters.size()) {
-      // Cull clusters if more than max size.
-      clusters.resize(filter_params.max_clusters);
-    }
-  }
+  // Apply any filtering after we've decided how to score clusters.
+  std::unique_ptr<FilterClusterProcessor> filterer =
+      std::make_unique<FilterClusterProcessor>(
+          clustering_request_source, filter_params,
+          engagement_score_provider_is_valid);
+  filterer->ProcessClusters(&clusters);
 
   return calculate_triggerability
              ? GetClusterTriggerabilityOnBackgroundThread(
diff --git a/components/image_fetcher/android/junit/src/org/chromium/components/image_fetcher/CachedImageFetcherTest.java b/components/image_fetcher/android/junit/src/org/chromium/components/image_fetcher/CachedImageFetcherTest.java
index 591743d..654d5fd 100644
--- a/components/image_fetcher/android/junit/src/org/chromium/components/image_fetcher/CachedImageFetcherTest.java
+++ b/components/image_fetcher/android/junit/src/org/chromium/components/image_fetcher/CachedImageFetcherTest.java
@@ -66,7 +66,7 @@
     public void setUp() {
         ShadowPostTask.setTestImpl(new ShadowPostTask.TestImpl() {
             @Override
-            public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
+            public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
                 task.run();
             }
         });
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageAnimationCoordinatorUnitTest.java b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageAnimationCoordinatorUnitTest.java
index 9961741..4335af9 100644
--- a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageAnimationCoordinatorUnitTest.java
+++ b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageAnimationCoordinatorUnitTest.java
@@ -235,12 +235,13 @@
                         .expectIntRecord("Android.Messages.Stacking",
                                 MessagesMetrics.StackingAnimationType.SHOW_ALL)
                         .expectIntRecord("Android.Messages.Stacking.InsertAtFront", 1)
-                        .expectIntRecord("Android.Messages.Stacking.InsertAtBack", 2)
+                        .expectIntRecord("Android.Messages.Stacking.InsertAtBack",
+                                MessageIdentifier.COUNT - 1)
                         .build();
         MessageState m1 = buildMessageState();
         setMessageIdentifier(m1, 1);
         MessageState m2 = buildMessageState();
-        setMessageIdentifier(m2, 2);
+        setMessageIdentifier(m2, MessageIdentifier.COUNT - 1);
         mAnimationCoordinator.updateWithStacking(Arrays.asList(m1, m2), false, () -> {});
 
         verify(m1.handler).show(Position.INVISIBLE, Position.FRONT);
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessagesMetrics.java b/components/messages/android/java/src/org/chromium/components/messages/MessagesMetrics.java
index 283954d..23aabf6 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessagesMetrics.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessagesMetrics.java
@@ -123,7 +123,7 @@
             @StackingAnimationAction int action, @MessageIdentifier int messageIdentifier) {
         String suffix = stackingAnimationActionToHistogramSuffix(action);
         RecordHistogram.recordEnumeratedHistogram(STACKING_ACTION_HISTOGRAM_PREFIX + suffix,
-                messageIdentifier, StackingAnimationType.MAX_VALUE);
+                messageIdentifier, MessageIdentifier.COUNT);
     }
 
     static void recordThreeStackedScenario(@ThreeStackedScenario int scenario) {
diff --git a/components/messages/android/mock_message_dispatcher_bridge.h b/components/messages/android/mock_message_dispatcher_bridge.h
index 9cd50d2..dce8d12 100644
--- a/components/messages/android/mock_message_dispatcher_bridge.h
+++ b/components/messages/android/mock_message_dispatcher_bridge.h
@@ -27,6 +27,10 @@
               (MessageWrapper * message,
                DismissReason dismiss_reason),
               (override));
+  MOCK_METHOD(bool,
+              EnqueueWindowScopedMessage,
+              (MessageWrapper*, ui::WindowAndroid*, MessagePriority),
+              (override));
   int MapToJavaDrawableId(int resource_id) override;
   void SetMessagesEnabledForEmbedder(bool messages_enabled_for_embedder);
 };
diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc
index dc5e4111..d44d3dd 100644
--- a/components/metrics/file_metrics_provider.cc
+++ b/components/metrics/file_metrics_provider.cc
@@ -607,7 +607,8 @@
 // static
 void FileMetricsProvider::RecordHistogramSnapshotsFromSource(
     base::HistogramSnapshotManager* snapshot_manager,
-    SourceInfo* source) {
+    SourceInfo* source,
+    base::HistogramBase::Flags required_flags) {
   DCHECK_NE(SOURCE_HISTOGRAMS_ACTIVE_FILE, source->type);
 
   base::PersistentHistogramAllocator::Iterator histogram_iter(
@@ -618,8 +619,10 @@
     std::unique_ptr<base::HistogramBase> histogram = histogram_iter.GetNext();
     if (!histogram)
       break;
-    snapshot_manager->PrepareFinalDelta(histogram.get());
-    ++histogram_count;
+    if (histogram->HasFlags(required_flags)) {
+      snapshot_manager->PrepareFinalDelta(histogram.get());
+      ++histogram_count;
+    }
   }
 
   source->read_complete = true;
@@ -689,7 +692,9 @@
     // contention, and a low amount of extra memory that will never be released.
     source->allocator->SetRangesManager(new base::RangesManager());
     system_profile_proto->mutable_stability()->set_from_previous_run(true);
-    RecordHistogramSnapshotsFromSource(snapshot_manager, source);
+    RecordHistogramSnapshotsFromSource(
+        snapshot_manager, source,
+        /*required_flags=*/base::HistogramBase::kUmaTargetedHistogramFlag);
     return true;
   }
 
@@ -935,8 +940,11 @@
     DCHECK(!source->read_complete);
     DCHECK(source->allocator);
 
-    // Dump all histograms contained within the source to the snapshot-manager.
-    RecordHistogramSnapshotsFromSource(snapshot_manager, source.get());
+    // Dump all stability histograms contained within the source to the
+    // snapshot-manager.
+    RecordHistogramSnapshotsFromSource(
+        snapshot_manager, source.get(),
+        /*required_flags=*/base::HistogramBase::kUmaStabilityHistogramFlag);
 
     // Update the last-seen time so it isn't read again unless it changes.
     RecordSourceAsRead(source.get());
diff --git a/components/metrics/file_metrics_provider.h b/components/metrics/file_metrics_provider.h
index 5d7a6b96..6c363e9c 100644
--- a/components/metrics/file_metrics_provider.h
+++ b/components/metrics/file_metrics_provider.h
@@ -283,10 +283,12 @@
   // Returns the number of histograms merged.
   static size_t MergeHistogramDeltasFromSource(SourceInfo* source);
 
-  // Records all histograms from a given source via a snapshot-manager.
+  // Records all histograms from a given source via a snapshot-manager. Only the
+  // histograms that have |required_flags| will be recorded.
   static void RecordHistogramSnapshotsFromSource(
       base::HistogramSnapshotManager* snapshot_manager,
-      SourceInfo* source);
+      SourceInfo* source,
+      base::HistogramBase::Flags required_flags);
 
   // Calls source filter (if any) and returns the desired action.
   static AccessResult HandleFilterSource(SourceInfo* source,
diff --git a/components/metrics/file_metrics_provider_unittest.cc b/components/metrics/file_metrics_provider_unittest.cc
index f8e5236..f63ba50 100644
--- a/components/metrics/file_metrics_provider_unittest.cc
+++ b/components/metrics/file_metrics_provider_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram.h"
+#include "base/metrics/histogram_base.h"
 #include "base/metrics/histogram_flattener.h"
 #include "base/metrics/histogram_snapshot_manager.h"
 #include "base/metrics/persistent_histogram_allocator.h"
@@ -30,6 +31,7 @@
 #include "components/metrics/persistent_system_profile.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
 #include "third_party/metrics_proto/system_profile.pb.h"
@@ -39,13 +41,27 @@
 const char kMergedCountHistogramName[] =
     "UMA.FileMetricsProvider.TestMetrics.MergedHistogramsCount";
 const char kMetricsFilename[] = "file.metrics";
+
+void WriteSystemProfileToAllocator(
+    base::PersistentHistogramAllocator* allocator) {
+  metrics::SystemProfileProto profile_proto;
+  // Add a field trial to verify that FileMetricsProvider will produce an
+  // independent log with the written system profile.
+  metrics::SystemProfileProto::FieldTrial* trial =
+      profile_proto.add_field_trial();
+  trial->set_name_id(123);
+  trial->set_group_id(456);
+  metrics::PersistentSystemProfile persistent_profile;
+  persistent_profile.RegisterPersistentAllocator(allocator->memory_allocator());
+  persistent_profile.SetSystemProfile(profile_proto, /*complete=*/true);
+}
 }  // namespace
 
 namespace metrics {
 
 class HistogramFlattenerDeltaRecorder : public base::HistogramFlattener {
  public:
-  HistogramFlattenerDeltaRecorder() {}
+  HistogramFlattenerDeltaRecorder() = default;
 
   HistogramFlattenerDeltaRecorder(const HistogramFlattenerDeltaRecorder&) =
       delete;
@@ -178,12 +194,17 @@
   void CreateGlobalHistograms(int histogram_count) {
     DCHECK_GT(kMaxCreateHistograms, histogram_count);
 
-    // Create both sparse and normal histograms in the allocator.
-    created_histograms_[0] = base::SparseHistogram::FactoryGet("h0", 0);
+    // Create both sparse and normal histograms in the allocator. Make them
+    // stability histograms to ensure that the histograms are snapshotted (in
+    // the case of stability logs) or are put into independent logs. Histogram
+    // names must be 2 characters (see HistogramFlattenerDeltaRecorder).
+    created_histograms_[0] = base::SparseHistogram::FactoryGet(
+        "h0", /*flags=*/base::HistogramBase::Flags::kUmaStabilityHistogramFlag);
     created_histograms_[0]->Add(0);
     for (int i = 1; i < histogram_count; ++i) {
       created_histograms_[i] = base::Histogram::FactoryGet(
-          base::StringPrintf("h%d", i), 1, 100, 10, 0);
+          base::StringPrintf("h%d", i), 1, 100, 10,
+          /*flags=*/base::HistogramBase::Flags::kUmaStabilityHistogramFlag);
       created_histograms_[i]->Add(i);
     }
   }
@@ -453,7 +474,7 @@
                          allocator, base_time);
   WriteMetricsFileAtTime(metrics_files.GetPath().AppendASCII("_bar.pma"),
                          allocator, base_time);
-
+  // Histogram names must be 2 characters (see HistogramFlattenerDeltaRecorder).
   histogram = base::Histogram::FactoryGet("h1", 1, 100, 10, 0);
   histogram->Add(1);
   WriteMetricsFileAtTime(metrics_files.GetPath().AppendASCII("a1.pma"),
@@ -532,17 +553,7 @@
   CreateMetricsFileWithHistograms(
       metrics_files.GetPath().AppendASCII("h2.pma"),
       base_time + base::Minutes(2), 2,
-      base::BindOnce([](base::PersistentHistogramAllocator* allocator) {
-        SystemProfileProto profile_proto;
-        SystemProfileProto::FieldTrial* trial = profile_proto.add_field_trial();
-        trial->set_name_id(123);
-        trial->set_group_id(456);
-
-        PersistentSystemProfile persistent_profile;
-        persistent_profile.RegisterPersistentAllocator(
-            allocator->memory_allocator());
-        persistent_profile.SetSystemProfile(profile_proto, true);
-      }));
+      base::BindOnce(&WriteSystemProfileToAllocator));
 
   CreateMetricsFileWithHistograms(
       metrics_files.GetPath().AppendASCII("h3.pma"),
@@ -602,7 +613,8 @@
       base::GlobalHistogramAllocator::Get();
   base::HistogramBase* histogram;
 
-  // Create one old file and one new file.
+  // Create one old file and one new file. Histogram names must be 2 characters
+  // (see HistogramFlattenerDeltaRecorder).
   base::ScopedTempDir metrics_files;
   EXPECT_TRUE(metrics_files.CreateUniqueTempDir());
   histogram = base::Histogram::FactoryGet("h1", 1, 100, 10, 0);
@@ -649,7 +661,8 @@
       base::GlobalHistogramAllocator::Get();
   base::HistogramBase* histogram;
 
-  // Create one old file and one new file.
+  // Create one old file and one new file. Histogram names must be 2 characters
+  // (see HistogramFlattenerDeltaRecorder).
   base::ScopedTempDir metrics_files;
   EXPECT_TRUE(metrics_files.CreateUniqueTempDir());
   histogram = base::Histogram::FactoryGet("h1", 1, 100, 10, 0);
@@ -701,7 +714,8 @@
       base::GlobalHistogramAllocator::Get();
   base::HistogramBase* histogram;
 
-  // Create one old file and one new file.
+  // Create one old file and one new file. Histogram names must be 2 characters
+  // (see HistogramFlattenerDeltaRecorder).
   base::ScopedTempDir metrics_files;
   EXPECT_TRUE(metrics_files.CreateUniqueTempDir());
   histogram = base::Histogram::FactoryGet("h1", 1, 100, 10, 0);
@@ -755,7 +769,7 @@
   // ensure that each file has a later timestamp on disk than the previous one.
   base::ScopedTempDir metrics_files;
   EXPECT_TRUE(metrics_files.CreateUniqueTempDir());
-
+  // Histogram names must be 2 characters (see HistogramFlattenerDeltaRecorder).
   histogram = base::Histogram::FactoryGet("h1", 1, 100, 10, 0);
   histogram->Add(1);
   WriteMetricsFileAtTime(metrics_files.GetPath().AppendASCII("a1.pma"),
@@ -925,17 +939,7 @@
   ASSERT_FALSE(PathExists(metrics_file()));
   CreateMetricsFileWithHistograms(
       metrics_file(), base::Time::Now(), 2,
-      base::BindOnce([](base::PersistentHistogramAllocator* allocator) {
-        SystemProfileProto profile_proto;
-        SystemProfileProto::FieldTrial* trial = profile_proto.add_field_trial();
-        trial->set_name_id(123);
-        trial->set_group_id(456);
-
-        PersistentSystemProfile persistent_profile;
-        persistent_profile.RegisterPersistentAllocator(
-            allocator->memory_allocator());
-        persistent_profile.SetSystemProfile(profile_proto, true);
-      }));
+      base::BindOnce(&WriteSystemProfileToAllocator));
 
   // Register the file and allow the "checker" task to run.
   ASSERT_TRUE(PathExists(metrics_file()));
@@ -952,10 +956,15 @@
     RecordInitialHistogramSnapshots(&snapshot_manager);
     EXPECT_EQ(0U, flattener.GetRecordedDeltaHistogramNames().size());
 
-    // A read of metrics with internal profiles should return one result.
+    // A read of metrics with internal profiles should return one result, and
+    // the independent log generated should have the embedded system profile.
     ChromeUserMetricsExtension uma_proto;
     EXPECT_TRUE(HasIndependentMetrics());
     EXPECT_TRUE(ProvideIndependentMetrics(&uma_proto, &snapshot_manager));
+    ASSERT_TRUE(uma_proto.has_system_profile());
+    ASSERT_EQ(1, uma_proto.system_profile().field_trial_size());
+    EXPECT_EQ(123U, uma_proto.system_profile().field_trial(0).name_id());
+    EXPECT_EQ(456U, uma_proto.system_profile().field_trial(0).group_id());
     EXPECT_FALSE(HasIndependentMetrics());
     EXPECT_FALSE(ProvideIndependentMetrics(&uma_proto, &snapshot_manager));
   }
@@ -998,17 +1007,7 @@
   ASSERT_FALSE(PathExists(metrics_file()));
   CreateMetricsFileWithHistograms(
       metrics_file(), base::Time::Now(), 2,
-      base::BindOnce([](base::PersistentHistogramAllocator* allocator) {
-        SystemProfileProto profile_proto;
-        SystemProfileProto::FieldTrial* trial = profile_proto.add_field_trial();
-        trial->set_name_id(123);
-        trial->set_group_id(456);
-
-        PersistentSystemProfile persistent_profile;
-        persistent_profile.RegisterPersistentAllocator(
-            allocator->memory_allocator());
-        persistent_profile.SetSystemProfile(profile_proto, true);
-      }));
+      base::BindOnce(&WriteSystemProfileToAllocator));
 
   // Register the file and allow the "checker" task to run.
   ASSERT_TRUE(PathExists(metrics_file()));
@@ -1044,18 +1043,7 @@
   for (int i = 0; i < file_count; ++i) {
     CreateMetricsFileWithHistograms(
         metrics_file(), base::Time::Now(), 2,
-        base::BindOnce([](base::PersistentHistogramAllocator* allocator) {
-          SystemProfileProto profile_proto;
-          SystemProfileProto::FieldTrial* trial =
-              profile_proto.add_field_trial();
-          trial->set_name_id(123);
-          trial->set_group_id(456);
-
-          PersistentSystemProfile persistent_profile;
-          persistent_profile.RegisterPersistentAllocator(
-              allocator->memory_allocator());
-          persistent_profile.SetSystemProfile(profile_proto, true);
-        }));
+        base::BindOnce(&WriteSystemProfileToAllocator));
     ASSERT_TRUE(PathExists(metrics_file()));
     char new_name[] = "hX";
     new_name[1] = '1' + i;
@@ -1093,4 +1081,106 @@
     EXPECT_FALSE(base::PathExists(file_name));
 }
 
+TEST_P(FileMetricsProviderTest,
+       RecordInitialHistogramSnapshotsStabilityHistograms) {
+  // Create a metrics file with 2 non-stability histograms and 2 stability
+  // histograms. Histogram names must be 2 characters (see
+  // HistogramFlattenerDeltaRecorder).
+  ASSERT_FALSE(PathExists(metrics_file()));
+  base::GlobalHistogramAllocator::CreateWithLocalMemory(
+      create_large_files_ ? kLargeFileSize : kSmallFileSize, 0, kMetricsName);
+  base::HistogramBase* h0 = base::SparseHistogram::FactoryGet(
+      "h0", /*flags=*/base::HistogramBase::Flags::kUmaStabilityHistogramFlag);
+  h0->Add(0);
+  base::HistogramBase* h1 = base::SparseHistogram::FactoryGet(
+      "h1", /*flags=*/base::HistogramBase::Flags::kUmaTargetedHistogramFlag);
+  h1->Add(0);
+  base::HistogramBase* h2 = base::Histogram::FactoryGet(
+      "h2", 1, 100, 10,
+      /*flags=*/base::HistogramBase::Flags::kUmaStabilityHistogramFlag);
+  h2->Add(0);
+  base::HistogramBase* h3 = base::Histogram::FactoryGet(
+      "h3", 1, 100, 10,
+      /*flags=*/base::HistogramBase::Flags::kUmaTargetedHistogramFlag);
+  h3->Add(0);
+  std::unique_ptr<base::PersistentHistogramAllocator> histogram_allocator =
+      base::GlobalHistogramAllocator::ReleaseForTesting();
+  WriteMetricsFileAtTime(metrics_file(), histogram_allocator.get(),
+                         base::Time::Now());
+  ASSERT_TRUE(PathExists(metrics_file()));
+
+  // Register the file and allow the "checker" task to run.
+  provider()->RegisterSource(FileMetricsProvider::Params(
+      metrics_file(), FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE,
+      FileMetricsProvider::ASSOCIATE_PREVIOUS_RUN, kMetricsName));
+  ASSERT_TRUE(HasPreviousSessionData());
+  RunTasks();
+
+  // Record embedded snapshots via snapshot-manager.
+  HistogramFlattenerDeltaRecorder flattener;
+  base::HistogramSnapshotManager snapshot_manager(&flattener);
+  RecordInitialHistogramSnapshots(&snapshot_manager);
+
+  // Verify that only the stability histograms were snapshotted.
+  EXPECT_THAT(flattener.GetRecordedDeltaHistogramNames(),
+              testing::ElementsAre("h0", "h2"));
+
+  // The metrics file should eventually be deleted.
+  EXPECT_TRUE(base::PathExists(metrics_file()));
+  OnDidCreateMetricsLog();
+  RunTasks();
+  EXPECT_FALSE(base::PathExists(metrics_file()));
+}
+
+TEST_P(FileMetricsProviderTest, IndependentLogContainsUmaHistograms) {
+  ASSERT_FALSE(PathExists(metrics_file()));
+  // Create a metrics file with 2 UMA histograms and 2 non-UMA histograms.
+  // Histogram names must be 2 characters (see HistogramFlattenerDeltaRecorder).
+  base::GlobalHistogramAllocator::CreateWithLocalMemory(
+      create_large_files_ ? kLargeFileSize : kSmallFileSize, 0, kMetricsName);
+  base::HistogramBase* h0 = base::SparseHistogram::FactoryGet(
+      "h0", /*flags=*/base::HistogramBase::Flags::kUmaTargetedHistogramFlag);
+  h0->Add(0);
+  base::HistogramBase* h1 = base::SparseHistogram::FactoryGet(
+      "h1", /*flags=*/base::HistogramBase::Flags::kNoFlags);
+  h1->Add(0);
+  base::HistogramBase* h2 = base::Histogram::FactoryGet(
+      "h2", 1, 100, 10,
+      /*flags=*/base::HistogramBase::Flags::kUmaStabilityHistogramFlag);
+  h2->Add(0);
+  base::HistogramBase* h3 = base::Histogram::FactoryGet(
+      "h3", 1, 100, 10,
+      /*flags=*/base::HistogramBase::Flags::kNoFlags);
+  h3->Add(0);
+  std::unique_ptr<base::PersistentHistogramAllocator> histogram_allocator =
+      base::GlobalHistogramAllocator::ReleaseForTesting();
+  // Write a system profile so that an independent log can successfully be
+  // created from the metrics file.
+  WriteSystemProfileToAllocator(histogram_allocator.get());
+  WriteMetricsFileAtTime(metrics_file(), histogram_allocator.get(),
+                         base::Time::Now());
+  ASSERT_TRUE(PathExists(metrics_file()));
+
+  // Register the file and allow the "checker" task to run.
+  provider()->RegisterSource(FileMetricsProvider::Params(
+      metrics_file(), FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE,
+      FileMetricsProvider::ASSOCIATE_INTERNAL_PROFILE, kMetricsName));
+  OnDidCreateMetricsLog();
+  RunTasks();
+
+  // Verify that the independent log provided only contains UMA histograms (both
+  // stability and non-stability).
+  ChromeUserMetricsExtension uma_proto;
+  HistogramFlattenerDeltaRecorder flattener;
+  base::HistogramSnapshotManager snapshot_manager(&flattener);
+  EXPECT_TRUE(HasIndependentMetrics());
+  EXPECT_TRUE(ProvideIndependentMetrics(&uma_proto, &snapshot_manager));
+  EXPECT_THAT(flattener.GetRecordedDeltaHistogramNames(),
+              testing::ElementsAre("h0", "h2"));
+
+  // The metrics file should eventually be deleted.
+  RunTasks();
+  EXPECT_FALSE(base::PathExists(metrics_file()));
+}
+
 }  // namespace metrics
diff --git a/components/metrics/metrics_service.h b/components/metrics/metrics_service.h
index e40b4957f..07aa3fd0 100644
--- a/components/metrics/metrics_service.h
+++ b/components/metrics/metrics_service.h
@@ -340,6 +340,12 @@
 
   // Writes snapshots of histograms owned by the StatisticsRecorder to a log.
   // Does not take ownership of the log.
+  // TODO(crbug/1423653): Although this class takes in |required_flags| in its
+  // constructor to filter the StatisticsRecorder histograms being put into
+  // the log, the |histogram_snapshot_manager_| is not aware of this. So if
+  // the |histogram_snapshot_manager_| is passed to some other caller, this
+  // caller will need to manually filter the histograms. Re-factor the code so
+  // that this is not needed.
   class MetricsLogHistogramWriter {
    public:
     explicit MetricsLogHistogramWriter(MetricsLog* log);
@@ -375,7 +381,8 @@
 
    private:
     // Used to select which histograms to record when calling
-    // SnapshotStatisticsRecorderHistograms().
+    // SnapshotStatisticsRecorderHistograms() or
+    // SnapshotStatisticsRecorderUnloggedSamples().
     const base::HistogramBase::Flags required_flags_;
 
     // Used to write histograms to the log passed in the constructor.
diff --git a/components/metrics/metrics_service_unittest.cc b/components/metrics/metrics_service_unittest.cc
index 48fc214..43aafd5 100644
--- a/components/metrics/metrics_service_unittest.cc
+++ b/components/metrics/metrics_service_unittest.cc
@@ -290,7 +290,7 @@
       const base::HistogramBase* histogram = FindHistogram(histograms, hash);
       EXPECT_TRUE(histogram) << hash;
 
-      EXPECT_EQ(kStabilityFlags, histogram->flags() & kStabilityFlags) << hash;
+      EXPECT_TRUE(histogram->HasFlags(kStabilityFlags)) << hash;
     }
   }
 
diff --git a/components/offline_pages/core/background/request_coordinator.cc b/components/offline_pages/core/background/request_coordinator.cc
index 6c764be7..ee2263d 100644
--- a/components/offline_pages/core/background/request_coordinator.cc
+++ b/components/offline_pages/core/background/request_coordinator.cc
@@ -76,18 +76,6 @@
   }
 }
 
-// Records final request status UMA for an offlining request. This should only
-// be called once per Offliner::LoadAndSave request. Every Offliner::LoadAndSave
-// request should also call this once.
-void RecordSavePageResultUMA(
-    const ClientId& client_id,
-    RequestNotifier::BackgroundSavePageResult request_status) {
-  base::UmaHistogramEnumeration(
-      AddHistogramSuffix(client_id,
-                         "OfflinePages.Background.FinalSavePageResult"),
-      request_status);
-}
-
 // Records whether the request comes from CCT or not
 void RecordSavePageResultCCTUMA(const ClientId& client_id,
                                 const std::string& origin) {
@@ -154,23 +142,6 @@
   histogram->Add(effective_connection);
 }
 
-// Record the network quality at request creation time per namespace.
-void RecordNetworkQualityAtRequestStartForFailedRequest(
-    const ClientId& client_id,
-    const net::EffectiveConnectionType effective_connection) {
-  // The histogram below is an expansion of the UMA_HISTOGRAM_ENUMERATION
-  // macro adapted to allow for a dynamically suffixed histogram name.
-  // Note: The factory creates and owns the histogram.
-  base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
-      AddHistogramSuffix(
-          client_id,
-          "OfflinePages.Background.EffectiveConnectionType.OffliningStartType"),
-      1, net::EFFECTIVE_CONNECTION_TYPE_LAST - 1,
-      net::EFFECTIVE_CONNECTION_TYPE_LAST,
-      base::HistogramBase::kUmaTargetedHistogramFlag);
-  histogram->Add(effective_connection);
-}
-
 // Returns whether |result| is a successful result for a single request.
 bool IsSingleSuccessResult(const UpdateRequestsResult& result) {
   return result.store_state == StoreState::LOADED &&
@@ -657,9 +628,6 @@
   UpdateCurrentConditionsFromAndroid();
   OfflinerImmediateStartStatus immediate_start_status =
       TryImmediateStart(callback);
-  UMA_HISTOGRAM_ENUMERATION(
-      "OfflinePages.Background.ImmediateStartStatus", immediate_start_status,
-      RequestCoordinator::OfflinerImmediateStartStatus::STATUS_COUNT);
   return immediate_start_status == OfflinerImmediateStartStatus::STARTED;
 }
 
@@ -883,36 +851,22 @@
   if (processing_state_ == ProcessingWindowState::SCHEDULED_WINDOW) {
     if (is_low_end_device_) {
       UMA_HISTOGRAM_COUNTS_1000(
-          "OfflinePages.Background.ScheduledStart.AvailableRequestCount."
-          "Svelte",
-          available_requests);
-      UMA_HISTOGRAM_COUNTS_1000(
           "OfflinePages.Background.ScheduledStart.UnavailableRequestCount."
           "Svelte",
           total_requests - available_requests);
     } else {
       UMA_HISTOGRAM_COUNTS_1000(
-          "OfflinePages.Background.ScheduledStart.AvailableRequestCount",
-          available_requests);
-      UMA_HISTOGRAM_COUNTS_1000(
           "OfflinePages.Background.ScheduledStart.UnavailableRequestCount",
           total_requests - available_requests);
     }
   } else if (processing_state_ == ProcessingWindowState::IMMEDIATE_WINDOW) {
     if (is_low_end_device_) {
       UMA_HISTOGRAM_COUNTS_1000(
-          "OfflinePages.Background.ImmediateStart.AvailableRequestCount."
-          "Svelte",
-          available_requests);
-      UMA_HISTOGRAM_COUNTS_1000(
           "OfflinePages.Background.ImmediateStart.UnavailableRequestCount."
           "Svelte",
           total_requests - available_requests);
     } else {
       UMA_HISTOGRAM_COUNTS_1000(
-          "OfflinePages.Background.ImmediateStart.AvailableRequestCount",
-          available_requests);
-      UMA_HISTOGRAM_COUNTS_1000(
           "OfflinePages.Background.ImmediateStart.UnavailableRequestCount",
           total_requests - available_requests);
     }
@@ -1016,15 +970,6 @@
   absl::optional<RequestNotifier::BackgroundSavePageResult> attempt_result =
       SingleAttemptResult(status);
 
-  // If the request failed, report the connection type as of the start of the
-  // request.
-  if (!attempt_result ||
-      attempt_result.value() !=
-          RequestNotifier::BackgroundSavePageResult::SUCCESS) {
-    RecordNetworkQualityAtRequestStartForFailedRequest(
-        request.client_id(), network_quality_at_request_start_);
-  }
-
   if (IsCanceledOrInternalFailure(status)) {
     UpdateRequestForAbortedAttempt(request);
   } else if (attempt_result) {
@@ -1169,7 +1114,6 @@
 void RequestCoordinator::NotifyCompleted(
     const SavePageRequest& request,
     RequestNotifier::BackgroundSavePageResult status) {
-  RecordSavePageResultUMA(request.client_id(), status);
   RecordSavePageResultCCTUMA(request.client_id(), request.request_origin());
   for (Observer& observer : observers_)
     observer.OnCompleted(request, status);
diff --git a/components/offline_pages/core/background/request_coordinator_unittest.cc b/components/offline_pages/core/background/request_coordinator_unittest.cc
index 964de1cc..4ac311a1 100644
--- a/components/offline_pages/core/background/request_coordinator_unittest.cc
+++ b/components/offline_pages/core/background/request_coordinator_unittest.cc
@@ -540,16 +540,6 @@
   PumpLoop();
 
   EXPECT_TRUE(processing_callback_called());
-
-  // Verify queue depth UMA for starting scheduled processing on empty queue.
-  if (base::SysInfo::IsLowEndDevice()) {
-    histograms().ExpectBucketCount(
-        "OfflinePages.Background.ScheduledStart.AvailableRequestCount.Svelte",
-        0, 1);
-  } else {
-    histograms().ExpectBucketCount(
-        "OfflinePages.Background.ScheduledStart.AvailableRequestCount", 0, 1);
-  }
 }
 
 TEST_F(RequestCoordinatorTest, NetworkProgressCallback) {
@@ -586,9 +576,6 @@
   PumpLoop();
 
   EXPECT_TRUE(processing_callback_called());
-
-  histograms().ExpectBucketCount("OfflinePages.Background.ImmediateStartStatus",
-                                 0 /* STARTED */, 1);
 }
 
 TEST_F(RequestCoordinatorTest, StartImmediateProcessingOnSvelte) {
@@ -596,8 +583,6 @@
   SetIsLowEndDeviceForTest(true);
 
   EXPECT_FALSE(coordinator()->StartImmediateProcessing(processing_callback()));
-  histograms().ExpectBucketCount("OfflinePages.Background.ImmediateStartStatus",
-                                 5 /* NOT_STARTED_ON_SVELTE */, 1);
 }
 
 TEST_F(RequestCoordinatorTest, StartImmediateProcessingWhenDisconnected) {
@@ -606,8 +591,6 @@
       net::NetworkChangeNotifier::CONNECTION_NONE);
   SetDeviceConditionsForTest(disconnected_conditions);
   EXPECT_FALSE(coordinator()->StartImmediateProcessing(processing_callback()));
-  histograms().ExpectBucketCount("OfflinePages.Background.ImmediateStartStatus",
-                                 3 /* NO_CONNECTION */, 1);
 }
 
 TEST_F(RequestCoordinatorTest, StartImmediateProcessingWithRequestInProgress) {
@@ -627,9 +610,6 @@
 
   // Now trying to start processing should return false since already busy.
   EXPECT_FALSE(coordinator()->StartImmediateProcessing(processing_callback()));
-
-  histograms().ExpectBucketCount("OfflinePages.Background.ImmediateStartStatus",
-                                 1 /* BUSY */, 1);
 }
 
 TEST_F(RequestCoordinatorTest, SavePageLater) {
@@ -680,10 +660,6 @@
 
   // Check that the observer got the notification that a page is available
   EXPECT_TRUE(observer().added_called());
-
-  // Verify queue depth UMA for starting immediate processing.
-  histograms().ExpectBucketCount(
-      "OfflinePages.Background.ImmediateStart.AvailableRequestCount", 1, 1);
 }
 
 TEST_F(RequestCoordinatorTest, SavePageLaterFailed) {
@@ -756,9 +732,6 @@
   // Check that the observer got the notification that we succeeded, and that
   // the request got removed from the queue.
   EXPECT_TRUE(observer().completed_called());
-  histograms().ExpectBucketCount(
-      "OfflinePages.Background.FinalSavePageResult.bookmark", 0 /* SUCCESS */,
-      1);
   EXPECT_EQ(RequestCoordinator::BackgroundSavePageResult::SUCCESS,
             observer().last_status());
 }
@@ -830,9 +803,6 @@
   // subsequent notification that the request was removed) since we exceeded
   // retry count.
   EXPECT_TRUE(observer().completed_called());
-  histograms().ExpectBucketCount(
-      "OfflinePages.Background.FinalSavePageResult.bookmark",
-      6 /* RETRY_COUNT_EXCEEDED */, 1);
   EXPECT_EQ(RequestCoordinator::BackgroundSavePageResult::RETRY_COUNT_EXCEEDED,
             observer().last_status());
 }
@@ -873,12 +843,6 @@
   EXPECT_TRUE(observer().completed_called());
   EXPECT_EQ(RequestCoordinator::BackgroundSavePageResult::LOADING_FAILURE,
             observer().last_status());
-  // We should have a histogram entry for the effective network conditions
-  // when this failed request began.
-  histograms().ExpectBucketCount(
-      "OfflinePages.Background.EffectiveConnectionType.OffliningStartType."
-      "bookmark",
-      net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 1);
 }
 
 TEST_F(RequestCoordinatorTest, OfflinerDoneRequestFailedNoNextFailure) {
diff --git a/components/offline_pages/core/model/startup_maintenance_task.cc b/components/offline_pages/core/model/startup_maintenance_task.cc
index 15a0e20..4957d2a4 100644
--- a/components/offline_pages/core/model/startup_maintenance_task.cc
+++ b/components/offline_pages/core/model/startup_maintenance_task.cc
@@ -137,14 +137,6 @@
   if (!DeleteFiles(files_to_delete))
     return SyncOperationResult::FILE_OPERATION_ERROR;
 
-  size_t headless_file_count =
-      files_to_delete.size() - offline_ids_to_delete.size();
-  if (headless_file_count > 0) {
-    UMA_HISTOGRAM_COUNTS_1M(
-        "OfflinePages.ConsistencyCheck.Legacy.DeletedHeadlessFileCount",
-        headless_file_count);
-  }
-
   return SyncOperationResult::SUCCESS;
 }
 
@@ -182,9 +174,6 @@
     // committed.
     if (!DeletePageTask::DeletePagesFromDbSync(offline_ids_to_delete, db))
       return SyncOperationResult::DB_OPERATION_ERROR;
-    UMA_HISTOGRAM_COUNTS_1M(
-        "OfflinePages.ConsistencyCheck.Temporary.PagesMissingArchiveFileCount",
-        base::saturated_cast<int32_t>(offline_ids_to_delete.size()));
   }
 
   if (!transaction.Commit())
@@ -202,9 +191,6 @@
   if (files_to_delete.size() > 0) {
     if (!DeleteFiles(files_to_delete))
       return SyncOperationResult::FILE_OPERATION_ERROR;
-    UMA_HISTOGRAM_COUNTS_1M(
-        "OfflinePages.ConsistencyCheck.Temporary.PagesMissingDbEntryCount",
-        static_cast<int32_t>(files_to_delete.size()));
   }
 
   return SyncOperationResult::SUCCESS;
@@ -217,13 +203,6 @@
   for (const auto& name_space : GetAllPolicyNamespaces()) {
     sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
     statement.BindString(0, name_space);
-    int size_in_kib = 0;
-    while (statement.Step()) {
-      size_in_kib = base::saturated_cast<int>(statement.ColumnInt64(0) / 1024);
-    }
-    base::UmaHistogramCustomCounts(
-        "OfflinePages.ClearStoragePreRunUsage2." + name_space, size_in_kib, 1,
-        10000000, 50);
   }
 }
 
diff --git a/components/offline_pages/core/model/startup_maintenance_task_unittest.cc b/components/offline_pages/core/model/startup_maintenance_task_unittest.cc
index 7839f943..e5548bd 100644
--- a/components/offline_pages/core/model/startup_maintenance_task_unittest.cc
+++ b/components/offline_pages/core/model/startup_maintenance_task_unittest.cc
@@ -108,8 +108,6 @@
   EXPECT_EQ(PagePresence::BOTH_DB_AND_FILESYSTEM,
             CheckPagePresence(persistent_page1));
   EXPECT_EQ(PagePresence::NONE, CheckPagePresence(persistent_page2));
-  histogram_tester()->ExpectUniqueSample(
-      "OfflinePages.ConsistencyCheck.Legacy.DeletedHeadlessFileCount", 2, 1);
 }
 
 // This test is affected by https://crbug.com/725685, which only affects windows
@@ -157,13 +155,6 @@
   EXPECT_EQ(PagePresence::NONE, CheckPagePresence(persistent_page2));
 
   histogram_tester()->ExpectUniqueSample(
-      "OfflinePages.ConsistencyCheck.Legacy.DeletedHeadlessFileCount", 1, 1);
-  histogram_tester()->ExpectTotalCount(
-      "OfflinePages.ConsistencyCheck.Temporary.PagesMissingArchiveFileCount",
-      0);
-  histogram_tester()->ExpectUniqueSample(
-      "OfflinePages.ConsistencyCheck.Temporary.PagesMissingDbEntryCount", 1, 1);
-  histogram_tester()->ExpectUniqueSample(
       "OfflinePages.ConsistencyCheck.Temporary.Result",
       static_cast<int>(SyncOperationResult::SUCCESS), 1);
 }
@@ -210,11 +201,6 @@
             CheckPagePresence(persistent_page1));
   EXPECT_EQ(PagePresence::DB_ONLY, CheckPagePresence(persistent_page2));
 
-  histogram_tester()->ExpectTotalCount(
-      "OfflinePages.ConsistencyCheck.Temporary.PagesMissingDbEntryCount", 0);
-  histogram_tester()->ExpectUniqueSample(
-      "OfflinePages.ConsistencyCheck.Temporary.PagesMissingArchiveFileCount", 1,
-      1);
   histogram_tester()->ExpectUniqueSample(
       "OfflinePages.ConsistencyCheck.Temporary.Result",
       static_cast<int>(SyncOperationResult::SUCCESS), 1);
@@ -273,13 +259,6 @@
   EXPECT_EQ(PagePresence::NONE, CheckPagePresence(persistent_page2));
 
   histogram_tester()->ExpectUniqueSample(
-      "OfflinePages.ConsistencyCheck.Legacy.DeletedHeadlessFileCount", 2, 1);
-  histogram_tester()->ExpectUniqueSample(
-      "OfflinePages.ConsistencyCheck.Temporary.PagesMissingArchiveFileCount", 2,
-      1);
-  histogram_tester()->ExpectUniqueSample(
-      "OfflinePages.ConsistencyCheck.Temporary.PagesMissingDbEntryCount", 1, 1);
-  histogram_tester()->ExpectUniqueSample(
       "OfflinePages.ConsistencyCheck.Temporary.Result",
       static_cast<int>(SyncOperationResult::SUCCESS), 1);
 }
@@ -332,14 +311,6 @@
   auto task =
       std::make_unique<StartupMaintenanceTask>(store(), archive_manager());
   RunTask(std::move(task));
-
-  // For each namespace, check if the storage usage was correctly reported,
-  // since the value is reported with KiB as unit, divide it by 1024 here.
-  for (const auto& name_space : namespaces) {
-    histogram_tester()->ExpectUniqueSample(
-        "OfflinePages.ClearStoragePreRunUsage2." + name_space,
-        name_space.length() * kTestFileSize / 1024, 1);
-  }
 }
 
 }  // namespace offline_pages
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index 4d228feb..4ab4e37 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -1473,7 +1473,7 @@
 void AutocompleteController::OnUrlScoringModelDone(
     base::OnceCallback<void(AutocompleteMatch)> callback,
     AutocompleteMatch match,
-    const absl::optional<std::vector<float>>& output) {
+    absl::optional<float> relevance) {
   // TODO(crbug/1405555): Populate this callback.  This callback should process
   //  `output` from the scoring model, updates the relevance score in the copy
   //  of the AutocompleteMatch, and passes that the final callback.
diff --git a/components/omnibox/browser/autocomplete_controller.h b/components/omnibox/browser/autocomplete_controller.h
index 59fbfead..31dbec3f 100644
--- a/components/omnibox/browser/autocomplete_controller.h
+++ b/components/omnibox/browser/autocomplete_controller.h
@@ -355,19 +355,19 @@
   // only runs on Lacros and the @tabs scope.
   bool ShouldRunProvider(AutocompleteProvider* provider) const;
 
-  // This is called each time the model returns for a match.  This processes the
-  // output and passes a copy of the match with the updated relevance score
-  // to the final callback.  `OnUrlScoringModelDoneForAllMatches()` runs only
-  // after it has been called for all matches and receives a vector of matches
-  // with the updated relevance scores.
+  // Called each time the model returns for a match. Passes a copy of the match
+  // with the updated relevance score from the model to the final
+  // `OnUrlScoringModelDoneForAllMatches()` callback which receives a vector of
+  // matches with the updated relevance scores after this function has been
+  // called for all matches.
   void OnUrlScoringModelDone(
       base::OnceCallback<void(AutocompleteMatch)> callback,
       AutocompleteMatch match,
-      const absl::optional<std::vector<float>>& output);
+      absl::optional<float> relevance);
 
-  // This callback is called when the model finishes running for all matches in
-  // `results_.matches_`. This re-processes the result given the new relevance
-  // scores, then updates the final set of matches in `results_`.
+  // Called when the model finishes running for all matches in
+  // `results_.matches_`. Re-processes the result with the updated relevance
+  // scores from the model, and updates the final set of matches in `results_`.
   void OnUrlScoringModelDoneForAllMatches(
       const std::vector<AutocompleteMatch>& matches);
 
diff --git a/components/omnibox/browser/autocomplete_scoring_model_service.cc b/components/omnibox/browser/autocomplete_scoring_model_service.cc
index d7969fc..61aa167 100644
--- a/components/omnibox/browser/autocomplete_scoring_model_service.cc
+++ b/components/omnibox/browser/autocomplete_scoring_model_service.cc
@@ -37,25 +37,39 @@
 void AutocompleteScoringModelService::ScoreAutocompleteUrlMatch(
     const metrics::OmniboxEventProto::Suggestion::ScoringSignals&
         scoring_signals,
-    base::OnceCallback<void(
-        const absl::optional<AutocompleteScoringModelExecutor::ModelOutput>&)>
-        scoring_callback) {
+    ResultCallback result_callback) {
   if (!UrlScoringModelAvailable()) {
-    std::move(scoring_callback).Run(absl::nullopt);
+    std::move(result_callback).Run(absl::nullopt);
     return;
   }
 
   absl::optional<std::vector<float>> input_signals =
       url_scoring_model_handler_->GetModelInput(scoring_signals);
   if (!input_signals) {
-    std::move(scoring_callback).Run(absl::nullopt);
+    std::move(result_callback).Run(absl::nullopt);
     return;
   }
 
-  url_scoring_model_handler_->ExecuteModelWithInput(std::move(scoring_callback),
-                                                    *input_signals);
+  url_scoring_model_handler_->ExecuteModelWithInput(
+      base::BindOnce(&AutocompleteScoringModelService::ProcessModelOutput,
+                     base::Unretained(this), std::move(result_callback)),
+      *input_signals);
 }
 
 bool AutocompleteScoringModelService::UrlScoringModelAvailable() {
   return url_scoring_model_handler_ != nullptr;
 }
+
+void AutocompleteScoringModelService::ProcessModelOutput(
+    ResultCallback result_callback,
+    const absl::optional<AutocompleteScoringModelExecutor::ModelOutput>&
+        model_output) {
+  if (model_output.has_value()) {
+    if (!model_output.value().empty()) {
+      std::move(result_callback).Run(model_output.value()[0]);
+      return;
+    }
+    NOTREACHED() << "The model generated an empty output vector.";
+  }
+  std::move(result_callback).Run(absl::nullopt);
+}
diff --git a/components/omnibox/browser/autocomplete_scoring_model_service.h b/components/omnibox/browser/autocomplete_scoring_model_service.h
index eed3cf7d..c71dd1b 100644
--- a/components/omnibox/browser/autocomplete_scoring_model_service.h
+++ b/components/omnibox/browser/autocomplete_scoring_model_service.h
@@ -21,6 +21,8 @@
 // OptimizationGuide's model handler.
 class AutocompleteScoringModelService : public KeyedService {
  public:
+  using ResultCallback = base::OnceCallback<void(absl::optional<float>)>;
+
   explicit AutocompleteScoringModelService(
       optimization_guide::OptimizationGuideModelProvider* model_provider);
   ~AutocompleteScoringModelService() override;
@@ -31,19 +33,26 @@
   AutocompleteScoringModelService& operator=(
       const AutocompleteScoringModelService&) = delete;
 
-  // Scores an autocomplete URL match with scoring signals.
+  // Invokes the model to score the given `scoring_signals` and calls
+  // `result_callback` with an optional relevance score generated by the model.
   void ScoreAutocompleteUrlMatch(
       const metrics::OmniboxEventProto::Suggestion::ScoringSignals&
           scoring_signals,
-      base::OnceCallback<void(
-          const absl::optional<AutocompleteScoringModelExecutor::ModelOutput>&)>
-          scoring_callback);
+      ResultCallback result_callback);
 
   // Returns whether the scoring model is loaded and the pointer to the
   // handler is non-null.
   bool UrlScoringModelAvailable();
 
  private:
+  // Processes the model output and invokes the callback with the relevance
+  // score from the model output. Invokes the callback with nullopt if the model
+  // output is nullopt or an empty vector (which is unexpected).
+  void ProcessModelOutput(
+      ResultCallback result_callback,
+      const absl::optional<AutocompleteScoringModelExecutor::ModelOutput>&
+          model_output);
+
   scoped_refptr<base::SequencedTaskRunner> model_executor_task_runner_;
 
   // Autocomplete URL scoring model.
diff --git a/components/optimization_guide/core/model_util.cc b/components/optimization_guide/core/model_util.cc
index 05dd729f..352f54d 100644
--- a/components/optimization_guide/core/model_util.cc
+++ b/components/optimization_guide/core/model_util.cc
@@ -94,6 +94,8 @@
       return "SegmentationDeviceSwitcher";
     case proto::OPTIMIZATION_TARGET_SEGMENTATION_ADAPTIVE_TOOLBAR:
       return "SegmentationAdaptiveToolbar";
+    case proto::OPTIMIZATION_TARGET_SEGMENTATION_TABLET_PRODUCTIVITY_USER:
+      return "SegmentationTabletProductivityUser";
       // Whenever a new value is added, make sure to add it to the OptTarget
       // variant list in
       // //tools/metrics/histograms/metadata/optimization/histograms.xml.
diff --git a/components/optimization_guide/proto/models.proto b/components/optimization_guide/proto/models.proto
index 44f8137..97068f7 100644
--- a/components/optimization_guide/proto/models.proto
+++ b/components/optimization_guide/proto/models.proto
@@ -181,6 +181,8 @@
   OPTIMIZATION_TARGET_SEGMENTATION_DEVICE_SWITCHER = 27;
   // Target for segmentation: Adaptive toolbar button.
   OPTIMIZATION_TARGET_SEGMENTATION_ADAPTIVE_TOOLBAR = 28;
+  // Target for segmentation: Determine users who are tabletproductivity users.
+  OPTIMIZATION_TARGET_SEGMENTATION_TABLET_PRODUCTIVITY_USER = 29;
 }
 
 // The model engine versions that can be used to do model inference.
diff --git a/components/password_manager/core/browser/leak_detection_delegate.cc b/components/password_manager/core/browser/leak_detection_delegate.cc
index 8c14025..af95104f 100644
--- a/components/password_manager/core/browser/leak_detection_delegate.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate.cc
@@ -111,6 +111,7 @@
     case SyncState::kNotSyncing:
       break;
     case SyncState::kAccountPasswordsActiveNormalEncryption:
+    case SyncState::kAccountPasswordsActiveWithCustomPassphrase:
       is_syncing = IsSyncing((in_stores & PasswordForm::Store::kAccountStore) ==
                              PasswordForm::Store::kAccountStore);
       break;
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.cc b/components/password_manager/core/browser/password_feature_manager_impl.cc
index d235b5c3..808b730c 100644
--- a/components/password_manager/core/browser/password_feature_manager_impl.cc
+++ b/components/password_manager/core/browser/password_feature_manager_impl.cc
@@ -30,6 +30,7 @@
     case SyncState::kSyncingWithCustomPassphrase:
     case SyncState::kSyncingNormalEncryption:
     case SyncState::kAccountPasswordsActiveNormalEncryption:
+    case SyncState::kAccountPasswordsActiveWithCustomPassphrase:
       return true;
   }
 }
diff --git a/components/password_manager/core/browser/password_manager_client.h b/components/password_manager/core/browser/password_manager_client.h
index 02cd52b..b4ed1f4 100644
--- a/components/password_manager/core/browser/password_manager_client.h
+++ b/components/password_manager/core/browser/password_manager_client.h
@@ -96,7 +96,9 @@
   kSyncingWithCustomPassphrase,
   // Sync is disabled but the user is signed in and opted in to passwords
   // account storage.
-  kAccountPasswordsActiveNormalEncryption
+  kAccountPasswordsActiveNormalEncryption,
+  // Same as above but the account has a custom passphrase set.
+  kAccountPasswordsActiveWithCustomPassphrase,
 };
 
 enum class ErrorMessageFlowType { kSaveFlow, kFillFlow };
diff --git a/components/password_manager/core/browser/password_manager_metrics_util.cc b/components/password_manager/core/browser/password_manager_metrics_util.cc
index 0387b85227..e96f78c7 100644
--- a/components/password_manager/core/browser/password_manager_metrics_util.cc
+++ b/components/password_manager/core/browser/password_manager_metrics_util.cc
@@ -353,6 +353,15 @@
   }
 }
 
+void LogIsPasswordProtected(bool is_password_protected) {
+  // To preserve privacy of individual data points, add a 10% statistical noise
+  bool log_value = is_password_protected;
+  if (base::RandInt(0, 9) == 0) {
+    log_value = !is_password_protected;
+  }
+  base::UmaHistogramBoolean("PasswordManager.IsPasswordProtected", log_value);
+}
+
 void LogProtectedPasswordHashCounts(size_t gaia_hash_count,
                                     bool does_primary_account_exists,
                                     bool is_signed_in) {
diff --git a/components/password_manager/core/browser/password_manager_metrics_util.h b/components/password_manager/core/browser/password_manager_metrics_util.h
index bead84ba..a7618e4c 100644
--- a/components/password_manager/core/browser/password_manager_metrics_util.h
+++ b/components/password_manager/core/browser/password_manager_metrics_util.h
@@ -821,6 +821,10 @@
 void LogIsSyncPasswordHashSaved(IsSyncPasswordHashSaved state,
                                 bool is_under_advanced_protection);
 
+// Log whether the saved password is protected by Phishguard. To preserve
+// privacy of individual data points, we will log with 10% noise.
+void LogIsPasswordProtected(bool is_password_protected);
+
 // Log the number of Gaia password hashes saved. Currently only called on
 // profile start up.
 void LogProtectedPasswordHashCounts(size_t gaia_hash_count,
diff --git a/components/password_manager/core/browser/password_manager_metrics_util_unittest.cc b/components/password_manager/core/browser/password_manager_metrics_util_unittest.cc
index 1730ccd..7686edc 100644
--- a/components/password_manager/core/browser/password_manager_metrics_util_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_metrics_util_unittest.cc
@@ -92,4 +92,14 @@
       "PasswordManager.NewlySavedPasswordHasEmptyUsername.UserCreated", 0);
 }
 
+TEST(PasswordManagerMetricsUtil, LogIsPasswordProtectedMetric) {
+  base::HistogramTester histogram_tester;
+
+  LogIsPasswordProtected(true);
+  LogIsPasswordProtected(false);
+
+  // Not testing individual bucket counts since we have 10% random noise
+  histogram_tester.ExpectTotalCount("PasswordManager.IsPasswordProtected", 2);
+}
+
 }  // namespace password_manager::metrics_util
diff --git a/components/password_manager/core/browser/password_manager_util.cc b/components/password_manager/core/browser/password_manager_util.cc
index 1164e28..368d4109 100644
--- a/components/password_manager/core/browser/password_manager_util.cc
+++ b/components/password_manager/core/browser/password_manager_util.cc
@@ -111,10 +111,12 @@
 
   DCHECK(base::FeatureList::IsEnabled(
       password_manager::features::kEnablePasswordsAccountStorage));
-  // Account passwords are enabled only for users with normal encryption at
-  // the moment. Data types won't become active for non-sync users with custom
-  // passphrase.
-  return password_manager::SyncState::kAccountPasswordsActiveNormalEncryption;
+
+  return sync_service->GetUserSettings()->IsUsingExplicitPassphrase()
+             ? password_manager::SyncState::
+                   kAccountPasswordsActiveWithCustomPassphrase
+             : password_manager::SyncState::
+                   kAccountPasswordsActiveNormalEncryption;
 }
 
 void TrimUsernameOnlyCredentials(
diff --git a/components/password_manager/core/browser/password_reuse_detection_manager.h b/components/password_manager/core/browser/password_reuse_detection_manager.h
index 8e69de47..1a7b87a 100644
--- a/components/password_manager/core/browser/password_reuse_detection_manager.h
+++ b/components/password_manager/core/browser/password_reuse_detection_manager.h
@@ -24,6 +24,11 @@
 
 class PasswordManagerClient;
 
+// TODO(crbug.com/1322599): The identical files of this class reside in
+// components/safe_browsing/core/browser/password_protection/. This file and its
+// .cc file will be removed from the password manager directory in a follow-up
+// CL.
+
 // Class for managing password reuse detection. Now it receives keystrokes and
 // does nothing with them. TODO(crbug.com/657041): write other features of this
 // class when they are implemented. This class is one per-tab.
diff --git a/components/password_manager/core/browser/password_reuse_detector.cc b/components/password_manager/core/browser/password_reuse_detector.cc
index c8b961c..ef2526b2 100644
--- a/components/password_manager/core/browser/password_reuse_detector.cc
+++ b/components/password_manager/core/browser/password_reuse_detector.cc
@@ -23,11 +23,6 @@
 namespace password_manager {
 
 namespace {
-// Minimum number of characters in a password for finding it as password reuse.
-// It does not make sense to consider short strings for password reuse, since it
-// is quite likely that they are parts of common words.
-constexpr size_t kMinPasswordLengthToCheck = 8;
-
 // Returns true iff |suffix_candidate| is a suffix of |str|.
 bool IsSuffix(const std::u16string& str,
               const std::u16string& suffix_candidate) {
diff --git a/components/password_manager/core/browser/password_reuse_detector.h b/components/password_manager/core/browser/password_reuse_detector.h
index d0ad10a6..7fa51d78 100644
--- a/components/password_manager/core/browser/password_reuse_detector.h
+++ b/components/password_manager/core/browser/password_reuse_detector.h
@@ -19,6 +19,11 @@
 
 namespace password_manager {
 
+// Minimum number of characters in a password for finding it as password reuse.
+// It does not make sense to consider short strings for password reuse, since it
+// is quite likely that they are parts of common words.
+constexpr size_t kMinPasswordLengthToCheck = 8;
+
 class PasswordReuseDetectorConsumer;
 
 // Comparator that compares reversed strings.
diff --git a/components/password_manager/core/browser/store_metrics_reporter.cc b/components/password_manager/core/browser/store_metrics_reporter.cc
index 4f6425ac..f69bd10 100644
--- a/components/password_manager/core/browser/store_metrics_reporter.cc
+++ b/components/password_manager/core/browser/store_metrics_reporter.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/strcat.h"
 #include "base/strings/utf_string_conversions.h"
@@ -17,11 +18,13 @@
 #include "components/password_manager/core/browser/password_manager_features_util.h"
 #include "components/password_manager/core/browser/password_manager_metrics_util.h"
 #include "components/password_manager/core/browser/password_manager_util.h"
+#include "components/password_manager/core/browser/password_reuse_detector.h"
 #include "components/password_manager/core/browser/password_reuse_manager.h"
 #include "components/password_manager/core/browser/password_store_consumer.h"
 #include "components/password_manager/core/browser/password_sync_util.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
+#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/sync/base/features.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "google_apis/gaia/gaia_urls.h"
@@ -48,10 +51,23 @@
 constexpr char kWithCustomPassphraseSuffix[] = ".WithCustomPassphrase";
 constexpr char kWithoutCustomPassphraseSuffix[] = ".WithoutCustomPassphrase";
 
-base::StringPiece GetCustomPassphraseSuffix(
-    bool custom_passphrase_sync_enabled) {
-  return custom_passphrase_sync_enabled ? kWithCustomPassphraseSuffix
-                                        : kWithoutCustomPassphraseSuffix;
+bool IsCustomPassphraseEnabled(password_manager::SyncState sync_state) {
+  switch (sync_state) {
+    case password_manager::SyncState::kSyncingWithCustomPassphrase:
+    case password_manager::SyncState::
+        kAccountPasswordsActiveWithCustomPassphrase:
+      return true;
+    case password_manager::SyncState::kNotSyncing:
+    case password_manager::SyncState::kSyncingNormalEncryption:
+    case password_manager::SyncState::kAccountPasswordsActiveNormalEncryption:
+      return false;
+  }
+  NOTREACHED_NORETURN();
+}
+
+base::StringPiece GetCustomPassphraseSuffix(bool custom_passphrase_enabled) {
+  return custom_passphrase_enabled ? kWithCustomPassphraseSuffix
+                                   : kWithoutCustomPassphraseSuffix;
 }
 
 // Returns a suffix (infix, really) to be used in histogram names to
@@ -90,7 +106,7 @@
 
 void ReportNumberOfAccountsMetrics(
     bool is_account_store,
-    bool custom_passphrase_sync_enabled,
+    bool custom_passphrase_enabled,
     const std::vector<std::unique_ptr<PasswordForm>>& forms) {
   base::flat_map<std::tuple<std::string, PasswordForm::Type, int>, int>
       accounts_per_site_map;
@@ -102,7 +118,7 @@
 
   base::StringPiece store_suffix = GetMetricsSuffixForStore(is_account_store);
   base::StringPiece custom_passphrase_suffix =
-      GetCustomPassphraseSuffix(custom_passphrase_sync_enabled);
+      GetCustomPassphraseSuffix(custom_passphrase_enabled);
 
   int total_user_created_accounts = 0;
   int total_generated_accounts = 0;
@@ -284,11 +300,11 @@
 
 void ReportTimesPasswordUsedMetrics(
     bool is_account_store,
-    bool custom_passphrase_sync_enabled,
+    bool custom_passphrase_enabled,
     const std::vector<std::unique_ptr<PasswordForm>>& forms) {
   base::StringPiece store_suffix = GetMetricsSuffixForStore(is_account_store);
   base::StringPiece custom_passphrase_suffix =
-      GetCustomPassphraseSuffix(custom_passphrase_sync_enabled);
+      GetCustomPassphraseSuffix(custom_passphrase_enabled);
 
   for (const auto& form : forms) {
     auto type = form->type;
@@ -405,17 +421,30 @@
       count_phished);
 }
 
+void ReportPasswordProtectedMetrics(
+    const std::vector<std::unique_ptr<PasswordForm>>& forms) {
+  for (const std::unique_ptr<PasswordForm>& form : forms) {
+    metrics_util::LogIsPasswordProtected(
+        form->password_value.size() >=
+        password_manager::kMinPasswordLengthToCheck);
+  }
+}
+
 void ReportStoreMetrics(bool is_account_store,
-                        bool custom_passphrase_sync_enabled,
+                        bool custom_passphrase_enabled,
                         const std::string& sync_username,
                         BulkCheckDone bulk_check_done,
+                        bool is_safe_browsing_enabled,
                         std::vector<std::unique_ptr<PasswordForm>> results) {
-  ReportNumberOfAccountsMetrics(is_account_store,
-                                custom_passphrase_sync_enabled, results);
+  ReportNumberOfAccountsMetrics(is_account_store, custom_passphrase_enabled,
+                                results);
   ReportLoginsWithSchemesMetrics(is_account_store, results);
-  ReportTimesPasswordUsedMetrics(is_account_store,
-                                 custom_passphrase_sync_enabled, results);
+  ReportTimesPasswordUsedMetrics(is_account_store, custom_passphrase_enabled,
+                                 results);
   ReportPasswordNotesMetrics(is_account_store, results);
+  if (is_safe_browsing_enabled) {
+    ReportPasswordProtectedMetrics(results);
+  }
 
   // The remaining metrics are not recorded for the account store:
   // - SyncingAccountState2 just doesn't make sense, since syncing users only
@@ -511,10 +540,11 @@
   }
 }
 
-void ReportAllMetrics(bool custom_passphrase_sync_enabled,
+void ReportAllMetrics(bool custom_passphrase_enabled,
                       const std::string& sync_username,
                       BulkCheckDone bulk_check_done,
                       bool is_opted_in_account_storage,
+                      bool is_safe_browsing_enabled,
                       absl::optional<std::vector<std::unique_ptr<PasswordForm>>>
                           profile_store_results,
                       absl::optional<std::vector<std::unique_ptr<PasswordForm>>>
@@ -550,15 +580,13 @@
   }
 
   if (profile_store_results.has_value()) {
-    ReportStoreMetrics(/*is_account_store=*/false,
-                       custom_passphrase_sync_enabled, sync_username,
-                       bulk_check_done,
+    ReportStoreMetrics(/*is_account_store=*/false, custom_passphrase_enabled,
+                       sync_username, bulk_check_done, is_safe_browsing_enabled,
                        std::move(profile_store_results).value());
   }
   if (account_store_results.has_value()) {
-    ReportStoreMetrics(/*is_account_store=*/true,
-                       custom_passphrase_sync_enabled, sync_username,
-                       bulk_check_done,
+    ReportStoreMetrics(/*is_account_store=*/true, custom_passphrase_enabled,
+                       sync_username, bulk_check_done, is_safe_browsing_enabled,
                        std::move(account_store_results).value());
   }
 
@@ -636,9 +664,8 @@
       password_manager::sync_util::GetSyncUsernameIfSyncingPasswords(
           sync_service, identity_manager);
 
-  custom_passphrase_sync_enabled_ =
-      password_manager_util::GetPasswordSyncState(sync_service) ==
-      password_manager::SyncState::kSyncingWithCustomPassphrase;
+  custom_passphrase_enabled_ = IsCustomPassphraseEnabled(
+      password_manager_util::GetPasswordSyncState(sync_service));
 
   bulk_check_done_ =
       BulkCheckDone(prefs->HasPrefPath(prefs::kLastTimePasswordCheckCompleted));
@@ -646,6 +673,8 @@
   is_opted_in_account_storage_ =
       features_util::IsOptedInForAccountStorage(prefs, sync_service);
 
+  is_safe_browsing_enabled_ = safe_browsing::IsSafeBrowsingEnabled(*prefs);
+
   base::UmaHistogramEnumeration(
       base::StrCat({kPasswordManager, ".EnableState"}),
       CredentialsEnableServiceSettingToPasswordManagerEnableState(
@@ -703,9 +732,9 @@
 
   base::ThreadPool::PostTaskAndReply(
       FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()},
-      base::BindOnce(&ReportAllMetrics, custom_passphrase_sync_enabled_,
+      base::BindOnce(&ReportAllMetrics, custom_passphrase_enabled_,
                      sync_username_, bulk_check_done_,
-                     is_opted_in_account_storage_,
+                     is_opted_in_account_storage_, is_safe_browsing_enabled_,
                      std::exchange(profile_store_results_, absl::nullopt),
                      std::exchange(account_store_results_, absl::nullopt)),
       base::BindOnce(&OnMetricsReportingCompleted,
diff --git a/components/password_manager/core/browser/store_metrics_reporter.h b/components/password_manager/core/browser/store_metrics_reporter.h
index 9a21d18..dfe8b8b 100644
--- a/components/password_manager/core/browser/store_metrics_reporter.h
+++ b/components/password_manager/core/browser/store_metrics_reporter.h
@@ -68,12 +68,14 @@
 
   std::string sync_username_;
 
-  bool custom_passphrase_sync_enabled_;
+  bool custom_passphrase_enabled_;
 
   BulkCheckDone bulk_check_done_;
 
   bool is_opted_in_account_storage_;
 
+  bool is_safe_browsing_enabled_;
+
   // Temporarily holds the credentials stored in the profile and account stores
   // till the actual metric computation starts. They don't have a value until
   // the credentials are loaded from the storage.
diff --git a/components/password_manager/core/browser/store_metrics_reporter_unittest.cc b/components/password_manager/core/browser/store_metrics_reporter_unittest.cc
index 8e84dff..97cb499 100644
--- a/components/password_manager/core/browser/store_metrics_reporter_unittest.cc
+++ b/components/password_manager/core/browser/store_metrics_reporter_unittest.cc
@@ -26,6 +26,7 @@
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
+#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/sync/base/features.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -152,6 +153,8 @@
                                            false);
     prefs_.registry()->RegisterDoublePref(
         prefs::kLastTimePasswordStoreMetricsReported, 0.0);
+    prefs_.registry()->RegisterBooleanPref(::prefs::kSafeBrowsingEnabled,
+                                           false);
 #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
     prefs_.registry()->RegisterBooleanPref(
         prefs::kBiometricAuthenticationBeforeFilling, false);
@@ -375,6 +378,78 @@
   RunUntilIdle();
 }
 
+TEST_F(StoreMetricsReporterTest, ReportPasswordProtectedMetricsTest) {
+  // Set up custom preferences for this test because we want safe browsing
+  // enabled
+  prefs_.SetBoolean(::prefs::kSafeBrowsingEnabled, true);
+
+  auto profile_store =
+      base::MakeRefCounted<TestPasswordStore>(IsAccountStore(false));
+  profile_store->Init(&prefs_,
+                      /*affiliated_match_helper=*/nullptr);
+  auto account_store =
+      base::MakeRefCounted<TestPasswordStore>(IsAccountStore(true));
+  account_store->Init(&prefs_,
+                      /*affiliated_match_helper=*/nullptr);
+
+  // Fill Password Store with 1000 account and profile logins
+  const std::string kRealm = "https://example.com";
+  const int kNumberOfLogins = 1000;
+  const int kHalfOfLogins = kNumberOfLogins / 2;
+  for (int protected_num = 0; protected_num < kHalfOfLogins; ++protected_num) {
+    account_store->AddLogin(CreateForm(
+        kRealm, "protectedaccount" + base::NumberToString(protected_num),
+        "protectedaccountpass" + base::NumberToString(protected_num)));
+    profile_store->AddLogin(CreateForm(
+        kRealm, "protectedprofile" + base::NumberToString(protected_num),
+        "protectedprofilepass" + base::NumberToString(protected_num)));
+  }
+  for (int unprotected_num = 0; unprotected_num < kHalfOfLogins;
+       ++unprotected_num) {
+    account_store->AddLogin(CreateForm(
+        kRealm, "unprotectedaccount" + base::NumberToString(unprotected_num),
+        base::NumberToString(unprotected_num)));
+    profile_store->AddLogin(CreateForm(
+        kRealm, "unprotectedprofile" + base::NumberToString(unprotected_num),
+        base::NumberToString(unprotected_num)));
+  }
+
+  base::HistogramTester histogram_tester;
+  StoreMetricsReporter reporter(profile_store.get(), account_store.get(),
+                                sync_service(), identity_manager(), &prefs_,
+                                /*password_reuse_manager=*/nullptr,
+                                /*is_under_advanced_protection=*/false,
+                                /*done_callback*/ base::DoNothing());
+  // Wait for the metrics to get reported, which involves queries to the
+  // stores, i.e. to background task runners.
+  RunUntilIdle();
+
+  const int kTotalAccountAndProfileLogins = 2 * kNumberOfLogins;
+  // Since there is 10% noise in this histogram, we can't deterministically say
+  // what the exact sample count for each bucket will be. Instead, test that the
+  // number of samples is within a reasonable range.
+  histogram_tester.ExpectTotalCount("PasswordManager.IsPasswordProtected",
+                                    kTotalAccountAndProfileLogins);
+  EXPECT_GE(histogram_tester.GetBucketCount(
+                "PasswordManager.IsPasswordProtected", true),
+            0.4 * kTotalAccountAndProfileLogins);
+  EXPECT_LE(histogram_tester.GetBucketCount(
+                "PasswordManager.IsPasswordProtected", true),
+            0.6 * kTotalAccountAndProfileLogins);
+  EXPECT_GE(histogram_tester.GetBucketCount(
+                "PasswordManager.IsPasswordProtected", false),
+            0.4 * kTotalAccountAndProfileLogins);
+  EXPECT_LE(histogram_tester.GetBucketCount(
+                "PasswordManager.IsPasswordProtected", false),
+            0.6 * kTotalAccountAndProfileLogins);
+
+  profile_store->ShutdownOnUIThread();
+  account_store->ShutdownOnUIThread();
+  // Make sure the PasswordStore destruction parts on the background sequence
+  // finish, otherwise we get memory leak reports.
+  RunUntilIdle();
+}
+
 TEST_F(StoreMetricsReporterTest, ReportTotalAccountsHiResMetricsTest) {
   auto profile_store =
       base::MakeRefCounted<TestPasswordStore>(IsAccountStore(false));
diff --git a/components/password_manager/ios/shared_password_controller.h b/components/password_manager/ios/shared_password_controller.h
index a1bcc74..2841b86 100644
--- a/components/password_manager/ios/shared_password_controller.h
+++ b/components/password_manager/ios/shared_password_controller.h
@@ -44,6 +44,13 @@
 - (void)sharedPasswordController:(SharedPasswordController*)controller
              didAcceptSuggestion:(FormSuggestion*)suggestion;
 
+// Whether to show the one-time notice that passwords stored in the signed-in
+// account might be offered as suggestions.
+- (BOOL)shouldShowAccountStorageNotice;
+
+// Must only be called if shouldShowAccountStorageNotice: is true.
+- (void)showAccountStorageNotice:(void (^)())completion;
+
 @end
 
 // Per-tab shared password controller. Handles parsing forms, loading
diff --git a/components/password_manager/ios/shared_password_controller.mm b/components/password_manager/ios/shared_password_controller.mm
index 10beb69..476ed79 100644
--- a/components/password_manager/ios/shared_password_controller.mm
+++ b/components/password_manager/ios/shared_password_controller.mm
@@ -35,6 +35,7 @@
 #include "components/autofill/ios/form_util/form_activity_params.h"
 #include "components/autofill/ios/form_util/unique_id_data_tab_helper.h"
 #include "components/password_manager/core/browser/password_bubble_experiment.h"
+#import "components/password_manager/core/browser/password_feature_manager.h"
 #include "components/password_manager/core/browser/password_generation_frame_helper.h"
 #include "components/password_manager/core/browser/password_manager_client.h"
 #include "components/password_manager/core/common/password_manager_features.h"
@@ -489,7 +490,27 @@
     LogPasswordDropdownShown(*suggestionState, [self isIncognito]);
   }
 
-  completion([suggestions copy], self);
+  if (suggestions.count == 0 || ![_delegate shouldShowAccountStorageNotice]) {
+    completion(suggestions, self);
+    return;
+  }
+
+  __weak __typeof(self) weakSelf = self;
+  [_delegate showAccountStorageNotice:^{
+    if (!weakSelf) {
+      return;
+    }
+    if (weakSelf.delegate && !weakSelf.delegate.passwordManagerClient
+             ->GetPasswordFeatureManager()
+             ->IsOptedInForAccountStorage()) {
+      // Re-fetch, account suggestions are no longer valid.
+      [weakSelf retrieveSuggestionsForForm:formQuery
+                                  webState:webState
+                         completionHandler:completion];
+    } else {
+      completion(suggestions, weakSelf);
+    }
+  }];
 }
 
 - (void)didSelectSuggestion:(FormSuggestion*)suggestion
diff --git a/components/pdf/renderer/pdf_accessibility_tree.cc b/components/pdf/renderer/pdf_accessibility_tree.cc
index 1c66c60..a4dc241 100644
--- a/components/pdf/renderer/pdf_accessibility_tree.cc
+++ b/components/pdf/renderer/pdf_accessibility_tree.cc
@@ -30,6 +30,7 @@
 #include "third_party/blink/public/strings/grit/blink_accessibility_strings.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_mode.h"
+#include "ui/accessibility/ax_node_id_forward.h"
 #include "ui/accessibility/ax_tree_id.h"
 #include "ui/accessibility/null_ax_action_target.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -399,6 +400,32 @@
   return node_ptr;
 }
 
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+// TODO(crbug.com/1393069): Need to test this status node with screen readers
+// on other desktop platforms, such as Windows, macOS, and Linux, as well as in
+// the embedded PDF case.
+ui::AXNodeData* CreateStatusNode(
+    content::RenderAccessibility* render_accessibility,
+    std::vector<std::unique_ptr<ui::AXNodeData>>* nodes,
+    ui::AXNodeData* pdf_root_node) {
+  // Create a status node that conveys a notification message and add it under
+  // the PDF root node as the first node.
+  ui::AXNodeData* node_ptr =
+      CreateNode(ax::mojom::Role::kStatus, ax::mojom::Restriction::kReadOnly,
+                 render_accessibility, nodes);
+  // Set the origin of this status node to be offscreen with a 1x1 rectangle as
+  // this status node doesn't have a visual element. The origin of the doc is
+  // (0, 0), so setting (-1, -1) will make this node offscreen.
+  node_ptr->relative_bounds.bounds = gfx::RectF(-1, -1, 1, 1);
+  // As we create this status node right after the PDF root node, this node
+  // will be added as the first node to the PDF accessibility tree.
+  DCHECK(pdf_root_node->child_ids.empty());
+  pdf_root_node->child_ids.push_back(node_ptr->id);
+  VLOG(2) << "Creating an OCR status node.";
+  return node_ptr;
+}
+#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+
 ax::mojom::Role GetRoleForButtonType(chrome_pdf::ButtonType button_type) {
   switch (button_type) {
     case chrome_pdf::ButtonType::kRadioButton:
@@ -1156,6 +1183,8 @@
       para_node->child_ids.push_back(image_node->id);
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
       if (!images_[i].image_data.drawsNothing() && ocr_service_) {
+        // Keep track of the number of remaining OCR requests that are sent.
+        pdf_accessibility_tree_->IncrementNumberOfRemainingOcrRequests();
         ocr_service_->ScheduleImageProcessing(
             images_[i], base::BindOnce(&PdfAccessibilityTree::OnOcrDataReceived,
                                        pdf_accessibility_tree_, image_node->id,
@@ -1242,6 +1271,8 @@
         GetRenderAccessibilityIfEnabled();
     // PdfAccessibilityTree is created even when accessibility services are not
     // enabled and we rely on them to use PdfOcr service.
+    // TODO(crbug.com/1393069): Ensure that ui::AXMode::kPDFOcr is set in the
+    // AXMode only when both the PDF OCR pref and screen reader are on.
     if (render_accessibility &&
         render_accessibility->GetAXMode().has_mode(ui::AXMode::kPDFOcr)) {
       VLOG(2) << "Creating OCR service.";
@@ -1472,6 +1503,16 @@
   // width and height will be updated as we add each page so that the
   // doc's bounding box surrounds all pages.
   doc_node_->relative_bounds.bounds = gfx::RectF(0, 0, 1, 1);
+
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  // This notification node needs to be added as the first node in the PDF
+  // accessibility tree so that the user will reach out to this node first when
+  // navigating the PDF accessibility tree.
+  if (features::IsPdfOcrEnabled()) {
+    ocr_status_node_ =
+        CreateStatusNode(render_accessibility, &nodes_, doc_node_);
+  }
+#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
 }
 
 void PdfAccessibilityTree::SetAccessibilityPageInfo(
@@ -1533,6 +1574,22 @@
                  page_objects);
 
   did_get_a_text_run_ |= !text_runs.empty();
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  if (features::IsPdfOcrEnabled() && !did_get_a_text_run_) {
+    if (render_accessibility->GetAXMode().has_mode(ui::AXMode::kPDFOcr)) {
+      // Notify users via the status node that PDF OCR is about to run since
+      // the AXMode was set for PDF OCR.
+      SetStatusMessage(IDS_PDF_OCR_IN_PROGRESS);
+    } else {
+      // Notify users of the PDF OCR feature when they encounter an inaccessible
+      // PDF before turning on the feature via the status node.
+      // TODO(crbug.com/1393069): Need to send out this notification only a few
+      // times in case that the user may not want to use the PDF OCR feature
+      // and to be notified of this feature anymore.
+      SetStatusMessage(IDS_PDF_OCR_FEATURE_ALERT);
+    }
+  }
+#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
 
   if (page_index == page_count_ - 1)
     Finish();
@@ -1590,6 +1647,29 @@
                             did_get_a_text_run_);
 }
 
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+void PdfAccessibilityTree::FinishWithStatus() {
+  VLOG(2) << "Performing OCR on PDF is complete.";
+  SetStatusMessage(IDS_PDF_OCR_COMPLETED);
+
+  ui::AXTreeUpdate update;
+  update.root_id = doc_node_->id;
+  update.nodes.push_back(*doc_node_);
+  update.nodes.push_back(*ocr_status_node_);
+
+  if (!tree_.Unserialize(update)) {
+    LOG(FATAL) << tree_.error();
+  }
+}
+
+void PdfAccessibilityTree::SetStatusMessage(int message_id) {
+  DCHECK(ocr_status_node_);
+  const std::string message = l10n_util::GetStringUTF8(message_id);
+  VLOG(2) << "Setting the status node with message: " << message;
+  ocr_status_node_->SetName(message);
+}
+#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+
 void PdfAccessibilityTree::UpdateAXTreeDataFromSelection() {
   tree_data_.sel_is_backward = false;
   if (selection_start_page_index_ > selection_end_page_index_) {
@@ -1803,8 +1883,18 @@
   // more convenient and less complex if an `ui::AXTree` was never constructed
   // and if the `ui::AXTreeSource` was able to use the collection of `nodes_`
   // directly.
+
+  // Check if it finishes running OCR on PDF.
+  DCHECK_NE(num_remaining_ocr_requests_, 0u);
+  bool is_last_ocr_request = --num_remaining_ocr_requests_ == 0u;
+
   if (child_tree_id == ui::AXTreeIDUnknown()) {
     VLOG(1) << "Empty OCR data received.";
+    // TODO(crbug.com/1393069): Investigate more to understand cases in which
+    // OCR gave no results and update the status node with a relevant message.
+    if (is_last_ocr_request) {
+      FinishWithStatus();
+    }
     return;
   }
 
@@ -1856,8 +1946,17 @@
 
   if (!tree_.Unserialize(update))
     LOG(FATAL) << tree_.error();
+
+  if (is_last_ocr_request) {
+    FinishWithStatus();
+  }
+
   render_accessibility->SetPluginTreeSource(this);
 }
+
+void PdfAccessibilityTree::IncrementNumberOfRemainingOcrRequests() {
+  ++num_remaining_ocr_requests_;
+}
 #endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
 
 bool PdfAccessibilityTree::ShowContextMenu() {
diff --git a/components/pdf/renderer/pdf_accessibility_tree.h b/components/pdf/renderer/pdf_accessibility_tree.h
index 25a085b..d6fcba3 100644
--- a/components/pdf/renderer/pdf_accessibility_tree.h
+++ b/components/pdf/renderer/pdf_accessibility_tree.h
@@ -22,6 +22,10 @@
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/vector2d_f.h"
 
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+#include "ui/accessibility/ax_node_data.h"
+#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+
 namespace chrome_pdf {
 
 class PdfAccessibilityActionHandler;
@@ -130,6 +134,12 @@
                          const gfx::RectF& image_bounds,
                          const ui::AXNodeID& parent_node_id,
                          const ui::AXTreeID& child_tree_id);
+
+  // Increment the number of remaining OCR requests by one. This function will
+  // be called whenever PdfAccessibilityTreeBuilder is about to send an OCR
+  // request to the Screen AI library. The number of remaining OCR requests
+  // will decrement by one in `OnOcrDataReceived()`.
+  void IncrementNumberOfRemainingOcrRequests();
 #endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
 
   bool ShowContextMenu();
@@ -162,6 +172,15 @@
   // onto the host tree.
   void Finish();
 
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  // Called after the OCR data for all images in the PDF have been received.
+  // Finishes updating the status node.
+  void FinishWithStatus();
+
+  // Set the status node's message.
+  void SetStatusMessage(int message_id);
+#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+
   void AddPageContent(
       ui::AXNodeData* page_node,
       const gfx::RectF& page_bounds,
@@ -241,7 +260,12 @@
   bool did_get_a_text_run_ = false;
 
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  // The status node contains a notification message for the user. It will be
+  // owned by `nodes_` defined above.
+  ui::AXNodeData* ocr_status_node_ = nullptr;
   std::unique_ptr<PdfOcrService> ocr_service_;
+  // The number of remaining OCR service requests.
+  uint32_t num_remaining_ocr_requests_ = 0;
 #endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
 
   base::WeakPtrFactory<PdfAccessibilityTree> weak_ptr_factory_{this};
diff --git a/components/pdf_strings.grdp b/components/pdf_strings.grdp
index 7dcbad3..ecab1a8 100644
--- a/components/pdf_strings.grdp
+++ b/components/pdf_strings.grdp
@@ -343,4 +343,16 @@
       Note
     </message>
   </if>
+  <if expr="enable_screen_ai_service">
+    <!-- TODO(crbug.com/1393069): Remove translateable tags when strings are approved. -->
+    <message name="IDS_PDF_OCR_FEATURE_ALERT" is_accessibility_with_no_ui="true" translateable="false" desc="Notification of the PDF OCR feature when the user encounters an inaccessible PDF.">
+      Convert image to text in more actions or context menu
+    </message>
+    <message name="IDS_PDF_OCR_IN_PROGRESS" is_accessibility_with_no_ui="true" translateable="false" desc="Notification to inform the user that OCR is in progress.">
+      Image is being analyzed
+    </message>
+    <message name="IDS_PDF_OCR_COMPLETED" is_accessibility_with_no_ui="true" translateable="false" desc="Notification to inform the user that OCR is completed.">
+      Image converted to text
+    </message>
+  </if>
 </grit-part>
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto
index d6faafa..6dfb9950 100644
--- a/components/policy/proto/chrome_device_policy.proto
+++ b/components/policy/proto/chrome_device_policy.proto
@@ -133,11 +133,13 @@
   optional bool report_activity_times = 2 [default = true];
   optional bool report_boot_mode = 3 [default = true];
   optional bool report_location = 4 [default = false];
-  // TODO(b/243958646): The server side should remove the usage of this field.
+  // The server side still retains this field for being backward compatible with
+  // old versions of ChromeOS <= 95. See b/243958646.
   optional bool report_network_interfaces = 5
       [default = true, deprecated = true];
   optional bool report_users = 6 [default = true];
-  // TODO(b/243960946): The server side should remove the usage of this field.
+  // The server side still retains this field for being backward compatible with
+  // old versions of ChromeOS <= 95. See b/243960946.
   optional bool report_hardware_status = 7 [default = true, deprecated = true];
   optional bool report_session_status = 8 [default = true];
   optional bool report_os_update_status = 10 [default = false];
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index 45dfd273..75879fa 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -308,6 +308,8 @@
 
 // Response from server to device register request.
 message DeviceRegisterResponse {
+  reserved 6;
+
   // Device management token for this registration.  This token MUST be
   // part of HTTP Authorization header for all future requests from
   // device to server.
@@ -348,10 +350,6 @@
   // registering for policy is affiliated on the device.
   // Only sent if DeviceRegisterRequest.Type == USER
   repeated string user_affiliation_ids = 5;
-
-  // The unique directory api ID of the device which was generated on the
-  // server-side.
-  optional string directory_api_id = 6;
 }
 
 // Request from device to server to unregister device.
diff --git a/components/policy/resources/templates/policies.yaml b/components/policy/resources/templates/policies.yaml
index 666d9bc..8a3634e0 100644
--- a/components/policy/resources/templates/policies.yaml
+++ b/components/policy/resources/templates/policies.yaml
@@ -1092,6 +1092,7 @@
   1091: ThirdPartyStoragePartitioningBlockedForOrigins
   1092: ScreenCaptureWithoutGestureAllowedForOrigins
   1093: FileOrDirectoryPickerWithoutGestureAllowedForOrigins
+  1094: AppLaunchAutomation
 
 atomic_groups:
   1: Homepage
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/AppLaunchAutomation.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/AppLaunchAutomation.yaml
new file mode 100644
index 0000000..6b912af
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/AppLaunchAutomation.yaml
@@ -0,0 +1,83 @@
+caption: App Launch Automation
+desc: Setting this policy allows administrators to configure automation for
+  launching apps on <ph name="PRODUCT_NAME">$1<ex>Google ChromeOS</ex></ph>
+  devices. These apps can be launched on user login, or users can launch them
+  together from the launcher.
+example_value:
+- auto_launch_on_startup: false
+  created_time_usec: '13320917261678808'
+  desk:
+    apps:
+    - app_type: browser
+      browser_tabs:
+      - url: https://www.chromium.org
+      window_id: 30002
+    - app_type: browser
+      browser_tabs:
+      - url: chrome://version/
+      - url: https://dev.chromium.org
+      window_id: 30001
+  name: App Automation 1
+  updated_time_usec: '13320917261678808'
+  uuid: 27ea906b-a7d3-40b1-8c36-76d332d7f184
+- created_time_usec: '13320917271679905'
+  desk:
+    apps:
+    - app_type: browser
+      browser_tabs:
+      - url: https://www.google.com/
+      - url: https://www.youtube.com/
+      window_id: 30001
+  name: App Automation 2
+  updated_time_usec: '13320917271679905'
+  uuid: 3aa30d88-576e-48ea-ab26-cbdd2cbe43a1
+features:
+  dynamic_refresh: true
+  per_profile: false
+future_on:
+- chrome_os
+owners:
+- yzd@google.com
+- cros-commercial-productivity-policy-eng@google.com
+schema:
+  type: array
+  items:
+    type: object
+    properties:
+      auto_launch_on_startup:
+        type: boolean
+      created_time_usec:
+        type: string
+      desk:
+        type: object
+        properties:
+          apps:
+            type: array
+            items:
+              type: object
+              properties:
+                app_type:
+                  enum:
+                  - android
+                  - browser
+                  - chrome_app
+                  - isolated_web_app
+                  - progressive_web_app
+                  type: string
+                browser_tabs:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      url:
+                        type: string
+                window_id:
+                  type: integer
+      name:
+        type: string
+      updated_time_usec:
+        type: string
+      uuid:
+        type: string
+tags: []
+type: dict
diff --git a/components/policy/test/data/policy_test_cases.json b/components/policy/test/data/policy_test_cases.json
index 1d7f557b..d152902 100644
--- a/components/policy/test/data/policy_test_cases.json
+++ b/components/policy/test/data/policy_test_cases.json
@@ -8031,6 +8031,9 @@
       }
     ]
   },
+  "AppLaunchAutomation": {
+    "reason_for_missing_test": "TODO(b/268538092): Feature not yet implemented"
+  },
   "AllowedDomainsForApps": {
     "os": [
       "win",
diff --git a/components/reading_list/core/reading_list_model_impl.cc b/components/reading_list/core/reading_list_model_impl.cc
index a20760bc..f455fb7 100644
--- a/components/reading_list/core/reading_list_model_impl.cc
+++ b/components/reading_list/core/reading_list_model_impl.cc
@@ -398,7 +398,6 @@
   }
   UpdateEntryStateCountersOnEntryRemoval(entry);
   entry.SetRead(read, clock_->Now());
-  entry.MarkEntryUpdated(clock_->Now());
   UpdateEntryStateCountersOnEntryInsertion(entry);
 
   std::unique_ptr<ReadingListModelStorage::ScopedBatchUpdate> batch =
diff --git a/components/resources/autofill_scaled_resources.grdp b/components/resources/autofill_scaled_resources.grdp
index 59e117b..eb27baf 100644
--- a/components/resources/autofill_scaled_resources.grdp
+++ b/components/resources/autofill_scaled_resources.grdp
@@ -13,6 +13,16 @@
   <structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_TROY" file="autofill/troy.png" />
   <structure type="chrome_scaled_image" name="IDR_AUTOFILL_VIRTUAL_CARD_ENROLL_DIALOG" file="autofill/virtual_card_enroll.png" />
   <structure type="chrome_scaled_image" name="IDR_AUTOFILL_VIRTUAL_CARD_ENROLL_DIALOG_DARK" file="autofill/virtual_card_enroll_dark.png" />
+  <structure type="chrome_scaled_image" name="IDR_AUTOFILL_METADATA_CC_AMEX" file="autofill/metadata/amex.png" />
+  <structure type="chrome_scaled_image" name="IDR_AUTOFILL_METADATA_CC_DINERS" file="autofill/metadata/diners.png" />
+  <structure type="chrome_scaled_image" name="IDR_AUTOFILL_METADATA_CC_DISCOVER" file="autofill/metadata/discover.png" />
+  <structure type="chrome_scaled_image" name="IDR_AUTOFILL_METADATA_CC_GENERIC" file="autofill/metadata/cc-generic.png" />
+  <structure type="chrome_scaled_image" name="IDR_AUTOFILL_METADATA_CC_JCB" file="autofill/metadata/jcb.png" />
+  <structure type="chrome_scaled_image" name="IDR_AUTOFILL_METADATA_CC_MASTERCARD" file="autofill/metadata/mastercard.png" />
+  <structure type="chrome_scaled_image" name="IDR_AUTOFILL_METADATA_CC_MIR" file="autofill/metadata/mir.png" />
+  <structure type="chrome_scaled_image" name="IDR_AUTOFILL_METADATA_CC_UNIONPAY" file="autofill/metadata/unionpay.png" />
+  <structure type="chrome_scaled_image" name="IDR_AUTOFILL_METADATA_CC_VISA" file="autofill/metadata/visa.png" />
+  <structure type="chrome_scaled_image" name="IDR_AUTOFILL_METADATA_CC_TROY" file="autofill/metadata/troy.png" />
   <if expr="_google_chrome">
     <then>
       <structure type="chrome_scaled_image" name="IDR_AUTOFILL_GOOGLE_PAY" file="google_chrome/autofill/googlepay.png" />
diff --git a/components/resources/default_100_percent/autofill/metadata/amex.png b/components/resources/default_100_percent/autofill/metadata/amex.png
new file mode 100644
index 0000000..44efed3
--- /dev/null
+++ b/components/resources/default_100_percent/autofill/metadata/amex.png
Binary files differ
diff --git a/components/resources/default_100_percent/autofill/metadata/cc-generic.png b/components/resources/default_100_percent/autofill/metadata/cc-generic.png
new file mode 100644
index 0000000..59522d3
--- /dev/null
+++ b/components/resources/default_100_percent/autofill/metadata/cc-generic.png
Binary files differ
diff --git a/components/resources/default_100_percent/autofill/metadata/diners.png b/components/resources/default_100_percent/autofill/metadata/diners.png
new file mode 100644
index 0000000..19e22e4
--- /dev/null
+++ b/components/resources/default_100_percent/autofill/metadata/diners.png
Binary files differ
diff --git a/components/resources/default_100_percent/autofill/metadata/discover.png b/components/resources/default_100_percent/autofill/metadata/discover.png
new file mode 100644
index 0000000..2f1bdffb5
--- /dev/null
+++ b/components/resources/default_100_percent/autofill/metadata/discover.png
Binary files differ
diff --git a/components/resources/default_100_percent/autofill/metadata/jcb.png b/components/resources/default_100_percent/autofill/metadata/jcb.png
new file mode 100644
index 0000000..cadcd3ac
--- /dev/null
+++ b/components/resources/default_100_percent/autofill/metadata/jcb.png
Binary files differ
diff --git a/components/resources/default_100_percent/autofill/metadata/mastercard.png b/components/resources/default_100_percent/autofill/metadata/mastercard.png
new file mode 100644
index 0000000..10bbef1
--- /dev/null
+++ b/components/resources/default_100_percent/autofill/metadata/mastercard.png
Binary files differ
diff --git a/components/resources/default_100_percent/autofill/metadata/mir.png b/components/resources/default_100_percent/autofill/metadata/mir.png
new file mode 100644
index 0000000..633f7bff
--- /dev/null
+++ b/components/resources/default_100_percent/autofill/metadata/mir.png
Binary files differ
diff --git a/components/resources/default_100_percent/autofill/metadata/troy.png b/components/resources/default_100_percent/autofill/metadata/troy.png
new file mode 100644
index 0000000..af011d0
--- /dev/null
+++ b/components/resources/default_100_percent/autofill/metadata/troy.png
Binary files differ
diff --git a/components/resources/default_100_percent/autofill/metadata/unionpay.png b/components/resources/default_100_percent/autofill/metadata/unionpay.png
new file mode 100644
index 0000000..b07222e06
--- /dev/null
+++ b/components/resources/default_100_percent/autofill/metadata/unionpay.png
Binary files differ
diff --git a/components/resources/default_100_percent/autofill/metadata/visa.png b/components/resources/default_100_percent/autofill/metadata/visa.png
new file mode 100644
index 0000000..44633e6c
--- /dev/null
+++ b/components/resources/default_100_percent/autofill/metadata/visa.png
Binary files differ
diff --git a/components/resources/default_200_percent/autofill/metadata/amex.png b/components/resources/default_200_percent/autofill/metadata/amex.png
new file mode 100644
index 0000000..d970ef08
--- /dev/null
+++ b/components/resources/default_200_percent/autofill/metadata/amex.png
Binary files differ
diff --git a/components/resources/default_200_percent/autofill/metadata/cc-generic.png b/components/resources/default_200_percent/autofill/metadata/cc-generic.png
new file mode 100644
index 0000000..f115bde
--- /dev/null
+++ b/components/resources/default_200_percent/autofill/metadata/cc-generic.png
Binary files differ
diff --git a/components/resources/default_200_percent/autofill/metadata/diners.png b/components/resources/default_200_percent/autofill/metadata/diners.png
new file mode 100644
index 0000000..57b295a
--- /dev/null
+++ b/components/resources/default_200_percent/autofill/metadata/diners.png
Binary files differ
diff --git a/components/resources/default_200_percent/autofill/metadata/discover.png b/components/resources/default_200_percent/autofill/metadata/discover.png
new file mode 100644
index 0000000..9eed1d6
--- /dev/null
+++ b/components/resources/default_200_percent/autofill/metadata/discover.png
Binary files differ
diff --git a/components/resources/default_200_percent/autofill/metadata/jcb.png b/components/resources/default_200_percent/autofill/metadata/jcb.png
new file mode 100644
index 0000000..36f0e37
--- /dev/null
+++ b/components/resources/default_200_percent/autofill/metadata/jcb.png
Binary files differ
diff --git a/components/resources/default_200_percent/autofill/metadata/mastercard.png b/components/resources/default_200_percent/autofill/metadata/mastercard.png
new file mode 100644
index 0000000..1f24e6e5
--- /dev/null
+++ b/components/resources/default_200_percent/autofill/metadata/mastercard.png
Binary files differ
diff --git a/components/resources/default_200_percent/autofill/metadata/mir.png b/components/resources/default_200_percent/autofill/metadata/mir.png
new file mode 100644
index 0000000..470f2e0
--- /dev/null
+++ b/components/resources/default_200_percent/autofill/metadata/mir.png
Binary files differ
diff --git a/components/resources/default_200_percent/autofill/metadata/troy.png b/components/resources/default_200_percent/autofill/metadata/troy.png
new file mode 100644
index 0000000..42a0ac0d
--- /dev/null
+++ b/components/resources/default_200_percent/autofill/metadata/troy.png
Binary files differ
diff --git a/components/resources/default_200_percent/autofill/metadata/unionpay.png b/components/resources/default_200_percent/autofill/metadata/unionpay.png
new file mode 100644
index 0000000..381c094c
--- /dev/null
+++ b/components/resources/default_200_percent/autofill/metadata/unionpay.png
Binary files differ
diff --git a/components/resources/default_200_percent/autofill/metadata/visa.png b/components/resources/default_200_percent/autofill/metadata/visa.png
new file mode 100644
index 0000000..3d24628
--- /dev/null
+++ b/components/resources/default_200_percent/autofill/metadata/visa.png
Binary files differ
diff --git a/components/resources/default_300_percent/autofill/metadata/amex.png b/components/resources/default_300_percent/autofill/metadata/amex.png
new file mode 100644
index 0000000..f5571bb8
--- /dev/null
+++ b/components/resources/default_300_percent/autofill/metadata/amex.png
Binary files differ
diff --git a/components/resources/default_300_percent/autofill/metadata/cc-generic.png b/components/resources/default_300_percent/autofill/metadata/cc-generic.png
new file mode 100644
index 0000000..a1b2e91
--- /dev/null
+++ b/components/resources/default_300_percent/autofill/metadata/cc-generic.png
Binary files differ
diff --git a/components/resources/default_300_percent/autofill/metadata/diners.png b/components/resources/default_300_percent/autofill/metadata/diners.png
new file mode 100644
index 0000000..5a4597b
--- /dev/null
+++ b/components/resources/default_300_percent/autofill/metadata/diners.png
Binary files differ
diff --git a/components/resources/default_300_percent/autofill/metadata/discover.png b/components/resources/default_300_percent/autofill/metadata/discover.png
new file mode 100644
index 0000000..b5316a39
--- /dev/null
+++ b/components/resources/default_300_percent/autofill/metadata/discover.png
Binary files differ
diff --git a/components/resources/default_300_percent/autofill/metadata/jcb.png b/components/resources/default_300_percent/autofill/metadata/jcb.png
new file mode 100644
index 0000000..a205cb5
--- /dev/null
+++ b/components/resources/default_300_percent/autofill/metadata/jcb.png
Binary files differ
diff --git a/components/resources/default_300_percent/autofill/metadata/mastercard.png b/components/resources/default_300_percent/autofill/metadata/mastercard.png
new file mode 100644
index 0000000..c7ec6573
--- /dev/null
+++ b/components/resources/default_300_percent/autofill/metadata/mastercard.png
Binary files differ
diff --git a/components/resources/default_300_percent/autofill/metadata/mir.png b/components/resources/default_300_percent/autofill/metadata/mir.png
new file mode 100644
index 0000000..781a2e0
--- /dev/null
+++ b/components/resources/default_300_percent/autofill/metadata/mir.png
Binary files differ
diff --git a/components/resources/default_300_percent/autofill/metadata/troy.png b/components/resources/default_300_percent/autofill/metadata/troy.png
new file mode 100644
index 0000000..c649003
--- /dev/null
+++ b/components/resources/default_300_percent/autofill/metadata/troy.png
Binary files differ
diff --git a/components/resources/default_300_percent/autofill/metadata/unionpay.png b/components/resources/default_300_percent/autofill/metadata/unionpay.png
new file mode 100644
index 0000000..a358aff
--- /dev/null
+++ b/components/resources/default_300_percent/autofill/metadata/unionpay.png
Binary files differ
diff --git a/components/resources/default_300_percent/autofill/metadata/visa.png b/components/resources/default_300_percent/autofill/metadata/visa.png
new file mode 100644
index 0000000..8505b42
--- /dev/null
+++ b/components/resources/default_300_percent/autofill/metadata/visa.png
Binary files differ
diff --git a/components/safe_browsing/content/browser/client_side_detection_service.cc b/components/safe_browsing/content/browser/client_side_detection_service.cc
index ffde4fc..1252bdf 100644
--- a/components/safe_browsing/content/browser/client_side_detection_service.cc
+++ b/components/safe_browsing/content/browser/client_side_detection_service.cc
@@ -558,7 +558,16 @@
   if (static_cast<int>(verdict->tflite_model_scores().size()) >
       thresholds.size()) {
     // Model is misconfigured, so bail out.
-    VLOG(0) << "Model is misconfigured";
+    base::UmaHistogramEnumeration(
+        "SBClientPhishing.ClassifyThresholdsResult",
+        SBClientDetectionClassifyThresholdsResult::kModelSizeMismatch);
+    DVLOG(0)
+        << "Model is misconfigured. Size is mismatched. Verdict scores size is "
+        << static_cast<int>(verdict->tflite_model_scores().size())
+        << " and model thresholds size is "
+        << static_cast<int>(thresholds.size());
+    verdict->set_is_phishing(false);
+    verdict->set_is_tflite_match(false);
     return;
   }
 
@@ -582,6 +591,10 @@
       }
     }
   }
+
+  base::UmaHistogramEnumeration(
+      "SBClientPhishing.ClassifyThresholdsResult",
+      SBClientDetectionClassifyThresholdsResult::kSuccess);
 }
 
 base::WeakPtr<ClientSideDetectionService>
diff --git a/components/safe_browsing/content/browser/client_side_detection_service.h b/components/safe_browsing/content/browser/client_side_detection_service.h
index af6bfa0..18c28280 100644
--- a/components/safe_browsing/content/browser/client_side_detection_service.h
+++ b/components/safe_browsing/content/browser/client_side_detection_service.h
@@ -50,6 +50,15 @@
 class ClientPhishingRequest;
 class ClientSideDetectionHost;
 
+// Enum used to keep stats on classification using threshold comparison.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class SBClientDetectionClassifyThresholdsResult {
+  kSuccess = 0,
+  kModelSizeMismatch = 1,
+  kMaxValue = kModelSizeMismatch,
+};
+
 // Main service which pushes models to the renderers, responds to classification
 // requests. This owns two ModelLoader objects.
 class ClientSideDetectionService
@@ -152,6 +161,11 @@
   // override it.
   virtual const base::File& GetVisualTfLiteModel();
 
+  // Returns the visual TFLite model thresholds from the model class
+  virtual const google::protobuf::RepeatedPtrField<
+      TfLiteModelMetadata::Threshold>&
+  GetVisualTfLiteModelThresholds();
+
   // Compare the scores from classification to TFLite model thresholds
   void ClassifyPhishingThroughThresholds(ClientPhishingRequest* verdict);
 
@@ -241,11 +255,6 @@
   // content::RenderProcessHostCreationObserver:
   void OnRenderProcessHostCreated(content::RenderProcessHost* rph) override;
 
-  // Returns the visual TFLite model thresholds from the model class
-  virtual const google::protobuf::RepeatedPtrField<
-      TfLiteModelMetadata::Threshold>&
-  GetVisualTfLiteModelThresholds();
-
   // Whether the service is running or not.  When the service is not running,
   // it won't download the model nor report detected phishing URLs.
   bool enabled_ = false;
diff --git a/components/safe_browsing/content/browser/client_side_phishing_model.cc b/components/safe_browsing/content/browser/client_side_phishing_model.cc
index 32dbfc9a..f432244 100644
--- a/components/safe_browsing/content/browser/client_side_phishing_model.cc
+++ b/components/safe_browsing/content/browser/client_side_phishing_model.cc
@@ -171,6 +171,8 @@
             VLOG(0) << "Failed to verify CSD Flatbuffer indices and fields";
           } else {
             if (tflite_valid) {
+              thresholds_.Clear();  // Clear the previous model's thresholds
+                                    // before adding on the new ones
               for (const flat::TfLiteModelMetadata_::Threshold* flat_threshold :
                    *(flatbuffer_model_->tflite_metadata()->thresholds())) {
                 TfLiteModelMetadata::Threshold* threshold = thresholds_.Add();
diff --git a/components/safe_browsing/content/browser/client_side_phishing_model_optimization_guide.cc b/components/safe_browsing/content/browser/client_side_phishing_model_optimization_guide.cc
index 788dc205..412e5d0 100644
--- a/components/safe_browsing/content/browser/client_side_phishing_model_optimization_guide.cc
+++ b/components/safe_browsing/content/browser/client_side_phishing_model_optimization_guide.cc
@@ -200,6 +200,8 @@
           VLOG(0) << "Failed to verify CSD Flatbuffer indices and fields";
         } else {
           if (tflite_valid) {
+            thresholds_.Clear();  // Clear the previous model's thresholds
+                                  // before adding on the new ones
             for (const flat::TfLiteModelMetadata_::Threshold* flat_threshold :
                  *(flatbuffer_model->tflite_metadata()->thresholds())) {
               TfLiteModelMetadata::Threshold* threshold = thresholds_.Add();
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/BUILD.gn b/components/safe_browsing/core/browser/hashprefix_realtime/BUILD.gn
index 0d65ebf2..32f6bcc 100644
--- a/components/safe_browsing/core/browser/hashprefix_realtime/BUILD.gn
+++ b/components/safe_browsing/core/browser/hashprefix_realtime/BUILD.gn
@@ -62,6 +62,7 @@
     "hash_realtime_cache_unittest.cc",
     "hash_realtime_service_unittest.cc",
     "hash_realtime_utils_unittest.cc",
+    "ohttp_key_service_unittest.cc",
   ]
   deps = [
     ":hash_realtime_cache",
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service_unittest.cc b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service_unittest.cc
index dacaef2..15102a1 100644
--- a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service_unittest.cc
+++ b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service_unittest.cc
@@ -94,6 +94,8 @@
 
 class TestOhttpKeyService : public OhttpKeyService {
  public:
+  TestOhttpKeyService() : OhttpKeyService(/*url_loader_factory=*/nullptr) {}
+
   void GetOhttpKey(OhttpKeyService::Callback callback) override {
     std::move(callback).Run(ohttp_key_);
   }
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc
index 650dbbb..17d12ef1 100644
--- a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc
+++ b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc
@@ -4,14 +4,135 @@
 
 #include "components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h"
 
+#include "net/base/net_errors.h"
+#include "net/http/http_status_code.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+#include "services/network/public/mojom/url_response_head.mojom.h"
+
+namespace {
+
+constexpr base::TimeDelta kKeyFetchTimeout = base::Seconds(3);
+// TODO(crbug.com/1407283): Update the endpoint when it is finalized.
+constexpr char kKeyFetchServerUrl[] =
+    "https://safebrowsingohttpgateway.googleapis.com/key";
+// Key older than 30 days is considered expired and should be refetched.
+constexpr base::TimeDelta kKeyExpirationDuration = base::Days(30);
+
+constexpr net::NetworkTrafficAnnotationTag kOhttpKeyTrafficAnnotation =
+    net::DefineNetworkTrafficAnnotation("safe_browsing_ohttp_key_fetch",
+                                        R"(
+  semantics {
+    sender: "Safe Browsing"
+    description:
+      "Get the Oblivious HTTP key for hash real time URL check."
+    trigger:
+      "Periodically fetching the key once every few hours or fetching the key "
+      "during hash real time URL check if there is no key available."
+    data:
+        "A simple GET HTTP request. No user data is included."
+    destination: GOOGLE_OWNED_SERVICE
+    internal {
+      contacts {
+        email: "xinghuilu@chromium.org"
+      }
+      contacts {
+        email: "chrome-counter-abuse-alerts@google.com"
+      }
+    }
+    user_data {
+      type: NONE
+    }
+    last_reviewed: "2023-03-06"
+  }
+  policy {
+    cookies_allowed: NO
+    setting:
+      "Users can disable this feature by unselecting 'Standard protection' "
+      "in Chromium settings under Security. The feature is enabled by default."
+    chrome_policy {
+      SafeBrowsingProtectionLevel {
+        policy_options {mode: MANDATORY}
+        SafeBrowsingProtectionLevel: 0
+      }
+    }
+  }
+  comments:
+      "SafeBrowsingProtectionLevel value of 0 or 2 disables fetching this "
+      "OHTTP key. A value of 1 enables the feature. The feature is enabled by "
+      "default."
+  )");
+
+}  // namespace
+
 namespace safe_browsing {
 
-OhttpKeyService::OhttpKeyService() = default;
+OhttpKeyService::OhttpKeyService(
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
+    : url_loader_factory_(url_loader_factory) {}
 
 OhttpKeyService::~OhttpKeyService() = default;
 
 void OhttpKeyService::GetOhttpKey(Callback callback) {
-  std::move(callback).Run(absl::nullopt);
+  // If there is a valid key in memory, use it directly.
+  if (ohttp_key_ && ohttp_key_->expiration > base::Time::Now()) {
+    std::move(callback).Run(ohttp_key_->key);
+    return;
+  }
+
+  pending_callbacks_.AddUnsafe(std::move(callback));
+  // If url_loader_ is not null, that means a request is already in progress.
+  // Will notify the callback when it is completed.
+  if (url_loader_) {
+    return;
+  }
+  auto resource_request = std::make_unique<network::ResourceRequest>();
+  resource_request->url = GURL(kKeyFetchServerUrl);
+  resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
+  url_loader_ = network::SimpleURLLoader::Create(std::move(resource_request),
+                                                 kOhttpKeyTrafficAnnotation);
+  url_loader_->SetTimeoutDuration(kKeyFetchTimeout);
+  url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
+      url_loader_factory_.get(),
+      base::BindOnce(&OhttpKeyService::OnURLLoaderComplete,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void OhttpKeyService::OnURLLoaderComplete(
+    std::unique_ptr<std::string> response_body) {
+  // TODO(crbug.com/1407283): Log net error and response code.
+  DCHECK(url_loader_);
+  int response_code = 0;
+  if (url_loader_->ResponseInfo() && url_loader_->ResponseInfo()->headers) {
+    response_code = url_loader_->ResponseInfo()->headers->response_code();
+  }
+  bool is_key_fetch_successful = response_body &&
+                                 url_loader_->NetError() == net::OK &&
+                                 response_code == net::HTTP_OK;
+
+  url_loader_.reset();
+  if (is_key_fetch_successful) {
+    ohttp_key_ = {*response_body, base::Time::Now() + kKeyExpirationDuration};
+  }
+  pending_callbacks_.Notify(is_key_fetch_successful
+                                ? absl::optional<std::string>(*response_body)
+                                : absl::nullopt);
+}
+
+void OhttpKeyService::Shutdown() {
+  url_loader_.reset();
+  pending_callbacks_.Notify(absl::nullopt);
+}
+
+void OhttpKeyService::set_ohttp_key_for_testing(
+    OhttpKeyAndExpiration ohttp_key) {
+  ohttp_key_ = ohttp_key;
+}
+
+absl::optional<OhttpKeyService::OhttpKeyAndExpiration>
+OhttpKeyService::get_ohttp_key_for_testing() {
+  return ohttp_key_;
 }
 
 }  // namespace safe_browsing
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h
index e639721..7b430ca 100644
--- a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h
+++ b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h
@@ -5,11 +5,18 @@
 #ifndef COMPONENTS_SAFE_BROWSING_CORE_BROWSER_HASHPREFIX_REALTIME_OHTTP_KEY_SERVICE_H_
 #define COMPONENTS_SAFE_BROWSING_CORE_BROWSER_HASHPREFIX_REALTIME_OHTTP_KEY_SERVICE_H_
 
+#include "base/callback_list.h"
 #include "base/functional/callback.h"
 #include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
+namespace network {
+class SharedURLLoaderFactory;
+class SimpleURLLoader;
+}  // namespace network
+
 namespace safe_browsing {
 
 // This class is responsible for managing the public key for sending Oblivious
@@ -19,7 +26,15 @@
   using Callback =
       base::OnceCallback<void(absl::optional<std::string> ohttp_key)>;
 
-  OhttpKeyService();
+  struct OhttpKeyAndExpiration {
+    // The OHTTP key in this struct is formatted as described in
+    // https://www.ietf.org/archive/id/draft-ietf-ohai-ohttp-02.html#name-key-configuration-encoding
+    std::string key;
+    base::Time expiration;
+  };
+
+  explicit OhttpKeyService(
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
 
   OhttpKeyService(const OhttpKeyService&) = delete;
   OhttpKeyService& operator=(const OhttpKeyService&) = delete;
@@ -30,10 +45,36 @@
   // fetch, depending on whether there is a valid key already cached in memory
   // or there is an in-progress request triggered by other callers.
   // The key will be returned via |callback|. The callback runs with a nullopt
-  // if the service cannot provide a valid key at the moment. This function is
+  // if the service cannot provide a valid key at the moment. Callers should
+  // ensure |callback| is still valid when it is run. This function is
   // overridden in tests.
-  // TODO(crbug.com/1407283): Implement this function.
   virtual void GetOhttpKey(Callback callback);
+
+  // KeyedService:
+  // Called before the actual deletion of the object.
+  void Shutdown() override;
+
+  void set_ohttp_key_for_testing(OhttpKeyAndExpiration ohttp_key);
+  absl::optional<OhttpKeyAndExpiration> get_ohttp_key_for_testing();
+
+ private:
+  // Called when the response from the Safe Browsing key hosting endpoint is
+  // received.
+  void OnURLLoaderComplete(std::unique_ptr<std::string> response_body);
+
+  // The URLLoaderFactory we use to issue a network request.
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
+  // |url_loader_| is not null iff there is a network request in progress.
+  std::unique_ptr<network::SimpleURLLoader> url_loader_;
+
+  // All callbacks that have requested an OHTTP key but haven't received a
+  // response yet.
+  base::OnceCallbackList<Callback::RunType> pending_callbacks_;
+
+  // The key cached in memory.
+  absl::optional<OhttpKeyAndExpiration> ohttp_key_;
+
+  base::WeakPtrFactory<OhttpKeyService> weak_factory_{this};
 };
 
 }  // namespace safe_browsing
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service_unittest.cc b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service_unittest.cc
new file mode 100644
index 0000000..2f851bb
--- /dev/null
+++ b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service_unittest.cc
@@ -0,0 +1,154 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h"
+
+#include <memory>
+
+#include "base/test/bind.h"
+#include "base/test/mock_callback.h"
+#include "base/test/task_environment.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::Eq;
+using ::testing::Optional;
+
+namespace safe_browsing {
+
+namespace {
+constexpr char kTestOhttpKey[] = "TestOhttpKey";
+constexpr char kExpectedKeyFetchServerUrl[] =
+    "https://safebrowsingohttpgateway.googleapis.com/key";
+}  // namespace
+
+class OhttpKeyServiceTest : public ::testing::Test {
+ public:
+  void SetUp() override {
+    test_url_loader_factory_ =
+        std::make_unique<network::TestURLLoaderFactory>();
+    test_shared_loader_factory_ =
+        base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+            test_url_loader_factory_.get());
+    ohttp_key_service_ =
+        std::make_unique<OhttpKeyService>(test_shared_loader_factory_);
+  }
+
+ protected:
+  void SetupSuccessResponse() {
+    test_url_loader_factory_->SetInterceptor(base::BindLambdaForTesting(
+        [&](const network::ResourceRequest& resource_request) {
+          ASSERT_EQ(kExpectedKeyFetchServerUrl, resource_request.url.spec());
+          ASSERT_EQ(network::mojom::CredentialsMode::kOmit,
+                    resource_request.credentials_mode);
+        }));
+    test_url_loader_factory_->AddResponse(kExpectedKeyFetchServerUrl,
+                                          kTestOhttpKey);
+  }
+
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+  std::unique_ptr<OhttpKeyService> ohttp_key_service_;
+  std::unique_ptr<network::TestURLLoaderFactory> test_url_loader_factory_;
+  scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
+};
+
+TEST_F(OhttpKeyServiceTest, GetOhttpKey_Success) {
+  SetupSuccessResponse();
+  base::MockCallback<OhttpKeyService::Callback> response_callback;
+  EXPECT_CALL(response_callback, Run(Optional(std::string(kTestOhttpKey))))
+      .Times(1);
+
+  ohttp_key_service_->GetOhttpKey(response_callback.Get());
+  task_environment_.RunUntilIdle();
+
+  absl::optional<OhttpKeyService::OhttpKeyAndExpiration> ohttp_key =
+      ohttp_key_service_->get_ohttp_key_for_testing();
+  EXPECT_TRUE(ohttp_key.has_value());
+  EXPECT_EQ(ohttp_key.value().expiration, base::Time::Now() + base::Days(30));
+  EXPECT_EQ(ohttp_key.value().key, kTestOhttpKey);
+}
+
+TEST_F(OhttpKeyServiceTest, GetOhttpKey_Failure) {
+  test_url_loader_factory_->AddResponse(kExpectedKeyFetchServerUrl,
+                                        kTestOhttpKey, net::HTTP_FORBIDDEN);
+  base::MockCallback<OhttpKeyService::Callback> response_callback;
+  EXPECT_CALL(response_callback, Run(Eq(absl::nullopt))).Times(1);
+
+  ohttp_key_service_->GetOhttpKey(response_callback.Get());
+  task_environment_.RunUntilIdle();
+
+  absl::optional<OhttpKeyService::OhttpKeyAndExpiration> ohttp_key =
+      ohttp_key_service_->get_ohttp_key_for_testing();
+  // The key should not be cached if key fetch fails.
+  EXPECT_FALSE(ohttp_key.has_value());
+}
+
+TEST_F(OhttpKeyServiceTest, GetOhttpKey_MultipleRequests) {
+  base::MockCallback<OhttpKeyService::Callback> response_callback1;
+  base::MockCallback<OhttpKeyService::Callback> response_callback2;
+  EXPECT_CALL(response_callback1, Run(Optional(std::string(kTestOhttpKey))))
+      .Times(1);
+  EXPECT_CALL(response_callback2, Run(Optional(std::string(kTestOhttpKey))))
+      .Times(1);
+
+  ohttp_key_service_->GetOhttpKey(response_callback1.Get());
+  ohttp_key_service_->GetOhttpKey(response_callback2.Get());
+  task_environment_.RunUntilIdle();
+
+  SetupSuccessResponse();
+  task_environment_.RunUntilIdle();
+  // url_loader should only send one request
+  EXPECT_EQ(test_url_loader_factory_->total_requests(), 1u);
+}
+
+TEST_F(OhttpKeyServiceTest, GetOhttpKey_WithValidCache) {
+  SetupSuccessResponse();
+  ohttp_key_service_->set_ohttp_key_for_testing(
+      {"OldOhttpKey", base::Time::Now() + base::Hours(1)});
+
+  base::MockCallback<OhttpKeyService::Callback> response_callback;
+  // Should return the old key because it has not expired.
+  EXPECT_CALL(response_callback, Run(Optional(std::string("OldOhttpKey"))))
+      .Times(1);
+  ohttp_key_service_->GetOhttpKey(response_callback.Get());
+  task_environment_.RunUntilIdle();
+}
+
+TEST_F(OhttpKeyServiceTest, GetOhttpKey_WithExpiredCache) {
+  SetupSuccessResponse();
+  ohttp_key_service_->set_ohttp_key_for_testing(
+      {"OldOhttpKey", base::Time::Now() - base::Hours(1)});
+
+  base::MockCallback<OhttpKeyService::Callback> response_callback1;
+  // The new key should be fetched because the old key has expired.
+  EXPECT_CALL(response_callback1, Run(Optional(std::string(kTestOhttpKey))))
+      .Times(1);
+  ohttp_key_service_->GetOhttpKey(response_callback1.Get());
+  task_environment_.RunUntilIdle();
+
+  test_url_loader_factory_->AddResponse(kExpectedKeyFetchServerUrl,
+                                        "NewOhttpKey");
+  task_environment_.FastForwardBy(base::Days(20));
+  base::MockCallback<OhttpKeyService::Callback> response_callback2;
+  // The new key should not be fetched because the old key has not expired.
+  EXPECT_CALL(response_callback2, Run(Optional(std::string(kTestOhttpKey))))
+      .Times(1);
+  ohttp_key_service_->GetOhttpKey(response_callback2.Get());
+  task_environment_.RunUntilIdle();
+}
+
+TEST_F(OhttpKeyServiceTest, Shutdown) {
+  base::MockCallback<OhttpKeyService::Callback> response_callback;
+  // Pending callbacks should be run during shutdown.
+  EXPECT_CALL(response_callback, Run(Eq(absl::nullopt))).Times(1);
+
+  ohttp_key_service_->GetOhttpKey(response_callback.Get());
+  ohttp_key_service_->Shutdown();
+  task_environment_.RunUntilIdle();
+}
+
+}  // namespace safe_browsing
diff --git a/components/safe_browsing/core/browser/password_protection/BUILD.gn b/components/safe_browsing/core/browser/password_protection/BUILD.gn
index 2b30553..8b053de 100644
--- a/components/safe_browsing/core/browser/password_protection/BUILD.gn
+++ b/components/safe_browsing/core/browser/password_protection/BUILD.gn
@@ -8,6 +8,8 @@
     "password_protection_request.h",
     "password_protection_service_base.cc",
     "password_protection_service_base.h",
+    "password_reuse_detection_manager_sb.cc",
+    "password_reuse_detection_manager_sb.h",
     "request_canceler.cc",
     "request_canceler.h",
   ]
@@ -17,6 +19,7 @@
   deps = [
     ":password_protection_metrics_util",
     "//base",
+    "//components/autofill/core/browser",
     "//components/history/core/browser",
     "//components/password_manager/core/browser",
     "//components/safe_browsing/core/browser:referrer_chain_provider",
@@ -57,3 +60,17 @@
     "//net",
   ]
 }
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [ "password_reuse_detection_manager_sb_unittest.cc" ]
+  deps = [
+    ":password_protection",
+    "//base",
+    "//components/password_manager/core/browser:test_support",
+    "//testing/gmock",
+    "//testing/gtest",
+    "//third_party/abseil-cpp:absl",
+    "//url:url",
+  ]
+}
diff --git a/components/safe_browsing/core/browser/password_protection/DEPS b/components/safe_browsing/core/browser/password_protection/DEPS
index ecd430a..228a5c6 100644
--- a/components/safe_browsing/core/browser/password_protection/DEPS
+++ b/components/safe_browsing/core/browser/password_protection/DEPS
@@ -1,6 +1,9 @@
 include_rules = [
+  "+components/autofill/core/browser/logging",
   "+components/password_manager/core/browser/password_reuse_detector.h",
+  "+components/password_manager/core/browser",
   "+components/url_formatter",
   "+components/signin/public/identity_manager",
+  "+ui/events/keycodes/keyboard_codes_posix.h",
   "+ui/gfx/geometry",
 ]
diff --git a/components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb.cc b/components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb.cc
new file mode 100644
index 0000000..a16b233
--- /dev/null
+++ b/components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb.cc
@@ -0,0 +1,221 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb.h"
+
+#include "base/time/default_clock.h"
+#include "build/build_config.h"
+#include "components/autofill/core/browser/logging/log_manager.h"
+#include "components/password_manager/core/browser/browser_save_password_progress_logger.h"
+#include "components/password_manager/core/browser/password_reuse_manager.h"
+#include "components/safe_browsing/buildflags.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
+
+using base::Time;
+
+namespace safe_browsing {
+
+namespace {
+// The maximum number of characters to store in the keystrokes buffer.
+constexpr size_t kMaxNumberOfCharactersToStore = 45;
+// Clears the keystrokes buffer if last keystoke was more than 10s ago.
+constexpr base::TimeDelta kMaxInactivityTime = base::Seconds(10);
+}  // namespace
+
+PasswordReuseDetectionManagerSB::PasswordReuseDetectionManagerSB(
+    password_manager::PasswordManagerClient* client)
+    : client_(client), clock_(base::DefaultClock::GetInstance()) {
+  CHECK(client_);
+}
+
+PasswordReuseDetectionManagerSB::~PasswordReuseDetectionManagerSB() = default;
+
+void PasswordReuseDetectionManagerSB::DidNavigateMainFrame(
+    const GURL& main_frame_url) {
+  if (main_frame_url.host() == main_frame_url_.host()) {
+    return;
+  }
+
+  main_frame_url_ = main_frame_url;
+  input_characters_.clear();
+  reuse_on_this_page_was_found_ = false;
+}
+
+void PasswordReuseDetectionManagerSB::OnKeyPressedCommitted(
+    const std::u16string& text) {
+  OnKeyPressed(text, /*is_committed=*/true);
+}
+
+#if BUILDFLAG(IS_ANDROID)
+void PasswordReuseDetectionManagerSB::OnKeyPressedUncommitted(
+    const std::u16string& text) {
+  OnKeyPressed(text, /*is_committed=*/false);
+}
+#endif
+
+void PasswordReuseDetectionManagerSB::OnKeyPressed(const std::u16string& text,
+                                                   bool is_committed) {
+  // Do not check reuse if it was already found on this page.
+  if (reuse_on_this_page_was_found_) {
+    return;
+  }
+
+  // Clear the buffer if last keystoke was more than kMaxInactivityTime ago.
+  Time now = clock_->Now();
+  if (!last_keystroke_time_.is_null() &&
+      (now - last_keystroke_time_) >= kMaxInactivityTime) {
+    input_characters_.clear();
+  }
+  last_keystroke_time_ = now;
+
+  // Clear the buffer and return when enter is pressed.
+  if (text.size() == 1 && text[0] == ui::VKEY_RETURN) {
+    input_characters_.clear();
+    return;
+  }
+
+  if (is_committed) {
+    input_characters_ += text;
+  }
+
+  if (input_characters_.size() > kMaxNumberOfCharactersToStore) {
+    input_characters_.erase(
+        0, input_characters_.size() - kMaxNumberOfCharactersToStore);
+  }
+
+  const std::u16string text_to_check =
+      is_committed ? input_characters_ : input_characters_ + text;
+
+  CheckStoresForReuse(text_to_check);
+}
+
+void PasswordReuseDetectionManagerSB::OnPaste(std::u16string text) {
+  // Do not check reuse if it was already found on this page.
+  if (reuse_on_this_page_was_found_) {
+    return;
+  }
+  if (text.size() > kMaxNumberOfCharactersToStore) {
+    text = text.substr(text.size() - kMaxNumberOfCharactersToStore);
+  }
+
+  CheckStoresForReuse(text);
+}
+
+void PasswordReuseDetectionManagerSB::OnReuseCheckDone(
+    bool is_reuse_found,
+    size_t password_length,
+    absl::optional<password_manager::PasswordHashData>
+        reused_protected_password_hash,
+    const std::vector<password_manager::MatchingReusedCredential>&
+        matching_reused_credentials,
+    int saved_passwords,
+    const std::string& domain,
+    uint64_t reused_password_hash) {
+  reuse_on_this_page_was_found_ |= is_reuse_found;
+
+  // If no reuse was found, we're done.
+  if (!reuse_on_this_page_was_found_) {
+    return;
+  }
+
+  password_manager::metrics_util::PasswordType reused_password_type =
+      GetReusedPasswordType(reused_protected_password_hash,
+                            matching_reused_credentials.size());
+  autofill::LogManager* log_manager = client_->GetLogManager();
+  if (log_manager && log_manager->IsLoggingActive()) {
+    password_manager::BrowserSavePasswordProgressLogger logger(log_manager);
+    std::vector<std::string> domains_to_log;
+    domains_to_log.reserve(matching_reused_credentials.size());
+    for (const password_manager::MatchingReusedCredential& credential :
+         matching_reused_credentials) {
+      domains_to_log.push_back(credential.signon_realm);
+    }
+    switch (reused_password_type) {
+      case password_manager::metrics_util::PasswordType::
+          PRIMARY_ACCOUNT_PASSWORD:
+        domains_to_log.push_back("CHROME SYNC PASSWORD");
+        break;
+      case password_manager::metrics_util::PasswordType::OTHER_GAIA_PASSWORD:
+        domains_to_log.push_back("OTHER GAIA PASSWORD");
+        break;
+      case password_manager::metrics_util::PasswordType::ENTERPRISE_PASSWORD:
+        domains_to_log.push_back("ENTERPRISE PASSWORD");
+        break;
+      case password_manager::metrics_util::PasswordType::SAVED_PASSWORD:
+        domains_to_log.push_back("SAVED PASSWORD");
+        break;
+      default:
+        break;
+    }
+
+    for (const auto& domain_to_log : domains_to_log) {
+      logger.LogString(password_manager::BrowserSavePasswordProgressLogger::
+                           STRING_REUSE_FOUND,
+                       domain_to_log);
+    }
+  }
+
+  // PasswordManager could be nullptr in tests.
+  bool password_field_detected =
+      client_->GetPasswordManager()
+          ? client_->GetPasswordManager()->IsPasswordFieldDetectedOnPage()
+          : false;
+
+  password_manager::metrics_util::LogPasswordReuse(
+      saved_passwords, matching_reused_credentials.size(),
+      password_field_detected, reused_password_type);
+  if (reused_password_type ==
+      password_manager::metrics_util::PasswordType::PRIMARY_ACCOUNT_PASSWORD) {
+    client_->LogPasswordReuseDetectedEvent();
+  }
+
+  std::string username = reused_protected_password_hash.has_value()
+                             ? reused_protected_password_hash->username
+                             : "";
+
+  client_->CheckProtectedPasswordEntry(
+      reused_password_type, username, matching_reused_credentials,
+      password_field_detected, reused_password_hash, domain);
+}
+
+void PasswordReuseDetectionManagerSB::SetClockForTesting(base::Clock* clock) {
+  clock_ = clock;
+}
+
+password_manager::metrics_util::PasswordType
+PasswordReuseDetectionManagerSB::GetReusedPasswordType(
+    absl::optional<password_manager::PasswordHashData>
+        reused_protected_password_hash,
+    size_t matching_domain_count) {
+  if (!reused_protected_password_hash.has_value()) {
+    CHECK_GT(matching_domain_count, 0u);
+    return password_manager::metrics_util::PasswordType::SAVED_PASSWORD;
+  }
+
+  password_manager::metrics_util::PasswordType reused_password_type;
+  if (!reused_protected_password_hash->is_gaia_password) {
+    reused_password_type =
+        password_manager::metrics_util::PasswordType::ENTERPRISE_PASSWORD;
+  } else if (client_->GetStoreResultFilter()->IsSyncAccountEmail(
+                 reused_protected_password_hash->username)) {
+    reused_password_type =
+        password_manager::metrics_util::PasswordType::PRIMARY_ACCOUNT_PASSWORD;
+  } else {
+    reused_password_type =
+        password_manager::metrics_util::PasswordType::OTHER_GAIA_PASSWORD;
+  }
+  return reused_password_type;
+}
+
+void PasswordReuseDetectionManagerSB::CheckStoresForReuse(
+    const std::u16string& input) {
+  password_manager::PasswordReuseManager* reuse_manager =
+      client_->GetPasswordReuseManager();
+  if (reuse_manager) {
+    reuse_manager->CheckReuse(
+        input, main_frame_url_.DeprecatedGetOriginAsURL().spec(), this);
+  }
+}
+
+}  // namespace safe_browsing
diff --git a/components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb.h b/components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb.h
new file mode 100644
index 0000000..d9d934c
--- /dev/null
+++ b/components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb.h
@@ -0,0 +1,105 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SAFE_BROWSING_CORE_BROWSER_PASSWORD_PROTECTION_PASSWORD_REUSE_DETECTION_MANAGER_SB_H_
+#define COMPONENTS_SAFE_BROWSING_CORE_BROWSER_PASSWORD_PROTECTION_PASSWORD_REUSE_DETECTION_MANAGER_SB_H_
+
+#include <string>
+
+#include "base/containers/flat_set.h"
+#include "base/memory/raw_ptr.h"
+#include "base/time/time.h"
+#include "build/build_config.h"
+#include "components/password_manager/core/browser/password_manager_client.h"
+#include "components/password_manager/core/browser/password_manager_metrics_util.h"
+#include "components/password_manager/core/browser/password_reuse_detector.h"
+#include "components/password_manager/core/browser/password_reuse_detector_consumer.h"
+#include "url/gurl.h"
+
+namespace base {
+class Clock;
+}
+
+namespace safe_browsing {
+
+// This is a placeholder class to compile the new client files.
+// TODO(https://crbug.com/1322599): Rename the class name back to
+// PasswordReuseDetectionManager and delete the obsolete files in the password
+// manager directory.
+
+// TODO(https://crbug.com/1422140): Refactor the
+// password_reuse_detection_manager files. Class for managing password reuse
+// detection. Now it receives keystrokes and does nothing with them.
+// TODO(crbug.com/657041): write other features of this class when they are
+// implemented. This class is one per-tab.
+class PasswordReuseDetectionManagerSB
+    : public password_manager::PasswordReuseDetectorConsumer {
+ public:
+  explicit PasswordReuseDetectionManagerSB(
+      password_manager::PasswordManagerClient* client);
+
+  PasswordReuseDetectionManagerSB(const PasswordReuseDetectionManagerSB&) =
+      delete;
+  PasswordReuseDetectionManagerSB& operator=(
+      const PasswordReuseDetectionManagerSB&) = delete;
+
+  ~PasswordReuseDetectionManagerSB() override;
+
+  // Updates members based on whether the user navigated to another main frame
+  // or not.
+  void DidNavigateMainFrame(const GURL& main_frame_url);
+
+  // Checks reuse for the committed texts.
+  void OnKeyPressedCommitted(const std::u16string& text);
+
+#if BUILDFLAG(IS_ANDROID)
+  // Checks reuse for the uncommitted texts.
+  void OnKeyPressedUncommitted(const std::u16string& text);
+#endif
+
+  // Performs password reuse check when a string is pasted.
+  void OnPaste(std::u16string text);
+
+  // PasswordReuseDetectorConsumer implementation
+  void OnReuseCheckDone(
+      bool is_reuse_found,
+      size_t password_length,
+      absl::optional<password_manager::PasswordHashData>
+          reused_protected_password_hash,
+      const std::vector<password_manager::MatchingReusedCredential>&
+          matching_reused_credentials,
+      int saved_passwords,
+      const std::string& domain,
+      uint64_t reused_password_hash) override;
+
+  void SetClockForTesting(base::Clock* clock);
+
+ private:
+  void OnKeyPressed(const std::u16string& text, bool is_committed);
+  // Determines the type of password being reused.
+  password_manager::metrics_util::PasswordType GetReusedPasswordType(
+      absl::optional<password_manager::PasswordHashData>
+          reused_protected_password_hash,
+      size_t match_domain_count);
+
+  void CheckStoresForReuse(const std::u16string& input);
+
+  // A client to handle password reuse detection logic.
+  raw_ptr<password_manager::PasswordManagerClient> client_;
+  // A buffer that stores keystrokes.
+  std::u16string input_characters_;
+  // The url of the current main frame.
+  GURL main_frame_url_;
+  // Indicates when the last keystroke was detected.
+  base::Time last_keystroke_time_;
+  // Used to retrieve the current time, in base::Time units.
+  raw_ptr<base::Clock> clock_;
+  // Helps determine whether or not to check reuse based on if a reuse was
+  // already found.
+  bool reuse_on_this_page_was_found_ = false;
+};
+
+}  // namespace safe_browsing
+
+#endif  // COMPONENTS_SAFE_BROWSING_CORE_BROWSER_PASSWORD_PROTECTION_PASSWORD_REUSE_DETECTION_MANAGER_SB_H_
diff --git a/components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb_unittest.cc b/components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb_unittest.cc
new file mode 100644
index 0000000..9305398
--- /dev/null
+++ b/components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb_unittest.cc
@@ -0,0 +1,278 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/safe_browsing/core/browser/password_protection/password_reuse_detection_manager_sb.h"
+
+#include "base/run_loop.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/simple_test_clock.h"
+#include "base/test/task_environment.h"
+#include "build/build_config.h"
+#include "components/password_manager/core/browser/mock_password_reuse_manager.h"
+#include "components/password_manager/core/browser/stub_password_manager_client.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
+#include "url/gurl.h"
+
+using testing::_;
+using testing::AnyNumber;
+
+namespace safe_browsing {
+
+namespace {
+
+constexpr size_t kMaxNumberOfCharactersToStore = 45;
+
+class MockPasswordManagerClient
+    : public password_manager::StubPasswordManagerClient {
+ public:
+  MockPasswordManagerClient() = default;
+
+  MockPasswordManagerClient(const MockPasswordManagerClient&) = delete;
+  MockPasswordManagerClient& operator=(const MockPasswordManagerClient&) =
+      delete;
+
+  ~MockPasswordManagerClient() override = default;
+
+  MOCK_METHOD(password_manager::PasswordReuseManager*,
+              GetPasswordReuseManager,
+              (),
+              (const, override));
+
+  MOCK_METHOD(void,
+              CheckProtectedPasswordEntry,
+              (password_manager::metrics_util::PasswordType,
+               const std::string&,
+               const std::vector<password_manager::MatchingReusedCredential>&,
+               bool,
+               uint64_t,
+               const std::string&),
+              (override));
+};
+
+class PasswordReuseDetectionManagerSBTest : public ::testing::Test {
+ public:
+  PasswordReuseDetectionManagerSBTest() = default;
+
+  PasswordReuseDetectionManagerSBTest(
+      const PasswordReuseDetectionManagerSBTest&) = delete;
+  PasswordReuseDetectionManagerSBTest& operator=(
+      const PasswordReuseDetectionManagerSBTest&) = delete;
+
+ protected:
+  base::test::SingleThreadTaskEnvironment task_environment_;
+  MockPasswordManagerClient client_;
+  password_manager::MockPasswordReuseManager reuse_manager_;
+};
+
+// Verify that CheckReuse is called on each key pressed event with an argument
+// equal to the last 30 keystrokes typed after the last main frame navigation.
+TEST_F(PasswordReuseDetectionManagerSBTest, CheckReuseCalled) {
+  const GURL gurls[] = {GURL("https://www.example.com"),
+                        GURL("https://www.otherexample.com")};
+  const std::u16string input[] = {
+      u"1234567890abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ",
+      u"?<>:'{}ABCDEF"};
+
+  EXPECT_CALL(client_, GetPasswordReuseManager())
+      .WillRepeatedly(testing::Return(&reuse_manager_));
+  PasswordReuseDetectionManagerSB manager(&client_);
+
+  for (size_t test = 0; test < std::size(gurls); ++test) {
+    manager.DidNavigateMainFrame(gurls[test]);
+    for (size_t i = 0; i < input[test].size(); ++i) {
+      std::u16string expected_input = input[test].substr(0, i + 1);
+      if (expected_input.size() > kMaxNumberOfCharactersToStore) {
+        expected_input = expected_input.substr(expected_input.size() -
+                                               kMaxNumberOfCharactersToStore);
+      }
+      EXPECT_CALL(
+          reuse_manager_,
+          CheckReuse(expected_input,
+                     gurls[test].DeprecatedGetOriginAsURL().spec(), &manager));
+      manager.OnKeyPressedCommitted(input[test].substr(i, 1));
+      testing::Mock::VerifyAndClearExpectations(&reuse_manager_);
+    }
+  }
+}
+
+// Verify that the keystroke buffer is cleared after 10 seconds of user
+// inactivity.
+TEST_F(PasswordReuseDetectionManagerSBTest,
+       CheckThatBufferClearedAfterInactivity) {
+  EXPECT_CALL(client_, GetPasswordReuseManager())
+      .WillRepeatedly(testing::Return(&reuse_manager_));
+  PasswordReuseDetectionManagerSB manager(&client_);
+
+  base::SimpleTestClock clock;
+  base::Time now = base::Time::Now();
+  clock.SetNow(now);
+  manager.SetClockForTesting(&clock);
+
+  EXPECT_CALL(reuse_manager_, CheckReuse(std::u16string(u"1"), _, _));
+  manager.OnKeyPressedCommitted(u"1");
+
+  // Simulate 10 seconds of inactivity.
+  clock.SetNow(now + base::Seconds(10));
+  // Expect that a keystroke typed before inactivity is cleared.
+  EXPECT_CALL(reuse_manager_, CheckReuse(std::u16string(u"2"), _, _));
+  manager.OnKeyPressedCommitted(u"2");
+}
+
+// Verify that the keystroke buffer is cleared after user presses enter.
+TEST_F(PasswordReuseDetectionManagerSBTest, CheckThatBufferClearedAfterEnter) {
+  EXPECT_CALL(client_, GetPasswordReuseManager())
+      .WillRepeatedly(testing::Return(&reuse_manager_));
+  PasswordReuseDetectionManagerSB manager(&client_);
+
+  EXPECT_CALL(reuse_manager_, CheckReuse(std::u16string(u"1"), _, _));
+  manager.OnKeyPressedCommitted(u"1");
+
+  std::u16string enter_text(1, ui::VKEY_RETURN);
+  EXPECT_CALL(reuse_manager_, CheckReuse).Times(0);
+  manager.OnKeyPressedCommitted(enter_text);
+
+  // Expect only a keystroke typed after enter.
+  EXPECT_CALL(reuse_manager_, CheckReuse(std::u16string(u"2"), _, _));
+  manager.OnKeyPressedCommitted(u"2");
+}
+
+// Verify that after reuse found, no reuse checking happens till next main frame
+// navigation.
+TEST_F(PasswordReuseDetectionManagerSBTest, NoReuseCheckingAfterReuseFound) {
+  EXPECT_CALL(client_, GetPasswordReuseManager())
+      .WillRepeatedly(testing::Return(&reuse_manager_));
+  PasswordReuseDetectionManagerSB manager(&client_);
+
+  // Simulate that reuse found.
+  manager.OnReuseCheckDone(true, 0ul, absl::nullopt, {{"https://example.com"}},
+                           0, std::string(), 0);
+
+  // Expect no checking of reuse.
+  EXPECT_CALL(reuse_manager_, CheckReuse).Times(0);
+  manager.OnKeyPressedCommitted(u"1");
+
+  // Expect that after main frame navigation checking is restored.
+  manager.DidNavigateMainFrame(GURL("https://www.example.com"));
+  EXPECT_CALL(reuse_manager_, CheckReuse(std::u16string(u"1"), _, _));
+  manager.OnKeyPressedCommitted(u"1");
+}
+
+// Verify that keystroke buffer is cleared only on cross host navigation.
+TEST_F(PasswordReuseDetectionManagerSBTest, DidNavigateMainFrame) {
+  EXPECT_CALL(client_, GetPasswordReuseManager())
+      .WillRepeatedly(testing::Return(&reuse_manager_));
+  PasswordReuseDetectionManagerSB manager(&client_);
+
+  manager.DidNavigateMainFrame(GURL("https://www.example1.com/123"));
+  EXPECT_CALL(reuse_manager_, CheckReuse(std::u16string(u"1"), _, _));
+  manager.OnKeyPressedCommitted(u"1");
+
+  // Check that the buffer is not cleared on the same host navigation.
+  manager.DidNavigateMainFrame(GURL("https://www.example1.com/456"));
+  EXPECT_CALL(reuse_manager_, CheckReuse(std::u16string(u"12"), _, _));
+  manager.OnKeyPressedCommitted(u"2");
+
+  // Check that the buffer is cleared on the cross host navigation.
+  manager.DidNavigateMainFrame(GURL("https://www.example2.com/123"));
+  EXPECT_CALL(reuse_manager_, CheckReuse(std::u16string(u"3"), _, _));
+  manager.OnKeyPressedCommitted(u"3");
+}
+
+// Verify that CheckReuse is called on a paste event.
+TEST_F(PasswordReuseDetectionManagerSBTest, CheckReuseCalledOnPaste) {
+  const GURL gurls[] = {GURL("https://www.example.com"),
+                        GURL("https://www.example.test")};
+  const std::u16string input[] = {
+      u"1234567890abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ",
+      u"?<>:'{}ABCDEF"};
+
+  EXPECT_CALL(client_, GetPasswordReuseManager())
+      .WillRepeatedly(testing::Return(&reuse_manager_));
+  PasswordReuseDetectionManagerSB manager(&client_);
+
+  for (size_t test = 0; test < std::size(gurls); ++test) {
+    manager.DidNavigateMainFrame(gurls[test]);
+    std::u16string expected_input = input[test];
+    if (expected_input.size() > kMaxNumberOfCharactersToStore) {
+      expected_input = expected_input.substr(expected_input.size() -
+                                             kMaxNumberOfCharactersToStore);
+    }
+    EXPECT_CALL(
+        reuse_manager_,
+        CheckReuse(expected_input,
+                   gurls[test].DeprecatedGetOriginAsURL().spec(), &manager));
+    manager.OnPaste(input[test]);
+    testing::Mock::VerifyAndClearExpectations(&reuse_manager_);
+  }
+}
+
+TEST_F(PasswordReuseDetectionManagerSBTest,
+       CheckReuseCalledOnPasteTwiceProduceNoDuplicates) {
+  const GURL kURL("https://www.example.com");
+  const std::u16string kInput = u"1234567890abcdefghijklmnopqrstuvxyz";
+
+  EXPECT_CALL(client_, GetPasswordReuseManager())
+      .WillRepeatedly(testing::Return(&reuse_manager_));
+  PasswordReuseDetectionManagerSB manager(&client_);
+
+  manager.DidNavigateMainFrame(kURL);
+  EXPECT_CALL(
+      reuse_manager_,
+      CheckReuse(kInput, kURL.DeprecatedGetOriginAsURL().spec(), &manager))
+      .Times(2);
+  // The user paste the text twice before the store gets to respond.
+  manager.OnPaste(kInput);
+  manager.OnPaste(kInput);
+  testing::Mock::VerifyAndClearExpectations(&reuse_manager_);
+
+  std::vector<password_manager::MatchingReusedCredential> reused_credentials = {
+      {.signon_realm = "www.example2.com",
+       .username = u"username1",
+       .in_store = password_manager::PasswordForm::Store::kProfileStore}};
+
+  // CheckProtectedPasswordEntry should get called once, and the reused
+  // credentials get used reported once in this call.
+  EXPECT_CALL(client_,
+              CheckProtectedPasswordEntry(_, _, reused_credentials, _, _, _));
+  manager.OnReuseCheckDone(/*is_reuse_found=*/true, /*password_length=*/10,
+                           /*reused_protected_password_hash=*/absl::nullopt,
+                           reused_credentials, /*saved_passwords=*/1,
+                           /*domain=*/std::string(),
+                           /*reused_password_hash=*/0);
+}
+
+#if BUILDFLAG(IS_ANDROID)
+TEST_F(PasswordReuseDetectionManagerSBTest,
+       CheckReusedCalledWithUncommittedText) {
+  EXPECT_CALL(client_, GetPasswordReuseManager())
+      .WillRepeatedly(testing::Return(&reuse_manager_));
+  PasswordReuseDetectionManagerSB manager(&client_);
+  GURL test_url("https://www.example.com");
+  manager.DidNavigateMainFrame(test_url);
+
+  std::u16string init_text = u"init_text";
+  std::u16string uncommitted_text = u"uncommitted_text";
+  std::u16string committed_text = u"committed_text";
+
+  EXPECT_CALL(reuse_manager_,
+              CheckReuse(init_text, test_url.DeprecatedGetOriginAsURL().spec(),
+                         &manager));
+  manager.OnKeyPressedCommitted(init_text);
+  EXPECT_CALL(reuse_manager_,
+              CheckReuse(init_text + uncommitted_text,
+                         test_url.DeprecatedGetOriginAsURL().spec(), &manager));
+  manager.OnKeyPressedUncommitted(uncommitted_text);
+  // Uncommitted text should not be stored.
+  EXPECT_CALL(reuse_manager_,
+              CheckReuse(init_text + committed_text,
+                         test_url.DeprecatedGetOriginAsURL().spec(), &manager));
+  manager.OnKeyPressedCommitted(committed_text);
+}
+#endif
+
+}  // namespace
+
+}  // namespace safe_browsing
diff --git a/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.h b/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.h
index 952884c..19498fdb 100644
--- a/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.h
+++ b/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.h
@@ -301,8 +301,7 @@
   bool can_check_db_;
 
   // Whether the high confidence allowlist can be checked. It is set to false
-  // when enterprise real time URL lookup and allowlist bypass is also
-  // enabled (SafeBrowsingRealTimeUrlLookupForEnterpriseAllowlistBypass).
+  // when enterprise real time URL lookup is enabled.
   bool can_check_high_confidence_allowlist_ = true;
 
   // URL Lookup service suffix for logging metrics.
diff --git a/components/safe_browsing/core/browser/url_realtime_mechanism.h b/components/safe_browsing/core/browser/url_realtime_mechanism.h
index 2b07292..1477e12 100644
--- a/components/safe_browsing/core/browser/url_realtime_mechanism.h
+++ b/components/safe_browsing/core/browser/url_realtime_mechanism.h
@@ -132,8 +132,7 @@
   int url_web_ui_token_ = -1;
 
   // Whether the high confidence allowlist can be checked. It is set to
-  // false when enterprise real time URL lookup and allowlist bypass is also
-  // enabled (SafeBrowsingRealTimeUrlLookupForEnterpriseAllowlistBypass).
+  // false when enterprise real time URL lookup is enabled.
   bool can_check_high_confidence_allowlist_;
 
   // URL Lookup service suffix for logging metrics.
diff --git a/components/search/ntp_features.cc b/components/search/ntp_features.cc
index d14a2bb..4002cb9 100644
--- a/components/search/ntp_features.cc
+++ b/components/search/ntp_features.cc
@@ -260,6 +260,11 @@
              "NtpHistoryClustersModuleLoad",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Dummy feature to set kNtpHistoryClustersModuleMaxClustersParam.
+BASE_FEATURE(kNtpHistoryClustersModuleMaxClusters,
+             "NtpHistoryClustersMaxClusters",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // If enabled, module headers will display an associated icon.
 BASE_FEATURE(kNtpModulesHeaderIcon,
              "NtpModulesHeaderIcon",
@@ -329,6 +334,10 @@
     "NtpHistoryClustersModuleCategoriesParam";
 const char kNtpHistoryClustersModuleCategoriesBlocklistParam[] =
     "NtpHistoryClustersModuleCategoriesBlocklistParam";
+const char kNtpHistoryClustersModuleCategoriesBoostlistParam[] =
+    "NtpHistoryClustersModuleCategoriesBoostlistParam";
+const char kNtpHistoryClustersModuleMaxClustersParam[] =
+    "NtpHistoryClustersModuleMaxClustersParam";
 
 base::TimeDelta GetModulesLoadTimeout() {
   std::string param_value = base::GetFieldTrialParamValueByFeature(
diff --git a/components/search/ntp_features.h b/components/search/ntp_features.h
index 8e623a2..69dd969 100644
--- a/components/search/ntp_features.h
+++ b/components/search/ntp_features.h
@@ -69,6 +69,7 @@
 BASE_DECLARE_FEATURE(kNtpHistoryClustersModuleMinimumImagesRequired);
 BASE_DECLARE_FEATURE(kNtpHistoryClustersModuleCategories);
 BASE_DECLARE_FEATURE(kNtpHistoryClustersModuleLoad);
+BASE_DECLARE_FEATURE(kNtpHistoryClustersModuleMaxClusters);
 BASE_DECLARE_FEATURE(kNtpModulesHeaderIcon);
 
 // Parameter for controlling the luminosity difference for NTP elements on light
@@ -153,6 +154,12 @@
 // Parameter for determining the categories a history cluster must not fall into
 // to be shown.
 extern const char kNtpHistoryClustersModuleCategoriesBlocklistParam[];
+// Parameter for determining the categories a history cluster falls into to be
+// boosted for showing on the New Tab Page.
+extern const char kNtpHistoryClustersModuleCategoriesBoostlistParam[];
+// Parameter for setting the maximum number of candidate clusters for the
+// History Clusters Service to return.
+extern const char kNtpHistoryClustersModuleMaxClustersParam[];
 
 // Returns the timeout after which the load of a module should be aborted.
 base::TimeDelta GetModulesLoadTimeout();
diff --git a/components/security_interstitials/content/cert_logger.proto b/components/security_interstitials/content/cert_logger.proto
index adabf86..fa46211e 100644
--- a/components/security_interstitials/content/cert_logger.proto
+++ b/components/security_interstitials/content/cert_logger.proto
@@ -359,4 +359,7 @@
   // Debug information pertaining to the TrustStoreNSS instance used by the
   // trial verifier (if NSS is used).
   optional TrustStoreNSSDebugInfo trial_nss_debug_info = 18;
+
+  // The Linux distribution name, if report is from Linux.
+  optional string linux_distro = 19;
 }
diff --git a/components/security_interstitials/content/certificate_error_report.cc b/components/security_interstitials/content/certificate_error_report.cc
index 0430abef..50933f3 100644
--- a/components/security_interstitials/content/certificate_error_report.cc
+++ b/components/security_interstitials/content/certificate_error_report.cc
@@ -25,6 +25,10 @@
 #include "net/cert/internal/trust_store_mac.h"
 #endif
 
+#if BUILDFLAG(IS_LINUX)
+#include "base/linux_util.h"
+#endif
+
 #include "net/cert/cert_verify_result.h"
 
 using network_time::NetworkTimeTracker;
@@ -293,6 +297,9 @@
   AddWinPlatformDebugInfoToReport(debug_info->win_platform_debug_info,
                                   trial_report);
 #endif
+#if BUILDFLAG(IS_LINUX)
+  trial_report->set_linux_distro(base::GetLinuxDistro());
+#endif
 #if BUILDFLAG(USE_NSS_CERTS)
   trial_report->set_nss_version(debug_info->nss_version);
   AddNSSDebugInfoToReport(debug_info->primary_nss_debug_info,
diff --git a/components/security_interstitials/content/certificate_error_report_unittest.cc b/components/security_interstitials/content/certificate_error_report_unittest.cc
index bda1c66..3c5e3b7 100644
--- a/components/security_interstitials/content/certificate_error_report_unittest.cc
+++ b/components/security_interstitials/content/certificate_error_report_unittest.cc
@@ -457,6 +457,14 @@
   EXPECT_FALSE(trial_info.has_win_platform_debug_info());
 #endif
 
+#if BUILDFLAG(IS_LINUX)
+  // Can't really test anything more than that it is present, since the
+  // unittest could be running on any distro.
+  EXPECT_TRUE(trial_info.has_linux_distro());
+#else
+  EXPECT_FALSE(trial_info.has_linux_distro());
+#endif
+
 #if BUILDFLAG(USE_NSS_CERTS)
   ASSERT_TRUE(trial_info.has_nss_version());
   EXPECT_EQ("aoeu", trial_info.nss_version());
diff --git a/components/segmentation_platform/public/constants.cc b/components/segmentation_platform/public/constants.cc
index e4baf80..40212e23 100644
--- a/components/segmentation_platform/public/constants.cc
+++ b/components/segmentation_platform/public/constants.cc
@@ -44,6 +44,8 @@
     return kResumeHeavyUserUmaName;
   } else if (segmentation_key == kDeviceSwitcherKey) {
     return kDeviceSwitcherUmaName;
+  } else if (segmentation_key == kTabletProductivityUserKey) {
+    return kTabletProductivityUserUmaName;
   } else if (base::StartsWith(segmentation_key, "test_key")) {
     return "TestKey";
   }
@@ -99,6 +101,9 @@
       return "ChromeStartAndroidV2";
     case proto::SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_DEVICE_SWITCHER:
       return "DeviceSwitcher";
+    case proto::SegmentId::
+        OPTIMIZATION_TARGET_SEGMENTATION_TABLET_PRODUCTIVITY_USER:
+      return "TabletProductivityUserSegment";
     default:
       // This case is reached when UNKNOWN segment is valid, in case of boolean
       // segment results.
diff --git a/components/segmentation_platform/public/constants.h b/components/segmentation_platform/public/constants.h
index 52a2e43a..2293947 100644
--- a/components/segmentation_platform/public/constants.h
+++ b/components/segmentation_platform/public/constants.h
@@ -78,6 +78,11 @@
 const char kDeviceSwitcherKey[] = "device_switcher";
 const char kDeviceSwitcherUmaName[] = "DeviceSwitcher";
 
+// The key is used to decide whether the user is categorised as tablet
+// productivity or not.
+const char kTabletProductivityUserKey[] = "tablet_productivity_user";
+const char kTabletProductivityUserUmaName[] = "TabletProductivityUser";
+
 // The key provide a list of segment IDs, separated by commas, whose ML model
 // execution results are allowed to be uploaded through UKM.
 const char kSegmentIdsAllowedForReportingKey[] =
diff --git a/components/segmentation_platform/public/proto/segmentation_platform.proto b/components/segmentation_platform/public/proto/segmentation_platform.proto
index 488b87f1..78ba302 100644
--- a/components/segmentation_platform/public/proto/segmentation_platform.proto
+++ b/components/segmentation_platform/public/proto/segmentation_platform.proto
@@ -49,6 +49,8 @@
   OPTIMIZATION_TARGET_SEGMENTATION_DEVICE_SWITCHER = 27;
   // Target for segmentation: Adaptive toolbar.
   OPTIMIZATION_TARGET_SEGMENTATION_ADAPTIVE_TOOLBAR = 28;
+  // Target for segmentation: Determine users who are tabletproductivity users.
+  OPTIMIZATION_TARGET_SEGMENTATION_TABLET_PRODUCTIVITY_USER = 29;
   // Add new entries to OptimizationTarget proto.
 
   // New entries should start from a 1000 if OptimizationTarget does not
diff --git a/components/services/storage/service_worker/service_worker_database.cc b/components/services/storage/service_worker/service_worker_database.cc
index 42ef302..7816d49 100644
--- a/components/services/storage/service_worker/service_worker_database.cc
+++ b/components/services/storage/service_worker/service_worker_database.cc
@@ -1480,9 +1480,8 @@
   return WriteBatch(&batch);
 }
 
-ServiceWorkerDatabase::Status
-ServiceWorkerDatabase::DeleteAllDataForStorageKeys(
-    const std::set<blink::StorageKey>& keys,
+ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteAllDataForOrigins(
+    const std::set<url::Origin>& origins,
     std::vector<int64_t>* newly_purgeable_resources) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   Status status = LazyOpen(false);
@@ -1503,10 +1502,7 @@
   for (const mojom::ServiceWorkerRegistrationDataPtr& reg : registrations) {
     blink::StorageKey& key = reg->key;
 
-    for (const blink::StorageKey& requested_key : keys) {
-      // Only the origin of the requested key is relevant.
-      const url::Origin& requested_origin = requested_key.origin();
-
+    for (const url::Origin& requested_origin : origins) {
       if (requested_origin.opaque()) {
         return Status::kErrorFailed;
       }
diff --git a/components/services/storage/service_worker/service_worker_database.h b/components/services/storage/service_worker/service_worker_database.h
index c9764a7..f9e0806 100644
--- a/components/services/storage/service_worker/service_worker_database.h
+++ b/components/services/storage/service_worker/service_worker_database.h
@@ -289,8 +289,8 @@
   // Resources are moved to the purgeable list. Returns OK if
   // they are successfully deleted or not found in the database. Otherwise,
   // returns an error.
-  Status DeleteAllDataForStorageKeys(
-      const std::set<blink::StorageKey>& keys,
+  Status DeleteAllDataForOrigins(
+      const std::set<url::Origin>& origins,
       std::vector<int64_t>* newly_purgeable_resources);
 
   // Completely deletes the contents of the database.
diff --git a/components/services/storage/service_worker/service_worker_database_unittest.cc b/components/services/storage/service_worker/service_worker_database_unittest.cc
index 96567e3e..b1dd04c 100644
--- a/components/services/storage/service_worker/service_worker_database_unittest.cc
+++ b/components/services/storage/service_worker/service_worker_database_unittest.cc
@@ -2547,14 +2547,12 @@
                                     CreateUserData(exiting_data.registration_id,
                                                    {{"key1", "value1"}})));
 
-  // invoke DeleteAllDataForStorageKeys
+  // invoke DeleteAllDataForOrigins
   std::vector<int64_t> newly_purgeable_resources;
   auto origin_obj = url::Origin::Create(GURL(deleted_origin));
-  const blink::StorageKey deleted_key =
-      blink::StorageKey::CreateFirstParty(origin_obj);
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
-            database->DeleteAllDataForStorageKeys({deleted_key},
-                                                  &newly_purgeable_resources));
+            database->DeleteAllDataForOrigins({origin_obj},
+                                              &newly_purgeable_resources));
 
   if (expect_key_deleted) {
     // `registered_key` should be removed from the unique origin list.
@@ -2725,21 +2723,20 @@
                 data2.registration_id, registered_key,
                 CreateUserData(data2.registration_id, {{"key4", "value4"}})));
 
-  // invoke DeleteAllDataForStorageKeys
+  // invoke DeleteAllDataForOrigins
   std::vector<int64_t> newly_purgeable_resources;
-  auto make_key = [](std::string origin) {
-    return blink::StorageKey::CreateFirstParty(
-        url::Origin::Create(GURL(origin)));
+  auto make_origin = [](std::string origin) {
+    return url::Origin::Create(GURL(origin));
   };
   ASSERT_EQ(ServiceWorkerDatabase::Status::kOk,
-            database->DeleteAllDataForStorageKeys(
+            database->DeleteAllDataForOrigins(
                 {
                     // This key does not correspond to the registered data.
-                    make_key("https://other.com"),
+                    make_origin("https://other.com"),
                     // Delete the registered data precisely.
-                    make_key("https://example.com"),
+                    make_origin("https://example.com"),
                     // With 3PSP enabled, this will delete the same data.
-                    make_key("https://sub2.example.com"),
+                    make_origin("https://sub2.example.com"),
                 },
                 &newly_purgeable_resources));
 
diff --git a/components/services/storage/service_worker/service_worker_storage.cc b/components/services/storage/service_worker/service_worker_storage.cc
index 8b534c3..99e15f2 100644
--- a/components/services/storage/service_worker/service_worker_storage.cc
+++ b/components/services/storage/service_worker/service_worker_storage.cc
@@ -1275,12 +1275,11 @@
   }
 
   for (const auto& update : policy_updates) {
-    const blink::StorageKey key =
-        blink::StorageKey::CreateFirstParty(update->origin);
+    const url::Origin origin = update->origin;
     if (!update->purge_on_shutdown)
-      keys_to_purge_on_shutdown_.erase(key);
+      origins_to_purge_on_shutdown_.erase(origin);
     else
-      keys_to_purge_on_shutdown_.insert(std::move(key));
+      origins_to_purge_on_shutdown_.insert(std::move(origin));
   }
 
   std::move(callback).Run(ServiceWorkerDatabase::Status::kOk);
@@ -1600,8 +1599,8 @@
 
 void ServiceWorkerStorage::ClearSessionOnlyOrigins() {
   database_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&DeleteAllDataForStorageKeysFromDB,
-                                database_.get(), keys_to_purge_on_shutdown_));
+      FROM_HERE, base::BindOnce(&DeleteAllDataForOriginsFromDB, database_.get(),
+                                origins_to_purge_on_shutdown_));
 }
 
 void ServiceWorkerStorage::OnResourceReaderDisconnected(
@@ -1964,13 +1963,13 @@
       base::BindOnce(std::move(callback), status, std::move(user_data)));
 }
 
-void ServiceWorkerStorage::DeleteAllDataForStorageKeysFromDB(
+void ServiceWorkerStorage::DeleteAllDataForOriginsFromDB(
     ServiceWorkerDatabase* database,
-    const std::set<blink::StorageKey>& keys) {
+    const std::set<url::Origin>& origins) {
   DCHECK(database);
 
   std::vector<int64_t> newly_purgeable_resources;
-  database->DeleteAllDataForStorageKeys(keys, &newly_purgeable_resources);
+  database->DeleteAllDataForOrigins(origins, &newly_purgeable_resources);
 }
 
 void ServiceWorkerStorage::PerformStorageCleanupInDB(
diff --git a/components/services/storage/service_worker/service_worker_storage.h b/components/services/storage/service_worker/service_worker_storage.h
index 624bdbb..0ec05ebb 100644
--- a/components/services/storage/service_worker/service_worker_storage.h
+++ b/components/services/storage/service_worker/service_worker_storage.h
@@ -517,9 +517,9 @@
       scoped_refptr<base::SequencedTaskRunner> original_task_runner,
       const std::string& key_prefix,
       GetUserDataForAllRegistrationsInDBCallback callback);
-  static void DeleteAllDataForStorageKeysFromDB(
+  static void DeleteAllDataForOriginsFromDB(
       ServiceWorkerDatabase* database,
-      const std::set<blink::StorageKey>& keys);
+      const std::set<url::Origin>& origins);
   static void PerformStorageCleanupInDB(ServiceWorkerDatabase* database);
   static void GetPurgeableResourceIdsFromDB(
       ServiceWorkerDatabase* database,
@@ -541,7 +541,7 @@
   // StorageKeys having registations.
   std::set<blink::StorageKey> registered_keys_;
   // The set of StorageKeys whose storage should be cleaned on shutdown.
-  std::set<blink::StorageKey> keys_to_purge_on_shutdown_;
+  std::set<url::Origin> origins_to_purge_on_shutdown_;
 
   // Pending database tasks waiting for initialization.
   std::vector<base::OnceClosure> pending_tasks_;
diff --git a/components/strings/BUILD.gn b/components/strings/BUILD.gn
index 48e6f4f1..7586c9b 100644
--- a/components/strings/BUILD.gn
+++ b/components/strings/BUILD.gn
@@ -4,6 +4,7 @@
 
 import("//build/config/locales.gni")
 import("//components/feed/features.gni")
+import("//components/services/screen_ai/buildflags/features.gni")
 import("//device/vr/buildflags/buildflags.gni")
 import("//pdf/features.gni")
 import("//ppapi/buildflags/buildflags.gni")
@@ -35,6 +36,7 @@
     "enable_pdf=$enable_pdf",
     "enable_plugins=$enable_plugins",
     "enable_print_preview=$enable_print_preview",
+    "enable_screen_ai_service=$enable_screen_ai_service",
     "enable_vr=$enable_vr",
   ]
 
diff --git a/components/sync/base/features.cc b/components/sync/base/features.cc
index 40b10e856..4fd4f16 100644
--- a/components/sync/base/features.cc
+++ b/components/sync/base/features.cc
@@ -134,4 +134,10 @@
              "SyncPollImmediatelyOnEveryStartup",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+#if BUILDFLAG(IS_IOS)
+BASE_FEATURE(kIndicateAccountStorageErrorInAccountCell,
+             "IndicatePassphraseErrorForSignedInUser",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+#endif  // BUILDFLAG(IS_IOS)
+
 }  // namespace syncer
diff --git a/components/sync/base/features.h b/components/sync/base/features.h
index 92f1232..bfa61a3 100644
--- a/components/sync/base/features.h
+++ b/components/sync/base/features.h
@@ -181,6 +181,12 @@
 // TODO(crbug.com/1425071): Remove this.
 BASE_DECLARE_FEATURE(kSyncPollImmediatelyOnEveryStartup);
 
+#if BUILDFLAG(IS_IOS)
+// Feature flag to enable indicating the Account Storage error in the Account
+// Cell when Sync is turned OFF (iOS only).
+BASE_DECLARE_FEATURE(kIndicateAccountStorageErrorInAccountCell);
+#endif  // BUILDFLAG(IS_IOS)
+
 }  // namespace syncer
 
 #endif  // COMPONENTS_SYNC_BASE_FEATURES_H_
diff --git a/components/sync_preferences/dual_layer_user_pref_store.cc b/components/sync_preferences/dual_layer_user_pref_store.cc
index 0ef89617..adacf8b 100644
--- a/components/sync_preferences/dual_layer_user_pref_store.cc
+++ b/components/sync_preferences/dual_layer_user_pref_store.cc
@@ -11,6 +11,7 @@
 #include "base/observer_list.h"
 #include "base/strings/string_piece.h"
 #include "base/values.h"
+#include "components/sync_preferences/syncable_prefs_database.h"
 
 namespace sync_preferences {
 
@@ -56,11 +57,13 @@
 }
 
 DualLayerUserPrefStore::DualLayerUserPrefStore(
-    scoped_refptr<PersistentPrefStore> local_pref_store)
+    scoped_refptr<PersistentPrefStore> local_pref_store,
+    const SyncablePrefsDatabase* syncable_prefs_database)
     : local_pref_store_(std::move(local_pref_store)),
       account_pref_store_(base::MakeRefCounted<ValueMapPrefStore>()),
       local_pref_store_observer_(this, /*is_account_store=*/false),
-      account_pref_store_observer_(this, /*is_account_store=*/true) {
+      account_pref_store_observer_(this, /*is_account_store=*/true),
+      syncable_prefs_database_(syncable_prefs_database) {
   local_pref_store_->AddObserver(&local_pref_store_observer_);
   account_pref_store_->AddObserver(&account_pref_store_observer_);
 }
@@ -99,7 +102,7 @@
 
 bool DualLayerUserPrefStore::GetValue(base::StringPiece key,
                                       const base::Value** result) const {
-  if (!IsPrefKeySyncable(key)) {
+  if (!IsPrefKeySyncable(std::string(key))) {
     return local_pref_store_->GetValue(key, result);
   }
 
@@ -286,9 +289,12 @@
   local_pref_store_->OnStoreDeletionFromDisk();
 }
 
-bool DualLayerUserPrefStore::IsPrefKeySyncable(base::StringPiece key) const {
-  // TODO(crbug.com/1416477): Hook up to the list of syncable prefs.
-  return true;
+bool DualLayerUserPrefStore::IsPrefKeySyncable(const std::string& key) const {
+  if (!syncable_prefs_database_) {
+    // Safer this way.
+    return false;
+  }
+  return syncable_prefs_database_->IsPreferenceSyncable(key);
 }
 
 }  // namespace sync_preferences
diff --git a/components/sync_preferences/dual_layer_user_pref_store.h b/components/sync_preferences/dual_layer_user_pref_store.h
index 2a8be21f..ff96d7d 100644
--- a/components/sync_preferences/dual_layer_user_pref_store.h
+++ b/components/sync_preferences/dual_layer_user_pref_store.h
@@ -15,9 +15,12 @@
 #include "base/strings/string_piece.h"
 #include "components/prefs/persistent_pref_store.h"
 #include "components/prefs/value_map_pref_store.h"
+#include "components/sync/base/model_type.h"
 
 namespace sync_preferences {
 
+class SyncablePrefsDatabase;
+
 // A two-layer user PrefStore that combines local preferences (scoped to this
 // profile) with account-scoped preferences (scoped to the user's signed-in
 // account).
@@ -29,8 +32,8 @@
 //   account store.
 class DualLayerUserPrefStore : public PersistentPrefStore {
  public:
-  explicit DualLayerUserPrefStore(
-      scoped_refptr<PersistentPrefStore> local_pref_store);
+  DualLayerUserPrefStore(scoped_refptr<PersistentPrefStore> local_pref_store,
+                         const SyncablePrefsDatabase* syncable_prefs_database);
 
   DualLayerUserPrefStore(const DualLayerUserPrefStore&) = delete;
   DualLayerUserPrefStore& operator=(const DualLayerUserPrefStore&) = delete;
@@ -96,7 +99,7 @@
   };
 
   // Returns whether the pref with the given `key` is registered as syncable.
-  bool IsPrefKeySyncable(base::StringPiece key) const;
+  bool IsPrefKeySyncable(const std::string& key) const;
 
   // The two underlying pref stores, scoped to this device/profile and to the
   // user's signed-in account, respectively.
@@ -113,6 +116,8 @@
   bool is_setting_prefs_ = false;
 
   base::ObserverList<PrefStore::Observer, true>::Unchecked observers_;
+
+  const SyncablePrefsDatabase* const syncable_prefs_database_ = nullptr;
 };
 
 }  // namespace sync_preferences
diff --git a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
index 1356cabf..d6adf27f 100644
--- a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
+++ b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/values.h"
 #include "components/prefs/testing_pref_store.h"
+#include "components/sync_preferences/syncable_prefs_database.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -69,14 +70,25 @@
   MOCK_METHOD(void, OnInitializationCompleted, (bool succeeded), (override));
 };
 
+class TestSyncablePrefsDatabase : public SyncablePrefsDatabase {
+ public:
+  absl::optional<SyncablePrefMetadata> GetSyncablePrefMetadata(
+      const std::string& pref_name) const override {
+    return SyncablePrefMetadata{0, syncer::PREFERENCES};
+  }
+};
+
 }  // namespace
 
 class DualLayerUserPrefStoreTestBase : public testing::Test {
  public:
   explicit DualLayerUserPrefStoreTestBase(bool initialize) {
     local_store_ = base::MakeRefCounted<TestingPrefStore>();
-    dual_layer_store_ =
-        base::MakeRefCounted<DualLayerUserPrefStore>(local_store_);
+    dual_layer_store_ = base::MakeRefCounted<DualLayerUserPrefStore>(
+        local_store_, &prefs_database_);
+
+    // TODO(crbug.com/1416480): Add proper test setup to enable and disable data
+    // types appropriately.
 
     if (initialize) {
       local_store_->NotifyInitializationCompleted();
@@ -89,6 +101,7 @@
  protected:
   scoped_refptr<TestingPrefStore> local_store_;
   scoped_refptr<DualLayerUserPrefStore> dual_layer_store_;
+  TestSyncablePrefsDatabase prefs_database_;
 };
 
 class DualLayerUserPrefStoreTest : public DualLayerUserPrefStoreTestBase {
diff --git a/components/sync_preferences/pref_service_syncable_factory.cc b/components/sync_preferences/pref_service_syncable_factory.cc
index bb12c25..9ca7c08 100644
--- a/components/sync_preferences/pref_service_syncable_factory.cc
+++ b/components/sync_preferences/pref_service_syncable_factory.cc
@@ -18,6 +18,7 @@
 #include "components/prefs/pref_value_store.h"
 #include "components/sync/base/features.h"
 #include "components/sync_preferences/dual_layer_user_pref_store.h"
+#include "components/sync_preferences/pref_model_associator_client.h"
 #include "components/sync_preferences/pref_service_syncable.h"
 
 namespace sync_preferences {
@@ -57,9 +58,14 @@
     // If EnablePreferencesAccountStorage is enabled, then a
     // DualLayerUserPrefStore is used as the main user pref store, and sync is
     // hooked up directly to the underlying account store.
+    const SyncablePrefsDatabase* syncable_prefs_database = nullptr;
+    if (pref_model_associator_client_) {
+      syncable_prefs_database =
+          &pref_model_associator_client_->GetSyncablePrefsDatabase();
+    }
     auto dual_layer_user_pref_store =
         base::MakeRefCounted<sync_preferences::DualLayerUserPrefStore>(
-            user_prefs_);
+            user_prefs_, syncable_prefs_database);
     auto pref_value_store = std::make_unique<PrefValueStore>(
         managed_prefs_.get(), supervised_user_prefs_.get(),
         extension_prefs_.get(), standalone_browser_prefs_.get(),
diff --git a/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java b/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java
index d9270d88..72e1dea5 100644
--- a/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java
+++ b/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java
@@ -20,11 +20,9 @@
 import static org.mockito.Mockito.when;
 
 import android.content.SharedPreferences;
-import android.os.Handler;
 import android.os.Looper;
 import android.util.Base64;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -60,7 +58,6 @@
     private HttpURLConnection mConnection;
     private VariationsSeedFetcher mFetcher;
     private SharedPreferences mPrefs;
-    private Looper mOrigLooper;
 
     private static final String sRestrict = "restricted";
     private static final String sMilestone = "64";
@@ -70,9 +67,6 @@
     public void setUp() throws IOException {
         // Pretend we are not on the UI thread, since the class we are testing is supposed to run
         // only on a background thread.
-        Handler handler = ThreadUtils.getUiThreadHandler();
-        if (handler != null) mOrigLooper = handler.getLooper();
-        ThreadUtils.setUiThread(null);
         ThreadUtils.setWillOverrideUiThread(true);
         ThreadUtils.setUiThread(mock(Looper.class));
         mFetcher = spy(VariationsSeedFetcher.get());
@@ -85,16 +79,6 @@
         UmaRecorderHolder.resetForTesting();
     }
 
-    @After
-    public void tearDown() {
-        ThreadUtils.setUiThread(null);
-        if (mOrigLooper != null) {
-            ThreadUtils.setUiThread(mOrigLooper);
-            mOrigLooper = null;
-        }
-        ThreadUtils.setWillOverrideUiThread(false);
-    }
-
     /**
      * Test method for {@link VariationsSeedFetcher#fetchSeed()}.
      *
diff --git a/components/viz/common/frame_sinks/begin_frame_source.cc b/components/viz/common/frame_sinks/begin_frame_source.cc
index 0715424..6ec52f95 100644
--- a/components/viz/common/frame_sinks/begin_frame_source.cc
+++ b/components/viz/common/frame_sinks/begin_frame_source.cc
@@ -520,4 +520,8 @@
   return missed_args;
 }
 
+base::TimeDelta ExternalBeginFrameSource::GetMaximumRefreshFrameInterval() {
+  return BeginFrameArgs::DefaultInterval();
+}
+
 }  // namespace viz
diff --git a/components/viz/common/frame_sinks/begin_frame_source.h b/components/viz/common/frame_sinks/begin_frame_source.h
index 8e7cf25..f9eb9bb 100644
--- a/components/viz/common/frame_sinks/begin_frame_source.h
+++ b/components/viz/common/frame_sinks/begin_frame_source.h
@@ -414,6 +414,9 @@
 
   virtual void SetVSyncDisplayID(int64_t display_id) {}
 
+  // Returns the maximum supported refresh rate interval for a given BFS.
+  virtual base::TimeDelta GetMaximumRefreshFrameInterval();
+
  protected:
   // Called on AddObserver and gets missed BeginFrameArgs for the given
   // observer. The missed BeginFrame is sent only if the returned
diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_ios.h b/components/viz/service/frame_sinks/external_begin_frame_source_ios.h
index a13f643..30b3a635 100644
--- a/components/viz/service/frame_sinks/external_begin_frame_source_ios.h
+++ b/components/viz/service/frame_sinks/external_begin_frame_source_ios.h
@@ -34,6 +34,7 @@
 
   // ExternalBeginFrameSource override:
   void SetPreferredInterval(base::TimeDelta interval) override;
+  base::TimeDelta GetMaximumRefreshFrameInterval() override;
 
   // BeginFrameSource override:
   void SetDynamicBeginFrameDeadlineOffsetSource(
diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_ios.mm b/components/viz/service/frame_sinks/external_begin_frame_source_ios.mm
index f74f00d..233ea47 100644
--- a/components/viz/service/frame_sinks/external_begin_frame_source_ios.mm
+++ b/components/viz/service/frame_sinks/external_begin_frame_source_ios.mm
@@ -4,8 +4,9 @@
 
 #import "components/viz/service/frame_sinks/external_begin_frame_source_ios.h"
 
-#import <Foundation/NSRunLoop.h>
-#import <QuartzCore/CADisplayLink.h>
+#import <Foundation/Foundation.h>
+#import <QuartzCore/QuartzCore.h>
+#import <UIKit/UIKit.h>
 
 #include "base/logging.h"
 #include "base/mac/mach_logging.h"
@@ -14,14 +15,11 @@
 
 namespace {
 
-constexpr float kMinimumRefreshInterval =
+constexpr float kMinimumRefreshRate =
     (viz::BeginFrameArgs::MinInterval() == base::TimeDelta()
          ? 1
          : 1 / viz::BeginFrameArgs::MinInterval().InSecondsF());
 
-constexpr float kMaximumRefreshInterval =
-    (1 / viz::BeginFrameArgs::DefaultInterval().InSecondsF());
-
 // Translates CFTimeInterval to absolute time.
 uint64_t GetMachTimeFromSeconds(CFTimeInterval seconds) {
   mach_timebase_info_data_t info;
@@ -66,6 +64,9 @@
   // maximum refresh rate of display. Eg, if a display supports 60Hz, the
   // refresh rate might be rounded to 15, 20, 30, and 60 FPS respectively.
   float _preferredRefrehRate;
+  // The maximum refresh rate that depends on a maximum supported refresh rate
+  // of a display that a device uses.
+  float _maximumRefreshRate;
 }
 
 @end
@@ -83,7 +84,8 @@
     _displayLink =
         [CADisplayLink displayLinkWithTarget:self
                                     selector:@selector(displayLinkDidFire:)];
-    [self setPreferredInterval:viz::BeginFrameArgs::DefaultInterval()];
+    _maximumRefreshRate = [UIScreen mainScreen].maximumFramesPerSecond;
+    [self setPreferredInterval:base::Hertz(_maximumRefreshRate)];
     [self setEnabled:false];
     [_displayLink addToRunLoop:[NSRunLoop currentRunLoop]
                        forMode:NSRunLoopCommonModes];
@@ -124,16 +126,19 @@
   }
 
   DCHECK_GE(interval, base::TimeDelta());
-  const float refresh_rate =
-      interval.InSecondsF() == 0 ? 0 : (1 / interval.InSecondsF());
+  const float refresh_rate = 1 / interval.InSecondsF();
 
   if (_preferredRefrehRate != refresh_rate) {
-    _preferredRefrehRate = refresh_rate;
+    // The preferred refresh rate mustn't exceed the maximum one. The floating
+    // part can result in exceeding the maximum rate because of the division
+    // operation.
+    _preferredRefrehRate =
+        refresh_rate > _maximumRefreshRate ? _maximumRefreshRate : refresh_rate;
     if (@available(iOS 15, *)) {
       [_displayLink
           setPreferredFrameRateRange:CAFrameRateRange{
-                                         .minimum = kMinimumRefreshInterval,
-                                         .maximum = kMaximumRefreshInterval,
+                                         .minimum = kMinimumRefreshRate,
+                                         .maximum = _maximumRefreshRate,
                                          .preferred = _preferredRefrehRate}];
     } else if (@available(iOS 10, *)) {
       [_displayLink setPreferredFramesPerSecond:_preferredRefrehRate];
@@ -171,6 +176,10 @@
   _client->OnVSync(vsync_time, next_vsync_time, vsync_interval);
 }
 
+- (int64_t)maximumRefreshRate {
+  return _maximumRefreshRate;
+}
+
 @end
 
 namespace viz {
@@ -193,6 +202,14 @@
   [display_link_impl_ setPreferredInterval:interval];
 }
 
+base::TimeDelta ExternalBeginFrameSourceIOS::GetMaximumRefreshFrameInterval() {
+  const int64_t max_refresh_rate = [display_link_impl_ maximumRefreshRate];
+  if (UNLIKELY(max_refresh_rate <= 0)) {
+    return BeginFrameArgs::DefaultInterval();
+  }
+  return base::Hertz(max_refresh_rate);
+}
+
 void ExternalBeginFrameSourceIOS::SetDynamicBeginFrameDeadlineOffsetSource(
     DynamicBeginFrameDeadlineOffsetSource*
         dynamic_begin_frame_deadline_offset_source) {
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
index fc5d840c..84ab6b2 100644
--- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
+++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
@@ -549,6 +549,11 @@
     use_preferred_interval_ = true;
   }
 #endif
+
+  if (external_begin_frame_source_) {
+    display_frame_interval_ =
+        external_begin_frame_source_->GetMaximumRefreshFrameInterval();
+  }
 }
 
 void RootCompositorFrameSinkImpl::DisplayOutputSurfaceLost() {
diff --git a/components/webxr/android/BUILD.gn b/components/webxr/android/BUILD.gn
index 9d391266..d1c0434 100644
--- a/components/webxr/android/BUILD.gn
+++ b/components/webxr/android/BUILD.gn
@@ -91,10 +91,10 @@
     sources += [
       "//components/webxr/android/java/src/org/chromium/components/webxr/ArCompositorDelegate.java",
       "//components/webxr/android/java/src/org/chromium/components/webxr/ArCompositorDelegateProvider.java",
-      "//components/webxr/android/java/src/org/chromium/components/webxr/ArDelegate.java",
       "//components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateImpl.java",
       "//components/webxr/android/java/src/org/chromium/components/webxr/XrImmersiveOverlay.java",
       "//components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java",
+      "//components/webxr/android/java/src/org/chromium/components/webxr/XrSessionTypeSupplier.java",
     ]
 
     deps += [
@@ -114,7 +114,6 @@
       "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java",
       "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShim.java",
       "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShimImpl.java",
-      "//components/webxr/android/java/src/org/chromium/components/webxr/ArDelegateImpl.java",
       "//components/webxr/android/java/src/org/chromium/components/webxr/ArOverlayDelegate.java",
     ]
 
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/ArClassProvider.java b/components/webxr/android/java/src/org/chromium/components/webxr/ArClassProvider.java
index 729e316..1ef6935e 100644
--- a/components/webxr/android/java/src/org/chromium/components/webxr/ArClassProvider.java
+++ b/components/webxr/android/java/src/org/chromium/components/webxr/ArClassProvider.java
@@ -14,10 +14,6 @@
  * corresponding /stubs/ version of this class.
  */
 /*package*/ class ArClassProvider {
-    /*package*/ static @Nullable ArDelegate getArDelegate() {
-        return new ArDelegateImpl();
-    }
-
     /*package*/ static @Nullable XrImmersiveOverlay.Delegate getOverlayDelegate(
             @NonNull ArCompositorDelegate compositorDelegate, boolean useOverlay,
             boolean canRenderDomContent) {
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/ArDelegate.java b/components/webxr/android/java/src/org/chromium/components/webxr/ArDelegate.java
deleted file mode 100644
index e9a63675..0000000
--- a/components/webxr/android/java/src/org/chromium/components/webxr/ArDelegate.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.webxr;
-
-import org.chromium.base.supplier.ObservableSupplier;
-
-/**
- * Interface used by XrDelegate to communicate with AR code that is only
- * available if |enable_arcore| is set to true at build time.
- */
-/*package*/ interface ArDelegate {
-    /**
-     * Used to let AR immersive mode intercept the Back button to exit immersive mode.
-     */
-    boolean onBackPressed();
-
-    /**
-     * Used to query and notify if there is an active immersive AR Session.
-     */
-    ObservableSupplier<Boolean> getHasActiveArSessionSupplier();
-}
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/ArDelegateImpl.java b/components/webxr/android/java/src/org/chromium/components/webxr/ArDelegateImpl.java
deleted file mode 100644
index 73558d5..0000000
--- a/components/webxr/android/java/src/org/chromium/components/webxr/ArDelegateImpl.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.webxr;
-
-import org.chromium.base.supplier.ObservableSupplier;
-import org.chromium.build.annotations.UsedByReflection;
-
-/**
- * This class provides methods to call into AR. It will be compiled into Chrome
- * only if |enable_arcore| is set at build time.
- */
-@UsedByReflection("XrDelegateImpl.java")
-/*package*/ class ArDelegateImpl implements ArDelegate {
-    @UsedByReflection("XrDelegateImpl.java")
-    public ArDelegateImpl() {}
-
-    @Override
-    public boolean onBackPressed() {
-        return XrSessionCoordinator.onBackPressed();
-    }
-
-    @Override
-    public ObservableSupplier<Boolean> getHasActiveArSessionSupplier() {
-        return XrSessionCoordinator.hasActiveArSessionSupplier();
-    }
-}
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateImpl.java b/components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateImpl.java
index 3936aee..38ed303 100644
--- a/components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateImpl.java
+++ b/components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateImpl.java
@@ -4,13 +4,9 @@
 
 package org.chromium.components.webxr;
 
-import androidx.annotation.IntDef;
-
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
+import org.chromium.components.webxr.XrSessionCoordinator.SessionType;
 
 /**
  * This class provides methods to interact with and query the state of any Xr
@@ -24,49 +20,27 @@
     private static final String TAG = "XrDelegateImpl";
     private static final boolean DEBUG_LOGS = false;
 
-    @IntDef({SessionType.NONE, SessionType.AR, SessionType.VR})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface SessionType {
-        int NONE = 0;
-        int AR = 1;
-        int VR = 2;
-    }
-
-    // The ArDelegate is either included in the build or not, so it's okay to
-    // cache an instance of it.
-    private ArDelegate mArDelegate;
-
-    private @XrDelegateImpl.SessionType int mActiveSession = XrDelegateImpl.SessionType.NONE;
+    private @SessionType int mActiveSession = SessionType.NONE;
 
     private ObservableSupplierImpl<Boolean> mHasActiveSessionSupplier =
             new ObservableSupplierImpl<>();
 
     public XrDelegateImpl() {
-        mArDelegate = ArClassProvider.getArDelegate();
-        if (mArDelegate != null) {
-            mArDelegate.getHasActiveArSessionSupplier().addObserver(this::setHasActiveArSession);
-        }
+        XrSessionCoordinator.getActiveSessionTypeSupplier().addObserver(this::setActiveSessionType);
     }
 
-    private void setHasActiveArSession(Boolean hasSession) {
-        if (hasSession) {
-            assert (mActiveSession == XrDelegateImpl.SessionType.NONE);
-            mActiveSession = XrDelegateImpl.SessionType.AR;
-            mHasActiveSessionSupplier.set(true);
-        } else if (mActiveSession == XrDelegateImpl.SessionType.AR) {
-            mActiveSession = XrDelegateImpl.SessionType.NONE;
-            mHasActiveSessionSupplier.set(false);
+    private void setActiveSessionType(@SessionType int sessionType) {
+        boolean hasActiveSession = (mActiveSession != SessionType.NONE);
+        boolean nowHasActiveSession = (sessionType != SessionType.NONE);
+        mActiveSession = sessionType;
+        if (hasActiveSession != nowHasActiveSession) {
+            mHasActiveSessionSupplier.set(nowHasActiveSession);
         }
     }
 
     @Override
     public boolean onBackPressed() {
-        if (mActiveSession == XrDelegateImpl.SessionType.AR) {
-            // If we have an active AR session we must have an ArDelegate.
-            return mArDelegate.onBackPressed();
-        }
-
-        return false;
+        return XrSessionCoordinator.onBackPressed();
     }
 
     @Override
@@ -81,6 +55,6 @@
 
     @Override
     public boolean hasActiveArSession() {
-        return mActiveSession == XrDelegateImpl.SessionType.AR;
+        return mActiveSession == SessionType.AR;
     }
 }
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java b/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java
index d0e3829..2ea1c9c2 100644
--- a/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java
+++ b/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java
@@ -8,17 +8,20 @@
 import android.content.Context;
 import android.view.Surface;
 
+import androidx.annotation.IntDef;
+
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.base.supplier.ObservableSupplier;
-import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.WindowAndroid;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
 /**
  * Provides static methods called by the XrDelegateImpl as well as JNI methods to the C/C++ code
  * in order to interact with the various bits of the Java side of a session. This includes the
@@ -32,6 +35,14 @@
     private static final String TAG = "XrSessionCoordinator";
     private static final boolean DEBUG_LOGS = false;
 
+    @IntDef({SessionType.NONE, SessionType.AR, SessionType.VR})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface SessionType {
+        int NONE = 0;
+        int AR = 1;
+        int VR = 2;
+    }
+
     private long mNativeXrSessionCoordinator;
 
     // The native ArCoreDevice runtime creates a XrSessionCoordinator instance in its constructor,
@@ -47,9 +58,11 @@
     // session.
     private static XrSessionCoordinator sActiveSessionInstance;
 
+    private @SessionType int mActiveSessionType = SessionType.NONE;
+
     /** Whether there is a non-null valid {@link #sActiveSessionInstance}. */
-    private static ObservableSupplierImpl<Boolean> sActiveSessionAvailableSupplier =
-            new ObservableSupplierImpl<>();
+    private static XrSessionTypeSupplier sActiveSessionAvailableSupplier =
+            new XrSessionTypeSupplier(SessionType.NONE);
 
     // Helper, obtains android Activity out of passed in WebContents instance.
     // Equivalent to ChromeActivity.fromWebContents(), but does not require that
@@ -84,27 +97,43 @@
         mNativeXrSessionCoordinator = nativeXrSessionCoordinator;
     }
 
-    @CalledByNative
-    private void startSession(final ArCompositorDelegateProvider compositorDelegateProvider,
-            final WebContents webContents, boolean useOverlay, boolean canRenderDomContent) {
-        if (DEBUG_LOGS) Log.i(TAG, "startSession");
-        XrImmersiveOverlay.Delegate overlayDelegate = ArClassProvider.getOverlayDelegate(
-                compositorDelegateProvider.create(webContents), useOverlay, canRenderDomContent);
-        sActiveSessionInstance = this;
-        sActiveSessionAvailableSupplier.set(true);
+    private void startSession(@SessionType int sessionType,
+            XrImmersiveOverlay.Delegate overlayDelegate, final WebContents webContents) {
+        assert (sActiveSessionInstance == null);
+        assert (sessionType != SessionType.NONE);
+
         mImmersiveOverlay = new XrImmersiveOverlay();
         mImmersiveOverlay.show(overlayDelegate, webContents, this);
+
+        sActiveSessionInstance = this;
+        mActiveSessionType = sessionType;
+        sActiveSessionAvailableSupplier.set(sessionType);
+    }
+
+    @CalledByNative
+    private void startArSession(final ArCompositorDelegateProvider compositorDelegateProvider,
+            final WebContents webContents, boolean useOverlay, boolean canRenderDomContent) {
+        if (DEBUG_LOGS) Log.i(TAG, "startArSession");
+        // The higher levels should have guaranteed that we're only called if there isn't any other
+        // active session going on.
+        assert (sActiveSessionInstance == null);
+
+        XrImmersiveOverlay.Delegate overlayDelegate = ArClassProvider.getOverlayDelegate(
+                compositorDelegateProvider.create(webContents), useOverlay, canRenderDomContent);
+        startSession(SessionType.AR, overlayDelegate, webContents);
     }
 
     @CalledByNative
     private void endSession() {
         if (DEBUG_LOGS) Log.i(TAG, "endSession");
         if (mImmersiveOverlay == null) return;
+        assert (sActiveSessionInstance == this);
 
         mImmersiveOverlay.cleanupAndExit();
         mImmersiveOverlay = null;
         sActiveSessionInstance = null;
-        sActiveSessionAvailableSupplier.set(false);
+        mActiveSessionType = SessionType.NONE;
+        sActiveSessionAvailableSupplier.set(SessionType.NONE);
     }
 
     // Called from ArDelegateImpl
@@ -120,10 +149,10 @@
     }
 
     public static boolean hasActiveArSession() {
-        return sActiveSessionInstance != null;
+        return sActiveSessionInstance.mActiveSessionType == SessionType.AR;
     }
 
-    public static ObservableSupplier<Boolean> hasActiveArSessionSupplier() {
+    public static XrSessionTypeSupplier getActiveSessionTypeSupplier() {
         return sActiveSessionAvailableSupplier;
     }
 
@@ -152,7 +181,7 @@
 
     @CalledByNative
     private void onNativeDestroy() {
-        // ArCoreDevice's destructor ends sessions before destroying its native XrSessionCoordinator
+        // Native destructors should ends sessions before destroying the native XrSessionCoordinator
         // object.
         assert sActiveSessionInstance == null : "unexpected active session in onNativeDestroy";
 
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionTypeSupplier.java b/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionTypeSupplier.java
new file mode 100644
index 0000000..b00d4b5
--- /dev/null
+++ b/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionTypeSupplier.java
@@ -0,0 +1,23 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.webxr;
+
+import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.components.webxr.XrSessionCoordinator.SessionType;
+
+/**
+ * A thin wrapper/subclass of ObservableSupplierImpl to add some type safety for the Xr SessionType.
+ */
+public class XrSessionTypeSupplier extends ObservableSupplierImpl<Integer> {
+    public XrSessionTypeSupplier(@SessionType int initialValue) {
+        set(initialValue);
+    }
+
+    @Override
+    public void set(@SessionType Integer value) {
+        assert value != null;
+        super.set(value);
+    }
+}
diff --git a/components/webxr/android/stubs/java/src/org/chromium/components/webxr/ArClassProvider.java b/components/webxr/android/stubs/java/src/org/chromium/components/webxr/ArClassProvider.java
index 56634058..5b60fb55 100644
--- a/components/webxr/android/stubs/java/src/org/chromium/components/webxr/ArClassProvider.java
+++ b/components/webxr/android/stubs/java/src/org/chromium/components/webxr/ArClassProvider.java
@@ -14,10 +14,6 @@
  * need to also be updated here as well.
  */
 /*package*/ class ArClassProvider {
-    /*package*/ static @Nullable ArDelegate getArDelegate() {
-        return null;
-    }
-
     /*package*/ static @Nullable XrImmersiveOverlay.Delegate getOverlayDelegate(
             @NonNull ArCompositorDelegate compositorDelegate, boolean useOverlay,
             boolean canRenderDomContent) {
diff --git a/components/webxr/android/xr_session_coordinator.cc b/components/webxr/android/xr_session_coordinator.cc
index 0497ef66..d7e287d 100644
--- a/components/webxr/android/xr_session_coordinator.cc
+++ b/components/webxr/android/xr_session_coordinator.cc
@@ -61,7 +61,7 @@
   surface_touch_callback_ = std::move(touch_callback);
   surface_destroyed_callback_ = std::move(destroyed_callback);
 
-  Java_XrSessionCoordinator_startSession(
+  Java_XrSessionCoordinator_startArSession(
       env, j_xr_session_coordinator_,
       compositor_delegate_provider.GetJavaObject(),
       webxr::GetJavaWebContents(render_process_id, render_frame_id),
diff --git a/content/app/android/library_loader_hooks.cc b/content/app/android/library_loader_hooks.cc
index cf2b4ff..46be2515 100644
--- a/content/app/android/library_loader_hooks.cc
+++ b/content/app/android/library_loader_hooks.cc
@@ -5,11 +5,13 @@
 #include "content/app/android/library_loader_hooks.h"
 
 #include "base/android/reached_code_profiler.h"
+#include "base/android/task_scheduler/task_runner_android.h"
 #include "base/logging.h"
 #include "base/process/current_process.h"
 #include "base/trace_event/trace_event.h"
 #include "content/common/content_constants_internal.h"
 #include "content/common/url_schemes.h"
+#include "content/public/browser/browser_task_traits.h"
 #include "services/tracing/public/cpp/trace_startup.h"
 
 namespace content {
@@ -54,6 +56,11 @@
             << ", default verbosity = " << logging::GetVlogVerbosity();
   }
 
+  // In Android Java, UI thread is a base/ concept, but needs to know how that
+  // maps onto the BrowserThread::UI in C++.
+  base::TaskRunnerAndroid::SetUiThreadExtension(
+      {BrowserTaskTraitsExtension::kExtensionId, {}});
+
   // Content Schemes need to be registered as early as possible after the
   // CommandLine has been initialized to allow java and tests to use GURL before
   // running ContentMain.
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index f521e2c..1c99ce5 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1160,6 +1160,8 @@
     "interest_group/interest_group_update.h",
     "interest_group/interest_group_update_manager.cc",
     "interest_group/interest_group_update_manager.h",
+    "interest_group/noiser_and_bucketer.cc",
+    "interest_group/noiser_and_bucketer.h",
     "interest_group/storage_interest_group.cc",
     "interest_group/storage_interest_group.h",
     "interest_group/subresource_url_authorizations.cc",
@@ -3014,6 +3016,8 @@
       "attribution_reporting/attribution_os_level_manager.h",
       "attribution_reporting/attribution_os_level_manager_android.cc",
       "attribution_reporting/attribution_os_level_manager_android.h",
+      "attribution_reporting/os_registration.cc",
+      "attribution_reporting/os_registration.h",
       "child_process_launcher_helper_android.cc",
       "contacts/contacts_provider_android.cc",
       "contacts/contacts_provider_android.h",
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
index e59a72a..5eeb01f8 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
@@ -61,6 +61,7 @@
 #if BUILDFLAG(IS_ANDROID)
 #include "components/attribution_reporting/os_registration.h"
 #include "content/browser/attribution_reporting/attribution_os_level_manager.h"
+#include "content/browser/attribution_reporting/os_registration.h"
 #include "net/http/structured_headers.h"
 #include "url/gurl.h"
 #endif
@@ -200,13 +201,6 @@
   GlobalRenderFrameHostId render_frame_id_;
 };
 
-#if BUILDFLAG(IS_ANDROID)
-struct AttributionDataHostManagerImpl::OsTrigger {
-  GURL registration_url;
-  url::Origin top_level_origin;
-};
-#endif
-
 struct AttributionDataHostManagerImpl::DelayedTrigger {
   // Logically const.
   base::TimeTicks delay_until;
@@ -678,18 +672,17 @@
     return;
   }
 
-  attribution_manager_->HandleOsSource(
-      registration_url, context->context_origin(), context->input_event(),
+  attribution_manager_->HandleOsRegistration(
+      OsRegistration(registration_url, context->context_origin(),
+                     context->input_event()),
       context->render_frame_id());
 }
 
 void AttributionDataHostManagerImpl::OsTriggerDataAvailable(
     const GURL& registration_url) {
   MaybeBufferTrigger([&](const ReceiverContext& context) {
-    return OsTrigger{
-        .registration_url = registration_url,
-        .top_level_origin = context.context_origin(),
-    };
+    return OsRegistration(registration_url, context.context_origin(),
+                          /*input_event=*/absl::nullopt);
   });
 }
 
@@ -710,10 +703,10 @@
                     attribution_manager_->HandleTrigger(std::move(trigger),
                                                         render_frame_id);
                   },
-                  [&](const OsTrigger& trigger) {
-                    attribution_manager_->HandleOsTrigger(
-                        trigger.registration_url, trigger.top_level_origin,
-                        render_frame_id);
+                  [&](OsRegistration trigger) {
+                    DCHECK(!trigger.input_event.has_value());
+                    attribution_manager_->HandleOsRegistration(
+                        std::move(trigger), render_frame_id);
                   },
               },
               std::move(trigger));
@@ -958,9 +951,11 @@
       GURL registration_url =
           attribution_reporting::ParseOsSourceOrTriggerHeader(*result);
 
-      attribution_manager_->HandleOsSource(
-          registration_url, registrations.source_origin(),
-          registrations.input_event(), registrations.render_frame_id());
+      attribution_manager_->HandleOsRegistration(
+          OsRegistration(std::move(registration_url),
+                         registrations.source_origin(),
+                         registrations.input_event()),
+          registrations.render_frame_id());
     }
   });
 }
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.h b/content/browser/attribution_reporting/attribution_data_host_manager_impl.h
index 3ed79f8..adbde74 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.h
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.h
@@ -51,6 +51,10 @@
 
 struct GlobalRenderFrameHostId;
 
+#if BUILDFLAG(IS_ANDROID)
+struct OsRegistration;
+#endif
+
 // Manages a receiver set of all ongoing `AttributionDataHost`s and forwards
 // events to the `AttributionManager` that owns `this`. Because attributionsrc
 // requests may continue until after we have detached a frame, all browser
@@ -125,8 +129,7 @@
       absl::variant<blink::AttributionSrcToken, BeaconId>;
 
 #if BUILDFLAG(IS_ANDROID)
-  struct OsTrigger;
-  using TriggerPayload = absl::variant<AttributionTrigger, OsTrigger>;
+  using TriggerPayload = absl::variant<AttributionTrigger, OsRegistration>;
 #else
   using TriggerPayload = AttributionTrigger;
 #endif
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
index d76ec81..2f47f52 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
@@ -65,6 +65,7 @@
 #if BUILDFLAG(IS_ANDROID)
 #include "components/attribution_reporting/os_support.mojom.h"
 #include "content/browser/attribution_reporting/attribution_os_level_manager_android.h"
+#include "content/browser/attribution_reporting/os_registration.h"
 #endif
 
 namespace content {
@@ -776,8 +777,10 @@
   const auto source_site = *SuitableOrigin::Deserialize("https://source.test");
 
   EXPECT_CALL(mock_manager_,
-              HandleOsSource(GURL("https://r.test/x"), *source_site,
-                             /*input_event=*/_, kFrameId));
+              HandleOsRegistration(
+                  OsRegistration(GURL("https://r.test/x"), *source_site,
+                                 AttributionInputEvent()),
+                  kFrameId));
 
   auto headers = base::MakeRefCounted<net::HttpResponseHeaders>("");
   headers->SetHeader(kAttributionReportingRegisterOsSourceHeader,
@@ -805,7 +808,7 @@
   const auto reporter = *SuitableOrigin::Deserialize("https://report.test");
   const auto source_site = *SuitableOrigin::Deserialize("https://source.test");
 
-  EXPECT_CALL(mock_manager_, HandleOsSource).Times(0);
+  EXPECT_CALL(mock_manager_, HandleOsRegistration).Times(0);
 
   auto headers = base::MakeRefCounted<net::HttpResponseHeaders>("");
   headers->SetHeader(kAttributionReportingRegisterOsSourceHeader, "!");
@@ -831,7 +834,7 @@
   const auto source_site = *SuitableOrigin::Deserialize("https://source.test");
 
 #if BUILDFLAG(IS_ANDROID)
-  EXPECT_CALL(mock_manager_, HandleOsSource).Times(0);
+  EXPECT_CALL(mock_manager_, HandleOsRegistration).Times(0);
 #endif
   EXPECT_CALL(mock_manager_, HandleSource).Times(0);
 
@@ -1782,8 +1785,10 @@
   auto source_origin = *SuitableOrigin::Deserialize("https://source.test");
 
   EXPECT_CALL(mock_manager_,
-              HandleOsSource(GURL("https://r.test/x"), *source_origin,
-                             /*input_event=*/_, kFrameId))
+              HandleOsRegistration(
+                  OsRegistration(GURL("https://r.test/x"), *source_origin,
+                                 AttributionInputEvent()),
+                  kFrameId))
       .Times(2);
 
   NavigationBeaconId navigation_id(123);
@@ -2071,8 +2076,11 @@
   const auto kTopLevelOrigin = *SuitableOrigin::Deserialize("https://a.test");
   const GURL kRegistrationUrl("https://b.test/x");
 
-  EXPECT_CALL(mock_manager_,
-              HandleOsSource(kRegistrationUrl, *kTopLevelOrigin, _, kFrameId));
+  EXPECT_CALL(
+      mock_manager_,
+      HandleOsRegistration(OsRegistration(kRegistrationUrl, *kTopLevelOrigin,
+                                          AttributionInputEvent()),
+                           kFrameId));
 
   mojo::Remote<blink::mojom::AttributionDataHost> data_host_remote;
   data_host_manager_.RegisterDataHost(
@@ -2088,8 +2096,11 @@
   const auto kTopLevelOrigin = *SuitableOrigin::Deserialize("https://a.test");
   const GURL kRegistrationUrl("https://b.test/x");
 
-  EXPECT_CALL(mock_manager_,
-              HandleOsTrigger(kRegistrationUrl, *kTopLevelOrigin, kFrameId));
+  EXPECT_CALL(
+      mock_manager_,
+      HandleOsRegistration(OsRegistration(kRegistrationUrl, *kTopLevelOrigin,
+                                          /*input_event=*/absl::nullopt),
+                           kFrameId));
 
   mojo::Remote<blink::mojom::AttributionDataHost> data_host_remote;
   data_host_manager_.RegisterDataHost(
diff --git a/content/browser/attribution_reporting/attribution_internals_browsertest.cc b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
index d0e7ce0..08e00ac 100644
--- a/content/browser/attribution_reporting/attribution_internals_browsertest.cc
+++ b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
@@ -60,12 +60,10 @@
 #include "url/origin.h"
 
 #if BUILDFLAG(IS_ANDROID)
-#include "content/browser/attribution_reporting/attribution_reporting.mojom.h"
-#endif
-
-#if BUILDFLAG(IS_ANDROID)
 #include "components/attribution_reporting/os_support.mojom.h"
+#include "content/browser/attribution_reporting/attribution_input_event.h"
 #include "content/browser/attribution_reporting/attribution_os_level_manager_android.h"
+#include "content/browser/attribution_reporting/os_registration.h"
 #endif
 
 namespace content {
@@ -449,8 +447,10 @@
   TitleWatcher title_watcher(shell()->web_contents(), kCompleteTitle);
 
   manager()->NotifyOsRegistration(
-      GURL("https://a.test"), url::Origin::Create(GURL("https://b.test")),
-      attribution_reporting::mojom::OsRegistrationType::kSource, false);
+      OsRegistration(GURL("https://a.test"),
+                     url::Origin::Create(GURL("https://b.test")),
+                     AttributionInputEvent()),
+      /*is_debug_key_allowed=*/false);
   EXPECT_EQ(kCompleteTitle, title_watcher.WaitAndGetTitle());
 }
 #endif  // BUILDFLAG(IS_ANDROID)
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
index 5d5e1ae..0c5d7a7 100644
--- a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
+++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
@@ -61,6 +61,7 @@
 
 #if BUILDFLAG(IS_ANDROID)
 #include "content/browser/attribution_reporting/attribution_reporting.mojom-forward.h"
+#include "content/browser/attribution_reporting/os_registration.h"
 #endif
 
 namespace content {
@@ -410,17 +411,15 @@
 #if BUILDFLAG(IS_ANDROID)
 void AttributionInternalsHandlerImpl::OnOsRegistration(
     base::Time time,
-    const GURL& registration_url,
-    const url::Origin& top_level_origin,
-    attribution_reporting::mojom::OsRegistrationType registration_type,
+    const OsRegistration& registration,
     bool is_debug_key_allowed) {
   auto web_ui_os_registration =
       attribution_internals::mojom::WebUIOsRegistration::New();
   web_ui_os_registration->time = time.ToJsTimeIgnoringNull();
-  web_ui_os_registration->registration_url = registration_url;
-  web_ui_os_registration->top_level_origin = top_level_origin;
+  web_ui_os_registration->registration_url = registration.registration_url;
+  web_ui_os_registration->top_level_origin = registration.top_level_origin;
   web_ui_os_registration->is_debug_key_allowed = is_debug_key_allowed;
-  web_ui_os_registration->type = registration_type;
+  web_ui_os_registration->type = registration.GetType();
 
   observer_->OnOsRegistration(std::move(web_ui_os_registration));
 }
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.h b/content/browser/attribution_reporting/attribution_internals_handler_impl.h
index 59f63e2..8d26cfe 100644
--- a/content/browser/attribution_reporting/attribution_internals_handler_impl.h
+++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.h
@@ -83,9 +83,7 @@
 
 #if BUILDFLAG(IS_ANDROID)
   void OnOsRegistration(base::Time time,
-                        const GURL& registration_url,
-                        const url::Origin& top_level_origin,
-                        attribution_reporting::mojom::OsRegistrationType,
+                        const OsRegistration&,
                         bool is_debug_key_allowed) override;
 #endif  // BUILDFLAG(IS_ANDROID)
 
diff --git a/content/browser/attribution_reporting/attribution_manager.h b/content/browser/attribution_reporting/attribution_manager.h
index 9b1100c..b8d1599d 100644
--- a/content/browser/attribution_reporting/attribution_manager.h
+++ b/content/browser/attribution_reporting/attribution_manager.h
@@ -19,20 +19,6 @@
 #include "content/public/browser/attribution_data_model.h"
 #include "content/public/browser/storage_partition.h"
 
-#if BUILDFLAG(IS_ANDROID)
-
-class GURL;
-
-namespace content {
-struct AttributionInputEvent;
-}  // namespace content
-
-namespace url {
-class Origin;
-}  // namespace url
-
-#endif  // BUILDFLAG(IS_ANDROID)
-
 namespace attribution_reporting {
 class SuitableOrigin;
 }  // namespace attribution_reporting
@@ -54,6 +40,10 @@
 
 struct GlobalRenderFrameHostId;
 
+#if BUILDFLAG(IS_ANDROID)
+struct OsRegistration;
+#endif
+
 // Interface that mediates data flow between the network, storage layer, and
 // blink.
 class CONTENT_EXPORT AttributionManager : public AttributionDataModel {
@@ -84,17 +74,10 @@
                              GlobalRenderFrameHostId render_frame_id) = 0;
 
 #if BUILDFLAG(IS_ANDROID)
-
-  virtual void HandleOsSource(const GURL& registration_url,
-                              const url::Origin& top_level_origin,
-                              AttributionInputEvent,
-                              GlobalRenderFrameHostId render_frame_id) = 0;
-
-  virtual void HandleOsTrigger(const GURL& registration_url,
-                               const url::Origin& top_level_origin,
-                               GlobalRenderFrameHostId render_frame_id) = 0;
-
-#endif  // BUILDFLAG(IS_ANDROID)
+  virtual void HandleOsRegistration(
+      OsRegistration,
+      GlobalRenderFrameHostId render_frame_id) = 0;
+#endif
 
   // Get all sources that are currently stored in this partition. Used for
   // populating WebUI.
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc
index a413a3034..78e6722 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -82,9 +82,9 @@
 #include "url/origin.h"
 
 #if BUILDFLAG(IS_ANDROID)
-#include "content/browser/attribution_reporting/attribution_input_event.h"
 #include "content/browser/attribution_reporting/attribution_os_level_manager.h"
 #include "content/browser/attribution_reporting/attribution_os_level_manager_android.h"
+#include "content/browser/attribution_reporting/os_registration.h"
 #endif
 
 namespace content {
@@ -1226,52 +1226,33 @@
   attribution_os_level_manager_ = std::move(os_level_manager);
 }
 
-struct AttributionManagerImpl::OsRegistration {
-  GURL registration_url;
-  url::Origin top_level_origin;
-  // If `absl::nullopt`, represents an OS trigger. Otherwise, represents an OS
-  // source.
-  absl::optional<AttributionInputEvent> input_event;
-};
-
-void AttributionManagerImpl::HandleOsSource(
-    const GURL& registration_url,
-    const url::Origin& top_level_origin,
-    AttributionInputEvent input_event,
-    GlobalRenderFrameHostId render_frame_id) {
-  HandleOsRegistration(registration_url, top_level_origin,
-                       std::move(input_event), render_frame_id);
-}
-
-void AttributionManagerImpl::HandleOsTrigger(
-    const GURL& registration_url,
-    const url::Origin& top_level_origin,
-    GlobalRenderFrameHostId render_frame_id) {
-  HandleOsRegistration(registration_url, top_level_origin,
-                       /*input_event=*/absl::nullopt, render_frame_id);
-}
-
 void AttributionManagerImpl::HandleOsRegistration(
-    const GURL& registration_url,
-    const url::Origin& top_level_origin,
-    absl::optional<AttributionInputEvent> input_event,
+    OsRegistration registration,
     GlobalRenderFrameHostId render_frame_id) {
   if (!attribution_os_level_manager_) {
     return;
   }
 
-  const auto registration_origin = url::Origin::Create(registration_url);
+  const auto registration_origin =
+      url::Origin::Create(registration.registration_url);
   if (registration_origin.opaque()) {
     return;
   }
 
-  auto operation = ContentBrowserClient::AttributionReportingOperation::kSource;
-  const url::Origin* source_origin = &top_level_origin;
-  const url::Origin* destination_origin = nullptr;
-  if (!input_event.has_value()) {
-    operation = ContentBrowserClient::AttributionReportingOperation::kTrigger;
-    source_origin = nullptr;
-    destination_origin = &top_level_origin;
+  ContentBrowserClient::AttributionReportingOperation operation;
+  const url::Origin* source_origin;
+  const url::Origin* destination_origin;
+  switch (registration.GetType()) {
+    case OsRegistrationType::kSource:
+      operation = ContentBrowserClient::AttributionReportingOperation::kSource;
+      source_origin = &registration.top_level_origin;
+      destination_origin = nullptr;
+      break;
+    case OsRegistrationType::kTrigger:
+      operation = ContentBrowserClient::AttributionReportingOperation::kTrigger;
+      source_origin = nullptr;
+      destination_origin = &registration.top_level_origin;
+      break;
   }
 
   // TODO(https://crbug.com/1420704): Support separate behavior on webview for
@@ -1292,11 +1273,7 @@
     return;
   }
 
-  pending_os_events_.push_back(OsRegistration{
-      .registration_url = registration_url,
-      .top_level_origin = top_level_origin,
-      .input_event = std::move(input_event),
-  });
+  pending_os_events_.push_back(std::move(registration));
 
   // Only process the new event if it is the only one in the queue. Otherwise,
   // there's already an async cookie-check in progress.
@@ -1321,43 +1298,25 @@
 
             {
               const auto& event = manager->pending_os_events_.front();
+              manager->attribution_os_level_manager_->Register(
+                  event, is_debug_key_allowed);
+              manager->NotifyOsRegistration(event, is_debug_key_allowed);
+            }
 
-              if (event.input_event.has_value()) {
-                manager->attribution_os_level_manager_
-                    ->RegisterAttributionSource(
-                        event.registration_url, event.top_level_origin,
-                        is_debug_key_allowed, *event.input_event);
-                manager->NotifyOsRegistration(
-                    event.registration_url, event.top_level_origin,
-                    OsRegistrationType::kSource, is_debug_key_allowed);
-              } else {
-                manager->attribution_os_level_manager_
-                    ->RegisterAttributionTrigger(event.registration_url,
-                                                 event.top_level_origin,
-                                                 is_debug_key_allowed);
-                manager->NotifyOsRegistration(
-                    event.registration_url, event.top_level_origin,
-                    OsRegistrationType::kTrigger, is_debug_key_allowed);
-              }
-
-              manager->pending_os_events_.pop_front();
-              if (!manager->pending_os_events_.empty()) {
-                manager->ProcessNextOsEvent();
-              }
+            manager->pending_os_events_.pop_front();
+            if (!manager->pending_os_events_.empty()) {
+              manager->ProcessNextOsEvent();
             }
           },
           weak_factory_.GetWeakPtr()));
 }
 
 void AttributionManagerImpl::NotifyOsRegistration(
-    const GURL& registration_url,
-    const url::Origin& top_level_origin,
-    OsRegistrationType registration_type,
+    const OsRegistration& registration,
     bool is_debug_key_allowed) {
   base::Time now = base::Time::Now();
   for (auto& observer : observers_) {
-    observer.OnOsRegistration(now, registration_url, top_level_origin,
-                              registration_type, is_debug_key_allowed);
+    observer.OnOsRegistration(now, registration, is_debug_key_allowed);
   }
 }
 
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.h b/content/browser/attribution_reporting/attribution_manager_impl.h
index 64e4b30..a40c829 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.h
+++ b/content/browser/attribution_reporting/attribution_manager_impl.h
@@ -32,12 +32,6 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/abseil-cpp/absl/types/variant.h"
 
-#if BUILDFLAG(IS_ANDROID)
-#include "content/browser/attribution_reporting/attribution_reporting.mojom-forward.h"
-#endif
-
-class GURL;
-
 namespace attribution_reporting {
 class SuitableOrigin;
 }  // namespace attribution_reporting
@@ -52,10 +46,6 @@
 class SpecialStoragePolicy;
 }  // namespace storage
 
-namespace url {
-class Origin;
-}  // namespace url
-
 namespace content {
 
 class AggregatableReport;
@@ -74,7 +64,7 @@
 
 #if BUILDFLAG(IS_ANDROID)
 class AttributionOsLevelManager;
-struct AttributionInputEvent;
+struct OsRegistration;
 #endif
 
 // UI thread class that manages the lifetime of the underlying attribution
@@ -168,23 +158,14 @@
 
 #if BUILDFLAG(IS_ANDROID)
 
-  void HandleOsSource(const GURL& registration_url,
-                      const url::Origin& top_level_origin,
-                      AttributionInputEvent,
-                      GlobalRenderFrameHostId render_frame_id) override;
-
-  void HandleOsTrigger(const GURL& registration_url,
-                       const url::Origin& top_level_origin,
-                       GlobalRenderFrameHostId render_frame_id) override;
+  void HandleOsRegistration(OsRegistration,
+                            GlobalRenderFrameHostId render_frame_id) override;
 
   AttributionOsLevelManager* GetOsLevelManager() {
     return attribution_os_level_manager_.get();
   }
 
-  void NotifyOsRegistration(const GURL& registration_url,
-                            const url::Origin& top_level_origin,
-                            attribution_reporting::mojom::OsRegistrationType,
-                            bool is_debug_key_allowed);
+  void NotifyOsRegistration(const OsRegistration&, bool is_debug_key_allowed);
 
 #endif  // BUILDFLAG(IS_ANDROID)
 
@@ -274,10 +255,6 @@
 #if BUILDFLAG(IS_ANDROID)
   void OverrideOsLevelManagerForTesting(
       std::unique_ptr<AttributionOsLevelManager>);
-  void HandleOsRegistration(const GURL& registration_url,
-                            const url::Origin& top_level_origin,
-                            absl::optional<AttributionInputEvent>,
-                            GlobalRenderFrameHostId);
   void ProcessNextOsEvent();
 #endif  // BUILDFLAG(IS_ANDROID)
 
@@ -335,7 +312,6 @@
 #if BUILDFLAG(IS_ANDROID)
   std::unique_ptr<AttributionOsLevelManager> attribution_os_level_manager_;
 
-  struct OsRegistration;
   base::circular_deque<OsRegistration> pending_os_events_;
 #endif  // BUILDFLAG(IS_ANDROID)
 
diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
index 9cb5949..e935cb4e 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
@@ -79,6 +79,7 @@
 #if BUILDFLAG(IS_ANDROID)
 #include "content/browser/attribution_reporting/attribution_input_event.h"
 #include "content/browser/attribution_reporting/attribution_os_level_manager.h"
+#include "content/browser/attribution_reporting/os_registration.h"
 #endif
 
 namespace content {
@@ -225,18 +226,8 @@
   ~MockAttributionOsLevelManager() override = default;
 
   MOCK_METHOD(void,
-              RegisterAttributionSource,
-              (const GURL& registration_url,
-               const url::Origin& top_level_origin,
-               bool is_debug_key_allowed,
-               const AttributionInputEvent&),
-              (override));
-
-  MOCK_METHOD(void,
-              RegisterAttributionTrigger,
-              (const GURL& registration_url,
-               const url::Origin& top_level_origin,
-               bool is_debug_key_allowed),
+              Register,
+              (const OsRegistration&, bool is_debug_key_allowed),
               (override));
 
   MOCK_METHOD(void,
@@ -1144,32 +1135,42 @@
     InSequence seq;
 
     EXPECT_CALL(*os_level_manager_ptr,
-                RegisterAttributionSource(kRegistrationUrl1, kTopLevelOrigin1,
-                                          /*is_debug_key_allowed=*/true, _));
+                Register(OsRegistration(kRegistrationUrl1, kTopLevelOrigin1,
+                                        AttributionInputEvent()),
+                         /*is_debug_key_allowed=*/true));
 
     EXPECT_CALL(*os_level_manager_ptr,
-                RegisterAttributionSource(kRegistrationUrl2, kTopLevelOrigin2,
-                                          /*is_debug_key_allowed=*/false, _));
+                Register(OsRegistration(kRegistrationUrl2, kTopLevelOrigin2,
+                                        AttributionInputEvent()),
+                         /*is_debug_key_allowed=*/false));
   }
 
   // Dropped due to the URL being opaque.
-  EXPECT_CALL(
-      *os_level_manager_ptr,
-      RegisterAttributionSource(kRegistrationUrl3, kTopLevelOrigin3, _, _))
+  EXPECT_CALL(*os_level_manager_ptr,
+              Register(OsRegistration(kRegistrationUrl3, kTopLevelOrigin3,
+                                      AttributionInputEvent()),
+                       _))
       .Times(0);
 
   // Prohibited by policy below.
-  EXPECT_CALL(
-      *os_level_manager_ptr,
-      RegisterAttributionSource(kRegistrationUrl4, kTopLevelOrigin4, _, _))
+  EXPECT_CALL(*os_level_manager_ptr,
+              Register(OsRegistration(kRegistrationUrl4, kTopLevelOrigin4,
+                                      AttributionInputEvent()),
+                       _))
       .Times(0);
 
-  attribution_manager_->HandleOsSource(kRegistrationUrl1, kTopLevelOrigin1,
-                                       AttributionInputEvent(), kFrameId);
-  attribution_manager_->HandleOsSource(kRegistrationUrl2, kTopLevelOrigin2,
-                                       AttributionInputEvent(), kFrameId);
-  attribution_manager_->HandleOsSource(kRegistrationUrl3, kTopLevelOrigin3,
-                                       AttributionInputEvent(), kFrameId);
+  attribution_manager_->HandleOsRegistration(
+      OsRegistration(kRegistrationUrl1, kTopLevelOrigin1,
+                     AttributionInputEvent()),
+      kFrameId);
+  attribution_manager_->HandleOsRegistration(
+      OsRegistration(kRegistrationUrl2, kTopLevelOrigin2,
+                     AttributionInputEvent()),
+      kFrameId);
+  attribution_manager_->HandleOsRegistration(
+      OsRegistration(kRegistrationUrl3, kTopLevelOrigin3,
+                     AttributionInputEvent()),
+      kFrameId);
 
   MockAttributionReportingContentBrowserClient browser_client;
   EXPECT_CALL(
@@ -1181,8 +1182,10 @@
       .WillOnce(Return(false));
   ScopedContentBrowserClientSetting setting(&browser_client);
 
-  attribution_manager_->HandleOsSource(kRegistrationUrl4, kTopLevelOrigin4,
-                                       AttributionInputEvent(), kFrameId);
+  attribution_manager_->HandleOsRegistration(
+      OsRegistration(kRegistrationUrl4, kTopLevelOrigin4,
+                     AttributionInputEvent()),
+      kFrameId);
 }
 
 TEST_F(AttributionManagerImplTest, HandleOsTrigger) {
@@ -1207,32 +1210,42 @@
     InSequence seq;
 
     EXPECT_CALL(*os_level_manager_ptr,
-                RegisterAttributionTrigger(kRegistrationUrl1, kTopLevelOrigin1,
-                                           /*is_debug_key_allowed=*/true));
+                Register(OsRegistration(kRegistrationUrl1, kTopLevelOrigin1,
+                                        /*input_event=*/absl::nullopt),
+                         /*is_debug_key_allowed=*/true));
 
     EXPECT_CALL(*os_level_manager_ptr,
-                RegisterAttributionTrigger(kRegistrationUrl2, kTopLevelOrigin2,
-                                           /*is_debug_key_allowed=*/false));
+                Register(OsRegistration(kRegistrationUrl2, kTopLevelOrigin2,
+                                        /*input_event=*/absl::nullopt),
+                         /*is_debug_key_allowed=*/false));
   }
 
   // Dropped due to the URL being opaque.
-  EXPECT_CALL(
-      *os_level_manager_ptr,
-      RegisterAttributionTrigger(kRegistrationUrl3, kTopLevelOrigin3, _))
+  EXPECT_CALL(*os_level_manager_ptr,
+              Register(OsRegistration(kRegistrationUrl3, kTopLevelOrigin3,
+                                      /*input_event=*/absl::nullopt),
+                       _))
       .Times(0);
 
   // Prohibited by policy below.
-  EXPECT_CALL(
-      *os_level_manager_ptr,
-      RegisterAttributionTrigger(kRegistrationUrl4, kTopLevelOrigin4, _))
+  EXPECT_CALL(*os_level_manager_ptr,
+              Register(OsRegistration(kRegistrationUrl4, kTopLevelOrigin4,
+                                      /*input_event=*/absl::nullopt),
+                       _))
       .Times(0);
 
-  attribution_manager_->HandleOsTrigger(kRegistrationUrl1, kTopLevelOrigin1,
-                                        kFrameId);
-  attribution_manager_->HandleOsTrigger(kRegistrationUrl2, kTopLevelOrigin2,
-                                        kFrameId);
-  attribution_manager_->HandleOsTrigger(kRegistrationUrl3, kTopLevelOrigin3,
-                                        kFrameId);
+  attribution_manager_->HandleOsRegistration(
+      OsRegistration(kRegistrationUrl1, kTopLevelOrigin1,
+                     /*input_event=*/absl::nullopt),
+      kFrameId);
+  attribution_manager_->HandleOsRegistration(
+      OsRegistration(kRegistrationUrl2, kTopLevelOrigin2,
+                     /*input_event=*/absl::nullopt),
+      kFrameId);
+  attribution_manager_->HandleOsRegistration(
+      OsRegistration(kRegistrationUrl3, kTopLevelOrigin3,
+                     /*input_event=*/absl::nullopt),
+      kFrameId);
 
   MockAttributionReportingContentBrowserClient browser_client;
   EXPECT_CALL(
@@ -1244,8 +1257,10 @@
       .WillOnce(Return(false));
   ScopedContentBrowserClientSetting setting(&browser_client);
 
-  attribution_manager_->HandleOsTrigger(kRegistrationUrl4, kTopLevelOrigin4,
-                                        kFrameId);
+  attribution_manager_->HandleOsRegistration(
+      OsRegistration(kRegistrationUrl4, kTopLevelOrigin4,
+                     /*input_event=*/absl::nullopt),
+      kFrameId);
 }
 
 #endif  // BUILDFLAG(IS_ANDROID)
diff --git a/content/browser/attribution_reporting/attribution_observer.h b/content/browser/attribution_reporting/attribution_observer.h
index c42d14fc..03b9956f 100644
--- a/content/browser/attribution_reporting/attribution_observer.h
+++ b/content/browser/attribution_reporting/attribution_observer.h
@@ -15,22 +15,10 @@
 #include "components/attribution_reporting/source_type.mojom-forward.h"
 #include "content/browser/attribution_reporting/store_source_result.mojom-forward.h"
 
-#if BUILDFLAG(IS_ANDROID)
-#include "content/browser/attribution_reporting/attribution_reporting.mojom-forward.h"
-#endif
-
 namespace attribution_reporting {
 class SuitableOrigin;
 }  // namespace attribution_reporting
 
-#if BUILDFLAG(IS_ANDROID)
-class GURL;
-
-namespace url {
-class Origin;
-}  // namespace url
-#endif
-
 namespace content {
 
 class AttributionDebugReport;
@@ -41,6 +29,10 @@
 
 struct SendResult;
 
+#if BUILDFLAG(IS_ANDROID)
+struct OsRegistration;
+#endif
+
 // Observes events in the Attribution Reporting API. Observers are registered on
 // `AttributionManager`.
 class AttributionObserver : public base::CheckedObserver {
@@ -88,12 +80,9 @@
 
 #if BUILDFLAG(IS_ANDROID)
   // Called when a source or trigger registration is passed to the OS.
-  virtual void OnOsRegistration(
-      base::Time time,
-      const GURL& registration_url,
-      const url::Origin& top_level_origin,
-      attribution_reporting::mojom::OsRegistrationType,
-      bool is_debug_key_allowed) {}
+  virtual void OnOsRegistration(base::Time time,
+                                const OsRegistration&,
+                                bool is_debug_key_allowed) {}
 #endif  // BUILDFLAG(IS_ANDROID)
 };
 
diff --git a/content/browser/attribution_reporting/attribution_os_level_manager.h b/content/browser/attribution_reporting/attribution_os_level_manager.h
index 5e47b07..9279ef3a 100644
--- a/content/browser/attribution_reporting/attribution_os_level_manager.h
+++ b/content/browser/attribution_reporting/attribution_os_level_manager.h
@@ -11,8 +11,6 @@
 #include "base/functional/callback_forward.h"
 #include "content/public/browser/browsing_data_filter_builder.h"
 
-class GURL;
-
 namespace base {
 class Time;
 }  // namespace base
@@ -23,7 +21,7 @@
 
 namespace content {
 
-struct AttributionInputEvent;
+struct OsRegistration;
 
 // Interface between the browser's Attribution Reporting implementation and the
 // operating system's.
@@ -31,14 +29,7 @@
  public:
   virtual ~AttributionOsLevelManager() = default;
 
-  virtual void RegisterAttributionSource(const GURL& registration_url,
-                                         const url::Origin& top_level_origin,
-                                         bool is_debug_key_allowed,
-                                         const AttributionInputEvent&) = 0;
-
-  virtual void RegisterAttributionTrigger(const GURL& registration_url,
-                                          const url::Origin& top_level_origin,
-                                          bool is_debug_key_allowed) = 0;
+  virtual void Register(const OsRegistration&, bool is_debug_key_allowed) = 0;
 
   // Clears storage data with the OS.
   // Note that `done` is not run if `AttributionOsLevelManager` is destroyed
diff --git a/content/browser/attribution_reporting/attribution_os_level_manager_android.cc b/content/browser/attribution_reporting/attribution_os_level_manager_android.cc
index 3b338c81..5183c39 100644
--- a/content/browser/attribution_reporting/attribution_os_level_manager_android.cc
+++ b/content/browser/attribution_reporting/attribution_os_level_manager_android.cc
@@ -14,6 +14,7 @@
 
 #include "base/android/jni_array.h"
 #include "base/android/scoped_java_ref.h"
+#include "base/check.h"
 #include "base/dcheck_is_on.h"
 #include "base/functional/callback.h"
 #include "base/no_destructor.h"
@@ -22,6 +23,8 @@
 #include "base/time/time.h"
 #include "components/attribution_reporting/os_support.mojom-shared.h"
 #include "content/browser/attribution_reporting/attribution_input_event.h"
+#include "content/browser/attribution_reporting/attribution_reporting.mojom.h"
+#include "content/browser/attribution_reporting/os_registration.h"
 #include "content/public/android/content_jni_headers/AttributionOsLevelManager_jni.h"
 #include "content/public/browser/browsing_data_filter_builder.h"
 #include "content/public/browser/render_process_host.h"
@@ -147,31 +150,30 @@
       base::android::AttachCurrentThread(), jobj_);
 }
 
-void AttributionOsLevelManagerAndroid::RegisterAttributionSource(
-    const GURL& registration_url,
-    const url::Origin& top_level_origin,
-    bool is_debug_key_allowed,
-    const AttributionInputEvent& input_event) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  JNIEnv* env = base::android::AttachCurrentThread();
-  Java_AttributionOsLevelManager_registerAttributionSource(
-      env, jobj_, url::GURLAndroid::FromNativeGURL(env, registration_url),
-      url::GURLAndroid::FromNativeGURL(env, top_level_origin.GetURL()),
-      is_debug_key_allowed, input_event.input_event);
-}
-
-void AttributionOsLevelManagerAndroid::RegisterAttributionTrigger(
-    const GURL& registration_url,
-    const url::Origin& top_level_origin,
+void AttributionOsLevelManagerAndroid::Register(
+    const OsRegistration& registration,
     bool is_debug_key_allowed) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   JNIEnv* env = base::android::AttachCurrentThread();
-  Java_AttributionOsLevelManager_registerAttributionTrigger(
-      env, jobj_, url::GURLAndroid::FromNativeGURL(env, registration_url),
-      url::GURLAndroid::FromNativeGURL(env, top_level_origin.GetURL()),
-      is_debug_key_allowed);
+
+  auto registration_url =
+      url::GURLAndroid::FromNativeGURL(env, registration.registration_url);
+  auto top_level_origin = url::GURLAndroid::FromNativeGURL(
+      env, registration.top_level_origin.GetURL());
+
+  switch (registration.GetType()) {
+    case attribution_reporting::mojom::OsRegistrationType::kSource:
+      DCHECK(registration.input_event.has_value());
+      Java_AttributionOsLevelManager_registerAttributionSource(
+          env, jobj_, registration_url, top_level_origin, is_debug_key_allowed,
+          registration.input_event->input_event);
+      break;
+    case attribution_reporting::mojom::OsRegistrationType::kTrigger:
+      Java_AttributionOsLevelManager_registerAttributionTrigger(
+          env, jobj_, registration_url, top_level_origin, is_debug_key_allowed);
+      break;
+  }
 }
 
 void AttributionOsLevelManagerAndroid::ClearData(
diff --git a/content/browser/attribution_reporting/attribution_os_level_manager_android.h b/content/browser/attribution_reporting/attribution_os_level_manager_android.h
index 5a90437..bcdf34d8 100644
--- a/content/browser/attribution_reporting/attribution_os_level_manager_android.h
+++ b/content/browser/attribution_reporting/attribution_os_level_manager_android.h
@@ -56,14 +56,7 @@
   AttributionOsLevelManagerAndroid& operator=(
       AttributionOsLevelManagerAndroid&&) = delete;
 
-  void RegisterAttributionSource(const GURL& registration_url,
-                                 const url::Origin& top_level_origin,
-                                 bool is_debug_key_allowed,
-                                 const AttributionInputEvent&) override;
-
-  void RegisterAttributionTrigger(const GURL& registration_url,
-                                  const url::Origin& top_level_origin,
-                                  bool is_debug_key_allowed) override;
+  void Register(const OsRegistration&, bool is_debug_key_allowed) override;
 
   void ClearData(base::Time delete_begin,
                  base::Time delete_end,
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc
index 5e611dd..a861d70 100644
--- a/content/browser/attribution_reporting/attribution_test_utils.cc
+++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -40,6 +40,13 @@
 #include "third_party/abseil-cpp/absl/numeric/int128.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
+#if BUILDFLAG(IS_ANDROID)
+#include "content/browser/attribution_reporting/attribution_reporting.mojom.h"
+#include "content/browser/attribution_reporting/os_registration.h"
+#include "url/gurl.h"
+#include "url/origin.h"
+#endif
+
 namespace content {
 
 namespace {
@@ -1096,4 +1103,21 @@
   return contributions;
 }
 
+#if BUILDFLAG(IS_ANDROID)
+
+bool operator==(const OsRegistration& a, const OsRegistration& b) {
+  const auto tie = [](const OsRegistration& r) {
+    return std::make_tuple(r.registration_url, r.top_level_origin, r.GetType());
+  };
+  return tie(a) == tie(b);
+}
+
+std::ostream& operator<<(std::ostream& out, const OsRegistration& r) {
+  return out << "{registration_url=" << r.registration_url
+             << ",top_level_origin=" << r.top_level_origin
+             << ",type=" << r.GetType() << "}";
+}
+
+#endif
+
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h
index d861a3e..f2610f3 100644
--- a/content/browser/attribution_reporting/attribution_test_utils.h
+++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -695,6 +695,14 @@
 DefaultAggregatableHistogramContributions(
     const std::vector<uint32_t>& histogram_values = {1});
 
+#if BUILDFLAG(IS_ANDROID)
+struct OsRegistration;
+
+bool operator==(const OsRegistration&, const OsRegistration&);
+
+std::ostream& operator<<(std::ostream&, const OsRegistration&);
+#endif
+
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_TEST_UTILS_H_
diff --git a/content/browser/attribution_reporting/os_registration.cc b/content/browser/attribution_reporting/os_registration.cc
new file mode 100644
index 0000000..f5be21f
--- /dev/null
+++ b/content/browser/attribution_reporting/os_registration.cc
@@ -0,0 +1,42 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/attribution_reporting/os_registration.h"
+
+#include <utility>
+
+#include "content/browser/attribution_reporting/attribution_input_event.h"
+#include "content/browser/attribution_reporting/attribution_reporting.mojom.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
+#include "url/origin.h"
+
+namespace content {
+
+OsRegistration::OsRegistration(
+    GURL registration_url,
+    url::Origin top_level_origin,
+    absl::optional<AttributionInputEvent> input_event)
+    : registration_url(std::move(registration_url)),
+      top_level_origin(std::move(top_level_origin)),
+      input_event(std::move(input_event)) {}
+
+OsRegistration::~OsRegistration() = default;
+
+OsRegistration::OsRegistration(const OsRegistration&) = default;
+
+OsRegistration& OsRegistration::operator=(const OsRegistration&) = default;
+
+OsRegistration::OsRegistration(OsRegistration&&) = default;
+
+OsRegistration& OsRegistration::operator=(OsRegistration&&) = default;
+
+attribution_reporting::mojom::OsRegistrationType OsRegistration::GetType()
+    const {
+  return input_event.has_value()
+             ? attribution_reporting::mojom::OsRegistrationType::kSource
+             : attribution_reporting::mojom::OsRegistrationType::kTrigger;
+}
+
+}  // namespace content
diff --git a/content/browser/attribution_reporting/os_registration.h b/content/browser/attribution_reporting/os_registration.h
new file mode 100644
index 0000000..b3ad93a
--- /dev/null
+++ b/content/browser/attribution_reporting/os_registration.h
@@ -0,0 +1,41 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_OS_REGISTRATION_H_
+#define CONTENT_BROWSER_ATTRIBUTION_REPORTING_OS_REGISTRATION_H_
+
+#include "content/browser/attribution_reporting/attribution_input_event.h"
+#include "content/browser/attribution_reporting/attribution_reporting.mojom-forward.h"
+#include "content/common/content_export.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
+#include "url/origin.h"
+
+namespace content {
+
+struct CONTENT_EXPORT OsRegistration {
+  GURL registration_url;
+  url::Origin top_level_origin;
+  // If `absl::nullopt`, represents an OS trigger. Otherwise, represents an OS
+  // source.
+  absl::optional<AttributionInputEvent> input_event;
+
+  OsRegistration(GURL registration_url,
+                 url::Origin top_level_origin,
+                 absl::optional<AttributionInputEvent> input_event);
+
+  ~OsRegistration();
+
+  OsRegistration(const OsRegistration&);
+  OsRegistration& operator=(const OsRegistration&);
+
+  OsRegistration(OsRegistration&&);
+  OsRegistration& operator=(OsRegistration&&);
+
+  attribution_reporting::mojom::OsRegistrationType GetType() const;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_ATTRIBUTION_REPORTING_OS_REGISTRATION_H_
diff --git a/content/browser/attribution_reporting/test/mock_attribution_manager.cc b/content/browser/attribution_reporting/test/mock_attribution_manager.cc
index 3d7acfa..cf8110b 100644
--- a/content/browser/attribution_reporting/test/mock_attribution_manager.cc
+++ b/content/browser/attribution_reporting/test/mock_attribution_manager.cc
@@ -21,7 +21,7 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 #if BUILDFLAG(IS_ANDROID)
-#include "content/browser/attribution_reporting/attribution_reporting.mojom-forward.h"
+#include "content/browser/attribution_reporting/os_registration.h"
 #endif
 
 namespace content {
@@ -105,14 +105,11 @@
 
 #if BUILDFLAG(IS_ANDROID)
 void MockAttributionManager::NotifyOsRegistration(
-    const GURL& registration_url,
-    const url::Origin& top_level_origin,
-    attribution_reporting::mojom::OsRegistrationType registration_type,
+    const OsRegistration& registration,
     bool is_debug_key_allowed) {
   base::Time now = base::Time::Now();
   for (auto& observer : observers_) {
-    observer.OnOsRegistration(now, registration_url, top_level_origin,
-                              registration_type, is_debug_key_allowed);
+    observer.OnOsRegistration(now, registration, is_debug_key_allowed);
   }
 }
 #endif  // BUILDFLAG(IS_ANDROID)
diff --git a/content/browser/attribution_reporting/test/mock_attribution_manager.h b/content/browser/attribution_reporting/test/mock_attribution_manager.h
index b885ba8e..feee016 100644
--- a/content/browser/attribution_reporting/test/mock_attribution_manager.h
+++ b/content/browser/attribution_reporting/test/mock_attribution_manager.h
@@ -33,10 +33,7 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 #if BUILDFLAG(IS_ANDROID)
-#include "content/browser/attribution_reporting/attribution_input_event.h"
-#include "content/browser/attribution_reporting/attribution_reporting.mojom-forward.h"
-#include "url/gurl.h"
-#include "url/origin.h"
+#include "content/browser/attribution_reporting/os_registration.h"
 #endif
 
 namespace content {
@@ -110,22 +107,10 @@
               (override));
 
 #if BUILDFLAG(IS_ANDROID)
-
   MOCK_METHOD(void,
-              HandleOsSource,
-              (const GURL& registration_url,
-               const url::Origin& top_level_origin,
-               AttributionInputEvent,
-               GlobalRenderFrameHostId),
+              HandleOsRegistration,
+              (OsRegistration, GlobalRenderFrameHostId),
               (override));
-
-  MOCK_METHOD(void,
-              HandleOsTrigger,
-              (const GURL& registration_url,
-               const url::Origin& top_level_origin,
-               GlobalRenderFrameHostId),
-              (override));
-
 #endif  // BUILDFLAG(IS_ANDROID)
 
   void AddObserver(AttributionObserver*) override;
@@ -155,10 +140,7 @@
                              int status,
                              base::Time);
 #if BUILDFLAG(IS_ANDROID)
-  void NotifyOsRegistration(const GURL& registration_url,
-                            const url::Origin& top_level_origin,
-                            attribution_reporting::mojom::OsRegistrationType,
-                            bool is_debug_key_allowed);
+  void NotifyOsRegistration(const OsRegistration&, bool is_debug_key_allowed);
 #endif  // BUILDFLAG(IS_ANDROID)
 
   void SetDataHostManager(std::unique_ptr<AttributionDataHostManager>);
diff --git a/content/browser/cache_storage/cache_storage_context_impl.cc b/content/browser/cache_storage/cache_storage_context_impl.cc
index 2f5e778..c45f9fc 100644
--- a/content/browser/cache_storage/cache_storage_context_impl.cc
+++ b/content/browser/cache_storage/cache_storage_context_impl.cc
@@ -37,17 +37,19 @@
 CacheStorageContextImpl::~CacheStorageContextImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  cache_manager_->DeleteStorageKeyData(
-      storage_keys_to_purge_on_shutdown_,
-      storage::mojom::CacheStorageOwner::kCacheAPI,
+  if (!storage_keys_to_purge_on_shutdown_.empty()) {
+    cache_manager_->DeleteStorageKeyData(
+        storage_keys_to_purge_on_shutdown_,
+        storage::mojom::CacheStorageOwner::kCacheAPI,
 
-      // Retain a reference to the manager until the deletion is
-      // complete, since it internally uses weak pointers for
-      // the various stages of deletion and nothing else will
-      // keep it alive during shutdown.
-      base::BindOnce([](scoped_refptr<CacheStorageManager> cache_manager,
-                        blink::mojom::QuotaStatusCode) {},
-                     cache_manager_));
+        // Retain a reference to the manager until the deletion is
+        // complete, since it internally uses weak pointers for
+        // the various stages of deletion and nothing else will
+        // keep it alive during shutdown.
+        base::BindOnce([](scoped_refptr<CacheStorageManager> cache_manager,
+                          blink::mojom::QuotaStatusCode) {},
+                       cache_manager_));
+  }
 }
 
 // static
diff --git a/content/browser/cache_storage/cache_storage_manager.cc b/content/browser/cache_storage/cache_storage_manager.cc
index 4a7d95243..5e12291c 100644
--- a/content/browser/cache_storage/cache_storage_manager.cc
+++ b/content/browser/cache_storage/cache_storage_manager.cc
@@ -907,6 +907,13 @@
     storage::mojom::QuotaClient::DeleteBucketDataCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  if (storage_keys.empty()) {
+    scheduler_task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback),
+                                  blink::mojom::QuotaStatusCode::kOk));
+    return;
+  }
+
   if (IsMemoryBacked()) {
     std::vector<
         std::tuple<storage::BucketLocator, storage::mojom::StorageUsageInfoPtr>>
diff --git a/content/browser/cache_storage/cache_storage_manager.h b/content/browser/cache_storage/cache_storage_manager.h
index addf725..2d16c22 100644
--- a/content/browser/cache_storage/cache_storage_manager.h
+++ b/content/browser/cache_storage/cache_storage_manager.h
@@ -131,10 +131,7 @@
  protected:
   friend class base::RefCounted<CacheStorageManager>;
 
-  // TODO(https://crbug.com/1353198): NOINLINE here is needed to prevent a crash
-  // when ThinLTO is enabled on x86 Android chrome-branded release-mode builds.
-  // Remove this once the underlying issue is resolved.
-  NOINLINE CacheStorageManager(
+  CacheStorageManager(
       const base::FilePath& path,
       scoped_refptr<base::SequencedTaskRunner> cache_task_runner,
       scoped_refptr<base::SequencedTaskRunner> scheduler_task_runner,
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc
index 91fecc5f..535e5d8 100644
--- a/content/browser/cache_storage/cache_storage_manager_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -2835,6 +2835,16 @@
   EXPECT_EQ(206, callback_cache_handle_response_->status_code);
 }
 
+TEST_P(CacheStorageManagerTestP, DeleteStorageKeyDataEmptyList) {
+  std::set<blink::StorageKey> empty_list;
+  for (const storage::mojom::CacheStorageOwner owner :
+       {storage::mojom::CacheStorageOwner::kCacheAPI,
+        storage::mojom::CacheStorageOwner::kBackgroundFetch}) {
+    EXPECT_EQ(DeleteStorageKeyData(empty_list, owner),
+              blink::mojom::QuotaStatusCode::kOk);
+  }
+}
+
 TEST_P(CacheStorageManagerTestP, BatchDeleteStorageKeyData) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
diff --git a/content/browser/code_cache/generated_code_cache.cc b/content/browser/code_cache/generated_code_cache.cc
index 939dbbb8..930d51df 100644
--- a/content/browser/code_cache/generated_code_cache.cc
+++ b/content/browser/code_cache/generated_code_cache.cc
@@ -22,6 +22,7 @@
 #include "net/base/features.h"
 #include "net/base/network_isolation_key.h"
 #include "net/base/url_util.h"
+#include "net/http/http_cache.h"
 #include "url/gurl.h"
 
 using storage::BigIOBuffer;
@@ -106,8 +107,9 @@
   if (origin_lock.is_valid())
     key.append(net::SimplifyUrlForRequest(origin_lock).spec());
 
-  if (base::FeatureList::IsEnabled(
-          net::features::kSplitCacheByNetworkIsolationKey)) {
+  if (net::HttpCache::IsSplitCacheEnabled() &&
+      base::FeatureList::IsEnabled(
+          net::features::kSplitCodeCacheByNetworkIsolationKey)) {
     // TODO(https://crbug.com/1346188):  Transient NIKs return nullopt when
     // their ToCacheKeyString() method is invoked, as they generally shouldn't
     // be written to disk. This code is currently reached for transient NIKs,
diff --git a/content/browser/interest_group/interest_group_k_anonymity_manager.cc b/content/browser/interest_group/interest_group_k_anonymity_manager.cc
index 19d3510..2b049dd 100644
--- a/content/browser/interest_group/interest_group_k_anonymity_manager.cc
+++ b/content/browser/interest_group/interest_group_k_anonymity_manager.cc
@@ -73,13 +73,7 @@
                                                  update_time};
     interest_group_manager_->UpdateKAnonymity(data);
   }
-  for (size_t i = size; i < unhashed_query.size(); i++) {
-    // If we fail, update the data set anyway until we can verify that the
-    // server is stable.
-    StorageInterestGroup::KAnonymityData data = {unhashed_query[i], false,
-                                                 update_time};
-    interest_group_manager_->UpdateKAnonymity(data);
-  }
+  // Don't update sets if the request failed.
 }
 
 void InterestGroupKAnonymityManager::RegisterAdKeysAsJoined(
@@ -127,8 +121,10 @@
 
 void InterestGroupKAnonymityManager::JoinSetCallback(std::string key,
                                                      bool status) {
-  // Update the time regardless of status until we verify the server is stable.
-  interest_group_manager_->UpdateLastKAnonymityReported(key);
+  if (status) {
+    // Update the last reported time if the request succeeded.
+    interest_group_manager_->UpdateLastKAnonymityReported(key);
+  }
   joins_in_progress.erase(key);
 }
 
diff --git a/content/browser/interest_group/interest_group_k_anonymity_manager_unittest.cc b/content/browser/interest_group/interest_group_k_anonymity_manager_unittest.cc
index 9f51d20..354d876 100644
--- a/content/browser/interest_group/interest_group_k_anonymity_manager_unittest.cc
+++ b/content/browser/interest_group/interest_group_k_anonymity_manager_unittest.cc
@@ -36,7 +36,7 @@
   void JoinSet(std::string id,
                base::OnceCallback<void(bool)> callback) override {
     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE, base::BindOnce(std::move(callback), has_error_));
+        FROM_HERE, base::BindOnce(std::move(callback), !has_error_));
   }
 
   void QuerySets(
@@ -80,7 +80,7 @@
  public:
   void SetUp() override { ASSERT_TRUE(temp_directory_.CreateUniqueTempDir()); }
 
-  absl::optional<StorageInterestGroup> getGroup(
+  absl::optional<StorageInterestGroup> GetGroup(
       InterestGroupManagerImpl* manager,
       url::Origin owner,
       std::string name) {
@@ -136,19 +136,19 @@
   const url::Origin owner = url::Origin::Create(top_frame);
   const std::string name = "foo";
 
-  EXPECT_FALSE(getGroup(manager.get(), owner, name));
+  EXPECT_FALSE(GetGroup(manager.get(), owner, name));
   base::Time before_join = base::Time::Now();
 
   // Join queues the update, but returns first.
   manager->JoinInterestGroup(MakeInterestGroup(owner, "foo"), top_frame);
-  auto maybe_group = getGroup(manager.get(), owner, name);
+  auto maybe_group = GetGroup(manager.get(), owner, name);
   ASSERT_TRUE(maybe_group);
   EXPECT_EQ(base::Time::Min(), maybe_group->bidding_ads_kanon[0].last_updated);
 
   // k-anonymity update happens here.
   task_environment().FastForwardBy(base::Minutes(1));
 
-  maybe_group = getGroup(manager.get(), owner, name);
+  maybe_group = GetGroup(manager.get(), owner, name);
   ASSERT_TRUE(maybe_group);
   base::Time last_updated = maybe_group->bidding_ads_kanon[0].last_updated;
   EXPECT_LE(before_join, last_updated);
@@ -158,7 +158,7 @@
   manager->QueueKAnonymityUpdateForInterestGroup(*maybe_group);
   task_environment().FastForwardBy(base::Minutes(1));
 
-  maybe_group = getGroup(manager.get(), owner, name);
+  maybe_group = GetGroup(manager.get(), owner, name);
   ASSERT_TRUE(maybe_group);
   EXPECT_EQ(last_updated, maybe_group->bidding_ads_kanon[0].last_updated);
 
@@ -167,7 +167,7 @@
   // Updated more than 24 hours ago, so update.
   manager->QueueKAnonymityUpdateForInterestGroup(*maybe_group);
   task_environment().RunUntilIdle();
-  maybe_group = getGroup(manager.get(), owner, name);
+  maybe_group = GetGroup(manager.get(), owner, name);
   ASSERT_TRUE(maybe_group);
   EXPECT_LT(last_updated, maybe_group->bidding_ads_kanon[0].last_updated);
 }
@@ -185,14 +185,14 @@
       KAnonKeyForAdNameReporting(group, group.ads.value()[0]);
 
   auto manager = CreateManager();
-  EXPECT_FALSE(getGroup(manager.get(), owner, name));
+  EXPECT_FALSE(GetGroup(manager.get(), owner, name));
   EXPECT_EQ(base::Time::Min(), GetLastReported(manager.get(), kAd1KAnonBidKey));
   EXPECT_EQ(base::Time::Min(),
             GetLastReported(manager.get(), kAd1KAnonReportNameKey));
 
   manager->JoinInterestGroup(group, top_frame);
   // The group *must* exist when JoinInterestGroup returns.
-  ASSERT_TRUE(getGroup(manager.get(), owner, name));
+  ASSERT_TRUE(GetGroup(manager.get(), owner, name));
 
   // k-anonymity would happens here.
   task_environment().FastForwardBy(base::Minutes(1));
@@ -241,15 +241,13 @@
   const url::Origin owner = url::Origin::Create(top_frame);
   const std::string name = "foo";
 
-  base::Time start_time = base::Time::Now();
-
   auto manager = CreateManager(/*has_error=*/true);
   blink::InterestGroup g = MakeInterestGroup(owner, "foo");
   const std::string kAd1KAnonBidKey = KAnonKeyForAdBid(g, GURL(kAdURL));
 
   manager->JoinInterestGroup(g, top_frame);
   // The group *must* exist when JoinInterestGroup returns.
-  ASSERT_TRUE(getGroup(manager.get(), owner, name));
+  ASSERT_TRUE(GetGroup(manager.get(), owner, name));
   manager->RegisterAdKeysAsJoined({kAd1KAnonBidKey});
 
   // k-anonymity update happens here.
@@ -266,17 +264,12 @@
       GetLastReported(manager.get(), kAd1KAnonBidKey);
   ASSERT_TRUE(ad_reported);
 
-  // TODO(behamilton): Change this once we expect the server to be stable.
-  EXPECT_LE(start_time, ad_reported);
-  // EXPECT_EQ(base::Time::Min(), group_name_reported);
+  EXPECT_EQ(base::Time::Min(), ad_reported);
 
-  auto maybe_group = getGroup(manager.get(), owner, name);
+  auto maybe_group = GetGroup(manager.get(), owner, name);
   ASSERT_TRUE(maybe_group);
 
-  // TODO(behamilton): Change this once we expect the server to be stable.
-  EXPECT_LE(start_time, maybe_group->bidding_ads_kanon[0].last_updated);
-  // EXPECT_EQ(base::Time::Min(),
-  // maybe_group->bidding_ads_kanon[0].last_updated);
+  EXPECT_EQ(base::Time::Min(), maybe_group->bidding_ads_kanon[0].last_updated);
 }
 
 class MockAnonymityServiceDelegate : public KAnonymityServiceDelegate {
diff --git a/content/browser/interest_group/noiser_and_bucketer.cc b/content/browser/interest_group/noiser_and_bucketer.cc
new file mode 100644
index 0000000..e78f857
--- /dev/null
+++ b/content/browser/interest_group/noiser_and_bucketer.cc
@@ -0,0 +1,119 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/interest_group/noiser_and_bucketer.h"
+
+#include <stdint.h>
+
+#include "base/rand_util.h"
+#include "base/time/time.h"
+
+namespace content {
+
+namespace {
+
+template <typename T>
+T Noise(T input, int min, int max) {
+  if (base::RandDouble() < 0.01) {
+    return static_cast<T>(base::RandInt(min, max));
+  }
+  return input;
+}
+
+}  // namespace
+
+uint8_t NoiseAndBucketJoinCount(int32_t join_count) {
+  return Noise(internals::BucketJoinCount(join_count), 1, 16);
+}
+
+uint8_t NoiseAndBucketRecency(base::TimeDelta recency) {
+  return Noise(internals::BucketRecency(recency), 0, 31);
+}
+
+uint16_t NoiseAndMaskModelingSignals(uint16_t modeling_signals) {
+  constexpr uint16_t kMask = 0x0FFF;
+  return Noise(modeling_signals & kMask, 0, kMask);
+}
+
+namespace internals {
+
+uint8_t BucketJoinCount(int32_t join_count) {
+  if (join_count < 1) {
+    join_count = 1;
+  }
+
+  if (join_count <= 10) {
+    return join_count;
+  } else if (join_count <= 20) {
+    return 11;
+  } else if (join_count <= 30) {
+    return 12;
+  } else if (join_count <= 40) {
+    return 13;
+  } else if (join_count <= 50) {
+    return 14;
+  } else if (join_count <= 100) {
+    return 15;
+  }
+
+  return 16;
+}
+
+uint8_t BucketRecency(base::TimeDelta recency) {
+  if (recency < base::Minutes(0)) {
+    recency = base::Minutes(0);
+  }
+
+  if (recency < base::Minutes(10)) {
+    return recency.InMinutes();
+  } else if (recency < base::Minutes(15)) {
+    return 10;
+  } else if (recency < base::Minutes(20)) {
+    return 11;
+  } else if (recency < base::Minutes(30)) {
+    return 12;
+  } else if (recency < base::Minutes(40)) {
+    return 13;
+  } else if (recency < base::Minutes(50)) {
+    return 14;
+  } else if (recency < base::Minutes(60)) {
+    return 15;
+  } else if (recency < base::Minutes(75)) {
+    return 16;
+  } else if (recency < base::Minutes(90)) {
+    return 17;
+  } else if (recency < base::Minutes(105)) {
+    return 18;
+  } else if (recency < base::Minutes(120)) {
+    return 19;
+  } else if (recency < base::Minutes(240)) {
+    return 20;
+  } else if (recency < base::Minutes(720)) {
+    return 21;
+  } else if (recency < base::Minutes(1440)) {
+    return 22;
+  } else if (recency < base::Minutes(2160)) {
+    return 23;
+  } else if (recency < base::Minutes(2880)) {
+    return 24;
+  } else if (recency < base::Minutes(4320)) {
+    return 25;
+  } else if (recency < base::Minutes(5760)) {
+    return 26;
+  } else if (recency < base::Minutes(10080)) {
+    return 27;
+  } else if (recency < base::Minutes(20160)) {
+    return 28;
+  } else if (recency < base::Minutes(30240)) {
+    return 29;
+  } else if (recency < base::Minutes(40320)) {
+    return 30;
+  }
+
+  return 31;
+}
+
+}  // namespace internals
+
+}  // namespace content
diff --git a/content/browser/interest_group/noiser_and_bucketer.h b/content/browser/interest_group/noiser_and_bucketer.h
new file mode 100644
index 0000000..85a3d0d
--- /dev/null
+++ b/content/browser/interest_group/noiser_and_bucketer.h
@@ -0,0 +1,50 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_INTEREST_GROUP_NOISER_AND_BUCKETER_H_
+#define CONTENT_BROWSER_INTEREST_GROUP_NOISER_AND_BUCKETER_H_
+
+#include <stdint.h>
+
+#include "base/time/time.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+// Converts `join_count` to a 4-bit value (16 buckets), and randomly applies
+// noise.
+//
+// Returns values in the range 1-16, inclusive.
+//
+// Unlike for recency and modeling signals, the first bucket is 1, since this
+// way, a join count of 1 goes into bucket 1, a join count of 2 goes into bucket
+// 2, etc., up to and including 10.
+//
+// The amount of information given to reportWin() is still the same would be
+// given in a 0-15 bucketing scheme.
+CONTENT_EXPORT uint8_t NoiseAndBucketJoinCount(int32_t join_count);
+
+// Converts `recency` to a 5-bit value (32 buckets), and randomly applies
+// noise.
+//
+// Returns values in the range 0-31, inclusive.
+CONTENT_EXPORT uint8_t NoiseAndBucketRecency(base::TimeDelta recency);
+
+// Masks `modeling_signals` to a 12-bit value (4096 values), and randomly
+// applies noise.
+//
+// Returns values in the range 0-4095, inclusive.
+CONTENT_EXPORT uint16_t NoiseAndMaskModelingSignals(uint16_t modeling_signals);
+
+// Non-noised functions are exposed for tests only.
+namespace internals {
+
+CONTENT_EXPORT uint8_t BucketJoinCount(int32_t join_count);
+CONTENT_EXPORT uint8_t BucketRecency(base::TimeDelta recency);
+
+}  // namespace internals
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_INTEREST_GROUP_NOISER_AND_BUCKETER_H_
diff --git a/content/browser/interest_group/noiser_and_bucketer_unittest.cc b/content/browser/interest_group/noiser_and_bucketer_unittest.cc
new file mode 100644
index 0000000..c7cd538
--- /dev/null
+++ b/content/browser/interest_group/noiser_and_bucketer_unittest.cc
@@ -0,0 +1,221 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/interest_group/noiser_and_bucketer.h"
+
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+namespace {
+
+// The function should sometimes return not equal, within the range.
+template <typename Function, typename T>
+void EqualAndNotEqual(T input,
+                      int expected,
+                      Function function,
+                      int min,
+                      int max) {
+  bool seen_equal = false, seen_not_equal = false;
+  while (!seen_equal || !seen_not_equal) {
+    int actual = function(input);
+    EXPECT_GE(actual, min);
+    EXPECT_LE(actual, max);
+    if (actual == expected) {
+      seen_equal = true;
+    } else {
+      seen_not_equal = true;
+    }
+  }
+}
+
+TEST(NoiserAndBucketerTest, JoinCount) {
+  constexpr int kMin = 1, kMax = 16;
+
+  // clang-format off
+  const struct {
+    int input;
+    int expected;
+  } kTestCases[] = {
+      {-2, 1},
+      {-1, 1},
+      {0, 1},
+      {1, 1},
+      {2, 2},
+      {3, 3},
+      {4, 4},
+      {5, 5},
+      {6, 6},
+      {7, 7},
+      {8, 8},
+      {9, 9},
+      {10, 10},
+      {11, 11},
+      {19, 11},
+      {20, 11},
+      {21, 12},
+      {29, 12},
+      {30, 12},
+      {31, 13},
+      {32, 13},
+      {39, 13},
+      {40, 13},
+      {41, 14},
+      {42, 14},
+      {49, 14},
+      {50, 14},
+      {51, 15},
+      {52, 15},
+      {60, 15},
+      {70, 15},
+      {80, 15},
+      {90, 15},
+      {99, 15},
+      {100, 15},
+      {101, 16},
+      {200, 16},
+      {1000, 16},
+  };
+  // clang-format on
+  for (const auto& test_case : kTestCases) {
+    SCOPED_TRACE(test_case.input);
+    EXPECT_EQ(internals::BucketJoinCount(test_case.input), test_case.expected);
+    EqualAndNotEqual(/*input=*/test_case.input, /*expected=*/test_case.expected,
+                     /*function=*/NoiseAndBucketJoinCount,
+                     /*min=*/kMin, /*max=*/kMax);
+  }
+}
+
+TEST(NoiserAndBucketerTest, Recency) {
+  constexpr int kMin = 0, kMax = 31;
+
+  // clang-format off
+  const struct {
+    base::TimeDelta input;
+    int expected;
+  } kTestCases[] = {
+    {base::Minutes(-2), 0},
+    {base::Minutes(-1), 0},
+    {base::Minutes(0), 0},
+    {base::Minutes(1), 1},
+    {base::Minutes(2), 2},
+    {base::Minutes(3), 3},
+    {base::Minutes(4), 4},
+    {base::Minutes(5), 5},
+    {base::Minutes(6), 6},
+    {base::Minutes(7), 7},
+    {base::Minutes(8), 8},
+    {base::Minutes(9), 9},
+    {base::Minutes(10), 10},
+    {base::Minutes(11), 10},
+    {base::Minutes(13), 10},
+    {base::Minutes(14), 10},
+    {base::Minutes(15), 11},
+    {base::Minutes(16), 11},
+    {base::Minutes(18), 11},
+    {base::Minutes(19), 11},
+    {base::Minutes(20), 12},
+    {base::Minutes(21), 12},
+    {base::Minutes(28), 12},
+    {base::Minutes(29), 12},
+    {base::Minutes(30), 13},
+    {base::Minutes(31), 13},
+    {base::Minutes(38), 13},
+    {base::Minutes(39), 13},
+    {base::Minutes(40), 14},
+    {base::Minutes(41), 14},
+    {base::Minutes(48), 14},
+    {base::Minutes(49), 14},
+    {base::Minutes(50), 15},
+    {base::Minutes(51), 15},
+    {base::Minutes(58), 15},
+    {base::Minutes(59), 15},
+    {base::Minutes(60), 16},
+    {base::Minutes(61), 16},
+    {base::Minutes(73), 16},
+    {base::Minutes(74), 16},
+    {base::Minutes(75), 17},
+    {base::Minutes(76), 17},
+    {base::Minutes(88), 17},
+    {base::Minutes(89), 17},
+    {base::Minutes(90), 18},
+    {base::Minutes(91), 18},
+    {base::Minutes(103), 18},
+    {base::Minutes(104), 18},
+    {base::Minutes(105), 19},
+    {base::Minutes(106), 19},
+    {base::Minutes(118), 19},
+    {base::Minutes(119), 19},
+    {base::Minutes(120), 20},
+    {base::Minutes(121), 20},
+    {base::Minutes(238), 20},
+    {base::Minutes(239), 20},
+    {base::Minutes(240), 21},
+    {base::Minutes(241), 21},
+    {base::Minutes(718), 21},
+    {base::Minutes(719), 21},
+    {base::Minutes(720), 22},
+    {base::Minutes(721), 22},
+    {base::Minutes(1438), 22},
+    {base::Minutes(1439), 22},
+    {base::Minutes(1440), 23},
+    {base::Minutes(1441), 23},
+    {base::Minutes(2158), 23},
+    {base::Minutes(2159), 23},
+    {base::Minutes(2160), 24},
+    {base::Minutes(2161), 24},
+    {base::Minutes(2878), 24},
+    {base::Minutes(2879), 24},
+    {base::Minutes(2880), 25},
+    {base::Minutes(2881), 25},
+    {base::Minutes(4318), 25},
+    {base::Minutes(4319), 25},
+    {base::Minutes(4320), 26},
+    {base::Minutes(4321), 26},
+    {base::Minutes(5758), 26},
+    {base::Minutes(5759), 26},
+    {base::Minutes(5760), 27},
+    {base::Minutes(5761), 27},
+    {base::Minutes(10078), 27},
+    {base::Minutes(10079), 27},
+    {base::Minutes(10080), 28},
+    {base::Minutes(10081), 28},
+    {base::Minutes(20158), 28},
+    {base::Minutes(20159), 28},
+    {base::Minutes(20160), 29},
+    {base::Minutes(20161), 29},
+    {base::Minutes(30238), 29},
+    {base::Minutes(30239), 29},
+    {base::Minutes(30240), 30},
+    {base::Minutes(30241), 30},
+    {base::Minutes(40318), 30},
+    {base::Minutes(40319), 30},
+    {base::Minutes(40320), 31},
+    {base::Minutes(40321), 31},
+    {base::Minutes(1000000), 31},
+    {base::Minutes(1000000000), 31},
+  };
+  // clang-format on
+  for (const auto& test_case : kTestCases) {
+    SCOPED_TRACE(test_case.input.InMinutes());
+    EXPECT_EQ(internals::BucketRecency(test_case.input), test_case.expected);
+    EqualAndNotEqual(/*input=*/test_case.input, /*expected=*/test_case.expected,
+                     /*function=*/NoiseAndBucketRecency,
+                     /*min=*/kMin, /*max=*/kMax);
+  }
+}
+
+TEST(NoiserAndBucketerTest, ModelingSignals) {
+  constexpr uint16_t kMin = 0, kMax = 0x0FFF;
+
+  for (uint16_t i = kMin; i <= kMax; i++) {
+    SCOPED_TRACE(i);
+    EqualAndNotEqual(/*input=*/i, /*expected=*/i,
+                     /*function=*/NoiseAndMaskModelingSignals, /*min=*/kMin,
+                     /*max=*/kMax);
+  }
+}
+
+}  // namespace
+}  // namespace content
diff --git a/content/browser/loader/navigation_url_loader.cc b/content/browser/loader/navigation_url_loader.cc
index 7087cc82..454f2588 100644
--- a/content/browser/loader/navigation_url_loader.cc
+++ b/content/browser/loader/navigation_url_loader.cc
@@ -32,6 +32,8 @@
     NavigationURLLoaderDelegate* delegate,
     LoaderType loader_type,
     mojo::PendingRemote<network::mojom::CookieAccessObserver> cookie_observer,
+    mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+        trust_token_observer,
     mojo::PendingRemote<network::mojom::URLLoaderNetworkServiceObserver>
         url_loader_network_observer,
     mojo::PendingRemote<network::mojom::DevToolsObserver> devtools_observer,
@@ -68,8 +70,9 @@
       browser_context, storage_partition, std::move(request_info),
       std::move(navigation_ui_data), service_worker_handle,
       std::move(prefetched_signed_exchange_cache), delegate,
-      std::move(cookie_observer), std::move(url_loader_network_observer),
-      std::move(devtools_observer), std::move(initial_interceptors));
+      std::move(cookie_observer), std::move(trust_token_observer),
+      std::move(url_loader_network_observer), std::move(devtools_observer),
+      std::move(initial_interceptors));
 }
 
 // static
diff --git a/content/browser/loader/navigation_url_loader.h b/content/browser/loader/navigation_url_loader.h
index acbab06..2ebfd46d 100644
--- a/content/browser/loader/navigation_url_loader.h
+++ b/content/browser/loader/navigation_url_loader.h
@@ -12,6 +12,7 @@
 #include "content/browser/loader/navigation_loader_interceptor.h"
 #include "content/common/content_export.h"
 #include "services/network/public/mojom/devtools_observer.mojom-forward.h"
+#include "services/network/public/mojom/trust_token_access_observer.mojom-forward.h"
 
 namespace net {
 class HttpRequestHeaders;
@@ -69,6 +70,8 @@
       NavigationURLLoaderDelegate* delegate,
       LoaderType loader_type,
       mojo::PendingRemote<network::mojom::CookieAccessObserver> cookie_observer,
+      mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+          trust_token_observer,
       mojo::PendingRemote<network::mojom::URLLoaderNetworkServiceObserver>
           url_loader_network_observer,
       mojo::PendingRemote<network::mojom::DevToolsObserver> devtools_observer,
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index c6656e6a..fc00cee 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -225,6 +225,8 @@
     const NavigationRequestInfo& request_info,
     FrameTreeNode* frame_tree_node,
     mojo::PendingRemote<network::mojom::CookieAccessObserver> cookie_observer,
+    mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+        trust_token_observer,
     mojo::PendingRemote<network::mojom::URLLoaderNetworkServiceObserver>
         url_loader_network_observer,
     mojo::PendingRemote<network::mojom::DevToolsObserver> devtools_observer,
@@ -240,6 +242,8 @@
   new_request->trusted_params = network::ResourceRequest::TrustedParams();
   new_request->trusted_params->isolation_info = request_info.isolation_info;
   new_request->trusted_params->cookie_observer = std::move(cookie_observer);
+  new_request->trusted_params->trust_token_observer =
+      std::move(trust_token_observer);
   new_request->trusted_params->url_loader_network_observer =
       std::move(url_loader_network_observer);
   new_request->trusted_params->devtools_observer = std::move(devtools_observer);
@@ -1280,6 +1284,8 @@
         prefetched_signed_exchange_cache,
     NavigationURLLoaderDelegate* delegate,
     mojo::PendingRemote<network::mojom::CookieAccessObserver> cookie_observer,
+    mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+        trust_token_observer,
     mojo::PendingRemote<network::mojom::URLLoaderNetworkServiceObserver>
         url_loader_network_observer,
     mojo::PendingRemote<network::mojom::DevToolsObserver> devtools_observer,
@@ -1322,8 +1328,8 @@
 
   resource_request_ = CreateResourceRequest(
       *request_info_, frame_tree_node, std::move(cookie_observer),
-      std::move(url_loader_network_observer), std::move(devtools_observer),
-      std::move(accept_ch_frame_observer));
+      std::move(trust_token_observer), std::move(url_loader_network_observer),
+      std::move(devtools_observer), std::move(accept_ch_frame_observer));
 
   std::string accept_langs =
       GetContentClient()->browser()->GetAcceptLangs(browser_context_);
diff --git a/content/browser/loader/navigation_url_loader_impl.h b/content/browser/loader/navigation_url_loader_impl.h
index d4cc5ac..a1691f56 100644
--- a/content/browser/loader/navigation_url_loader_impl.h
+++ b/content/browser/loader/navigation_url_loader_impl.h
@@ -61,6 +61,8 @@
           prefetched_signed_exchange_cache,
       NavigationURLLoaderDelegate* delegate,
       mojo::PendingRemote<network::mojom::CookieAccessObserver> cookie_observer,
+      mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+          trust_token_observer,
       mojo::PendingRemote<network::mojom::URLLoaderNetworkServiceObserver>
           url_loader_network_observer,
       mojo::PendingRemote<network::mojom::DevToolsObserver> devtools_observer,
diff --git a/content/browser/loader/navigation_url_loader_impl_unittest.cc b/content/browser/loader/navigation_url_loader_impl_unittest.cc
index 35521b4..556cd55 100644
--- a/content/browser/loader/navigation_url_loader_impl_unittest.cc
+++ b/content/browser/loader/navigation_url_loader_impl_unittest.cc
@@ -286,6 +286,7 @@
         nullptr /* service_worker_handle */,
         nullptr /* prefetched_signed_exchange_cache */, delegate,
         mojo::NullRemote() /* cookie_access_obsever */,
+        mojo::NullRemote() /* trust_token_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(), std::move(interceptors));
   }
diff --git a/content/browser/loader/navigation_url_loader_unittest.cc b/content/browser/loader/navigation_url_loader_unittest.cc
index 229b08c..32a7402 100644
--- a/content/browser/loader/navigation_url_loader_unittest.cc
+++ b/content/browser/loader/navigation_url_loader_unittest.cc
@@ -137,6 +137,7 @@
         browser_context_.get(), storage_partition, std::move(request_info),
         nullptr, nullptr, nullptr, delegate,
         NavigationURLLoader::LoaderType::kRegular, mojo::NullRemote(),
+        /* trust_token_observer=*/mojo::NullRemote(),
         /* url_loader_network_observer */ mojo::NullRemote(),
         /*devtools_observer=*/mojo::NullRemote());
   }
diff --git a/content/browser/network/trust_token_browsertest.cc b/content/browser/network/trust_token_browsertest.cc
index 10ec77b3..4ec2adf 100644
--- a/content/browser/network/trust_token_browsertest.cc
+++ b/content/browser/network/trust_token_browsertest.cc
@@ -115,6 +115,8 @@
 
   network::test::RegisterTrustTokenTestHandlers(&server_, &request_handler_);
 
+  TrustTokenBrowsertest::Observe(shell()->web_contents());
+
   ASSERT_TRUE(server_.Start());
 }
 
@@ -152,6 +154,18 @@
   return ret;
 }
 
+void TrustTokenBrowsertest::OnTrustTokensAccessed(
+    RenderFrameHost* render_frame_host,
+    const TrustTokenAccessDetails& details) {
+  access_count_++;
+}
+
+void TrustTokenBrowsertest::OnTrustTokensAccessed(
+    NavigationHandle* navigation_handle,
+    const TrustTokenAccessDetails& details) {
+  access_count_++;
+}
+
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, FetchEndToEnd) {
   ProvideRequestHandlerKeyCommitmentsToNetworkService({"a.test"});
 
@@ -183,6 +197,9 @@
       Optional(AllOf(
           HasHeader(network::kTrustTokensRequestHeaderSecRedemptionRecord),
           HasHeader(network::kTrustTokensSecTrustTokenVersionHeader))));
+
+  // Expect three accesses, one for issue, redeem, and sign.
+  EXPECT_EQ(3, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, XhrEndToEnd) {
@@ -247,6 +264,9 @@
       Optional(AllOf(
           HasHeader(network::kTrustTokensRequestHeaderSecRedemptionRecord),
           HasHeader(network::kTrustTokensSecTrustTokenVersionHeader))));
+
+  // Expect three accesses, one for issue, redeem, and sign.
+  EXPECT_EQ(3, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, IframeSendRedemptionRecord) {
@@ -294,6 +314,9 @@
       Optional(AllOf(
           HasHeader(network::kTrustTokensRequestHeaderSecRedemptionRecord),
           HasHeader(network::kTrustTokensSecTrustTokenVersionHeader))));
+
+  // Expect three accesses, one for issue, redeem, and sign.
+  EXPECT_EQ(3, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest,
@@ -342,6 +365,9 @@
   })();)",
                       IssuanceOriginFromHost("a.test"));
   EXPECT_EQ(false, EvalJs(shell(), command));
+
+  // Expect zero accesses.
+  EXPECT_EQ(0, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, HasTrustTokenAfterIssuance) {
@@ -365,6 +391,9 @@
   // Note: EvalJs's EXPECT_EQ type-conversion magic only supports the
   // "Yoda-style" EXPECT_EQ(expected, actual).
   EXPECT_EQ(true, EvalJs(shell(), command));
+
+  // Expect one access for issue.
+  EXPECT_EQ(1, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest,
@@ -392,6 +421,9 @@
 
   EXPECT_THAT(request_handler_.last_incoming_signed_request(),
               Optional(ReflectsSigningFailure()));
+
+  // Expect one access for sign.
+  EXPECT_EQ(1, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, FetchEndToEndInIsolatedWorld) {
@@ -432,6 +464,9 @@
       Optional(AllOf(
           HasHeader(network::kTrustTokensRequestHeaderSecRedemptionRecord),
           HasHeader(network::kTrustTokensSecTrustTokenVersionHeader))));
+
+  // Expect three accesses, one for issue, redeem, and sign.
+  EXPECT_EQ(3, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, RecordsTimers) {
@@ -505,6 +540,9 @@
         "Net.TrustTokens.NetErrorForTrustTokenOperation.Success." + op, net::OK,
         1);
   }
+
+  // Expect three accesses, one for issue, redeem, and sign.
+  EXPECT_EQ(3, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, RecordsNetErrorCodes) {
@@ -575,6 +613,9 @@
   histograms.ExpectUniqueSample(
       "Net.TrustTokens.NetErrorForTrustTokenOperation.Failure.Redemption",
       net::ERR_TRUST_TOKEN_OPERATION_FAILED, 1);
+
+  // Expect three accesses, one for issue, redeem, and sign.
+  EXPECT_EQ(3, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, RecordsFetchFailureReasons) {
@@ -647,6 +688,9 @@
       "Net.TrustTokens.NetErrorForFetchFailure.Issuance",
       net::ERR_BLOCKED_BY_RESPONSE,
       /*expected_count=*/1);
+
+  // Expect three accesses, two for issue and one for redeem.
+  EXPECT_EQ(3, access_count_);
 }
 
 // Trust Tokens should require that their executing contexts be secure.
@@ -688,6 +732,9 @@
   EXPECT_THAT(monitor.GetRequestInfo(issuance_url),
               Optional(Field(&network::ResourceRequest::trust_token_params,
                              IsFalse())));
+
+  // Expect zero accesses.
+  EXPECT_EQ(0, access_count_);
 }
 
 // Issuance should fail if we don't have keys for the issuer at hand.
@@ -707,6 +754,9 @@
   // We use EvalJs here, not ExecJs, because EvalJs waits for promises to
   // resolve.
   EXPECT_EQ("InvalidStateError", EvalJs(shell(), command));
+
+  // Expect one access of issue.
+  EXPECT_EQ(1, access_count_);
 }
 
 // When the server rejects issuance, the client-side issuance operation should
@@ -727,6 +777,9 @@
         { privateToken: { type: 'private-state-token',
                         version: 1, operation: 'token-request' } })
         .then(()=>'Success').catch(err => err.name); )"));
+
+  // Expect one access of issue.
+  EXPECT_EQ(1, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, CrossOriginIssuanceWorks) {
@@ -745,6 +798,9 @@
                                       operation: 'token-request' } })
             .then(()=>'Success'); )",
                                 server_.GetURL("sub1.b.test", "/issue"))));
+
+  // Expect one access of issue.
+  EXPECT_EQ(1, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, CrossSiteIssuanceWorks) {
@@ -762,6 +818,9 @@
                                       operation: 'token-request' } })
             .then(()=>'Success'); )",
                                       server_.GetURL("a.test", "/issue"))));
+
+  // Expect one access of issue.
+  EXPECT_EQ(1, access_count_);
 }
 
 // Issuance should succeed only if the number of issuers associated with the
@@ -795,6 +854,9 @@
                                             version: 1,
                                             operation: 'token-request' } })
             .then(() => 'Success').catch(error => error.name); )"));
+
+  // Expect one access for issue.
+  EXPECT_EQ(1, access_count_);
 }
 
 // When an issuance request is made in cors mode, a cross-origin redirect from
@@ -835,6 +897,9 @@
       EvalJs(shell(),
              JsReplace("document.hasPrivateToken($1, 'private-state-token');",
                        IssuanceOriginFromHost("a.test"))));
+
+  // Expect two accesses for issues.
+  EXPECT_EQ(2, access_count_);
 }
 
 // When an issuance request is made in no-cors mode, a cross-origin redirect
@@ -876,6 +941,9 @@
       EvalJs(shell(),
              JsReplace("document.hasPrivateToken($1, 'private-state-token');",
                        IssuanceOriginFromHost("b.test"))));
+
+  // Expect one access for issue.
+  EXPECT_EQ(1, access_count_);
 }
 
 // Issuance from a context with a secure-but-non-HTTP/S top frame origin
@@ -906,6 +974,9 @@
       EvalJs(shell(),
              JsReplace("document.hasPrivateToken($1, 'private-state-token');",
                        url::Origin::Create(server_.base_url()).Serialize())));
+
+  // Expect one access for issue.
+  EXPECT_EQ(1, access_count_);
 }
 
 // Redemption from a secure-but-non-HTTP(S) top frame origin should fail.
@@ -939,6 +1010,9 @@
   EXPECT_EQ(
       "InvalidStateError",
       EvalJs(shell(), JsReplace(command, server_.GetURL("a.test", "/redeem"))));
+
+  // Expect two accesses, one for issue and one for redemption.
+  EXPECT_EQ(2, access_count_);
 }
 
 // hasPrivateToken from a context with a secure-but-non-HTTP/S top frame
@@ -955,6 +1029,8 @@
           shell(),
           R"(document.hasPrivateToken('https://issuer.example', 'private-state-token')
                               .catch(error => error.name);)"));
+
+  EXPECT_EQ(0, access_count_);
 }
 
 // A hasPrivateToken call initiated from a secure context should succeed
@@ -975,6 +1051,8 @@
           root->child_at(0)->current_frame_host(),
           R"(document.hasPrivateToken('https://davids.website', 'private-state-token')
                               .then(()=>'Success');)"));
+
+  EXPECT_EQ(0, access_count_);
 }
 
 // An operation initiated from a secure context should succeed even if the
@@ -1000,6 +1078,9 @@
                                              operation: 'token-request'}
                                          }).then(()=>'Success');)",
                                         server_.GetURL("a.test", "/issue"))));
+
+  // Expect one access for issue.
+  EXPECT_EQ(1, access_count_);
 }
 
 // If a server issues with a key not present in the client's collection of key
@@ -1024,6 +1105,9 @@
   EXPECT_EQ(
       "OperationError",
       EvalJs(shell(), JsReplace(command, server_.GetURL("a.test", "/issue"))));
+
+  // Expect one access for issue.
+  EXPECT_EQ(1, access_count_);
 }
 
 // This regression test for crbug.com/1111735 ensures it's possible to execute
@@ -1063,6 +1147,9 @@
                                              ]}
                                          }).then(()=>'Success');)",
                                         server_.GetURL("a.test", "/issue"))));
+
+  // Expect one access for sign.
+  EXPECT_EQ(1, access_count_);
 }
 
 // Redemption should fail when there are no keys for the issuer.
@@ -1077,6 +1164,9 @@
         .then(() => 'Success')
         .catch(err => err.name); )",
                                       server_.GetURL("a.test", "/redeem"))));
+
+  // Expect one access for redemption.
+  EXPECT_EQ(1, access_count_);
 }
 
 // Redemption should fail when there are no tokens to redeem.
@@ -1093,6 +1183,9 @@
         .then(() => 'Success')
         .catch(err => err.name); )",
                                       server_.GetURL("a.test", "/redeem"))));
+
+  // Expect one access for redemption.
+  EXPECT_EQ(1, access_count_);
 }
 
 // When we have tokens for one issuer A, redemption against a different issuer B
@@ -1119,6 +1212,9 @@
         .then(() => 'Success')
         .catch(err => err.name); )",
                                       server_.GetURL("b.test", "/redeem"))));
+
+  // Expect two accesses, one for issuance and one for redemption.
+  EXPECT_EQ(2, access_count_);
 }
 
 // When the server rejects redemption, the client-side redemption operation
@@ -1144,6 +1240,9 @@
                         operation: 'token-redemption' } })
         .then(() => 'Success')
         .catch(err => err.name); )"));
+
+  // Expect two accesses, one for issuance and one for redemption.
+  EXPECT_EQ(2, access_count_);
 }
 
 // After a successful issuance and redemption, a subsequent redemption against
@@ -1177,6 +1276,9 @@
                         operation: 'token-redemption' } })
         .catch(err => err.name); )",
                                       server_.GetURL("a.test", "/redeem"))));
+
+  // Expect three accesses, one for issuance and two for redemption.
+  EXPECT_EQ(3, access_count_);
 }
 
 // Redemption with `refresh-policy: 'refresh'` from an issuer context should
@@ -1211,6 +1313,9 @@
                         refreshPolicy: 'refresh' } })
         .then(()=>'Success'); )",
                                       server_.GetURL("a.test", "/redeem"))));
+
+  // Expect three accesses, one for issuance and two for redemption.
+  EXPECT_EQ(3, access_count_);
 }
 
 // Redemption with `refresh-policy: 'refresh'` from a non-issuer context should
@@ -1248,6 +1353,9 @@
                         refreshPolicy: 'refresh' } })
         .then(()=>'Success').catch(err => err.name); )",
                                       server_.GetURL("b.test", "/redeem"))));
+
+  // Expect three accesses, one for issuance and two for redemption.
+  EXPECT_EQ(3, access_count_);
 }
 
 // When a redemption request is made in cors mode, a cross-origin redirect from
@@ -1326,6 +1434,9 @@
   // request.
   EXPECT_THAT(request_handler_.last_incoming_signed_request(),
               Optional(ReflectsSigningFailure()));
+
+  // Expect six accesses, four for issuance and two for redemption.
+  EXPECT_EQ(6, access_count_);
 }
 
 // When a redemption request is made in no-cors mode, a cross-origin redirect
@@ -1395,6 +1506,9 @@
   // request.
   EXPECT_THAT(request_handler_.last_incoming_signed_request(),
               Optional(ReflectsSigningFailure()));
+
+  // Expect four accesses, two for issuance and two for redemption.
+  EXPECT_EQ(4, access_count_);
 }
 
 // When a redemption request is made in no-cors mode, a cross-origin redirect
@@ -1433,6 +1547,9 @@
                         version: 1,
                         operation: 'token-redemption' } })
         .then(()=>'Success'); )"));
+
+  // Expect two accesses, one for issuance and one for redemption.
+  EXPECT_EQ(2, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest,
@@ -1474,6 +1591,9 @@
 
   EXPECT_THAT(request_handler_.last_incoming_signed_request(),
               Optional(ReflectsSigningFailure()));
+
+  // Expect three access, one for issue, redeem, and sign.
+  EXPECT_EQ(3, access_count_);
 }
 
 IN_PROC_BROWSER_TEST_F(TrustTokenBrowsertest, FetchEndToEndWithServiceWorker) {
@@ -1517,6 +1637,9 @@
       Optional(AllOf(
           HasHeader(network::kTrustTokensRequestHeaderSecRedemptionRecord),
           HasHeader(network::kTrustTokensSecTrustTokenVersionHeader))));
+
+  // Expect three accesses, one for issue and one for redeem and one for sign.
+  EXPECT_EQ(3, access_count_);
 }
 
 // Test redemption limit. Make three refreshing redemption calls back to back
@@ -1567,6 +1690,10 @@
         .then(()=>'Success')
         .catch(()=>'Error'); )",
                                       server_.GetURL("a.test", "/redeem"))));
+
+  // Expect four accesses, one for issuance, one for redemption, and two for
+  // sign.
+  EXPECT_EQ(4, access_count_);
 }
 
 // Check whether depreciated fetch API where 'type' refers to operation
diff --git a/content/browser/network/trust_token_browsertest.h b/content/browser/network/trust_token_browsertest.h
index c5b9079..51dd64f 100644
--- a/content/browser/network/trust_token_browsertest.h
+++ b/content/browser/network/trust_token_browsertest.h
@@ -32,7 +32,8 @@
 // diamond inheriting from ContentBrowserTest directly, needs to do so
 // virtually. Otherwise DevtoolsTrustTokenBrowsertest would contain multiple
 // copies of ContentBrowserTest's members.
-class TrustTokenBrowsertest : virtual public ContentBrowserTest {
+class TrustTokenBrowsertest : virtual public ContentBrowserTest,
+                              public WebContentsObserver {
  public:
   TrustTokenBrowsertest();
 
@@ -45,6 +46,12 @@
   // verification key was previously bound to a successful token redemption.
   void SetUpOnMainThread() override;
 
+  void OnTrustTokensAccessed(RenderFrameHost* render_frame_host,
+                             const TrustTokenAccessDetails& details) override;
+
+  void OnTrustTokensAccessed(NavigationHandle* navigation_handle,
+                             const TrustTokenAccessDetails& details) override;
+
  protected:
   // Provides the network service key commitments from the internal
   // TrustTokenRequestHandler. All hosts in |hosts| will be provided identical
@@ -65,6 +72,9 @@
   TrustTokenRequestHandler request_handler_;
 
   net::EmbeddedTestServer server_{net::EmbeddedTestServer::TYPE_HTTPS};
+
+  // Number of accesses reported by the Trust Token observer.
+  int access_count_ = 0;
 };
 
 }  // namespace content
diff --git a/content/browser/preloading/prefetch/prefetch_container.cc b/content/browser/preloading/prefetch/prefetch_container.cc
index 51b841b..3d78736 100644
--- a/content/browser/preloading/prefetch/prefetch_container.cc
+++ b/content/browser/preloading/prefetch/prefetch_container.cc
@@ -398,12 +398,11 @@
       this_prefetch->url_, cookie_manager);
 }
 
-void PrefetchContainer::StopCookieListener(const GURL& url) {
-  SinglePrefetch* this_prefetch = GetSinglePrefetch(url);
-  DCHECK(this_prefetch);
-
-  if (this_prefetch->cookie_listener_) {
-    this_prefetch->cookie_listener_->StopListening();
+void PrefetchContainer::StopAllCookieListeners() {
+  for (const auto& single_prefetch : redirect_chain_) {
+    if (single_prefetch->cookie_listener_) {
+      single_prefetch->cookie_listener_->StopListening();
+    }
   }
 }
 
@@ -419,21 +418,23 @@
 }
 
 bool PrefetchContainer::HasIsolatedCookieCopyStarted() const {
-  switch (cookie_copy_status_) {
-    case CookieCopyStatus::kNotStarted:
+  switch (
+      redirect_chain_[index_redirect_chain_to_serve_]->cookie_copy_status_) {
+    case SinglePrefetch::CookieCopyStatus::kNotStarted:
       return false;
-    case CookieCopyStatus::kInProgress:
-    case CookieCopyStatus::kCompleted:
+    case SinglePrefetch::CookieCopyStatus::kInProgress:
+    case SinglePrefetch::CookieCopyStatus::kCompleted:
       return true;
   }
 }
 
 bool PrefetchContainer::IsIsolatedCookieCopyInProgress() const {
-  switch (cookie_copy_status_) {
-    case CookieCopyStatus::kNotStarted:
-    case CookieCopyStatus::kCompleted:
+  switch (
+      redirect_chain_[index_redirect_chain_to_serve_]->cookie_copy_status_) {
+    case SinglePrefetch::CookieCopyStatus::kNotStarted:
+    case SinglePrefetch::CookieCopyStatus::kCompleted:
       return false;
-    case CookieCopyStatus::kInProgress:
+    case SinglePrefetch::CookieCopyStatus::kInProgress:
       return true;
   }
 }
@@ -441,51 +442,64 @@
 void PrefetchContainer::OnIsolatedCookieCopyStart() {
   DCHECK(!IsIsolatedCookieCopyInProgress());
 
-  // We don't want the cookie listener for this URL to get the changes from the
-  // copy.
-  StopCookieListener(prefetch_url_);
+  // We don't want any of the cookie listeners for this prefetch to pick up
+  // changes from the copy.
+  StopAllCookieListeners();
 
-  cookie_copy_status_ = CookieCopyStatus::kInProgress;
+  redirect_chain_[index_redirect_chain_to_serve_]->cookie_copy_status_ =
+      SinglePrefetch::CookieCopyStatus::kInProgress;
 
-  cookie_copy_start_time_ = base::TimeTicks::Now();
+  redirect_chain_[index_redirect_chain_to_serve_]->cookie_copy_start_time_ =
+      base::TimeTicks::Now();
 }
 
 void PrefetchContainer::OnIsolatedCookiesReadCompleteAndWriteStart() {
   DCHECK(IsIsolatedCookieCopyInProgress());
 
-  cookie_read_end_and_write_start_time_ = base::TimeTicks::Now();
+  redirect_chain_[index_redirect_chain_to_serve_]
+      ->cookie_read_end_and_write_start_time_ = base::TimeTicks::Now();
 }
 
 void PrefetchContainer::OnIsolatedCookieCopyComplete() {
   DCHECK(IsIsolatedCookieCopyInProgress());
 
-  cookie_copy_status_ = CookieCopyStatus::kCompleted;
+  const auto& this_prefetch = redirect_chain_[index_redirect_chain_to_serve_];
 
-  if (cookie_copy_start_time_.has_value() &&
-      cookie_read_end_and_write_start_time_.has_value()) {
-    RecordCookieCopyTimes(*cookie_copy_start_time_,
-                          *cookie_read_end_and_write_start_time_,
-                          base::TimeTicks::Now());
+  this_prefetch->cookie_copy_status_ =
+      SinglePrefetch::CookieCopyStatus::kCompleted;
+
+  if (this_prefetch->cookie_copy_start_time_.has_value() &&
+      this_prefetch->cookie_read_end_and_write_start_time_.has_value()) {
+    RecordCookieCopyTimes(
+        this_prefetch->cookie_copy_start_time_.value(),
+        this_prefetch->cookie_read_end_and_write_start_time_.value(),
+        base::TimeTicks::Now());
   }
 
-  if (on_cookie_copy_complete_callback_)
-    std::move(on_cookie_copy_complete_callback_).Run();
+  if (this_prefetch->on_cookie_copy_complete_callback_) {
+    std::move(this_prefetch->on_cookie_copy_complete_callback_).Run();
+  }
 }
 
 void PrefetchContainer::OnInterceptorCheckCookieCopy() {
-  if (!cookie_copy_start_time_)
+  if (!redirect_chain_[index_redirect_chain_to_serve_]
+           ->cookie_copy_start_time_) {
     return;
+  }
 
   UMA_HISTOGRAM_CUSTOM_TIMES(
       "PrefetchProxy.AfterClick.Mainframe.CookieCopyStartToInterceptorCheck",
-      base::TimeTicks::Now() - cookie_copy_start_time_.value(),
+      base::TimeTicks::Now() - redirect_chain_[index_redirect_chain_to_serve_]
+                                   ->cookie_copy_start_time_.value(),
       base::TimeDelta(), base::Seconds(5), 50);
 }
 
 void PrefetchContainer::SetOnCookieCopyCompleteCallback(
     base::OnceClosure callback) {
   DCHECK(IsIsolatedCookieCopyInProgress());
-  on_cookie_copy_complete_callback_ = std::move(callback);
+
+  redirect_chain_[index_redirect_chain_to_serve_]
+      ->on_cookie_copy_complete_callback_ = std::move(callback);
 }
 
 void PrefetchContainer::TakeStreamingURLLoader(
@@ -518,7 +532,11 @@
     case PrefetchProbeResult::kNoProbing:
     case PrefetchProbeResult::kDNSProbeSuccess:
     case PrefetchProbeResult::kTLSProbeSuccess:
-      SetPrefetchStatus(PrefetchStatus::kPrefetchResponseUsed);
+      // Wait to update the prefetch status until the probe for the final
+      // redirect hop is a success.
+      if (index_redirect_chain_to_serve_ == redirect_chain_.size() - 1) {
+        SetPrefetchStatus(PrefetchStatus::kPrefetchResponseUsed);
+      }
       break;
     case PrefetchProbeResult::kDNSProbeFailure:
     case PrefetchProbeResult::kTLSProbeFailure:
@@ -581,6 +599,20 @@
   return streaming_loader_ && streaming_loader_->Servable(cacheable_duration);
 }
 
+bool PrefetchContainer::DoesCurrentURLToServeMatch(const GURL& url) const {
+  DCHECK(index_redirect_chain_to_serve_ >= 1 &&
+         index_redirect_chain_to_serve_ < redirect_chain_.size());
+  return redirect_chain_[index_redirect_chain_to_serve_]->url_ == url ||
+         IsMatchingNoVarySearchUrl(
+             redirect_chain_[index_redirect_chain_to_serve_]->url_, url);
+}
+
+const GURL& PrefetchContainer::GetCurrentURLToServe() const {
+  DCHECK(index_redirect_chain_to_serve_ >= 0 &&
+         index_redirect_chain_to_serve_ < redirect_chain_.size());
+  return redirect_chain_[index_redirect_chain_to_serve_]->url_;
+}
+
 const network::mojom::URLResponseHead* PrefetchContainer::GetHead() {
   return streaming_loader_ ? streaming_loader_->GetHead() : nullptr;
 }
diff --git a/content/browser/preloading/prefetch/prefetch_container.h b/content/browser/preloading/prefetch/prefetch_container.h
index 55ea9c3..75a8cdc 100644
--- a/content/browser/preloading/prefetch/prefetch_container.h
+++ b/content/browser/preloading/prefetch/prefetch_container.h
@@ -125,6 +125,7 @@
 
   // The length of the redirect chain for this prefetch.
   size_t GetRedirectChainSize() const { return redirect_chain_.size(); }
+  GURL GetMatchingURLFromRedirectChain() const;
 
   // Whether this prefetch is a decoy. Decoy prefetches will not store the
   // response, and not serve any prefetched resources.
@@ -135,13 +136,15 @@
   // |redirect_chain_|.
   void RegisterCookieListener(const GURL& url,
                               network::mojom::CookieManager* cookie_manager);
-  void StopCookieListener(const GURL& url);
+  void StopAllCookieListeners();
   bool HaveDefaultContextCookiesChanged(const GURL& url) const;
 
   // Before a prefetch can be served, any cookies added to the isolated network
   // context must be copied over to the default network context. These functions
   // are used to check and update the status of this process, as well as record
-  // metrics about how long this process takes.
+  // metrics about how long this process takes. These functions all operate on
+  // the element in |redirect_chain_| at index
+  // |index_redirect_chain_to_serve_|.
   bool HasIsolatedCookieCopyStarted() const;
   bool IsIsolatedCookieCopyInProgress() const;
   void OnIsolatedCookieCopyStart();
@@ -194,6 +197,18 @@
   // Whether or not |this| is servable.
   bool IsPrefetchServable(base::TimeDelta cacheable_duration) const;
 
+  // Checks if the given URL matches the element in |redirect_chain_| at index
+  // |index_redirect_chain_to_serve_|.
+  bool DoesCurrentURLToServeMatch(const GURL& url) const;
+
+  // Returns the URL that can be served next. This is the url of the element in
+  // |redirect_chain_| at index |index_redirect_chain_to_serve_|.
+  const GURL& GetCurrentURLToServe() const;
+
+  // Called when one element of |redirect_chain_| is served and the next element
+  // can now be served.
+  void AdvanceCurrentURLToServe() { index_redirect_chain_to_serve_++; }
+
   // Called when |this| has received prefetched response's head.
   // Once this is called, we should be able to call GetHead() and receive a
   // non-null result.
@@ -283,6 +298,25 @@
     // This tracks whether the cookies associated with |url_| have changed at
     // some point after the initial eligibility check.
     std::unique_ptr<PrefetchCookieListener> cookie_listener_;
+
+    // The different possible states of the cookie copy process.
+    enum class CookieCopyStatus {
+      kNotStarted,
+      kInProgress,
+      kCompleted,
+    };
+
+    // The current state of the cookie copy process for this prefetch.
+    CookieCopyStatus cookie_copy_status_ = CookieCopyStatus::kNotStarted;
+
+    // The timestamps of when the overall cookie copy process starts, and midway
+    // when the cookies are read from the isolated network context and are about
+    // to be written to the default network context.
+    absl::optional<base::TimeTicks> cookie_copy_start_time_;
+    absl::optional<base::TimeTicks> cookie_read_end_and_write_start_time_;
+
+    // A callback that runs once |cookie_copy_status_| is set to |kCompleted|.
+    base::OnceClosure on_cookie_copy_complete_callback_;
   };
 
   // Helper function to get the |SinglePrefetch| for the given URL.
@@ -327,6 +361,9 @@
   // The redirect chain resulting from prefetching |prefetch_url_|.
   std::vector<std::unique_ptr<SinglePrefetch>> redirect_chain_;
 
+  // The index of the element in |redirect_chain_| that can be served.
+  size_t index_redirect_chain_to_serve_ = 0;
+
   // The network context used for this prefetch.
   std::unique_ptr<PrefetchNetworkContext> network_context_;
 
@@ -355,25 +392,6 @@
   // The result of probe when checked on navigation.
   absl::optional<PrefetchProbeResult> probe_result_;
 
-  // The different possible states of the cookie copy process.
-  enum class CookieCopyStatus {
-    kNotStarted,
-    kInProgress,
-    kCompleted,
-  };
-
-  // The current state of the cookie copy process for this prefetch.
-  CookieCopyStatus cookie_copy_status_ = CookieCopyStatus::kNotStarted;
-
-  // The timestamps of when the overall cookie copy process starts, and midway
-  // when the cookies are read from the isolated network context and are about
-  // to be written to the default network context.
-  absl::optional<base::TimeTicks> cookie_copy_start_time_;
-  absl::optional<base::TimeTicks> cookie_read_end_and_write_start_time_;
-
-  // A callback that runs once |cookie_copy_status_| is set to |kCompleted|.
-  base::OnceClosure on_cookie_copy_complete_callback_;
-
   // Reference to metrics related to the page that considered using this
   // prefetch.
   base::WeakPtr<PrefetchServingPageMetricsContainer>
diff --git a/content/browser/preloading/prefetch/prefetch_container_unittest.cc b/content/browser/preloading/prefetch/prefetch_container_unittest.cc
index b4a28922..f19f3dfa 100644
--- a/content/browser/preloading/prefetch/prefetch_container_unittest.cc
+++ b/content/browser/preloading/prefetch/prefetch_container_unittest.cc
@@ -205,7 +205,7 @@
   EXPECT_TRUE(prefetch_container.HaveDefaultContextCookiesChanged(kTestUrl2));
   EXPECT_FALSE(prefetch_container.HaveDefaultContextCookiesChanged(kTestUrl3));
 
-  prefetch_container.StopCookieListener(kTestUrl3);
+  prefetch_container.StopAllCookieListeners();
   ASSERT_TRUE(SetCookie(kTestUrl2, "test-cookie3"));
 
   EXPECT_TRUE(prefetch_container.HaveDefaultContextCookiesChanged(kTestUrl1));
@@ -269,6 +269,126 @@
       base::Milliseconds(70), 1);
 }
 
+TEST_F(PrefetchContainerTest, CookieCopyWithRedirects) {
+  const GURL kTestUrl = GURL("https://test.com");
+  const GURL kRedirectUrl1 = GURL("https://redirect1.com");
+  const GURL kRedirectUrl2 = GURL("https://redirect2.com");
+  base::HistogramTester histogram_tester;
+  PrefetchContainer prefetch_container(
+      GlobalRenderFrameHostId(1234, 5678), kTestUrl,
+      PrefetchType(/*use_isolated_network_context=*/true,
+                   /*use_prefetch_proxy=*/true,
+                   blink::mojom::SpeculationEagerness::kEager),
+      blink::mojom::Referrer(), nullptr);
+
+  prefetch_container.AddRedirectHop(kRedirectUrl1);
+  prefetch_container.AddRedirectHop(kRedirectUrl2);
+
+  prefetch_container.RegisterCookieListener(kTestUrl, cookie_manager());
+  prefetch_container.RegisterCookieListener(kRedirectUrl1, cookie_manager());
+  prefetch_container.RegisterCookieListener(kRedirectUrl2, cookie_manager());
+
+  EXPECT_EQ(prefetch_container.GetCurrentURLToServe(), kTestUrl);
+
+  EXPECT_FALSE(prefetch_container.IsIsolatedCookieCopyInProgress());
+  prefetch_container.OnIsolatedCookieCopyStart();
+  EXPECT_TRUE(prefetch_container.IsIsolatedCookieCopyInProgress());
+
+  // Once the cookie copy process has started, all cookie listeners are stopped.
+  ASSERT_TRUE(SetCookie(kTestUrl, "test-cookie"));
+  ASSERT_TRUE(SetCookie(kRedirectUrl1, "test-cookie"));
+  ASSERT_TRUE(SetCookie(kRedirectUrl2, "test-cookie"));
+
+  EXPECT_FALSE(prefetch_container.HaveDefaultContextCookiesChanged(kTestUrl));
+  EXPECT_FALSE(
+      prefetch_container.HaveDefaultContextCookiesChanged(kRedirectUrl1));
+  EXPECT_FALSE(
+      prefetch_container.HaveDefaultContextCookiesChanged(kRedirectUrl2));
+
+  task_environment()->FastForwardBy(base::Milliseconds(10));
+  prefetch_container.OnIsolatedCookiesReadCompleteAndWriteStart();
+  task_environment()->FastForwardBy(base::Milliseconds(20));
+
+  // The URL interceptor checks on the cookie copy status when trying to serve a
+  // prefetch. If its still in progress, it registers a callback to be called
+  // once the copy is complete.
+  EXPECT_TRUE(prefetch_container.IsIsolatedCookieCopyInProgress());
+  prefetch_container.OnInterceptorCheckCookieCopy();
+  task_environment()->FastForwardBy(base::Milliseconds(40));
+  bool callback_called = false;
+  prefetch_container.SetOnCookieCopyCompleteCallback(
+      base::BindOnce([](bool* callback_called) { *callback_called = true; },
+                     &callback_called));
+
+  prefetch_container.OnIsolatedCookieCopyComplete();
+
+  EXPECT_FALSE(prefetch_container.IsIsolatedCookieCopyInProgress());
+  EXPECT_TRUE(callback_called);
+
+  // Simulate copying cookies for the next redirect hop.
+  prefetch_container.AdvanceCurrentURLToServe();
+  EXPECT_EQ(prefetch_container.GetCurrentURLToServe(), kRedirectUrl1);
+  EXPECT_FALSE(prefetch_container.IsIsolatedCookieCopyInProgress());
+
+  prefetch_container.OnIsolatedCookieCopyStart();
+  EXPECT_TRUE(prefetch_container.IsIsolatedCookieCopyInProgress());
+  task_environment()->FastForwardBy(base::Milliseconds(10));
+
+  prefetch_container.OnIsolatedCookiesReadCompleteAndWriteStart();
+  task_environment()->FastForwardBy(base::Milliseconds(20));
+  EXPECT_TRUE(prefetch_container.IsIsolatedCookieCopyInProgress());
+
+  prefetch_container.OnInterceptorCheckCookieCopy();
+  task_environment()->FastForwardBy(base::Milliseconds(40));
+
+  callback_called = false;
+  prefetch_container.SetOnCookieCopyCompleteCallback(
+      base::BindOnce([](bool* callback_called) { *callback_called = true; },
+                     &callback_called));
+
+  prefetch_container.OnIsolatedCookieCopyComplete();
+  EXPECT_FALSE(prefetch_container.IsIsolatedCookieCopyInProgress());
+  EXPECT_TRUE(callback_called);
+
+  // Simulate copying cookies for the last redirect hop.
+  prefetch_container.AdvanceCurrentURLToServe();
+  EXPECT_EQ(prefetch_container.GetCurrentURLToServe(), kRedirectUrl2);
+  EXPECT_FALSE(prefetch_container.IsIsolatedCookieCopyInProgress());
+
+  prefetch_container.OnIsolatedCookieCopyStart();
+  EXPECT_TRUE(prefetch_container.IsIsolatedCookieCopyInProgress());
+  task_environment()->FastForwardBy(base::Milliseconds(10));
+
+  prefetch_container.OnIsolatedCookiesReadCompleteAndWriteStart();
+  task_environment()->FastForwardBy(base::Milliseconds(20));
+  EXPECT_TRUE(prefetch_container.IsIsolatedCookieCopyInProgress());
+
+  prefetch_container.OnInterceptorCheckCookieCopy();
+  task_environment()->FastForwardBy(base::Milliseconds(40));
+
+  callback_called = false;
+  prefetch_container.SetOnCookieCopyCompleteCallback(
+      base::BindOnce([](bool* callback_called) { *callback_called = true; },
+                     &callback_called));
+
+  prefetch_container.OnIsolatedCookieCopyComplete();
+  EXPECT_FALSE(prefetch_container.IsIsolatedCookieCopyInProgress());
+  EXPECT_TRUE(callback_called);
+
+  histogram_tester.ExpectUniqueTimeSample(
+      "PrefetchProxy.AfterClick.Mainframe.CookieReadTime",
+      base::Milliseconds(10), 3);
+  histogram_tester.ExpectUniqueTimeSample(
+      "PrefetchProxy.AfterClick.Mainframe.CookieWriteTime",
+      base::Milliseconds(60), 3);
+  histogram_tester.ExpectUniqueTimeSample(
+      "PrefetchProxy.AfterClick.Mainframe.CookieCopyStartToInterceptorCheck",
+      base::Milliseconds(30), 3);
+  histogram_tester.ExpectUniqueTimeSample(
+      "PrefetchProxy.AfterClick.Mainframe.CookieCopyTime",
+      base::Milliseconds(70), 3);
+}
+
 TEST_F(PrefetchContainerTest, PrefetchProxyPrefetchedResourceUkm) {
   ukm::TestAutoSetUkmRecorder ukm_recorder;
 
diff --git a/content/browser/preloading/prefetch/prefetch_service.cc b/content/browser/preloading/prefetch/prefetch_service.cc
index cc8886a..c0d2a10 100644
--- a/content/browser/preloading/prefetch/prefetch_service.cc
+++ b/content/browser/preloading/prefetch/prefetch_service.cc
@@ -1180,7 +1180,7 @@
   prefetch_container->OnIsolatedCookieCopyStart();
   net::CookieOptions options = net::CookieOptions::MakeAllInclusive();
   prefetch_container->GetNetworkContext()->GetCookieManager()->GetCookieList(
-      prefetch_container->GetURL(), options,
+      prefetch_container->GetCurrentURLToServe(), options,
       net::CookiePartitionKeyCollection::Todo(),
       base::BindOnce(&PrefetchService::OnGotIsolatedCookiesForCopy,
                      weak_method_factory_.GetWeakPtr(), prefetch_container));
@@ -1207,9 +1207,9 @@
   for (const net::CookieWithAccessResult& cookie : cookie_list) {
     browser_context_->GetDefaultStoragePartition()
         ->GetCookieManagerForBrowserProcess()
-        ->SetCanonicalCookie(cookie.cookie, prefetch_container->GetURL(),
-                             options,
-                             base::BindOnce(&CookieSetHelper, barrier));
+        ->SetCanonicalCookie(
+            cookie.cookie, prefetch_container->GetCurrentURLToServe(), options,
+            base::BindOnce(&CookieSetHelper, barrier));
   }
 }
 
@@ -1229,13 +1229,6 @@
     return;
   }
 
-  // TODO(https://crbug.com/1266876): Allow prefetches with redirects to be
-  // served.
-  if (prefetch_container->GetRedirectChainSize() > 1) {
-    std::move(on_prefetch_to_serve_ready).Run(nullptr);
-    return;
-  }
-
   if (prefetch_container->IsPrefetchServable(PrefetchCacheableDuration())) {
     ReturnPrefetchToServe(prefetch_container,
                           std::move(on_prefetch_to_serve_ready));
diff --git a/content/browser/preloading/prefetch/prefetch_service.h b/content/browser/preloading/prefetch/prefetch_service.h
index 89657fd..a2847e7 100644
--- a/content/browser/preloading/prefetch/prefetch_service.h
+++ b/content/browser/preloading/prefetch/prefetch_service.h
@@ -86,6 +86,10 @@
   void GetPrefetchToServe(const GURL& url,
                           OnPrefetchToServeReady on_prefetch_to_serve_ready);
 
+  // Copies any cookies in the isolated network context associated with
+  // |prefetch_container| to the default network context.
+  void CopyIsolatedCookies(base::WeakPtr<PrefetchContainer> prefetch_container);
+
   // Removes the prefetch with the given |prefetch_container_key| from
   // |all_prefetches_|.
   void RemovePrefetch(const PrefetchContainer::Key& prefetch_container_key);
@@ -217,9 +221,9 @@
       base::WeakPtr<PrefetchContainer> prefetch_container,
       const network::URLLoaderCompletionStatus& completion_status);
 
-  // Copies any cookies in the isolated network context associated with
-  // |prefetch_container| to the default network context.
-  void CopyIsolatedCookies(base::WeakPtr<PrefetchContainer> prefetch_container);
+  // Called when the cookies from |prefetch_conatiner| are read from the
+  // isolated network context and are ready to be written to the default network
+  // context.
   void OnGotIsolatedCookiesForCopy(
       base::WeakPtr<PrefetchContainer> prefetch_container,
       const net::CookieAccessResultList& cookie_list,
diff --git a/content/browser/preloading/prefetch/prefetch_service_unittest.cc b/content/browser/preloading/prefetch/prefetch_service_unittest.cc
index c39714d..2cc2bf69 100644
--- a/content/browser/preloading/prefetch/prefetch_service_unittest.cc
+++ b/content/browser/preloading/prefetch/prefetch_service_unittest.cc
@@ -3332,7 +3332,15 @@
 
   base::WeakPtr<PrefetchContainer> serveable_prefetch_container =
       GetPrefetchToServe(GURL("https://example.com"));
-  EXPECT_FALSE(serveable_prefetch_container);
+  EXPECT_TRUE(serveable_prefetch_container);
+  ASSERT_TRUE(serveable_prefetch_container);
+  EXPECT_TRUE(serveable_prefetch_container->HasPrefetchStatus());
+  EXPECT_EQ(serveable_prefetch_container->GetPrefetchStatus(),
+            PrefetchStatus::kPrefetchSuccessful);
+  EXPECT_TRUE(
+      serveable_prefetch_container->IsPrefetchServable(base::TimeDelta::Max()));
+  ASSERT_TRUE(serveable_prefetch_container->GetHead());
+  EXPECT_TRUE(serveable_prefetch_container->GetHead()->was_in_prefetch_cache);
 
   ExpectCorrectUkmLogs(PreloadingEligibility::kEligible,
                        PreloadingHoldbackStatus::kAllowed,
diff --git a/content/browser/preloading/prefetch/prefetch_streaming_url_loader.cc b/content/browser/preloading/prefetch/prefetch_streaming_url_loader.cc
index e5ee4d6..bbcc4d76 100644
--- a/content/browser/preloading/prefetch/prefetch_streaming_url_loader.cc
+++ b/content/browser/preloading/prefetch/prefetch_streaming_url_loader.cc
@@ -108,14 +108,16 @@
 
 void PrefetchStreamingURLLoader::OnReceiveEarlyHints(
     network::mojom::EarlyHintsPtr early_hints) {
-  if (serving_url_loader_client_) {
-    serving_url_loader_client_->OnReceiveEarlyHints(std::move(early_hints));
+  if (serving_url_loader_client_ &&
+      event_queue_status_ == EventQueueStatus::kFinished) {
+    ForwardEarlyHints(std::move(early_hints));
     return;
   }
 
-  event_queue_.push_back(
-      base::BindOnce(&PrefetchStreamingURLLoader::OnReceiveEarlyHints,
-                     base::Unretained(this), std::move(early_hints)));
+  AddEventToQueue(
+      base::BindOnce(&PrefetchStreamingURLLoader::ForwardEarlyHints,
+                     base::Unretained(this), std::move(early_hints)),
+      /*pause_after_event=*/false);
 }
 
 void PrefetchStreamingURLLoader::OnReceiveResponse(
@@ -173,14 +175,24 @@
   if (on_received_head_callback_) {
     std::move(on_received_head_callback_).Run();
   }
+
+  DCHECK(event_queue_status_ == EventQueueStatus::kNotStarted);
+  AddEventToQueue(base::BindOnce(&PrefetchStreamingURLLoader::ForwardResponse,
+                                 base::Unretained(this)),
+                  /*pause_after_event=*/false);
 }
 
 void PrefetchStreamingURLLoader::OnReceiveRedirect(
     const net::RedirectInfo& redirect_info,
     network::mojom::URLResponseHeadPtr head) {
   DCHECK(on_prefetch_redirect_callback_);
+  DCHECK(!redirect_head_);
+
+  redirect_info_ = redirect_info;
+  redirect_head_ = std::move(head);
+
   HandleRedirect(
-      on_prefetch_redirect_callback_.Run(redirect_info, *head.get()));
+      on_prefetch_redirect_callback_.Run(redirect_info, *redirect_head_.get()));
 }
 
 void PrefetchStreamingURLLoader::OnEligibilityCheckForRedirectComplete(
@@ -194,6 +206,8 @@
 
 void PrefetchStreamingURLLoader::HandleRedirect(
     PrefetchStreamingURLLoaderStatus new_status) {
+  DCHECK(redirect_head_);
+
   status_ = new_status;
   switch (status_) {
     case PrefetchStreamingURLLoaderStatus::kFollowRedirect:
@@ -202,6 +216,13 @@
           /*modified_headers=*/net::HttpRequestHeaders(),
           /*modified_cors_exempt_headers=*/net::HttpRequestHeaders(),
           /*new_url=*/absl::nullopt);
+
+      DCHECK(event_queue_status_ == EventQueueStatus::kNotStarted);
+      AddEventToQueue(
+          base::BindOnce(&PrefetchStreamingURLLoader::ForwardRedirect,
+                         base::Unretained(this), redirect_info_,
+                         std::move(redirect_head_)),
+          /*pause_after_event=*/true);
       break;
     case PrefetchStreamingURLLoaderStatus::kPauseRedirectForEligibilityCheck:
       // The eligibility check is still running on the redirect URL. Once it is
@@ -243,14 +264,16 @@
 
 void PrefetchStreamingURLLoader::OnTransferSizeUpdated(
     int32_t transfer_size_diff) {
-  if (serving_url_loader_client_) {
-    serving_url_loader_client_->OnTransferSizeUpdated(transfer_size_diff);
+  if (serving_url_loader_client_ &&
+      event_queue_status_ == EventQueueStatus::kFinished) {
+    ForwardTransferSizeUpdate(transfer_size_diff);
     return;
   }
 
-  event_queue_.push_back(
-      base::BindOnce(&PrefetchStreamingURLLoader::OnTransferSizeUpdated,
-                     base::Unretained(this), transfer_size_diff));
+  AddEventToQueue(
+      base::BindOnce(&PrefetchStreamingURLLoader::ForwardTransferSizeUpdate,
+                     base::Unretained(this), transfer_size_diff),
+      /*pause_after_event=*/false);
 }
 
 void PrefetchStreamingURLLoader::OnComplete(
@@ -281,28 +304,33 @@
   std::move(on_prefetch_response_completed_callback_)
       .Run(completion_status_.value());
 
-  if (serving_url_loader_client_) {
+  if (serving_url_loader_client_ &&
+      event_queue_status_ == EventQueueStatus::kFinished) {
     ForwardCompletionStatus();
     return;
   }
-  event_queue_.push_back(
+  AddEventToQueue(
       base::BindOnce(&PrefetchStreamingURLLoader::ForwardCompletionStatus,
-                     base::Unretained(this)));
-}
-
-void PrefetchStreamingURLLoader::ForwardCompletionStatus() {
-  DCHECK(serving_url_loader_client_);
-  DCHECK(completion_status_);
-  serving_url_loader_client_->OnComplete(completion_status_.value());
+                     base::Unretained(this)),
+      /*pause_after_event=*/false);
 }
 
 PrefetchStreamingURLLoader::RequestHandler
-PrefetchStreamingURLLoader::ServingResponseHandler(
+PrefetchStreamingURLLoader::ServingFinalResponseHandler(
     std::unique_ptr<PrefetchStreamingURLLoader> self) {
+  DCHECK(self);
+  DCHECK(IsReadyToServeFinalResponse());
   return base::BindOnce(&PrefetchStreamingURLLoader::BindAndStart,
                         weak_ptr_factory_.GetWeakPtr(), std::move(self));
 }
 
+PrefetchStreamingURLLoader::RequestHandler
+PrefetchStreamingURLLoader::ServingRedirectHandler() {
+  DCHECK(!IsReadyToServeFinalResponse());
+  return base::BindOnce(&PrefetchStreamingURLLoader::BindAndStart,
+                        weak_ptr_factory_.GetWeakPtr(), nullptr);
+}
+
 void PrefetchStreamingURLLoader::BindAndStart(
     std::unique_ptr<PrefetchStreamingURLLoader> self,
     const network::ResourceRequest& request,
@@ -310,40 +338,100 @@
     mojo::PendingRemote<network::mojom::URLLoaderClient> client) {
   DCHECK(servable_);
   DCHECK(!serving_url_loader_receiver_.is_bound());
-  DCHECK(self.get() == this);
+  DCHECK(!self || self.get() == this);
 
   status_ =
       completion_status_.has_value()
           ? PrefetchStreamingURLLoaderStatus::kSuccessfulServedAfterCompletion
           : PrefetchStreamingURLLoaderStatus::kSuccessfulServedBeforeCompletion;
 
-  // Make this self owned. This will delete itself once prefetching and serving
-  // are both complete.
-  self_pointer_ = std::move(self);
+  // If the final response is ready to be served, then make self owned, and
+  // delete self once serving the prefetch is finished.
+  if (self) {
+    self_pointer_ = std::move(self);
+  }
 
+  serving_url_loader_disconnected_ = false;
   serving_url_loader_receiver_.Bind(std::move(receiver));
   serving_url_loader_receiver_.set_disconnect_handler(base::BindOnce(
       &PrefetchStreamingURLLoader::OnServingURLLoaderMojoDisconnect,
       weak_ptr_factory_.GetWeakPtr()));
   serving_url_loader_client_.Bind(std::move(client));
 
-  // Serve the prefetched response by directly passing the |body_| mojo pipe.
-  // All data that has already been received will be buffered in the pipe, and
-  // all other data will be streamed as it is received.
-  DCHECK(head_);
-  DCHECK(body_);
-  serving_url_loader_client_->OnReceiveResponse(
-      head_->Clone(), std::move(body_), absl::nullopt);
-
   RunEventQueue();
 }
 
+bool PrefetchStreamingURLLoader::IsReadyToServeFinalResponse() const {
+  for (const auto& event : event_queue_) {
+    if (event.second) {
+      return false;
+    }
+  }
+  return true;
+}
+
+void PrefetchStreamingURLLoader::AddEventToQueue(base::OnceClosure closure,
+                                                 bool pause_after_event) {
+  DCHECK(event_queue_status_ != EventQueueStatus::kFinished);
+
+  event_queue_.emplace_back(std::move(closure), pause_after_event);
+}
+
 void PrefetchStreamingURLLoader::RunEventQueue() {
   DCHECK(serving_url_loader_client_);
-  for (auto& event : event_queue_) {
-    std::move(event).Run();
+  DCHECK(event_queue_.size() > 0);
+  DCHECK(event_queue_status_ == EventQueueStatus::kNotStarted ||
+         event_queue_status_ == EventQueueStatus::kPaused);
+
+  event_queue_status_ = EventQueueStatus::kRunning;
+  while (event_queue_.size() > 0) {
+    auto event_itr = event_queue_.begin();
+
+    base::OnceClosure& event_closure = event_itr->first;
+    bool pause_after_event = event_itr->second;
+
+    std::move(event_closure).Run();
+
+    event_queue_.erase(event_itr);
+    if (pause_after_event) {
+      event_queue_status_ = EventQueueStatus::kPaused;
+      return;
+    }
   }
-  event_queue_.clear();
+  event_queue_status_ = EventQueueStatus::kFinished;
+}
+
+void PrefetchStreamingURLLoader::ForwardCompletionStatus() {
+  DCHECK(serving_url_loader_client_);
+  DCHECK(completion_status_);
+  serving_url_loader_client_->OnComplete(completion_status_.value());
+}
+
+void PrefetchStreamingURLLoader::ForwardEarlyHints(
+    network::mojom::EarlyHintsPtr early_hints) {
+  DCHECK(serving_url_loader_client_);
+  serving_url_loader_client_->OnReceiveEarlyHints(std::move(early_hints));
+}
+
+void PrefetchStreamingURLLoader::ForwardTransferSizeUpdate(
+    int32_t transfer_size_diff) {
+  DCHECK(serving_url_loader_client_);
+  serving_url_loader_client_->OnTransferSizeUpdated(transfer_size_diff);
+}
+
+void PrefetchStreamingURLLoader::ForwardRedirect(
+    const net::RedirectInfo& redirect_info,
+    network::mojom::URLResponseHeadPtr head) {
+  DCHECK(serving_url_loader_client_);
+  serving_url_loader_client_->OnReceiveRedirect(redirect_info, std::move(head));
+}
+
+void PrefetchStreamingURLLoader::ForwardResponse() {
+  DCHECK(serving_url_loader_client_);
+  DCHECK(head_);
+  DCHECK(body_);
+  serving_url_loader_client_->OnReceiveResponse(
+      head_->Clone(), std::move(body_), absl::nullopt);
 }
 
 void PrefetchStreamingURLLoader::FollowRedirect(
@@ -351,7 +439,10 @@
     const net::HttpRequestHeaders& modified_headers,
     const net::HttpRequestHeaders& modified_cors_exempt_headers,
     const absl::optional<GURL>& new_url) {
-  // Redirects aren't supported by prefetch, and therefore are never served.
+  // If a URL loader provided to |NavigationURLLoaderImpl| to intercept triggers
+  // a redirect, then it will be interrupted before |FollowRedirect| is called,
+  // and instead interceptors are given a chance to intercept the navigation to
+  // the redirect.
   NOTREACHED();
 }
 
diff --git a/content/browser/preloading/prefetch/prefetch_streaming_url_loader.h b/content/browser/preloading/prefetch/prefetch_streaming_url_loader.h
index b6349d7..77eef55 100644
--- a/content/browser/preloading/prefetch/prefetch_streaming_url_loader.h
+++ b/content/browser/preloading/prefetch/prefetch_streaming_url_loader.h
@@ -79,13 +79,24 @@
   }
   const network::mojom::URLResponseHead* GetHead() const { return head_.get(); }
 
+  // Whether |this| is ready to serve the final response of the prefetch, or if
+  // there are any redirects to serve first.
+  bool IsReadyToServeFinalResponse() const;
+
   using RequestHandler = base::OnceCallback<void(
       const network::ResourceRequest& resource_request,
       mojo::PendingReceiver<network::mojom::URLLoader> url_loader_receiver,
       mojo::PendingRemote<network::mojom::URLLoaderClient> forwarding_client)>;
-  RequestHandler ServingResponseHandler(
+
+  // Creates a request handler to serve the final response of the prefetch, and
+  // also makes |this| self owned.
+  RequestHandler ServingFinalResponseHandler(
       std::unique_ptr<PrefetchStreamingURLLoader> self);
 
+  // Creates a request handler to serve the next redirect. Ownership of |this|
+  // does not change.
+  RequestHandler ServingRedirectHandler();
+
   // The streaming URL loader can be deleted in one of its callbacks, so instead
   // of deleting it immediately, it is made self owned and then deletes itself.
   void MakeSelfOwnedAndDeleteSoon(
@@ -102,11 +113,22 @@
       mojo::PendingReceiver<network::mojom::URLLoader> url_loader_receiver,
       mojo::PendingRemote<network::mojom::URLLoaderClient> forwarding_client);
 
+  // Adds an event to the queue that will be run when serving the prefetch. If
+  // |pause_after_event| is true, then the event queue will pause after running
+  // the event.
+  void AddEventToQueue(base::OnceClosure closure, bool pause_after_event);
+
   // Sends all stored events in |event_queue_| to |serving_url_loader_client_|.
   void RunEventQueue();
 
-  // Sends the |completion_status_| to |serving_url_loader_client_|.
+  // Helper functions to send the appropriate events to
+  // |serving_url_loader_client_|.
   void ForwardCompletionStatus();
+  void ForwardEarlyHints(network::mojom::EarlyHintsPtr early_hints);
+  void ForwardTransferSizeUpdate(int32_t transfer_size_diff);
+  void ForwardRedirect(const net::RedirectInfo& redirect_info,
+                       network::mojom::URLResponseHeadPtr);
+  void ForwardResponse();
 
   void DisconnectPrefetchURLLoaderMojo();
   void OnServingURLLoaderMojoDisconnect();
@@ -177,9 +199,26 @@
   absl::optional<network::URLLoaderCompletionStatus> completion_status_;
   absl::optional<base::TimeTicks> response_complete_time_;
 
+  // These store the most recent redirect in the event that |this| needs to wait
+  // for the prefetch eligibility check to complete before deciding whether to
+  // follow the redirect or not.
+  net::RedirectInfo redirect_info_;
+  network::mojom::URLResponseHeadPtr redirect_head_;
+
   // The URL Loader events that occur before serving the prefetch are queued up
-  // until the prefetch is served.
-  std::vector<base::OnceClosure> event_queue_;
+  // until the prefetch is served. The first value is the closure to run the
+  // event, and the second value is whether or not the event queue should be
+  // paused after running the event.
+  std::vector<std::pair<base::OnceClosure, bool>> event_queue_;
+
+  // The status of the event queue.
+  enum class EventQueueStatus {
+    kNotStarted,
+    kRunning,
+    kPaused,
+    kFinished,
+  };
+  EventQueueStatus event_queue_status_{EventQueueStatus::kNotStarted};
 
   // The URL loader client that will serve the prefetched data.
   mojo::Receiver<network::mojom::URLLoader> serving_url_loader_receiver_{this};
diff --git a/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc b/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc
index c5bf0e2..0f95427 100644
--- a/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc
+++ b/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc
@@ -192,6 +192,12 @@
     return completion_status_;
   }
 
+  const std::vector<
+      std::pair<net::RedirectInfo, network::mojom::URLResponseHeadPtr>>&
+  received_redirects() {
+    return received_redirects_;
+  }
+
  private:
   // network::mojom::URLLoaderClient
   void OnReceiveEarlyHints(network::mojom::EarlyHintsPtr early_hints) override {
@@ -211,7 +217,7 @@
 
   void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
                          network::mojom::URLResponseHeadPtr head) override {
-    NOTREACHED();
+    received_redirects_.emplace_back(redirect_info, std::move(head));
   }
 
   void OnUploadProgress(int64_t current_position,
@@ -248,6 +254,9 @@
   int32_t total_transfer_size_diff_{0};
 
   absl::optional<network::URLLoaderCompletionStatus> completion_status_;
+
+  std::vector<std::pair<net::RedirectInfo, network::mojom::URLResponseHeadPtr>>
+      received_redirects_;
 };
 
 class PrefetchStreamingURLLoaderTest : public ::testing::Test {
@@ -329,10 +338,11 @@
   // Gets handler to serve prefetch from |streaming_loader|. After this
   // |streaming_loader| is self owned, so |weak_streaming_loader| should be used
   // after this point.
+  EXPECT_TRUE(streaming_loader->IsReadyToServeFinalResponse());
   base::WeakPtr<PrefetchStreamingURLLoader> weak_streaming_loader =
       streaming_loader->GetWeakPtr();
   PrefetchStreamingURLLoader::RequestHandler request_handler =
-      weak_streaming_loader->ServingResponseHandler(
+      weak_streaming_loader->ServingFinalResponseHandler(
           std::move(streaming_loader));
 
   // Set up URLLoaderClient to "serve" the prefetch.
@@ -358,6 +368,7 @@
   EXPECT_TRUE(serving_url_loader_client->completion_status());
   EXPECT_EQ(serving_url_loader_client->completion_status()->error_code,
             net::OK);
+  EXPECT_EQ(serving_url_loader_client->received_redirects().size(), 0U);
 
   serving_url_loader_client->DisconnectMojoPipes();
   task_environment()->RunUntilIdle();
@@ -427,10 +438,11 @@
   // Gets handler to serve prefetch from |streaming_loader|. After this
   // |streaming_loader| is self owned, so |weak_streaming_loader| should be used
   // after this point.
+  EXPECT_TRUE(streaming_loader->IsReadyToServeFinalResponse());
   base::WeakPtr<PrefetchStreamingURLLoader> weak_streaming_loader =
       streaming_loader->GetWeakPtr();
   PrefetchStreamingURLLoader::RequestHandler request_handler =
-      weak_streaming_loader->ServingResponseHandler(
+      weak_streaming_loader->ServingFinalResponseHandler(
           std::move(streaming_loader));
 
   // Set up URLLoaderClient to "serve" the prefetch.
@@ -474,6 +486,7 @@
   EXPECT_TRUE(serving_url_loader_client->completion_status());
   EXPECT_EQ(serving_url_loader_client->completion_status()->error_code,
             net::OK);
+  EXPECT_EQ(serving_url_loader_client->received_redirects().size(), 0U);
 
   serving_url_loader_client->DisconnectMojoPipes();
   task_environment()->RunUntilIdle();
@@ -706,10 +719,11 @@
   // Gets handler to serve prefetch from |streaming_loader|. After this
   // |streaming_loader| is self owned, so |weak_streaming_loader| should be used
   // after this point.
+  EXPECT_TRUE(streaming_loader->IsReadyToServeFinalResponse());
   base::WeakPtr<PrefetchStreamingURLLoader> weak_streaming_loader =
       streaming_loader->GetWeakPtr();
   PrefetchStreamingURLLoader::RequestHandler request_handler =
-      weak_streaming_loader->ServingResponseHandler(
+      weak_streaming_loader->ServingFinalResponseHandler(
           std::move(streaming_loader));
 
   // Set up URLLoaderClient to "serve" the prefetch.
@@ -748,6 +762,7 @@
   EXPECT_TRUE(serving_url_loader_client->completion_status());
   EXPECT_EQ(serving_url_loader_client->completion_status()->error_code,
             net::ERR_FAILED);
+  EXPECT_EQ(serving_url_loader_client->received_redirects().size(), 0U);
 
   serving_url_loader_client->DisconnectMojoPipes();
   task_environment()->RunUntilIdle();
@@ -765,6 +780,7 @@
 TEST_F(PrefetchStreamingURLLoaderTest, ImmediateEligibleRedirect) {
   base::HistogramTester histogram_tester;
   const GURL kTestUrl = GURL("https://example.com");
+  const GURL kRedirectUrl = GURL("https://redirect.com");
   const std::string kBodyContent = "example body";
 
   std::unique_ptr<network::ResourceRequest> prefetch_request =
@@ -810,7 +826,7 @@
       on_follow_redirect_loop.QuitClosure());
 
   // Simulate a redirect that should be followed by the URL loader.
-  test_url_loader_factory()->SimulateRedirect(GURL("https://redirect.com"),
+  test_url_loader_factory()->SimulateRedirect(kRedirectUrl,
                                               net::HTTP_PERMANENT_REDIRECT);
   on_receive_redirect_loop.Run();
   on_follow_redirect_loop.Run();
@@ -828,11 +844,78 @@
 
   EXPECT_TRUE(streaming_loader->Servable(base::TimeDelta::Max()));
 
-  streaming_loader.reset();
+  // Simulates serving the redirect.
+  EXPECT_FALSE(streaming_loader->IsReadyToServeFinalResponse());
+  PrefetchStreamingURLLoader::RequestHandler redirect_handler =
+      streaming_loader->ServingRedirectHandler();
+
+  std::unique_ptr<TestURLLoaderClient> redirect_url_loader_client =
+      std::make_unique<TestURLLoaderClient>();
+
+  network::ResourceRequest serving_request;
+  serving_request.url = kTestUrl;
+  serving_request.method = "GET";
+
+  std::move(redirect_handler)
+      .Run(serving_request,
+           redirect_url_loader_client->BindURLloaderAndGetReceiver(),
+           redirect_url_loader_client->BindURLLoaderClientAndGetRemote());
+
+  // Wait for the redirect to be sent to |redirect_url_loader_client|. Once the
+  // redirect is served, |streaming_loader| will stop.
+  task_environment()->RunUntilIdle();
+
+  EXPECT_FALSE(redirect_url_loader_client->body_finished());
+  EXPECT_EQ(redirect_url_loader_client->body_content(), "");
+  EXPECT_EQ(redirect_url_loader_client->total_bytes_read(), 0U);
+
+  EXPECT_FALSE(redirect_url_loader_client->completion_status());
+  EXPECT_EQ(redirect_url_loader_client->received_redirects().size(), 1U);
+
+  redirect_url_loader_client->DisconnectMojoPipes();
+  task_environment()->RunUntilIdle();
+  ASSERT_TRUE(streaming_loader);
+
+  // Simulates serving the final response.
+  EXPECT_TRUE(streaming_loader->IsReadyToServeFinalResponse());
+  base::WeakPtr<PrefetchStreamingURLLoader> weak_streaming_loader =
+      streaming_loader->GetWeakPtr();
+  PrefetchStreamingURLLoader::RequestHandler final_response_handler =
+      weak_streaming_loader->ServingFinalResponseHandler(
+          std::move(streaming_loader));
+
+  // Set up URLLoaderClient to "serve" the prefetch.
+  std::unique_ptr<TestURLLoaderClient> serving_url_loader_client =
+      std::make_unique<TestURLLoaderClient>();
+
+  std::move(final_response_handler)
+      .Run(serving_request,
+           serving_url_loader_client->BindURLloaderAndGetReceiver(),
+           serving_url_loader_client->BindURLLoaderClientAndGetRemote());
+
+  // Wait for the data to be drained from the body pipe.
+  task_environment()->RunUntilIdle();
+
+  EXPECT_TRUE(serving_url_loader_client->body_finished());
+  EXPECT_EQ(serving_url_loader_client->body_content(), kBodyContent);
+  EXPECT_EQ(serving_url_loader_client->total_bytes_read(), kBodyContent.size());
+
+  EXPECT_TRUE(serving_url_loader_client->completion_status());
+  EXPECT_EQ(serving_url_loader_client->completion_status()->error_code,
+            net::OK);
+  EXPECT_EQ(serving_url_loader_client->received_redirects().size(), 0U);
+
+  serving_url_loader_client->DisconnectMojoPipes();
+  task_environment()->RunUntilIdle();
+
+  // Once the streaming URL loader serves is finished (all prefetched data
+  // received and served) and all mojo pipes are disconnected, it should delete
+  // itself.
+  EXPECT_FALSE(weak_streaming_loader);
 
   histogram_tester.ExpectUniqueSample(
       "PrefetchProxy.Prefetch.StreamingURLLoaderFinalStatus",
-      PrefetchStreamingURLLoaderStatus::kSuccessfulNotServed, 1);
+      PrefetchStreamingURLLoaderStatus::kSuccessfulServedAfterCompletion, 1);
 }
 
 TEST_F(PrefetchStreamingURLLoaderTest, ImmediateIneligibleRedirect) {
@@ -953,11 +1036,78 @@
 
   EXPECT_TRUE(streaming_loader->Servable(base::TimeDelta::Max()));
 
-  streaming_loader.reset();
+  // Simulates serving the redirect.
+  EXPECT_FALSE(streaming_loader->IsReadyToServeFinalResponse());
+  PrefetchStreamingURLLoader::RequestHandler redirect_handler =
+      streaming_loader->ServingRedirectHandler();
+
+  std::unique_ptr<TestURLLoaderClient> redirect_url_loader_client =
+      std::make_unique<TestURLLoaderClient>();
+
+  network::ResourceRequest serving_request;
+  serving_request.url = kTestUrl;
+  serving_request.method = "GET";
+
+  std::move(redirect_handler)
+      .Run(serving_request,
+           redirect_url_loader_client->BindURLloaderAndGetReceiver(),
+           redirect_url_loader_client->BindURLLoaderClientAndGetRemote());
+
+  // Wait for the redirect to be sent to |redirect_url_loader_client|. Once the
+  // redirect is served, |streaming_loader| will stop.
+  task_environment()->RunUntilIdle();
+
+  EXPECT_FALSE(redirect_url_loader_client->body_finished());
+  EXPECT_EQ(redirect_url_loader_client->body_content(), "");
+  EXPECT_EQ(redirect_url_loader_client->total_bytes_read(), 0U);
+
+  EXPECT_FALSE(redirect_url_loader_client->completion_status());
+  EXPECT_EQ(redirect_url_loader_client->received_redirects().size(), 1U);
+
+  redirect_url_loader_client->DisconnectMojoPipes();
+  task_environment()->RunUntilIdle();
+  ASSERT_TRUE(streaming_loader);
+
+  // Simulate serving the final response.
+  EXPECT_TRUE(streaming_loader->IsReadyToServeFinalResponse());
+  base::WeakPtr<PrefetchStreamingURLLoader> weak_streaming_loader =
+      streaming_loader->GetWeakPtr();
+  PrefetchStreamingURLLoader::RequestHandler final_response_handler =
+      weak_streaming_loader->ServingFinalResponseHandler(
+          std::move(streaming_loader));
+
+  // Set up URLLoaderClient to "serve" the prefetch.
+  std::unique_ptr<TestURLLoaderClient> serving_url_loader_client =
+      std::make_unique<TestURLLoaderClient>();
+
+  std::move(final_response_handler)
+      .Run(serving_request,
+           serving_url_loader_client->BindURLloaderAndGetReceiver(),
+           serving_url_loader_client->BindURLLoaderClientAndGetRemote());
+
+  // Wait for the data to be drained from the body pipe.
+  task_environment()->RunUntilIdle();
+
+  EXPECT_TRUE(serving_url_loader_client->body_finished());
+  EXPECT_EQ(serving_url_loader_client->body_content(), kBodyContent);
+  EXPECT_EQ(serving_url_loader_client->total_bytes_read(), kBodyContent.size());
+
+  EXPECT_TRUE(serving_url_loader_client->completion_status());
+  EXPECT_EQ(serving_url_loader_client->completion_status()->error_code,
+            net::OK);
+  EXPECT_EQ(serving_url_loader_client->received_redirects().size(), 0U);
+
+  serving_url_loader_client->DisconnectMojoPipes();
+  task_environment()->RunUntilIdle();
+
+  // Once the streaming URL loader serves is finished (all prefetched data
+  // received and served) and all mojo pipes are disconnected, it should delete
+  // itself.
+  EXPECT_FALSE(weak_streaming_loader);
 
   histogram_tester.ExpectUniqueSample(
       "PrefetchProxy.Prefetch.StreamingURLLoaderFinalStatus",
-      PrefetchStreamingURLLoaderStatus::kSuccessfulNotServed, 1);
+      PrefetchStreamingURLLoaderStatus::kSuccessfulServedAfterCompletion, 1);
 }
 
 TEST_F(PrefetchStreamingURLLoaderTest, PausedIneligibleRedirect) {
@@ -1243,10 +1393,11 @@
   // Gets handler to serve prefetch from |streaming_loader|. After this
   // |streaming_loader| is self owned, so |weak_streaming_loader| should be used
   // after this point.
+  EXPECT_TRUE(streaming_loader->IsReadyToServeFinalResponse());
   base::WeakPtr<PrefetchStreamingURLLoader> weak_streaming_loader =
       streaming_loader->GetWeakPtr();
   PrefetchStreamingURLLoader::RequestHandler request_handler =
-      weak_streaming_loader->ServingResponseHandler(
+      weak_streaming_loader->ServingFinalResponseHandler(
           std::move(streaming_loader));
 
   // Set up URLLoaderClient to "serve" the prefetch.
@@ -1290,6 +1441,7 @@
   EXPECT_TRUE(serving_url_loader_client->completion_status());
   EXPECT_EQ(serving_url_loader_client->completion_status()->error_code,
             net::OK);
+  EXPECT_EQ(serving_url_loader_client->received_redirects().size(), 0U);
 
   serving_url_loader_client->DisconnectMojoPipes();
   task_environment()->RunUntilIdle();
diff --git a/content/browser/preloading/prefetch/prefetch_test_utils.cc b/content/browser/preloading/prefetch/prefetch_test_utils.cc
index 97b27555..1fcc30a8 100644
--- a/content/browser/preloading/prefetch/prefetch_test_utils.cc
+++ b/content/browser/preloading/prefetch/prefetch_test_utils.cc
@@ -66,4 +66,63 @@
   return streaming_loader;
 }
 
+std::unique_ptr<PrefetchStreamingURLLoader>
+MakeServableStreamingURLLoaderWithRedirectForTest(const GURL& original_url,
+                                                  const GURL& redirect_url) {
+  network::TestURLLoaderFactory test_url_loader_factory;
+  std::unique_ptr<network::ResourceRequest> request =
+      std::make_unique<network::ResourceRequest>();
+  request->url = original_url;
+  request->method = "GET";
+
+  base::RunLoop on_receive_redirect_loop;
+  base::RunLoop on_response_received_loop;
+  base::RunLoop on_response_complete_loop;
+
+  std::unique_ptr<PrefetchStreamingURLLoader> streaming_loader =
+      std::make_unique<PrefetchStreamingURLLoader>(
+          &test_url_loader_factory, std::move(request),
+          TRAFFIC_ANNOTATION_FOR_TESTS, /*timeout_duration=*/base::TimeDelta(),
+          base::BindOnce(
+              [](base::RunLoop* on_response_received_loop,
+                 network::mojom::URLResponseHead* head) {
+                on_response_received_loop->Quit();
+                return PrefetchStreamingURLLoaderStatus::
+                    kHeadReceivedWaitingOnBody;
+              },
+              &on_response_received_loop),
+          base::BindOnce(
+              [](base::RunLoop* on_response_complete_loop,
+                 const network::URLLoaderCompletionStatus& completion_status) {
+                on_response_complete_loop->Quit();
+              },
+              &on_response_complete_loop),
+          base::BindRepeating(
+              [](base::RunLoop* on_receive_redirect_loop,
+                 const net::RedirectInfo& redirect_info,
+                 const network::mojom::URLResponseHead& response_head) {
+                on_receive_redirect_loop->Quit();
+                return PrefetchStreamingURLLoaderStatus::kFollowRedirect;
+              },
+              &on_receive_redirect_loop));
+
+  network::URLLoaderCompletionStatus status(net::OK);
+
+  net::RedirectInfo redirect_info;
+  redirect_info.new_url = redirect_url;
+
+  network::TestURLLoaderFactory::Redirects redirects;
+  redirects.emplace_back(redirect_info, network::mojom::URLResponseHead::New());
+
+  test_url_loader_factory.AddResponse(
+      original_url, network::mojom::URLResponseHead::New(), "test body", status,
+      std::move(redirects), network::TestURLLoaderFactory::kResponseDefault);
+  on_receive_redirect_loop.Run();
+  on_response_received_loop.Run();
+  on_response_complete_loop.Run();
+
+  DCHECK(streaming_loader->Servable(base::TimeDelta::Max()));
+  return streaming_loader;
+}
+
 }  // namespace content
diff --git a/content/browser/preloading/prefetch/prefetch_test_utils.h b/content/browser/preloading/prefetch/prefetch_test_utils.h
index 588b642..825e30a6 100644
--- a/content/browser/preloading/prefetch/prefetch_test_utils.h
+++ b/content/browser/preloading/prefetch/prefetch_test_utils.h
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "services/network/public/mojom/url_response_head.mojom-forward.h"
+#include "url/gurl.h"
 
 namespace content {
 
@@ -18,6 +19,10 @@
 MakeServableStreamingURLLoaderForTest(network::mojom::URLResponseHeadPtr head,
                                       const std::string body);
 
+std::unique_ptr<PrefetchStreamingURLLoader>
+MakeServableStreamingURLLoaderWithRedirectForTest(const GURL& original_url,
+                                                  const GURL& redirect_url);
+
 }  // namespace content
 
-#endif  // CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_TEST_UTILS_H_
\ No newline at end of file
+#endif  // CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_TEST_UTILS_H_
diff --git a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc
index 851788d..21ca5a9 100644
--- a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc
+++ b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc
@@ -92,6 +92,14 @@
   DCHECK(!loader_callback_);
   loader_callback_ = std::move(callback);
   url_ = tenative_resource_request.url;
+
+  if (redirect_prefetch_container_ &&
+      redirect_prefetch_container_->DoesCurrentURLToServeMatch(url_)) {
+    OnGotPrefetchToServe(tenative_resource_request,
+                         redirect_prefetch_container_);
+    return;
+  }
+
   GetPrefetch(url_, base::BindOnce(
                         &PrefetchURLLoaderInterceptor::OnGotPrefetchToServe,
                         weak_factory_.GetWeakPtr(), tenative_resource_request));
@@ -108,14 +116,14 @@
     replacements.ClearRef();
     replacements.ClearQuery();
     DCHECK_EQ(url_.ReplaceComponents(replacements),
-              prefetch_container->GetURL().ReplaceComponents(replacements));
+              prefetch_container->GetCurrentURLToServe().ReplaceComponents(
+                  replacements));
   }
 #endif
 
   if (!prefetch_container ||
       !prefetch_container->IsPrefetchServable(PrefetchCacheableDuration()) ||
-      prefetch_container->HaveDefaultContextCookiesChanged(
-          prefetch_container->GetURL())) {
+      prefetch_container->HaveDefaultContextCookiesChanged(url_)) {
     DoNotInterceptNavigation();
     return;
   }
@@ -206,6 +214,10 @@
     EnsureCookiesCopiedAndInterceptPrefetchedNavigation(
         const network::ResourceRequest& tenative_resource_request,
         base::WeakPtr<PrefetchContainer> prefetch_container) {
+  if (!prefetch_container->HasIsolatedCookieCopyStarted()) {
+    StartCookieCopy(prefetch_container);
+  }
+
   if (prefetch_container) {
     prefetch_container->OnInterceptorCheckCookieCopy();
   }
@@ -225,6 +237,17 @@
   InterceptPrefetchedNavigation(tenative_resource_request, prefetch_container);
 }
 
+void PrefetchURLLoaderInterceptor::StartCookieCopy(
+    base::WeakPtr<PrefetchContainer> prefetch_container) {
+  PrefetchService* prefetch_service =
+      PrefetchServiceFromFrameTreeNodeId(frame_tree_node_id_);
+  if (!prefetch_service) {
+    return;
+  }
+
+  prefetch_service->CopyIsolatedCookies(prefetch_container);
+}
+
 void PrefetchURLLoaderInterceptor::InterceptPrefetchedNavigation(
     const network::ResourceRequest& tenative_resource_request,
     base::WeakPtr<PrefetchContainer> prefetch_container) {
@@ -260,15 +283,26 @@
   // lifetime, and will delete itself once the prefetch response is completed
   // and served.
   DCHECK(prefetch_container->GetStreamingLoader());
-  std::unique_ptr<PrefetchStreamingURLLoader> prefetch_streaming_url_loader =
-      prefetch_container->ReleaseStreamingLoader();
-  auto* raw_prefetch_streaming_url_loader = prefetch_streaming_url_loader.get();
-
   scoped_refptr<network::SingleRequestURLLoaderFactory>
-      single_request_url_loader_factory =
-          base::MakeRefCounted<network::SingleRequestURLLoaderFactory>(
-              raw_prefetch_streaming_url_loader->ServingResponseHandler(
-                  std::move(prefetch_streaming_url_loader)));
+      single_request_url_loader_factory;
+  if (prefetch_container->GetStreamingLoader()->IsReadyToServeFinalResponse()) {
+    std::unique_ptr<PrefetchStreamingURLLoader> prefetch_streaming_url_loader =
+        prefetch_container->ReleaseStreamingLoader();
+    auto* raw_prefetch_streaming_url_loader =
+        prefetch_streaming_url_loader.get();
+
+    single_request_url_loader_factory =
+        base::MakeRefCounted<network::SingleRequestURLLoaderFactory>(
+            raw_prefetch_streaming_url_loader->ServingFinalResponseHandler(
+                std::move(prefetch_streaming_url_loader)));
+    redirect_prefetch_container_ = nullptr;
+  } else {
+    single_request_url_loader_factory =
+        base::MakeRefCounted<network::SingleRequestURLLoaderFactory>(
+            prefetch_container->GetStreamingLoader()->ServingRedirectHandler());
+    redirect_prefetch_container_ = prefetch_container;
+    prefetch_container->AdvanceCurrentURLToServe();
+  }
 
   // Create URL loader factory pipe that can be possibly proxied by Extensions.
   mojo::PendingReceiver<network::mojom::URLLoaderFactory> pending_receiver;
@@ -306,6 +340,7 @@
 }
 
 void PrefetchURLLoaderInterceptor::DoNotInterceptNavigation() {
+  redirect_prefetch_container_ = nullptr;
   std::move(loader_callback_).Run({});
 }
 
diff --git a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.h b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.h
index daf3eba1..8f11921 100644
--- a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.h
+++ b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.h
@@ -72,6 +72,10 @@
       const network::ResourceRequest& tenative_resource_request,
       base::WeakPtr<PrefetchContainer> prefetch_container);
 
+  // Starts the cookie copy for next redirect hop of |prefetch_container|.
+  virtual void StartCookieCopy(
+      base::WeakPtr<PrefetchContainer> prefetch_container);
+
   void InterceptPrefetchedNavigation(
       const network::ResourceRequest& tenative_resource_request,
       base::WeakPtr<PrefetchContainer> prefetch_container);
@@ -99,6 +103,11 @@
   // navigation. Used to calculate total cookie wait time.
   absl::optional<base::TimeTicks> cookie_copy_start_time_;
 
+  // The prefetch container that has already been used to serve a redirect. If
+  // another request can be intercepted, this will be checked first to see if
+  // its next redirect hop matches the request URL.
+  base::WeakPtr<PrefetchContainer> redirect_prefetch_container_;
+
   SEQUENCE_CHECKER(sequence_checker_);
 
   base::WeakPtrFactory<PrefetchURLLoaderInterceptor> weak_factory_{this};
diff --git a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc
index 0b817ee..5a51b84 100644
--- a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc
+++ b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc
@@ -149,6 +149,16 @@
     origin_prober_ = std::move(origin_prober);
   }
 
+  void AddOnStartCookieCopyClosure(const GURL& prefetch_url,
+                                   const GURL& redirect_url,
+                                   base::OnceClosure closure) {
+    auto key = std::make_pair(prefetch_url, redirect_url);
+    EXPECT_TRUE(on_start_cookie_copy_closure_.find(key) ==
+                on_start_cookie_copy_closure_.end());
+
+    on_start_cookie_copy_closure_[key] = std::move(closure);
+  }
+
   int num_probes() const { return origin_prober_->num_probes(); }
 
  private:
@@ -168,8 +178,28 @@
     return origin_prober_.get();
   }
 
+  void StartCookieCopy(
+      base::WeakPtr<PrefetchContainer> prefetch_container) override {
+    if (!prefetch_container->GetPrefetchType()
+             .IsIsolatedNetworkContextRequired()) {
+      return;
+    }
+
+    prefetch_container->OnIsolatedCookieCopyStart();
+
+    auto itr = on_start_cookie_copy_closure_.find(
+        std::make_pair(prefetch_container->GetURL(),
+                       prefetch_container->GetCurrentURLToServe()));
+    EXPECT_TRUE(itr != on_start_cookie_copy_closure_.end());
+    EXPECT_TRUE(itr->second);
+    std::move(itr->second).Run();
+  }
+
   std::map<GURL, base::WeakPtr<PrefetchContainer>> prefetches_;
   std::unique_ptr<TestPrefetchOriginProber> origin_prober_;
+
+  std::map<std::pair<GURL, GURL>, base::OnceClosure>
+      on_start_cookie_copy_closure_;
 };
 
 class PrefetchURLLoaderInterceptorTest : public RenderViewHostTestHarness {
@@ -213,24 +243,34 @@
 
   TestPrefetchURLLoaderInterceptor* interceptor() { return interceptor_.get(); }
 
-  void WaitForCallback() {
-    if (was_intercepted_.has_value())
+  void WaitForCallback(const GURL& url) {
+    auto itr = was_intercepted_.find(url);
+    if (itr != was_intercepted_.end()) {
       return;
+    }
 
     base::RunLoop run_loop;
-    on_loader_callback_closure_ = run_loop.QuitClosure();
+    on_loader_callback_closure_[url] = run_loop.QuitClosure();
     run_loop.Run();
   }
 
   void LoaderCallback(
+      const GURL& url,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
-    was_intercepted_ = url_loader_factory != nullptr;
-    if (on_loader_callback_closure_) {
-      std::move(on_loader_callback_closure_).Run();
+    was_intercepted_[url] = url_loader_factory != nullptr;
+
+    auto itr = on_loader_callback_closure_.find(url);
+    if (itr != on_loader_callback_closure_.end() && itr->second) {
+      std::move(itr->second).Run();
     }
   }
 
-  absl::optional<bool> was_intercepted() { return was_intercepted_; }
+  absl::optional<bool> was_intercepted(const GURL& url) {
+    if (was_intercepted_.find(url) == was_intercepted_.end()) {
+      return absl::nullopt;
+    }
+    return was_intercepted_[url];
+  }
 
   NavigationRequest* navigation_request() {
     return FrameTreeNode::GloballyFindByID(
@@ -331,8 +371,8 @@
 
   base::HistogramTester histogram_tester_;
 
-  absl::optional<bool> was_intercepted_;
-  base::OnceClosure on_loader_callback_closure_;
+  std::map<GURL, bool> was_intercepted_;
+  std::map<GURL, base::OnceClosure> on_loader_callback_closure_;
 
   mojo::Remote<network::mojom::CookieManager> cookie_manager_;
   std::unique_ptr<ScopedMockContentBrowserClient> test_content_browser_client_;
@@ -400,12 +440,12 @@
   interceptor()->MaybeCreateLoader(
       request, browser_context(),
       base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
-                     base::Unretained(this)),
+                     base::Unretained(this), kTestUrl),
       base::BindOnce([](bool) { NOTREACHED(); }));
-  WaitForCallback();
+  WaitForCallback(kTestUrl);
 
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_TRUE(was_intercepted().value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).value());
 
   histogram_tester().ExpectUniqueTimeSample(
       "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime", base::TimeDelta(),
@@ -473,20 +513,20 @@
   interceptor()->MaybeCreateLoader(
       request, browser_context(),
       base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
-                     base::Unretained(this)),
+                     base::Unretained(this), kTestUrl),
       base::BindOnce([](bool) { NOTREACHED(); }));
 
   // A decision on whether the navigation should be intercepted shouldn't be
   // made until after the cookie copy process is completed.
-  EXPECT_FALSE(was_intercepted().has_value());
+  EXPECT_FALSE(was_intercepted(kTestUrl).has_value());
 
   task_environment()->FastForwardBy(base::Milliseconds(20));
 
   prefetch_container->OnIsolatedCookieCopyComplete();
-  WaitForCallback();
+  WaitForCallback(kTestUrl);
 
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_TRUE(was_intercepted().value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).value());
 
   histogram_tester().ExpectUniqueTimeSample(
       "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime",
@@ -549,12 +589,12 @@
   interceptor()->MaybeCreateLoader(
       request, browser_context(),
       base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
-                     base::Unretained(this)),
+                     base::Unretained(this), kTestUrl),
       base::BindOnce([](bool) { NOTREACHED(); }));
-  WaitForCallback();
+  WaitForCallback(kTestUrl);
 
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_TRUE(was_intercepted().value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).value());
 
   histogram_tester().ExpectUniqueTimeSample(
       "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime", base::TimeDelta(),
@@ -588,12 +628,12 @@
   interceptor()->MaybeCreateLoader(
       request, browser_context(),
       base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
-                     base::Unretained(this)),
+                     base::Unretained(this), kTestUrl),
       base::BindOnce([](bool) { NOTREACHED(); }));
-  WaitForCallback();
+  WaitForCallback(kTestUrl);
 
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_FALSE(was_intercepted().value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_FALSE(was_intercepted(kTestUrl).value());
 
   histogram_tester().ExpectTotalCount(
       "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime", 0);
@@ -641,12 +681,12 @@
   interceptor()->MaybeCreateLoader(
       request, browser_context(),
       base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
-                     base::Unretained(this)),
+                     base::Unretained(this), kTestUrl),
       base::BindOnce([](bool) { NOTREACHED(); }));
-  WaitForCallback();
+  WaitForCallback(kTestUrl);
 
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_FALSE(was_intercepted().value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_FALSE(was_intercepted(kTestUrl).value());
 
   histogram_tester().ExpectTotalCount(
       "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime", 0);
@@ -696,12 +736,12 @@
   interceptor()->MaybeCreateLoader(
       request, browser_context(),
       base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
-                     base::Unretained(this)),
+                     base::Unretained(this), kTestUrl),
       base::BindOnce([](bool) { NOTREACHED(); }));
-  WaitForCallback();
+  WaitForCallback(kTestUrl);
 
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_FALSE(was_intercepted().value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_FALSE(was_intercepted(kTestUrl).value());
 
   histogram_tester().ExpectTotalCount(
       "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime", 0);
@@ -753,12 +793,12 @@
   interceptor()->MaybeCreateLoader(
       request, browser_context(),
       base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
-                     base::Unretained(this)),
+                     base::Unretained(this), kTestUrl),
       base::BindOnce([](bool) { NOTREACHED(); }));
-  WaitForCallback();
+  WaitForCallback(kTestUrl);
 
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_FALSE(was_intercepted().value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_FALSE(was_intercepted(kTestUrl).value());
 
   histogram_tester().ExpectTotalCount(
       "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime", 0);
@@ -823,12 +863,12 @@
   interceptor()->MaybeCreateLoader(
       request, browser_context(),
       base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
-                     base::Unretained(this)),
+                     base::Unretained(this), kTestUrl),
       base::BindOnce([](bool) { NOTREACHED(); }));
-  WaitForCallback();
+  WaitForCallback(kTestUrl);
 
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_TRUE(was_intercepted().value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).value());
 
   EXPECT_EQ(interceptor()->num_probes(), 1);
   ExpectCorrectUkmLogs(kTestUrl, /*is_accurate_trigger=*/true,
@@ -875,12 +915,12 @@
   interceptor()->MaybeCreateLoader(
       request, browser_context(),
       base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
-                     base::Unretained(this)),
+                     base::Unretained(this), kTestUrl),
       base::BindOnce([](bool) { NOTREACHED(); }));
-  WaitForCallback();
+  WaitForCallback(kTestUrl);
 
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_FALSE(was_intercepted().value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_FALSE(was_intercepted(kTestUrl).value());
 
   EXPECT_EQ(interceptor()->num_probes(), 1);
   ExpectCorrectUkmLogs(GURL("http://Not.Accurate.Trigger/"),
@@ -931,12 +971,12 @@
   interceptor()->MaybeCreateLoader(
       request, browser_context(),
       base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
-                     base::Unretained(this)),
+                     base::Unretained(this), kTestUrl),
       base::BindOnce([](bool) { NOTREACHED(); }));
 
   // A decision on whether the navigation should be intercepted shouldn't be
   // made until after the cookie copy process is completed.
-  EXPECT_FALSE(was_intercepted().has_value());
+  EXPECT_FALSE(was_intercepted(kTestUrl).has_value());
 
   task_environment()->FastForwardBy(base::Milliseconds(20));
 
@@ -945,10 +985,10 @@
   task_environment()->RunUntilIdle();
 
   prefetch_container->OnIsolatedCookieCopyComplete();
-  WaitForCallback();
+  WaitForCallback(kTestUrl);
 
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_FALSE(was_intercepted().value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_FALSE(was_intercepted(kTestUrl).value());
 
   histogram_tester().ExpectUniqueTimeSample(
       "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime",
@@ -959,5 +999,113 @@
                        PreloadingTriggeringOutcome::kReady);
 }
 
+TEST_F(PrefetchURLLoaderInterceptorTest, DISABLE_ASAN(HandleRedirects)) {
+  const GURL kTestUrl("https://example.com");
+  const GURL kRedirectUrl("https://redirect.com");
+
+  EXPECT_CALL(
+      *test_content_browser_client(),
+      WillCreateURLLoaderFactory(
+          testing::NotNull(), main_rfh(), main_rfh()->GetProcess()->GetID(),
+          ContentBrowserClient::URLLoaderFactoryType::kNavigation,
+          testing::ResultOf(
+              [](const url::Origin& request_initiator) {
+                return request_initiator.opaque();
+              },
+              true),
+          testing::Optional(navigation_request()->GetNavigationId()),
+          ukm::SourceIdObj::FromInt64(
+              navigation_request()->GetNextPageUkmSourceId()),
+          testing::NotNull(), testing::IsNull(), testing::NotNull(),
+          testing::IsNull(), testing::IsNull()))
+      .Times(2)
+      .WillRepeatedly(testing::Return(false));
+
+  std::unique_ptr<PrefetchContainer> prefetch_container =
+      std::make_unique<PrefetchContainer>(
+          main_rfh()->GetGlobalId(), kTestUrl,
+          PrefetchType(/*use_isolated_network_context=*/true,
+                       /*use_prefetch_proxy=*/true,
+                       blink::mojom::SpeculationEagerness::kEager),
+          blink::mojom::Referrer(), nullptr);
+  prefetch_container->SimulateAttemptAtInterceptorForTest();
+
+  prefetch_container->TakeStreamingURLLoader(
+      MakeServableStreamingURLLoaderWithRedirectForTest(kTestUrl,
+                                                        kRedirectUrl));
+  prefetch_container->AddRedirectHop(kRedirectUrl);
+
+  // Simulate the cookie copy process starting and finishing before
+  // |MaybeCreateLoader| is called.
+  prefetch_container->OnIsolatedCookieCopyStart();
+  task_environment()->FastForwardBy(base::Milliseconds(10));
+  prefetch_container->OnIsolatedCookieCopyComplete();
+
+  interceptor()->AddPrefetch(prefetch_container->GetWeakPtr());
+
+  interceptor()->TakePrefetchOriginProber(
+      std::make_unique<TestPrefetchOriginProber>(
+          browser_context(), /*should_probe_origins_response=*/false, kTestUrl,
+          PrefetchProbeResult::kNoProbing));
+
+  network::ResourceRequest request1;
+  request1.url = kTestUrl;
+  request1.resource_type =
+      static_cast<int>(blink::mojom::ResourceType::kMainFrame);
+  request1.method = "GET";
+
+  interceptor()->MaybeCreateLoader(
+      request1, browser_context(),
+      base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
+                     base::Unretained(this), kTestUrl),
+      base::BindOnce([](bool) { NOTREACHED(); }));
+  WaitForCallback(kTestUrl);
+
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).value());
+  EXPECT_FALSE(was_intercepted(kRedirectUrl).has_value());
+
+  base::RunLoop on_start_cookie_copy_run_loop;
+  interceptor()->AddOnStartCookieCopyClosure(
+      kTestUrl, kRedirectUrl, on_start_cookie_copy_run_loop.QuitClosure());
+
+  network::ResourceRequest request2;
+  request2.url = kRedirectUrl;
+  request2.resource_type =
+      static_cast<int>(blink::mojom::ResourceType::kMainFrame);
+  request2.method = "GET";
+
+  interceptor()->MaybeCreateLoader(
+      request2, browser_context(),
+      base::BindOnce(&PrefetchURLLoaderInterceptorTest::LoaderCallback,
+                     base::Unretained(this), kRedirectUrl),
+      base::BindOnce([](bool) { NOTREACHED(); }));
+
+  on_start_cookie_copy_run_loop.Run();
+  task_environment()->FastForwardBy(base::Milliseconds(20));
+  prefetch_container->OnIsolatedCookieCopyComplete();
+  WaitForCallback(kRedirectUrl);
+
+  EXPECT_TRUE(was_intercepted(kTestUrl).has_value());
+  EXPECT_TRUE(was_intercepted(kTestUrl).value());
+  EXPECT_TRUE(was_intercepted(kRedirectUrl).has_value());
+  EXPECT_TRUE(was_intercepted(kRedirectUrl).value());
+
+  histogram_tester().ExpectTotalCount(
+      "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime", 2);
+  histogram_tester().ExpectTimeBucketCount(
+      "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime", base::TimeDelta(),
+      1);
+  histogram_tester().ExpectTimeBucketCount(
+      "PrefetchProxy.AfterClick.Mainframe.CookieWaitTime",
+      base::Milliseconds(20), 1);
+
+  EXPECT_EQ(interceptor()->num_probes(), 0);
+  EXPECT_EQ(prefetch_container->GetPrefetchStatus(),
+            PrefetchStatus::kPrefetchResponseUsed);
+  ExpectCorrectUkmLogs(kTestUrl, /*is_accurate_trigger=*/true,
+                       PreloadingTriggeringOutcome::kSuccess);
+}
+
 }  // namespace
 }  // namespace content
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 09548c76..ddc4da1 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -4387,10 +4387,14 @@
   mojo::PendingRemote<network::mojom::CookieAccessObserver> cookie_observer;
   Clone(cookie_observer.InitWithNewPipeAndPassReceiver());
 
+  mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+      trust_token_observer;
+  Clone(trust_token_observer.InitWithNewPipeAndPassReceiver());
+
   network::mojom::URLLoaderFactoryParamsPtr url_loader_factory_params =
       URLLoaderFactoryParamsHelper::CreateForEarlyHintsPreload(
           process, tentative_origin, *this, early_hints,
-          std::move(cookie_observer));
+          std::move(cookie_observer), std::move(trust_token_observer));
 
   net::IsolationInfo isolation_info = url_loader_factory_params->isolation_info;
 
@@ -4804,7 +4808,7 @@
           allow_cookies_from_browser_),
       std::move(navigation_ui_data), service_worker_handle_.get(),
       std::move(prefetched_signed_exchange_cache_), this, loader_type,
-      CreateCookieAccessObserver(),
+      CreateCookieAccessObserver(), CreateTrustTokenAccessObserver(),
       static_cast<StoragePartitionImpl*>(partition)
           ->CreateURLLoaderNetworkObserverForNavigationRequest(*this),
       NetworkServiceDevToolsObserver::MakeSelfOwned(frame_tree_node_),
@@ -8293,6 +8297,13 @@
   return remote;
 }
 
+mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+NavigationRequest::CreateTrustTokenAccessObserver() {
+  mojo::PendingRemote<network::mojom::TrustTokenAccessObserver> remote;
+  trust_token_observers_.Add(this, remote.InitWithNewPipeAndPassReceiver());
+  return remote;
+}
+
 void NavigationRequest::OnCookiesAccessed(
     std::vector<network::mojom::CookieAccessDetailsPtr> details_vector) {
   for (auto& details : details_vector) {
@@ -8343,6 +8354,21 @@
   return cookie_observers_.TakeReceivers();
 }
 
+void NavigationRequest::OnTrustTokensAccessed(
+    network::mojom::TrustTokenAccessDetailsPtr details) {
+  GetDelegate()->OnTrustTokensAccessed(this, TrustTokenAccessDetails(details));
+}
+
+void NavigationRequest::Clone(
+    mojo::PendingReceiver<network::mojom::TrustTokenAccessObserver> observer) {
+  trust_token_observers_.Add(this, std::move(observer));
+}
+
+std::vector<mojo::PendingReceiver<network::mojom::TrustTokenAccessObserver>>
+NavigationRequest::TakeTrustTokenObservers() {
+  return trust_token_observers_.TakeReceivers();
+}
+
 RenderFrameHostImpl* NavigationRequest::GetInitiatorDocumentRenderFrameHost() {
   return static_cast<RenderFrameHostImpl*>(
       initiator_document_.AsRenderFrameHostIfValid());
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h
index 41832ef..d4e43536 100644
--- a/content/browser/renderer_host/navigation_request.h
+++ b/content/browser/renderer_host/navigation_request.h
@@ -52,6 +52,7 @@
 #include "services/network/public/cpp/content_security_policy/csp_context.h"
 #include "services/network/public/mojom/blocked_by_response_reason.mojom-shared.h"
 #include "services/network/public/mojom/content_security_policy.mojom.h"
+#include "services/network/public/mojom/trust_token_access_observer.mojom-shared.h"
 #include "services/network/public/mojom/web_sandbox_flags.mojom-shared.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/common/runtime_feature_state/runtime_feature_state_context.h"
@@ -100,7 +101,8 @@
       public FencedFrameURLMapping::MappingResultObserver,
       public mojom::NavigationRendererCancellationListener,
       private RenderProcessHostObserver,
-      private network::mojom::CookieAccessObserver {
+      private network::mojom::CookieAccessObserver,
+      private network::mojom::TrustTokenAccessObserver {
  public:
   // Keeps track of the various stages of a NavigationRequest.
   // To see what state transitions are allowed, see |SetState|.
@@ -812,6 +814,13 @@
       mojo::PendingReceiver<network::mojom::CookieAccessObserver>>
   TakeCookieObservers();
 
+  // Take all Trust Token observers associated with this navigation.
+  // Typically this is called when navigation commits to move these observers to
+  // the committed document.
+  [[nodiscard]] std::vector<
+      mojo::PendingReceiver<network::mojom::TrustTokenAccessObserver>>
+  TakeTrustTokenObservers();
+
   // Returns the coop status information relevant to the current navigation.
   CrossOriginOpenerPolicyStatus& coop_status() { return coop_status_; }
 
@@ -1655,6 +1664,15 @@
   void Clone(mojo::PendingReceiver<network::mojom::CookieAccessObserver>
                  observer) override;
 
+  mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+  CreateTrustTokenAccessObserver();
+
+  // network::mojom::TrustTokenAccessObserver:
+  void OnTrustTokensAccessed(
+      network::mojom::TrustTokenAccessDetailsPtr details) override;
+  void Clone(mojo::PendingReceiver<network::mojom::TrustTokenAccessObserver>
+                 observer) override;
+
   // Convenience function to return the NavigationControllerImpl this
   // NavigationRequest is in.
   NavigationControllerImpl* GetNavigationController();
@@ -2250,6 +2268,11 @@
   // made by this navigation.
   mojo::ReceiverSet<network::mojom::CookieAccessObserver> cookie_observers_;
 
+  // Observers listening to Trust Token access notifications for the network
+  // requests made by this navigation.
+  mojo::ReceiverSet<network::mojom::TrustTokenAccessObserver>
+      trust_token_observers_;
+
   OriginAgentClusterEndResult origin_agent_cluster_end_result_ =
       OriginAgentClusterEndResult::kNotRequestedAndNotOriginKeyed;
 
diff --git a/content/browser/renderer_host/navigator_delegate.h b/content/browser/renderer_host/navigator_delegate.h
index ec4ab2f79..5306124 100644
--- a/content/browser/renderer_host/navigator_delegate.h
+++ b/content/browser/renderer_host/navigator_delegate.h
@@ -14,6 +14,7 @@
 #include "content/public/browser/navigation_throttle.h"
 #include "content/public/browser/navigation_ui_data.h"
 #include "content/public/browser/reload_type.h"
+#include "content/public/browser/trust_token_access_details.h"
 
 class GURL;
 
@@ -120,6 +121,12 @@
   virtual void OnCookiesAccessed(NavigationHandle* navigation,
                                  const CookieAccessDetails& details) = 0;
 
+  // Called when a network request issued by this navigation accesses a Trust
+  // Token.
+  virtual void OnTrustTokensAccessed(
+      NavigationHandle* navigation,
+      const TrustTokenAccessDetails& details) = 0;
+
   // Does a global walk of the session history and all committed/pending-commit
   // origins, and registers origins that match |origin| to their respective
   // BrowsingInstances. |navigation_request_to_exclude| allows the
diff --git a/content/browser/renderer_host/render_frame_host_delegate.h b/content/browser/renderer_host/render_frame_host_delegate.h
index 20533bb..ad76ed1 100644
--- a/content/browser/renderer_host/render_frame_host_delegate.h
+++ b/content/browser/renderer_host/render_frame_host_delegate.h
@@ -594,6 +594,9 @@
   virtual void OnCookiesAccessed(RenderFrameHostImpl* render_frame_host,
                                  const CookieAccessDetails& details) {}
 
+  virtual void OnTrustTokensAccessed(RenderFrameHostImpl* render_frame_host,
+                                     const TrustTokenAccessDetails& details) {}
+
   // Notified that the renderer responded after calling GetSavableResourceLinks.
   virtual void SavableResourceLinksResponse(
       RenderFrameHostImpl* source,
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 52b014d..b1d5cfa 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -11303,7 +11303,6 @@
   // secure contexts, so we could additionally add a check verifying that the
   // bind request "is coming from a secure context"---but there's currently no
   // direct way to perform such a check in the browser.
-
   GetProcess()->GetStoragePartition()->CreateTrustTokenQueryAnswerer(
       std::move(receiver), ComputeTopFrameOrigin(GetLastCommittedOrigin()));
 }
@@ -12328,6 +12327,11 @@
       cookie_observers_.Add(this, std::move(receiver));
     }
 
+    // Continue observing the events for the committed navigation.
+    for (auto& receiver : navigation_request->TakeTrustTokenObservers()) {
+      trust_token_observers_.Add(this, std::move(receiver));
+    }
+
     // Resets when navigating to a new document. This is needed because
     // RenderFrameHost might be reused for a new document
     document_used_web_otp_ = false;
@@ -14595,6 +14599,13 @@
   return remote;
 }
 
+mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+RenderFrameHostImpl::CreateTrustTokenAccessObserver() {
+  mojo::PendingRemote<network::mojom::TrustTokenAccessObserver> remote;
+  trust_token_observers_.Add(this, remote.InitWithNewPipeAndPassReceiver());
+  return remote;
+}
+
 #if BUILDFLAG(ENABLE_MDNS)
 void RenderFrameHostImpl::CreateMdnsResponder(
     mojo::PendingReceiver<network::mojom::MdnsResponder> receiver) {
@@ -14608,6 +14619,11 @@
   cookie_observers_.Add(this, std::move(observer));
 }
 
+void RenderFrameHostImpl::Clone(
+    mojo::PendingReceiver<network::mojom::TrustTokenAccessObserver> observer) {
+  trust_token_observers_.Add(this, std::move(observer));
+}
+
 void RenderFrameHostImpl::OnCookiesAccessed(
     std::vector<network::mojom::CookieAccessDetailsPtr> details_vector) {
   for (auto& details : details_vector) {
@@ -14625,6 +14641,11 @@
   }
 }
 
+void RenderFrameHostImpl::OnTrustTokensAccessed(
+    network::mojom::TrustTokenAccessDetailsPtr details) {
+  delegate_->OnTrustTokensAccessed(this, TrustTokenAccessDetails(details));
+}
+
 void RenderFrameHostImpl::SetEmbeddingToken(
     const base::UnguessableToken& embedding_token) {
   // Everything in this method depends on whether the embedding token has
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index f4acf19..95ad454 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -109,6 +109,7 @@
 #include "services/network/public/mojom/cookie_access_observer.mojom.h"
 #include "services/network/public/mojom/fetch_api.mojom-forward.h"
 #include "services/network/public/mojom/mdns_responder.mojom.h"
+#include "services/network/public/mojom/trust_token_access_observer.mojom.h"
 #include "services/network/public/mojom/url_loader_network_service_observer.mojom-forward.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
@@ -308,6 +309,7 @@
       public blink::mojom::LocalMainFrameHost,
       public ui::AXActionHandlerBase,
       public network::mojom::CookieAccessObserver,
+      public network::mojom::TrustTokenAccessObserver,
       public BucketContext {
  public:
   using JavaScriptDialogCallback =
@@ -2535,10 +2537,17 @@
   mojo::PendingRemote<network::mojom::CookieAccessObserver>
   CreateCookieAccessObserver();
 
+  mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+  CreateTrustTokenAccessObserver();
+
   // network::mojom::CookieAccessObserver:
   void OnCookiesAccessed(std::vector<network::mojom::CookieAccessDetailsPtr>
                              details_vector) override;
 
+  // network::mojom::TrustTokenAccessObserver:
+  void OnTrustTokensAccessed(
+      network::mojom::TrustTokenAccessDetailsPtr details) override;
+
   void GetSavableResourceLinksFromRenderer();
   void GetPendingBeaconHost(
       mojo::PendingReceiver<blink::mojom::PendingBeaconHost> receiver);
@@ -3211,6 +3220,10 @@
   void Clone(mojo::PendingReceiver<network::mojom::CookieAccessObserver>
                  observer) override;
 
+  // network::mojom::TrustTokenAccessObserver
+  void Clone(mojo::PendingReceiver<network::mojom::TrustTokenAccessObserver>
+                 observer) override;
+
   // Resets any waiting state of this RenderFrameHost that is no longer
   // relevant.
   void ResetWaitingState();
@@ -4766,6 +4779,16 @@
   // TODO(crbug.com/936696): Remove this warning after the RDH ships.
   mojo::ReceiverSet<network::mojom::CookieAccessObserver> cookie_observers_;
 
+  // Observers listening to Trust Token access notifications for the current
+  // document in this RenderFrameHost. Note: at the moment this set is not
+  // cleared when a new document is created in this RenderFrameHost. This is
+  // done because the first observer is created before the navigation actually
+  // commits and because the old routing id-based behaved in the same way as
+  // well. This problem should go away with RenderDocumentHost in any case.
+  // TODO(crbug.com/936696): Remove this warning after the RDH ships.
+  mojo::ReceiverSet<network::mojom::TrustTokenAccessObserver>
+      trust_token_observers_;
+
   // Indicates whether this frame is an outer delegate frame for some other
   // RenderFrameHost. This will be a valid ID if so, and
   // `kFrameTreeNodeInvalidId` otherwise.
diff --git a/content/browser/shared_storage/shared_storage_browsertest.cc b/content/browser/shared_storage/shared_storage_browsertest.cc
index 33dd7cde7..ab582d7 100644
--- a/content/browser/shared_storage/shared_storage_browsertest.cc
+++ b/content/browser/shared_storage/shared_storage_browsertest.cc
@@ -228,17 +228,43 @@
 
   ~TestSharedStorageWorkletHost() override = default;
 
-  void WaitForWorkletResponsesCount(size_t count) {
-    if (worklet_responses_count_ >= count) {
-      ResetResponseCounts();
+  // Separate from `WaitForWorkletResponses()` so that we can wait for it
+  // without having to set an expected response count beforehand. The worklet
+  // host won't exist before the first call to either `addModule(), `run()`, or
+  // `selectURL()`. In the correct flow, `addModule()` will be called first.
+  void WaitForAddModule() {
+    if (add_module_called_) {
+      ResetAddModuleCalledAndMaybeCloseWorklet();
       return;
     }
 
+    add_module_waiter_ = std::make_unique<base::RunLoop>();
+    add_module_waiter_->Run();
+    add_module_waiter_.reset();
+    ResetAddModuleCalledAndMaybeCloseWorklet();
+  }
+
+  // Only applies to `run()` and `selectURL()`. Must be set before calling the
+  // operation. Precondition: Either `addModule()`, `run()`, or `selectURL()`
+  // has previously been called so that this worklet host exists.
+  void SetExpectedWorkletResponsesCount(size_t count) {
     expected_worklet_responses_count_ = count;
+    response_expectation_set_ = true;
+  }
+
+  // Only applies to `run()` and `selectURL()`.
+  // Precondition: `SetExpectedWorkletResponsesCount()` has been called with the
+  // desired expected `count`, followed by the operation(s) itself/themselves.
+  void WaitForWorkletResponses() {
+    if (worklet_responses_count_ >= expected_worklet_responses_count_) {
+      ResetResponseCountsAndMaybeCloseWorklet();
+      return;
+    }
+
     worklet_responses_count_waiter_ = std::make_unique<base::RunLoop>();
     worklet_responses_count_waiter_->Run();
     worklet_responses_count_waiter_.reset();
-    ResetResponseCounts();
+    ResetResponseCountsAndMaybeCloseWorklet();
   }
 
   void set_should_defer_worklet_messages(bool should_defer_worklet_messages) {
@@ -292,6 +318,7 @@
       bool success,
       const std::string& error_message,
       bool initial_message) {
+    bool in_keep_alive = IsInKeepAlivePhase();
     if (should_defer_worklet_messages_ && initial_message) {
       pending_worklet_messages_.push_back(base::BindOnce(
           &TestSharedStorageWorkletHost::OnAddModuleOnWorkletFinishedHelper,
@@ -303,7 +330,10 @@
     }
 
     if (initial_message)
-      OnWorkletResponseReceived();
+      OnAddModuleResponseReceived();
+    if (!in_keep_alive) {
+      ProcessAddModuleExpirationIfWorkletExpired();
+    }
   }
 
   void OnRunOperationOnWorkletFinished(
@@ -318,6 +348,7 @@
                                              bool success,
                                              const std::string& error_message,
                                              bool initial_message) {
+    bool in_keep_alive = IsInKeepAlivePhase();
     if (should_defer_worklet_messages_ && initial_message) {
       pending_worklet_messages_.push_back(base::BindOnce(
           &TestSharedStorageWorkletHost::OnRunOperationOnWorkletFinishedHelper,
@@ -330,6 +361,9 @@
 
     if (initial_message)
       OnWorkletResponseReceived();
+    if (!in_keep_alive) {
+      ProcessRunOrSelectURLExpirationIfWorkletExpired();
+    }
   }
 
   void OnRunURLSelectionOperationOnWorkletFinished(
@@ -353,6 +387,7 @@
       uint32_t index,
       BudgetResult budget_result,
       bool initial_message) {
+    bool in_keep_alive = IsInKeepAlivePhase();
     if (should_defer_worklet_messages_ && initial_message) {
       pending_worklet_messages_.push_back(base::BindOnce(
           &TestSharedStorageWorkletHost::
@@ -369,6 +404,91 @@
 
     if (initial_message)
       OnWorkletResponseReceived();
+    if (!in_keep_alive) {
+      ProcessRunOrSelectURLExpirationIfWorkletExpired();
+    }
+  }
+
+  void ExpireWorklet() override {
+    // We must defer the destruction of the expired worklet until the rest of
+    // the test worklet code has run, in order to avoid segmentation faults. In
+    // particular, if either the `add_module_waiter_` or the
+    // `worklet_responses_count_waiter_` is running, we must quit it first
+    // before we actually destroy the worklet (regardless of how many worklet
+    // responses have been received). Hence we save a callback to destroy the
+    // worklet after we quit the waiter. The `Quit()` will occur in
+    // `Process*ExpirationIfWorkletExpired()` after returning to
+    // `On*OnWorkletFinishedHelper()`. If no waiter is running, we still have to
+    // finish running whichever `On*OnWorkletFinishedHelper()` triggered the
+    // call to `ExpireWorklet()`.
+    DCHECK(!pending_expire_worklet_callback_);
+    pending_expire_worklet_callback_ =
+        base::BindOnce(&TestSharedStorageWorkletHost::ExpireWorkletOnBaseClass,
+                       weak_ptr_factory_.GetWeakPtr());
+  }
+
+  void ExpireWorkletOnBaseClass() { SharedStorageWorkletHost::ExpireWorklet(); }
+
+  void ProcessAddModuleExpirationIfWorkletExpired() {
+    if (!pending_expire_worklet_callback_) {
+      return;
+    }
+
+    // We can't have both waiters running at the same time.
+    DCHECK(!worklet_responses_count_waiter_);
+
+    if (add_module_waiter_ && add_module_waiter_->running()) {
+      // The worklet is expired and needs to be destroyed. Since
+      // `add_module_waiter_` is running, quitting it will return us to
+      // `WaitForAddModule()`, where the waiter will be reset, and then, in
+      // `ResetAddModuleCalledAndMaybeCloseWorklet()`, the
+      // `pending_expire_worklet_callback_` callback will be run.
+      add_module_waiter_->Quit();
+    }
+
+    std::move(pending_expire_worklet_callback_).Run();
+
+    // Do not add code after this. The worklet has been destroyed.
+  }
+
+  void ProcessRunOrSelectURLExpirationIfWorkletExpired() {
+    if (!pending_expire_worklet_callback_) {
+      return;
+    }
+
+    // We can't have both waiters running at the same time.
+    DCHECK(!add_module_waiter_);
+
+    if (worklet_responses_count_waiter_ &&
+        worklet_responses_count_waiter_->running()) {
+      // The worklet is expired and needs to be destroyed. Since
+      // `worklet_responses_count_waiter_` is running, quitting it will return
+      // us to `WaitForWorkletResponses()`, where the waiter will be reset, and
+      // then, in `ResetResponseCountsAndMaybeCloseWorklet()`, the
+      // `pending_expire_worklet_callback_` callback will be run.
+      worklet_responses_count_waiter_->Quit();
+      return;
+    }
+
+    if (response_expectation_set_) {
+      // We expect a call to `WaitForWorkletResponses()`, which will run the
+      // callback.
+      return;
+    }
+
+    // No response expectation has been set, so we do expect a call to
+    // `WaitForWorkletResponses()`.
+    std::move(pending_expire_worklet_callback_).Run();
+
+    // Do not add code after this. The worklet has been destroyed.
+  }
+
+  void OnAddModuleResponseReceived() {
+    add_module_called_ = true;
+
+    if (add_module_waiter_ && add_module_waiter_->running()) {
+      add_module_waiter_->Quit();
+    }
   }
 
   void OnWorkletResponseReceived() {
@@ -381,9 +501,26 @@
     }
   }
 
-  void ResetResponseCounts() {
+  void ResetAddModuleCalledAndMaybeCloseWorklet() {
+    add_module_called_ = false;
+
+    if (pending_expire_worklet_callback_) {
+      std::move(pending_expire_worklet_callback_).Run();
+
+      // Do not add code after this. The worklet has been destroyed.
+    }
+  }
+
+  void ResetResponseCountsAndMaybeCloseWorklet() {
     expected_worklet_responses_count_ = 0u;
     worklet_responses_count_ = 0u;
+    response_expectation_set_ = false;
+
+    if (pending_expire_worklet_callback_) {
+      std::move(pending_expire_worklet_callback_).Run();
+
+      // Do not add code after this. The worklet has been destroyed.
+    }
   }
 
   base::TimeDelta GetKeepAliveTimeout() const override {
@@ -392,10 +529,16 @@
     return base::Seconds(30);
   }
 
-  // How many worklet operations have finished. This only include `addModule()`,
-  // `selectURL()` and `run()`.
+  // Whether or not `addModule()` has been called since the last time (if any)
+  // that `add_module_waiter_` was reset.
+  bool add_module_called_ = false;
+  std::unique_ptr<base::RunLoop> add_module_waiter_;
+
+  // How many worklet operations have finished. This only includes `selectURL()`
+  // and `run()`.
   size_t worklet_responses_count_ = 0;
   size_t expected_worklet_responses_count_ = 0;
+  bool response_expectation_set_ = false;
   std::unique_ptr<base::RunLoop> worklet_responses_count_waiter_;
 
   // Whether we should defer messages received from the worklet environment to
@@ -405,6 +548,11 @@
   bool should_defer_worklet_messages_;
   std::vector<base::OnceClosure> pending_worklet_messages_;
 
+  // This callback will be non-null if the worklet is pending expiration due to
+  // the option `keepAlive: false` (which is the default value) being received
+  // in the most recent call to `run()` or `selectURL()`.
+  base::OnceClosure pending_expire_worklet_callback_;
+
   base::WeakPtrFactory<TestSharedStorageWorkletHost> weak_ptr_factory_{this};
 };
 
@@ -737,7 +885,8 @@
   void ExecuteScriptInWorklet(const ToRenderFrameHost& execution_target,
                               const std::string& script,
                               GURL* out_module_script_url,
-                              size_t expected_total_host_count = 1u) {
+                              size_t expected_total_host_count = 1u,
+                              bool keep_alive_after_operation = true) {
     DCHECK(out_module_script_url);
 
     base::StringPairs run_function_body_replacement;
@@ -763,14 +912,21 @@
 
     EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
 
-    EXPECT_TRUE(ExecJs(execution_target, R"(
-        sharedStorage.run('test-operation');
-      )"));
-
-    // There are 2 "worklet operations": `addModule()` and `run()`.
+    // There is 1 more "worklet operation": `run()`.
     test_worklet_host_manager()
         .GetAttachedWorkletHostForFrame(execution_target.render_frame_host())
-        ->WaitForWorkletResponsesCount(2);
+        ->SetExpectedWorkletResponsesCount(1);
+
+    EXPECT_TRUE(ExecJs(
+        execution_target,
+        JsReplace("window.keepWorklet = $1;", keep_alive_after_operation)));
+    EXPECT_TRUE(ExecJs(execution_target, R"(
+        sharedStorage.run('test-operation', {keepAlive: keepWorklet});
+      )"));
+
+    test_worklet_host_manager()
+        .GetAttachedWorkletHostForFrame(execution_target.render_frame_host())
+        ->WaitForWorkletResponses();
   }
 
   FrameTreeNode* CreateIFrame(FrameTreeNode* root, const GURL& url) {
@@ -797,7 +953,8 @@
   // the primary frame tree's root node will be chosen. This generates an URN
   // associated with `origin` and 3 bits of shared storage budget.
   GURL SelectFrom8URLsInContext(const url::Origin& origin,
-                                FrameTreeNode* parent_node = nullptr) {
+                                FrameTreeNode* parent_node = nullptr,
+                                bool keep_alive_after_operation = true) {
     if (!parent_node)
       parent_node = PrimaryFrameTreeNodeRoot();
 
@@ -808,10 +965,18 @@
 
     FrameTreeNode* iframe = CreateIFrame(parent_node, iframe_url);
 
+    EXPECT_TRUE(ExecJs(iframe, JsReplace("window.keepWorklet = $1;",
+                                         keep_alive_after_operation)));
+
     EXPECT_TRUE(ExecJs(iframe, R"(
         sharedStorage.worklet.addModule('/shared_storage/simple_module.js');
       )"));
 
+    // There is 1 more "worklet operation": `selectURL()`.
+    test_worklet_host_manager()
+        .GetAttachedWorkletHostForFrame(iframe->current_frame_host())
+        ->SetExpectedWorkletResponsesCount(1);
+
     // Generate 8 candidates urls in to a list variable `urls`.
     EXPECT_TRUE(ExecJs(iframe, kGenerateURLsListScript));
     EXPECT_TRUE(
@@ -828,7 +993,8 @@
             urls,
             {
               data: {'mockResult': 1},
-              resolveToConfig: resolveSelectURLToConfig
+              resolveToConfig: resolveSelectURLToConfig,
+              keepAlive: keepWorklet
             }
           );
           if (resolveSelectURLToConfig &&
@@ -849,26 +1015,39 @@
       EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
     }
 
-    // There are 2 "worklet operations": `addModule()` and `selectURL()`.
     test_worklet_host_manager()
         .GetAttachedWorkletHostForFrame(iframe->current_frame_host())
-        ->WaitForWorkletResponsesCount(2);
+        ->WaitForWorkletResponses();
 
     return observed_urn_uuid.value();
   }
 
   // Prerequisite: The worklet for `frame` has registered a
   // "remaining-budget-operation" that logs the remaining budget to the console
-  // after `kRemainingBudgetPrefix`.
-  double RemainingBudgetViaJSForFrame(FrameTreeNode* frame) {
+  // after `kRemainingBudgetPrefix`. Also, if any previous operations are
+  // called, they use the option `keepAlive: true`.
+  double RemainingBudgetViaJSForFrame(FrameTreeNode* frame,
+                                      bool keep_alive_after_operation = true) {
     DCHECK(frame);
 
     WebContentsConsoleObserver console_observer(shell()->web_contents());
     const std::string kRemainingBudgetPrefixStr(kRemainingBudgetPrefix);
     console_observer.SetPattern(base::StrCat({kRemainingBudgetPrefixStr, "*"}));
+    EXPECT_TRUE(ExecJs(frame, JsReplace("window.keepWorklet = $1;",
+                                        keep_alive_after_operation)));
+
+    // There is 1 "worklet operation": `run()`.
+    test_worklet_host_manager()
+        .GetAttachedWorkletHostForFrame(frame->current_frame_host())
+        ->SetExpectedWorkletResponsesCount(1);
 
     EXPECT_TRUE(ExecJs(frame, R"(
-      sharedStorage.run('remaining-budget-operation', {data: {}});
+      sharedStorage.run('remaining-budget-operation',
+                        {
+                          data: {},
+                          keepAlive: keepWorklet
+                        }
+      );
     )"));
 
     bool observed = console_observer.Wait();
@@ -877,9 +1056,9 @@
       return nan("");
     }
 
-    EXPECT_EQ(1u, console_observer.messages().size());
+    EXPECT_LE(1u, console_observer.messages().size());
     std::string console_message =
-        base::UTF16ToUTF8(console_observer.messages()[0].message);
+        base::UTF16ToUTF8(console_observer.messages().back().message);
     EXPECT_TRUE(base::StartsWith(console_message, kRemainingBudgetPrefixStr));
 
     std::string result_string = console_message.substr(
@@ -889,10 +1068,9 @@
     double result = 0.0;
     EXPECT_TRUE(base::StringToDouble(result_string, &result));
 
-    // There is 1 "worklet operation": `run()`.
     test_worklet_host_manager()
         .GetAttachedWorkletHostForFrame(frame->current_frame_host())
-        ->WaitForWorkletResponsesCount(1);
+        ->WaitForWorkletResponses();
     return result;
   }
 
@@ -904,10 +1082,6 @@
         sharedStorage.worklet.addModule('shared_storage/simple_module.js');
       )"));
 
-    // There is 1 "worklet operation": `addModule()`.
-    test_worklet_host_manager()
-        .GetAttachedWorkletHostForFrame(iframe->current_frame_host())
-        ->WaitForWorkletResponsesCount(1);
     return RemainingBudgetViaJSForFrame(iframe);
   }
 
@@ -1137,6 +1311,235 @@
             "a.test", "/shared_storage/simple_module.js"))}});
 }
 
+IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest,
+                       AddModule_SecondAddModuleAfterKeepAliveTrueRun_Failure) {
+  // The test assumes pages get deleted after navigation. To ensure this,
+  // disable back/forward cache.
+  content::DisableBackForwardCacheForTesting(
+      shell()->web_contents(),
+      content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
+
+  GURL url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'},
+                             keepAlive: true});
+    )"));
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  std::string expected_error =
+      "a JavaScript error: \"Error: sharedStorage.worklet.addModule() can only "
+      "be invoked once per browsing context.\"\n";
+
+  EvalJsResult result = EvalJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )");
+  EXPECT_EQ(expected_error, result.error);
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+  EXPECT_EQ(5u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+  EXPECT_EQ("Start executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[2].message));
+  EXPECT_EQ("{\"customKey\":\"customValue\"}",
+            base::UTF16ToUTF8(console_observer.messages()[3].message));
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[4].message));
+
+  // Navigate again to record histograms.
+  EXPECT_TRUE(NavigateToURL(shell(), GURL(url::kAboutBlankURL)));
+  WaitForHistograms(
+      {kDestroyedStatusHistogram, kTimingUsefulResourceHistogram});
+
+  histogram_tester_.ExpectUniqueSample(
+      kDestroyedStatusHistogram,
+      blink::SharedStorageWorkletDestroyedStatus::kDidNotEnterKeepAlive, 1);
+  histogram_tester_.ExpectTotalCount(kTimingUsefulResourceHistogram, 1);
+
+  std::string origin_str = url::Origin::Create(url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())},
+       {AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))}});
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageBrowserTest,
+    AddModule_SecondAddModuleAfterKeepAliveFalseRun_Failure) {
+  // The test assumes pages get deleted after navigation. To ensure this,
+  // disable back/forward cache.
+  content::DisableBackForwardCacheForTesting(
+      shell()->web_contents(),
+      content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
+
+  GURL url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'},
+                             keepAlive: false});
+    )"));
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  std::string expected_error = base::StrCat(
+      {"a JavaScript error: \"Error: ", kSharedStorageWorkletExpiredMessage,
+       "\"\n"});
+
+  EvalJsResult result = EvalJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )");
+  EXPECT_EQ(expected_error, result.error);
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+  EXPECT_EQ(5u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+  EXPECT_EQ("Start executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[2].message));
+  EXPECT_EQ("{\"customKey\":\"customValue\"}",
+            base::UTF16ToUTF8(console_observer.messages()[3].message));
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[4].message));
+
+  // Navigate again to record histograms.
+  EXPECT_TRUE(NavigateToURL(shell(), GURL(url::kAboutBlankURL)));
+  WaitForHistograms(
+      {kDestroyedStatusHistogram, kTimingUsefulResourceHistogram});
+
+  histogram_tester_.ExpectUniqueSample(
+      kDestroyedStatusHistogram,
+      blink::SharedStorageWorkletDestroyedStatus::kDidNotEnterKeepAlive, 1);
+  histogram_tester_.ExpectTotalCount(kTimingUsefulResourceHistogram, 1);
+
+  std::string origin_str = url::Origin::Create(url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())}});
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageBrowserTest,
+    AddModule_SecondAddModuleAfterKeepAliveDefaultRun_Failure) {
+  // The test assumes pages get deleted after navigation. To ensure this,
+  // disable back/forward cache.
+  content::DisableBackForwardCacheForTesting(
+      shell()->web_contents(),
+      content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
+
+  GURL url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'}});
+    )"));
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  std::string expected_error = base::StrCat(
+      {"a JavaScript error: \"Error: ", kSharedStorageWorkletExpiredMessage,
+       "\"\n"});
+
+  EvalJsResult result = EvalJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )");
+  EXPECT_EQ(expected_error, result.error);
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+  EXPECT_EQ(5u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+  EXPECT_EQ("Start executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[2].message));
+  EXPECT_EQ("{\"customKey\":\"customValue\"}",
+            base::UTF16ToUTF8(console_observer.messages()[3].message));
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[4].message));
+
+  // Navigate again to record histograms.
+  EXPECT_TRUE(NavigateToURL(shell(), GURL(url::kAboutBlankURL)));
+  WaitForHistograms(
+      {kDestroyedStatusHistogram, kTimingUsefulResourceHistogram});
+
+  histogram_tester_.ExpectUniqueSample(
+      kDestroyedStatusHistogram,
+      blink::SharedStorageWorkletDestroyedStatus::kDidNotEnterKeepAlive, 1);
+  histogram_tester_.ExpectTotalCount(kTimingUsefulResourceHistogram, 1);
+
+  std::string origin_str = url::Origin::Create(url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())}});
+}
+
 IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest, RunOperation_Success) {
   GURL url = https_server()->GetURL("a.test", kSimplePagePath);
   EXPECT_TRUE(NavigateToURL(shell(), url));
@@ -1149,21 +1552,26 @@
 
   EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
   EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
   EXPECT_EQ(2u, console_observer.messages().size());
   EXPECT_EQ("Start executing simple_module.js",
             base::UTF16ToUTF8(console_observer.messages()[0].message));
   EXPECT_EQ("Finish executing simple_module.js",
             base::UTF16ToUTF8(console_observer.messages()[1].message));
 
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EXPECT_TRUE(ExecJs(shell(), R"(
       sharedStorage.run(
           'test-operation', {data: {'customKey': 'customValue'}});
     )"));
 
-  // There are 2 "worklet operations": `addModule()` and `run()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   EXPECT_EQ(5u, console_observer.messages().size());
   EXPECT_EQ("Start executing 'test-operation'",
@@ -1201,7 +1609,8 @@
 
   EXPECT_TRUE(ExecJs(shell(), R"(
       sharedStorage.run(
-          'test-operation', {data: {'customKey': 'customValue'}});
+          'test-operation', {data: {'customKey': 'customValue'},
+                             keepAlive: true});
     )"));
 
   EXPECT_TRUE(ExecJs(shell(), R"(
@@ -1211,10 +1620,18 @@
   EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
   EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
 
-  // There are 2 "worklet operations": `run()` and `addModule()`.
+  // We cannot set the expected number of responses for `run()/selectURL()`
+  // until the worklet host is created. Normally we set these expectations after
+  // the call to `addModule()` and before making any calls to `run()` or
+  // `selectURL()`. Yet, here `run()` and `addModule()` are intentionally called
+  // in the wrong order.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->SetExpectedWorkletResponsesCount(1);
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
 
   EXPECT_EQ(3u, console_observer.messages().size());
   EXPECT_EQ(
@@ -1300,6 +1717,7 @@
 
   EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
   EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
   EXPECT_EQ(2u, console_observer.messages().size());
   EXPECT_EQ("Start executing erroneous_function_module.js",
             base::UTF16ToUTF8(console_observer.messages()[0].message));
@@ -1310,15 +1728,19 @@
   EXPECT_EQ(blink::mojom::ConsoleMessageLevel::kInfo,
             console_observer.messages()[0].log_level);
 
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EXPECT_TRUE(ExecJs(shell(), R"(
       sharedStorage.run(
           'test-operation', {data: {'customKey': 'customValue'}});
     )"));
 
-  // There are 2 "worklet operations": `addModule()` and `run()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   EXPECT_EQ(4u, console_observer.messages().size());
   EXPECT_EQ("Start executing 'test-operation'",
@@ -1343,6 +1765,239 @@
                                                std::vector<uint8_t>())}});
 }
 
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageBrowserTest,
+    RunOperation_SecondRunOperationAfterKeepAliveTrueRun_Success) {
+  GURL url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  EXPECT_EQ(2u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'},
+                             keepAlive: true});
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  EXPECT_EQ(5u, console_observer.messages().size());
+  EXPECT_EQ("Start executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[2].message));
+  EXPECT_EQ("{\"customKey\":\"customValue\"}",
+            base::UTF16ToUTF8(console_observer.messages()[3].message));
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[4].message));
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'}});
+    )"));
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  EXPECT_EQ(8u, console_observer.messages().size());
+  EXPECT_EQ("Start executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[5].message));
+  EXPECT_EQ("{\"customKey\":\"customValue\"}",
+            base::UTF16ToUTF8(console_observer.messages()[6].message));
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[7].message));
+
+  WaitForHistograms({kTimingRunExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingRunExecutedInWorkletHistogram, 2);
+
+  std::string origin_str = url::Origin::Create(url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())}});
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageBrowserTest,
+    RunOperation_SecondRunOperationAfterKeepAliveFalseRun_Failure) {
+  GURL url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  EXPECT_EQ(2u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'},
+                             keepAlive: false});
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  EXPECT_EQ(5u, console_observer.messages().size());
+  EXPECT_EQ("Start executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[2].message));
+  EXPECT_EQ("{\"customKey\":\"customValue\"}",
+            base::UTF16ToUTF8(console_observer.messages()[3].message));
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[4].message));
+
+  std::string expected_error = base::StrCat(
+      {"a JavaScript error: \"Error: ", kSharedStorageWorkletExpiredMessage,
+       "\"\n"});
+
+  EvalJsResult result = EvalJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'}});
+    )");
+  EXPECT_EQ(expected_error, result.error);
+
+  WaitForHistograms({kTimingRunExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingRunExecutedInWorkletHistogram, 1);
+
+  std::string origin_str = url::Origin::Create(url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())}});
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageBrowserTest,
+    RunOperation_SecondRunOperationAfterKeepAliveDefaultRun_Failure) {
+  GURL url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  EXPECT_EQ(2u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'}});
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  EXPECT_EQ(5u, console_observer.messages().size());
+  EXPECT_EQ("Start executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[2].message));
+  EXPECT_EQ("{\"customKey\":\"customValue\"}",
+            base::UTF16ToUTF8(console_observer.messages()[3].message));
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[4].message));
+
+  std::string expected_error = base::StrCat(
+      {"a JavaScript error: \"Error: ", kSharedStorageWorkletExpiredMessage,
+       "\"\n"});
+
+  EvalJsResult result = EvalJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'}});
+    )");
+  EXPECT_EQ(expected_error, result.error);
+
+  WaitForHistograms({kTimingRunExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingRunExecutedInWorkletHistogram, 1);
+
+  std::string origin_str = url::Origin::Create(url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())}});
+}
+
 IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest, WorkletDestroyed) {
   // The test assumes pages get deleted after navigation. To ensure this,
   // disable back/forward cache.
@@ -1470,9 +2125,7 @@
   EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
   EXPECT_EQ(1u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
 
-  test_worklet_host_manager()
-      .GetKeepAliveWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
+  test_worklet_host_manager().GetKeepAliveWorkletHost()->WaitForAddModule();
 
   // Three pending messages are expected: two for console.log and one for
   // `addModule()` response.
@@ -1537,9 +2190,7 @@
   EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
   EXPECT_EQ(1u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
 
-  test_worklet_host_manager()
-      .GetKeepAliveWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
+  test_worklet_host_manager().GetKeepAliveWorkletHost()->WaitForAddModule();
 
   // Three pending messages are expected: two for console.log and one for
   // `addModule()` response.
@@ -1598,6 +2249,11 @@
       .GetAttachedWorkletHost()
       ->set_should_defer_worklet_messages(true);
 
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EXPECT_TRUE(ExecJs(shell(), R"(
       sharedStorage.run(
           'test-operation', {data: {'customKey': 'customValue'}})
@@ -1611,7 +2267,7 @@
 
   test_worklet_host_manager()
       .GetKeepAliveWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   // Four pending messages are expected: three for console.log and one for
   // `run()` response.
@@ -1687,9 +2343,7 @@
   EXPECT_EQ(1u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
 
   // Ensure that the response is deferred.
-  test_worklet_host_manager()
-      .GetKeepAliveWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
+  test_worklet_host_manager().GetKeepAliveWorkletHost()->WaitForAddModule();
 
   // Three pending messages are expected: two for console.log and one for
   // `addModule()` response.
@@ -1794,10 +2448,16 @@
   EXPECT_TRUE(ExecJs(shell(), R"(
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
+
   EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
                                         ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(shell(), R"(
       (async function() {
         window.select_url_result = await sharedStorage.selectURL(
@@ -1833,10 +2493,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   ASSERT_TRUE(config_observer.ConfigObserved());
   const absl::optional<FencedFrameConfig>& fenced_frame_config =
@@ -1899,10 +2558,16 @@
   EXPECT_TRUE(ExecJs(shell(), R"(
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
+
   EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
                                         ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(shell(), R"(
       (async function() {
         window.select_url_result = await sharedStorage.selectURL(
@@ -1937,10 +2602,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   ASSERT_TRUE(config_observer.ConfigObserved());
   const absl::optional<FencedFrameConfig>& fenced_frame_config =
@@ -2006,6 +2670,11 @@
                                        ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(iframe, R"(
       (async function() {
         window.select_url_result = await sharedStorage.selectURL(
@@ -2046,10 +2715,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   ASSERT_TRUE(config_observer.ConfigObserved());
   const absl::optional<FencedFrameConfig>& fenced_frame_config =
@@ -2098,6 +2766,1007 @@
                   {}}}))}});
 }
 
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageBrowserTest,
+    SelectURL_SecondSelectURLAfterKeepAliveTrueSelectURL_Success) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
+                                        ResolveSelectURLToConfig())));
+
+  TestSelectURLFencedFrameConfigObserver config_observer1(
+      GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EvalJsResult result1 = EvalJs(shell(), R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: true
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )");
+
+  EXPECT_TRUE(result1.error.empty());
+  const absl::optional<GURL>& observed_urn_uuid1 =
+      config_observer1.GetUrnUuid();
+  EXPECT_TRUE(observed_urn_uuid1.has_value());
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(observed_urn_uuid1.value()));
+
+  if (!ResolveSelectURLToConfig()) {
+    EXPECT_EQ(result1.ExtractString(), observed_urn_uuid1->spec());
+  }
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  ASSERT_TRUE(config_observer1.ConfigObserved());
+  const absl::optional<FencedFrameConfig>& fenced_frame_config1 =
+      config_observer1.GetConfig();
+  EXPECT_TRUE(fenced_frame_config1.has_value());
+  EXPECT_EQ(fenced_frame_config1->urn_uuid_, observed_urn_uuid1.value());
+
+  EXPECT_EQ("Finish executing 'test-url-selection-operation'",
+            base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  TestSelectURLFencedFrameConfigObserver config_observer2(
+      GetStoragePartition());
+
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EvalJsResult result2 = EvalJs(shell(), R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )");
+
+  EXPECT_TRUE(result2.error.empty());
+  const absl::optional<GURL>& observed_urn_uuid2 =
+      config_observer2.GetUrnUuid();
+  EXPECT_TRUE(observed_urn_uuid2.has_value());
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(observed_urn_uuid2.value()));
+
+  if (!ResolveSelectURLToConfig()) {
+    EXPECT_EQ(result2.ExtractString(), observed_urn_uuid2->spec());
+  }
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  ASSERT_TRUE(config_observer2.ConfigObserved());
+  const absl::optional<FencedFrameConfig>& fenced_frame_config2 =
+      config_observer2.GetConfig();
+  EXPECT_TRUE(fenced_frame_config2.has_value());
+  EXPECT_EQ(fenced_frame_config2->urn_uuid_, observed_urn_uuid2.value());
+
+  EXPECT_EQ("Finish executing 'test-url-selection-operation'",
+            base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  WaitForHistograms({kTimingSelectUrlExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingSelectUrlExecutedInWorkletHistogram,
+                                     2);
+
+  std::string origin_str = url::Origin::Create(main_url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentSelectURL, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForSelectURL(
+            "test-url-selection-operation", std::vector<uint8_t>(),
+            std::vector<SharedStorageUrlSpecWithMetadata>(
+                {{https_server()->GetURL("a.test",
+                                         "/fenced_frames/title0.html"),
+                  {}}}))},
+       {AccessType::kDocumentSelectURL, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForSelectURL(
+            "test-url-selection-operation", std::vector<uint8_t>(),
+            std::vector<SharedStorageUrlSpecWithMetadata>(
+                {{https_server()->GetURL("a.test",
+                                         "/fenced_frames/title0.html"),
+                  {}}}))}});
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageBrowserTest,
+    SelectURL_SecondSelectURLAfterKeepAliveFalseSelectURL_Failure) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
+                                        ResolveSelectURLToConfig())));
+
+  TestSelectURLFencedFrameConfigObserver config_observer1(
+      GetStoragePartition());
+
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EvalJsResult result1 = EvalJs(shell(), R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: false
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )");
+
+  EXPECT_TRUE(result1.error.empty());
+  const absl::optional<GURL>& observed_urn_uuid1 =
+      config_observer1.GetUrnUuid();
+  EXPECT_TRUE(observed_urn_uuid1.has_value());
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(observed_urn_uuid1.value()));
+
+  if (!ResolveSelectURLToConfig()) {
+    EXPECT_EQ(result1.ExtractString(), observed_urn_uuid1->spec());
+  }
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  ASSERT_TRUE(config_observer1.ConfigObserved());
+  const absl::optional<FencedFrameConfig>& fenced_frame_config1 =
+      config_observer1.GetConfig();
+  EXPECT_TRUE(fenced_frame_config1.has_value());
+  EXPECT_EQ(fenced_frame_config1->urn_uuid_, observed_urn_uuid1.value());
+
+  EXPECT_EQ("Finish executing 'test-url-selection-operation'",
+            base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  TestSelectURLFencedFrameConfigObserver config_observer2(
+      GetStoragePartition());
+
+  std::string expected_error = base::StrCat(
+      {"a JavaScript error: \"Error: ", kSharedStorageWorkletExpiredMessage,
+       "\"\n"});
+
+  EvalJsResult result2 = EvalJs(shell(), R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )");
+
+  EXPECT_EQ(expected_error, result2.error);
+
+  EXPECT_FALSE(config_observer2.ConfigObserved());
+
+  WaitForHistograms({kTimingSelectUrlExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingSelectUrlExecutedInWorkletHistogram,
+                                     1);
+
+  std::string origin_str = url::Origin::Create(main_url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentSelectURL, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForSelectURL(
+            "test-url-selection-operation", std::vector<uint8_t>(),
+            std::vector<SharedStorageUrlSpecWithMetadata>(
+                {{https_server()->GetURL("a.test",
+                                         "/fenced_frames/title0.html"),
+                  {}}}))}});
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageBrowserTest,
+    SelectURL_SecondSelectURLAfterKeepAliveDefaultSelectURL_Failure) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
+                                        ResolveSelectURLToConfig())));
+
+  TestSelectURLFencedFrameConfigObserver config_observer1(
+      GetStoragePartition());
+
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  const char select_url_script[] = R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )";
+
+  EvalJsResult result1 = EvalJs(shell(), select_url_script);
+
+  EXPECT_TRUE(result1.error.empty());
+  const absl::optional<GURL>& observed_urn_uuid1 =
+      config_observer1.GetUrnUuid();
+  EXPECT_TRUE(observed_urn_uuid1.has_value());
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(observed_urn_uuid1.value()));
+
+  if (!ResolveSelectURLToConfig()) {
+    EXPECT_EQ(result1.ExtractString(), observed_urn_uuid1->spec());
+  }
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  ASSERT_TRUE(config_observer1.ConfigObserved());
+  const absl::optional<FencedFrameConfig>& fenced_frame_config1 =
+      config_observer1.GetConfig();
+  EXPECT_TRUE(fenced_frame_config1.has_value());
+  EXPECT_EQ(fenced_frame_config1->urn_uuid_, observed_urn_uuid1.value());
+
+  EXPECT_EQ("Finish executing 'test-url-selection-operation'",
+            base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  TestSelectURLFencedFrameConfigObserver config_observer2(
+      GetStoragePartition());
+
+  std::string expected_error = base::StrCat(
+      {"a JavaScript error: \"Error: ", kSharedStorageWorkletExpiredMessage,
+       "\"\n"});
+
+  EvalJsResult result2 = EvalJs(shell(), select_url_script);
+
+  EXPECT_EQ(expected_error, result2.error);
+
+  EXPECT_FALSE(config_observer2.ConfigObserved());
+
+  WaitForHistograms({kTimingSelectUrlExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingSelectUrlExecutedInWorkletHistogram,
+                                     1);
+
+  std::string origin_str = url::Origin::Create(main_url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentSelectURL, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForSelectURL(
+            "test-url-selection-operation", std::vector<uint8_t>(),
+            std::vector<SharedStorageUrlSpecWithMetadata>(
+                {{https_server()->GetURL("a.test",
+                                         "/fenced_frames/title0.html"),
+                  {}}}))}});
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest,
+                       SelectURL_SelectURLAfterKeepAliveFalseRun_Failure) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'},
+                             keepAlive: false});
+    )"));
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
+                                        ResolveSelectURLToConfig())));
+
+  TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+
+  std::string expected_error = base::StrCat(
+      {"a JavaScript error: \"Error: ", kSharedStorageWorkletExpiredMessage,
+       "\"\n"});
+
+  EvalJsResult result = EvalJs(shell(), R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )");
+
+  EXPECT_EQ(expected_error, result.error);
+
+  EXPECT_FALSE(config_observer.ConfigObserved());
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+  EXPECT_EQ(5u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+  EXPECT_EQ("Start executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[2].message));
+  EXPECT_EQ("{\"customKey\":\"customValue\"}",
+            base::UTF16ToUTF8(console_observer.messages()[3].message));
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[4].message));
+
+  WaitForHistograms({kTimingRunExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingRunExecutedInWorkletHistogram, 1);
+
+  std::string origin_str = url::Origin::Create(main_url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())}});
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest,
+                       SelectURL_SelectURLAfterKeepAliveTrueRun_Success) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'},
+                             keepAlive: true});
+    )"));
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  EXPECT_EQ(5u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+  EXPECT_EQ("Start executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[2].message));
+  EXPECT_EQ("{\"customKey\":\"customValue\"}",
+            base::UTF16ToUTF8(console_observer.messages()[3].message));
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[4].message));
+
+  EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
+                                        ResolveSelectURLToConfig())));
+
+  TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EvalJsResult result = EvalJs(shell(), R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )");
+
+  EXPECT_TRUE(result.error.empty());
+  const absl::optional<GURL>& observed_urn_uuid = config_observer.GetUrnUuid();
+  EXPECT_TRUE(observed_urn_uuid.has_value());
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(observed_urn_uuid.value()));
+
+  if (!ResolveSelectURLToConfig()) {
+    EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
+  }
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  ASSERT_TRUE(config_observer.ConfigObserved());
+  const absl::optional<FencedFrameConfig>& fenced_frame_config =
+      config_observer.GetConfig();
+  EXPECT_TRUE(fenced_frame_config.has_value());
+  EXPECT_EQ(fenced_frame_config->urn_uuid_, observed_urn_uuid.value());
+
+  EXPECT_EQ("Finish executing 'test-url-selection-operation'",
+            base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  WaitForHistograms({kTimingRunExecutedInWorkletHistogram,
+                     kTimingSelectUrlExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingRunExecutedInWorkletHistogram, 1);
+  histogram_tester_.ExpectTotalCount(kTimingSelectUrlExecutedInWorkletHistogram,
+                                     1);
+
+  std::string origin_str = url::Origin::Create(main_url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())},
+       {AccessType::kDocumentSelectURL, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForSelectURL(
+            "test-url-selection-operation", std::vector<uint8_t>(),
+            std::vector<SharedStorageUrlSpecWithMetadata>(
+                {{https_server()->GetURL("a.test",
+                                         "/fenced_frames/title0.html"),
+                  {}}}))}});
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest,
+                       SelectURL_SelectURLAfterKeepAliveDefaultRun_Failure) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'}});
+    )"));
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
+                                        ResolveSelectURLToConfig())));
+
+  TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+
+  std::string expected_error = base::StrCat(
+      {"a JavaScript error: \"Error: ", kSharedStorageWorkletExpiredMessage,
+       "\"\n"});
+
+  EvalJsResult result = EvalJs(shell(), R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )");
+
+  EXPECT_EQ(expected_error, result.error);
+
+  EXPECT_FALSE(config_observer.ConfigObserved());
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+  EXPECT_EQ(5u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+  EXPECT_EQ("Start executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[2].message));
+  EXPECT_EQ("{\"customKey\":\"customValue\"}",
+            base::UTF16ToUTF8(console_observer.messages()[3].message));
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[4].message));
+
+  WaitForHistograms({kTimingRunExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingRunExecutedInWorkletHistogram, 1);
+
+  std::string origin_str = url::Origin::Create(main_url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())}});
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest,
+                       RunOperation_RunAfterKeepAliveTrueSelectURL_Success) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(2u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+
+  EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
+                                        ResolveSelectURLToConfig())));
+
+  TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EvalJsResult result = EvalJs(shell(), R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: true
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )");
+
+  EXPECT_TRUE(result.error.empty());
+  const absl::optional<GURL>& observed_urn_uuid = config_observer.GetUrnUuid();
+  EXPECT_TRUE(observed_urn_uuid.has_value());
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(observed_urn_uuid.value()));
+
+  if (!ResolveSelectURLToConfig()) {
+    EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
+  }
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  ASSERT_TRUE(config_observer.ConfigObserved());
+  const absl::optional<FencedFrameConfig>& fenced_frame_config =
+      config_observer.GetConfig();
+  EXPECT_TRUE(fenced_frame_config.has_value());
+  EXPECT_EQ(fenced_frame_config->urn_uuid_, observed_urn_uuid.value());
+
+  EXPECT_EQ("Finish executing 'test-url-selection-operation'",
+            base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'}});
+    )"));
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  EXPECT_EQ("Finish executing 'test-operation'",
+            base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  WaitForHistograms({kTimingRunExecutedInWorkletHistogram,
+                     kTimingSelectUrlExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingRunExecutedInWorkletHistogram, 1);
+  histogram_tester_.ExpectTotalCount(kTimingSelectUrlExecutedInWorkletHistogram,
+                                     1);
+
+  std::string origin_str = url::Origin::Create(main_url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentSelectURL, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForSelectURL(
+            "test-url-selection-operation", std::vector<uint8_t>(),
+            std::vector<SharedStorageUrlSpecWithMetadata>(
+                {{https_server()->GetURL("a.test",
+                                         "/fenced_frames/title0.html"),
+                  {}}}))},
+       {AccessType::kDocumentRun, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForRun("test-operation",
+                                               std::vector<uint8_t>())}});
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest,
+                       RunOperation_RunAfterKeepAliveFalseSelectURL_Failure) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(2u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+
+  EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
+                                        ResolveSelectURLToConfig())));
+
+  TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EvalJsResult result1 = EvalJs(shell(), R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: false
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )");
+
+  EXPECT_TRUE(result1.error.empty());
+  const absl::optional<GURL>& observed_urn_uuid = config_observer.GetUrnUuid();
+  EXPECT_TRUE(observed_urn_uuid.has_value());
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(observed_urn_uuid.value()));
+
+  if (!ResolveSelectURLToConfig()) {
+    EXPECT_EQ(result1.ExtractString(), observed_urn_uuid->spec());
+  }
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  ASSERT_TRUE(config_observer.ConfigObserved());
+  const absl::optional<FencedFrameConfig>& fenced_frame_config =
+      config_observer.GetConfig();
+  EXPECT_TRUE(fenced_frame_config.has_value());
+  EXPECT_EQ(fenced_frame_config->urn_uuid_, observed_urn_uuid.value());
+
+  EXPECT_EQ("Finish executing 'test-url-selection-operation'",
+            base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  std::string expected_error = base::StrCat(
+      {"a JavaScript error: \"Error: ", kSharedStorageWorkletExpiredMessage,
+       "\"\n"});
+
+  EvalJsResult result2 = EvalJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'}});
+    )");
+  EXPECT_EQ(expected_error, result2.error);
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  WaitForHistograms({kTimingSelectUrlExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingSelectUrlExecutedInWorkletHistogram,
+                                     1);
+
+  std::string origin_str = url::Origin::Create(main_url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentSelectURL, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForSelectURL(
+            "test-url-selection-operation", std::vector<uint8_t>(),
+            std::vector<SharedStorageUrlSpecWithMetadata>(
+                {{https_server()->GetURL("a.test",
+                                         "/fenced_frames/title0.html"),
+                  {}}}))}});
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest,
+                       RunOperation_RunAfterKeepAliveDefaultSelectURL_Failure) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(2u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+
+  EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
+                                        ResolveSelectURLToConfig())));
+
+  TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EvalJsResult result1 = EvalJs(shell(), R"(
+      (async function() {
+        window.select_url_result = await sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [
+            {
+              url: "fenced_frames/title0.html"
+            }
+          ],
+          {
+            data: {'mockResult': 0},
+            resolveToConfig: resolveSelectURLToConfig
+          }
+        );
+        if (resolveSelectURLToConfig &&
+            !(select_url_result instanceof FencedFrameConfig)) {
+          throw new Error('selectURL() did not return a FencedFrameConfig.');
+        }
+        return window.select_url_result;
+      })()
+    )");
+
+  EXPECT_TRUE(result1.error.empty());
+  const absl::optional<GURL>& observed_urn_uuid = config_observer.GetUrnUuid();
+  EXPECT_TRUE(observed_urn_uuid.has_value());
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(observed_urn_uuid.value()));
+
+  if (!ResolveSelectURLToConfig()) {
+    EXPECT_EQ(result1.ExtractString(), observed_urn_uuid->spec());
+  }
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
+
+  ASSERT_TRUE(config_observer.ConfigObserved());
+  const absl::optional<FencedFrameConfig>& fenced_frame_config =
+      config_observer.GetConfig();
+  EXPECT_TRUE(fenced_frame_config.has_value());
+  EXPECT_EQ(fenced_frame_config->urn_uuid_, observed_urn_uuid.value());
+
+  EXPECT_EQ("Finish executing 'test-url-selection-operation'",
+            base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  std::string expected_error = base::StrCat(
+      {"a JavaScript error: \"Error: ", kSharedStorageWorkletExpiredMessage,
+       "\"\n"});
+
+  EvalJsResult result2 = EvalJs(shell(), R"(
+      sharedStorage.run(
+          'test-operation', {data: {'customKey': 'customValue'}});
+    )");
+  EXPECT_EQ(expected_error, result2.error);
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  WaitForHistograms({kTimingSelectUrlExecutedInWorkletHistogram});
+  histogram_tester_.ExpectTotalCount(kTimingSelectUrlExecutedInWorkletHistogram,
+                                     1);
+
+  std::string origin_str = url::Origin::Create(main_url).Serialize();
+  ExpectAccessObserved(
+      {{AccessType::kDocumentAddModule, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForAddModule(https_server()->GetURL(
+            "a.test", "/shared_storage/simple_module.js"))},
+       {AccessType::kDocumentSelectURL, MainFrameId(), origin_str,
+        SharedStorageEventParams::CreateForSelectURL(
+            "test-url-selection-operation", std::vector<uint8_t>(),
+            std::vector<SharedStorageUrlSpecWithMetadata>(
+                {{https_server()->GetURL("a.test",
+                                         "/fenced_frames/title0.html"),
+                  {}}}))}});
+}
+
 IN_PROC_BROWSER_TEST_P(SharedStorageBrowserTest,
                        SelectURL_ReportingMetadata_EmptyReportEvent) {
   GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
@@ -2108,10 +3777,16 @@
   EXPECT_TRUE(ExecJs(shell(), R"(
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
+
   EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
                                         ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(shell(), R"(
       (async function() {
         window.select_url_result = await sharedStorage.selectURL(
@@ -2146,10 +3821,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   ASSERT_TRUE(config_observer.ConfigObserved());
   const absl::optional<FencedFrameConfig>& fenced_frame_config =
@@ -2593,26 +4267,35 @@
   EXPECT_TRUE(ExecJs(
       shell(), JsReplace("sharedStorage.worklet.addModule($1)", script_url)));
 
-  EXPECT_TRUE(ExecJs(shell(), R"(
-        sharedStorage.run('get-operation', {data: {'key': 'key0'}});
-      )"));
-
-  // There are 2 "worklet operations": `addModule()` and `run()`.
+  // There is 1 more "worklet operation": `run()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->SetExpectedWorkletResponsesCount(1);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+        sharedStorage.run('get-operation', {data: {'key': 'key0'},
+                                            keepAlive: true});
+      )"));
+
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponses();
 
   // Advance clock so that key will expire.
   clock.Advance(base::Days(kStalenessThresholdDays) + base::Seconds(1));
 
+  // There is 1 more "worklet operation": `run()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EXPECT_TRUE(ExecJs(shell(), R"(
         sharedStorage.run('get-operation', {data: {'key': 'key0'}});
       )"));
 
-  // There is one "worklet operation": `run()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
+      ->WaitForWorkletResponses();
 
   EXPECT_EQ(4u, console_observer.messages().size());
   EXPECT_EQ("sharedStorage.length(): 1",
@@ -3074,6 +4757,7 @@
 
   EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
   EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
   EXPECT_EQ(2u, console_observer.messages().size());
   EXPECT_EQ("Start executing simple_module.js",
             base::UTF16ToUTF8(console_observer.messages()[0].message));
@@ -3084,6 +4768,11 @@
                                         ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(shell(), R"(
       (async function() {
         window.select_url_result = await sharedStorage.selectURL(
@@ -3124,10 +4813,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   ASSERT_TRUE(config_observer.ConfigObserved());
   const absl::optional<FencedFrameConfig>& fenced_frame_config =
@@ -3215,6 +4903,11 @@
                                         ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(shell(), R"(
       (async function() {
         window.select_url_result = await sharedStorage.selectURL(
@@ -3255,10 +4948,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   FrameTreeNode* root = PrimaryFrameTreeNodeRoot();
 
@@ -3411,6 +5103,11 @@
                                        ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(iframe, R"(
       (async function() {
         const urls = generateUrls(8);
@@ -3457,10 +5154,9 @@
   EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
   EXPECT_EQ(1u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
 
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
   test_worklet_host_manager()
       .GetKeepAliveWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   EXPECT_TRUE(ExecJs(root,
                      "var f = document.createElement('fencedframe');"
@@ -3560,6 +5256,11 @@
                                         ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(shell(), R"(
       (async function() {
         window.select_url_result = await sharedStorage.selectURL(
@@ -3601,10 +5302,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   ASSERT_TRUE(config_observer.ConfigObserved());
   const absl::optional<FencedFrameConfig>& fenced_frame_config =
@@ -3674,6 +5374,11 @@
                                         ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(shell(), R"(
       (async function() {
         window.select_url_result = await sharedStorage.selectURL(
@@ -3715,10 +5420,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   ASSERT_TRUE(config_observer.ConfigObserved());
   const absl::optional<FencedFrameConfig>& fenced_frame_config =
@@ -4207,6 +5911,11 @@
   EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
                                         ResolveSelectURLToConfig())));
 
+  // There are 2 more "worklet operations": both `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(2);
+
   TestSelectURLFencedFrameConfigObserver config_observer_1(
       GetStoragePartition());
   EvalJsResult result_1 = EvalJs(shell(), R"(
@@ -4216,7 +5925,8 @@
           urls,
           {
             data: {'mockResult': 1},
-            resolveToConfig: resolveSelectURLToConfig
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: true
           }
         );
         if (resolveSelectURLToConfig &&
@@ -4246,7 +5956,8 @@
           urls,
           {
             data: {'mockResult': 1},
-            resolveToConfig: resolveSelectURLToConfig
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: true
           }
         );
         if (resolveSelectURLToConfig &&
@@ -4267,11 +5978,9 @@
     EXPECT_EQ(result_2.ExtractString(), observed_urn_uuid_2->spec());
   }
 
-  // There are three "worklet operations": one `addModule()` and two
-  // `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(3);
+      ->WaitForWorkletResponses();
 
   ASSERT_TRUE(config_observer_1.ConfigObserved());
   const absl::optional<FencedFrameConfig>& fenced_frame_config_1 =
@@ -4384,6 +6093,12 @@
 
   TestSelectURLFencedFrameConfigObserver config_observer_1(
       GetStoragePartition());
+
+  // There are 2 more "worklet operations": both `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(2);
+
   EvalJsResult result_1 = EvalJs(shell(), R"(
       (async function() {
         window.select_url_result_1 = await sharedStorage.selectURL(
@@ -4391,7 +6106,8 @@
           urls,
           {
             data: {'mockResult': 1},
-            resolveToConfig: resolveSelectURLToConfig
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: true
           }
         );
         if (resolveSelectURLToConfig &&
@@ -4452,10 +6168,9 @@
     EXPECT_EQ(result_2.ExtractString(), observed_urn_uuid_2->spec());
   }
 
-  // Wait for the `addModule()` and two `selectURL()` to finish.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(3);
+      ->WaitForWorkletResponses();
 
   ASSERT_TRUE(config_observer_1.ConfigObserved());
   const absl::optional<FencedFrameConfig>& fenced_frame_config_1 =
@@ -4510,6 +6225,13 @@
 
   EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
                                         ResolveSelectURLToConfig())));
+  EXPECT_TRUE(ExecJs(shell(), "window.keepWorklet = true;"));
+
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   std::string select_url_script = R"(
       sharedStorage.selectURL(
         'test-url-selection-operation',
@@ -4520,16 +6242,16 @@
         ],
         {
           data: {'mockResult': 0},
-          resolveToConfig: resolveSelectURLToConfig
+          resolveToConfig: resolveSelectURLToConfig,
+          keepAlive: keepWorklet
         }
       );
     )";
   EXPECT_TRUE(ExecJs(shell(), select_url_script));
 
-  // Wait for the `addModule()` and `selectURL()` to finish.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   FencedFrameURLMapping& fenced_frame_url_mapping =
       root->current_frame_host()->GetPage().fenced_frame_urls_map();
@@ -4540,6 +6262,9 @@
   GURL url("https://a.test");
   fenced_frame_url_mapping_test_peer.FillMap(url);
 
+  // No need to keep the worklet after the next select operation.
+  EXPECT_TRUE(ExecJs(shell(), "window.keepWorklet = false;"));
+
   EvalJsResult extra_result = EvalJs(shell(), select_url_script);
 
   // `selectURL()` fails when map is full.
@@ -4649,10 +6374,16 @@
   EXPECT_TRUE(ExecJs(shell(), R"(
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
+
   EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
                                         ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is 1 more "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(shell(), R"(
       (async function() {
         window.select_url_result = await sharedStorage.selectURL(
@@ -4691,11 +6422,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There are three "worklet operations": one `addModule()` and two
-  // `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
+      ->WaitForWorkletResponses();
 
   FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(
       ResolveSelectURLToConfig()
@@ -5092,11 +6821,6 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-    // There is 1 "worklet operation": `addModule()`.
-    test_worklet_host_manager()
-        .GetAttachedWorkletHostForFrame(iframe_node->current_frame_host())
-        ->WaitForWorkletResponsesCount(1);
-
     std::pair<GURL, double> result_pair =
         RunSelectURLExtractingMappedURLAndBudgetToCharge(iframe_node, host_str,
                                                          num_urls);
@@ -5120,6 +6844,11 @@
     TestSelectURLFencedFrameConfigObserver config_observer(
         GetStoragePartition());
 
+    // There is 1 "worklet operation": `selectURL()`.
+    test_worklet_host_manager()
+        .GetAttachedWorkletHostForFrame(execution_target.render_frame_host())
+        ->SetExpectedWorkletResponsesCount(1);
+
     EvalJsResult result = RunSelectURLScript(execution_target, num_urls);
 
     EXPECT_TRUE(result.error.empty()) << result.error;
@@ -5132,10 +6861,9 @@
       EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
     }
 
-    // There is 1 "worklet operation": `selectURL()`.
     test_worklet_host_manager()
         .GetAttachedWorkletHostForFrame(execution_target.render_frame_host())
-        ->WaitForWorkletResponsesCount(1);
+        ->WaitForWorkletResponses();
 
     const absl::optional<FencedFrameConfig>& config =
         config_observer.GetConfig();
@@ -5153,13 +6881,17 @@
 
  private:
   EvalJsResult RunSelectURLScript(const ToRenderFrameHost& execution_target,
-                                  int num_urls) {
+                                  int num_urls,
+                                  bool keep_alive_after_operation = true) {
     EXPECT_TRUE(ExecJs(execution_target, kGenerateURLsListScript));
     EXPECT_TRUE(
         ExecJs(execution_target, JsReplace("window.numUrls = $1;", num_urls)));
     EXPECT_TRUE(ExecJs(execution_target,
                        JsReplace("window.resolveSelectURLToConfig = $1;",
                                  ResolveSelectURLToConfig())));
+    EXPECT_TRUE(ExecJs(
+        execution_target,
+        JsReplace("window.keepWorklet = $1;", keep_alive_after_operation)));
 
     EvalJsResult result = EvalJs(execution_target, R"(
       (async function() {
@@ -5169,7 +6901,8 @@
           urls,
           {
             data: {'mockResult': numUrls - 1},
-            resolveToConfig: resolveSelectURLToConfig
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: keepWorklet
           }
         );
         if (resolveSelectURLToConfig &&
@@ -5210,11 +6943,6 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-  // There is 1 "worklet operation": `addModule()`.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
-
   // This test relies on the assumption that `kSelectURLOverallBitBudget` is set
   // to be greater than or equal to `kSelectURLOriginBitBudget`.
   EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLOriginBitBudget);
@@ -5267,11 +6995,6 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-  // There is 1 "worklet operation": `addModule()`.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
-
   // This test relies on the assumptions that `kSelectURLOverallBitBudget` is
   // set to be greater than or equal to `kSelectURLOriginBitBudget` and that the
   // latter is at least 3.
@@ -5354,11 +7077,6 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-    // There is 1 "worklet operation": `addModule()`.
-    test_worklet_host_manager()
-        .GetAttachedWorkletHostForFrame(iframe_node->current_frame_host())
-        ->WaitForWorkletResponsesCount(1);
-
     // The limit for `selectURL()` has now been reached for "b.test". Make one
     // more call, which will return the default URL due to insufficient origin
     // pageload budget.
@@ -5430,11 +7148,6 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-    // There is 1 "worklet operation": `addModule()`.
-    test_worklet_host_manager()
-        .GetAttachedWorkletHostForFrame(last_iframe_node->current_frame_host())
-        ->WaitForWorkletResponsesCount(1);
-
     // The limit for `selectURL()` has now been reached for "b.test". Make one
     // more call, which will return the default URL due to insufficient origin
     // pageload budget.
@@ -5498,12 +7211,6 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-    // There is 1 "worklet operation": `addModule()`.
-    test_worklet_host_manager()
-        .GetAttachedWorkletHostForFrame(
-            penultimate_iframe_node->current_frame_host())
-        ->WaitForWorkletResponsesCount(1);
-
     // The limit for `selectURL()` has now been reached for "b.test". Make one
     // more call, which will return the default URL due to insufficient origin
     // pageload budget.
@@ -5594,12 +7301,6 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-      // There is 1 "worklet operation": `addModule()`.
-      test_worklet_host_manager()
-          .GetAttachedWorkletHostForFrame(
-              last_loop_iframe_node->current_frame_host())
-          ->WaitForWorkletResponsesCount(1);
-
       // The limit for `selectURL()` has now been reached for `iframe_host`.
       // Make one more call, which will return the default URL due to
       // insufficient origin pageload budget.
@@ -5648,11 +7349,6 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-    // There is 1 "worklet operation": `addModule()`.
-    test_worklet_host_manager()
-        .GetAttachedWorkletHostForFrame(final_iframe_node->current_frame_host())
-        ->WaitForWorkletResponsesCount(1);
-
     // The overall pageload limit for `selectURL()` has now been reached. Make
     // one more call, which will return the default URL due to insufficient
     // overall pageload budget.
@@ -5793,15 +7489,16 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-  // There is one "worklet operation": `addModule()`.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
-
   EXPECT_TRUE(ExecJs(shell(), kGenerateURLsListScript));
   EXPECT_TRUE(ExecJs(shell(), "window.urls = generateUrls(8);"));
   EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
                                         ResolveSelectURLToConfig())));
+
+  // There are `call_limit + 1` "worklet operations": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(call_limit + 1);
+
   std::vector<GURL> urns;
   for (size_t i = 0; i <= call_limit; ++i) {
     TestSelectURLFencedFrameConfigObserver config_observer(
@@ -5813,7 +7510,8 @@
           urls,
           {
             data: {'mockResult': 1},
-            resolveToConfig: resolveSelectURLToConfig
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: true
           }
         );
         if (resolveSelectURLToConfig &&
@@ -5837,10 +7535,9 @@
     urns.push_back(observed_urn_uuid.value());
   }
 
-  // There are `call_limit + 1` "worklet operations": `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(call_limit + 1);
+      ->WaitForWorkletResponses();
 
   for (size_t i = 0; i < call_limit; ++i) {
     FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(urns[i]);
@@ -5912,11 +7609,6 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-  // There is one "worklet operation": `addModule()`.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
-
   std::vector<GURL> urns;
   EXPECT_TRUE(ExecJs(shell(), kGenerateURLsListScript));
   EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
@@ -5932,7 +7624,8 @@
           urls_8,
           {
             data: {'mockResult': 1},
-            resolveToConfig: resolveSelectURLToConfig
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: true
           }
         );
         if (resolveSelectURLToConfig &&
@@ -5957,6 +7650,11 @@
   urns.push_back(observed_urn_uuid_from_8urls.value());
   EXPECT_TRUE(ExecJs(shell(), "window.urls_4 = generateUrls(4);"));
 
+  // There are `input4_call_limit + 2` "worklet operations": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(input4_call_limit + 2);
+
   for (size_t i = 0; i <= input4_call_limit; ++i) {
     TestSelectURLFencedFrameConfigObserver select_from_4urls_config_observer(
         GetStoragePartition());
@@ -5967,7 +7665,8 @@
           urls_4,
           {
             data: {'mockResult': 1},
-            resolveToConfig: resolveSelectURLToConfig
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: true
           }
         );
         if (resolveSelectURLToConfig &&
@@ -5995,7 +7694,7 @@
   // There are `input4_call_limit + 2` "worklet operations": `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(input4_call_limit + 2);
+      ->WaitForWorkletResponses();
 
   // The first pair of `reportEvent()` calls will deduct 3 bits from the
   // budget.
@@ -6071,16 +7770,16 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-  // There is one "worklet operation": `addModule()`.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
-
   EXPECT_TRUE(ExecJs(shell(), kGenerateURLsListScript));
   EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
                                         ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is one "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(shell(), R"(
       (async function() {
         const urls = generateUrls(8);
@@ -6089,7 +7788,8 @@
           urls,
           {
             data: {'mockResult': 1},
-            resolveToConfig: resolveSelectURLToConfig
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: true
           }
         );
         if (resolveSelectURLToConfig &&
@@ -6109,10 +7809,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There is one "worklet operation": `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
+      ->WaitForWorkletResponses();
 
   FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(
       ResolveSelectURLToConfig()
@@ -6157,16 +7856,16 @@
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
 
-  // There is one "worklet operation": `addModule()`.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
-
   EXPECT_TRUE(ExecJs(shell(), kGenerateURLsListScript));
   EXPECT_TRUE(ExecJs(shell(), JsReplace("window.resolveSelectURLToConfig = $1;",
                                         ResolveSelectURLToConfig())));
 
   TestSelectURLFencedFrameConfigObserver config_observer(GetStoragePartition());
+  // There is one "worklet operation": `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->SetExpectedWorkletResponsesCount(1);
+
   EvalJsResult result = EvalJs(shell(), R"(
       (async function() {
         const urls = generateUrls(8);
@@ -6175,7 +7874,8 @@
           urls,
           {
             data: {'mockResult': 1},
-            resolveToConfig: resolveSelectURLToConfig
+            resolveToConfig: resolveSelectURLToConfig,
+            keepAlive: true
           }
         );
         if (resolveSelectURLToConfig &&
@@ -6195,10 +7895,9 @@
     EXPECT_EQ(result.ExtractString(), observed_urn_uuid->spec());
   }
 
-  // There is one "worklet operation": `selectURL()`.
   test_worklet_host_manager()
       .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(1);
+      ->WaitForWorkletResponses();
 
   FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(
       ResolveSelectURLToConfig()
@@ -6308,7 +8007,10 @@
 
   ~SharedStorageContextBrowserTest() override = default;
 
-  void GenerateFencedFrameConfig(std::string hostname) {
+  void GenerateFencedFrameConfig(std::string hostname,
+                                 bool keep_alive_after_operation = true) {
+    EXPECT_TRUE(ExecJs(shell(), JsReplace("window.keepWorklet = $1;",
+                                          keep_alive_after_operation)));
     EXPECT_TRUE(ExecJs(shell(), R"(
       sharedStorage.worklet.addModule('shared_storage/simple_module.js');
     )"));
@@ -6316,6 +8018,12 @@
     TestSelectURLFencedFrameConfigObserver config_observer(
         GetStoragePartition());
     GURL fenced_frame_url = https_server()->GetURL(hostname, kFencedFramePath);
+
+    // There is 1 more "worklet operation": `selectURL()`.
+    test_worklet_host_manager()
+        .GetAttachedWorkletHost()
+        ->SetExpectedWorkletResponsesCount(1);
+
     EvalJsResult result = EvalJs(shell(), JsReplace(R"(
       (async function() {
         window.fencedFrameConfig = await sharedStorage.selectURL(
@@ -6327,7 +8035,8 @@
           ],
           {
             data: {'mockResult': 0},
-            resolveToConfig: true
+            resolveToConfig: true,
+            keepAlive: keepWorklet
           }
         );
         if (!(fencedFrameConfig instanceof FencedFrameConfig)) {
@@ -6344,10 +8053,9 @@
     EXPECT_TRUE(observed_urn_uuid.has_value());
     EXPECT_TRUE(blink::IsValidUrnUuidURL(observed_urn_uuid.value()));
 
-    // There are 2 "worklet operations": `addModule()` and `selectURL()`.
     test_worklet_host_manager()
         .GetAttachedWorkletHost()
-        ->WaitForWorkletResponsesCount(2);
+        ->WaitForWorkletResponses();
 
     ASSERT_TRUE(config_observer.ConfigObserved());
     const absl::optional<FencedFrameConfig>& fenced_frame_config =
diff --git a/content/browser/shared_storage/shared_storage_document_service_impl.cc b/content/browser/shared_storage/shared_storage_document_service_impl.cc
index 8e03727c..41e05c6e 100644
--- a/content/browser/shared_storage/shared_storage_document_service_impl.cc
+++ b/content/browser/shared_storage/shared_storage_document_service_impl.cc
@@ -49,6 +49,10 @@
 const char kSharedStorageSelectURLLimitReachedMessage[] =
     "sharedStorage.selectURL limit has been reached";
 
+const char kSharedStorageWorkletExpiredMessage[] =
+    "The sharedStorage worklet cannot execute further operations because the "
+    "previous operation did not include the option \'keepAlive: true\'.";
+
 // static
 bool& SharedStorageDocumentServiceImpl::
     GetBypassIsSharedStorageAllowedForTesting() {
@@ -88,6 +92,13 @@
     return;
   }
 
+  if (!keep_alive_worklet_after_operation_) {
+    std::move(callback).Run(
+        /*success=*/false,
+        /*error_message=*/kSharedStorageWorkletExpiredMessage);
+    return;
+  }
+
   GetSharedStorageWorkletHostManager()->NotifySharedStorageAccessed(
       AccessType::kDocumentAddModule, main_frame_id(),
       SerializeLastCommittedOrigin(),
@@ -109,6 +120,7 @@
 void SharedStorageDocumentServiceImpl::RunOperationOnWorklet(
     const std::string& name,
     const std::vector<uint8_t>& serialized_data,
+    bool keep_alive_after_operation,
     RunOperationOnWorkletCallback callback) {
   if (!IsSharedStorageAllowed()) {
     std::move(callback).Run(/*success=*/false,
@@ -116,11 +128,21 @@
     return;
   }
 
+  if (!keep_alive_worklet_after_operation_) {
+    std::move(callback).Run(
+        /*success=*/false,
+        /*error_message=*/kSharedStorageWorkletExpiredMessage);
+    return;
+  }
+
+  keep_alive_worklet_after_operation_ = keep_alive_after_operation;
+
   GetSharedStorageWorkletHostManager()->NotifySharedStorageAccessed(
       AccessType::kDocumentRun, main_frame_id(), SerializeLastCommittedOrigin(),
       SharedStorageEventParams::CreateForRun(name, serialized_data));
 
-  GetSharedStorageWorkletHost()->RunOperationOnWorklet(name, serialized_data);
+  GetSharedStorageWorkletHost()->RunOperationOnWorklet(
+      name, serialized_data, keep_alive_after_operation);
   std::move(callback).Run(/*success=*/true, /*error_message=*/{});
 }
 
@@ -129,6 +151,7 @@
     std::vector<blink::mojom::SharedStorageUrlWithMetadataPtr>
         urls_with_metadata,
     const std::vector<uint8_t>& serialized_data,
+    bool keep_alive_after_operation,
     RunURLSelectionOperationOnWorkletCallback callback) {
   if (!blink::IsValidSharedStorageURLsArrayLength(urls_with_metadata.size())) {
     // This could indicate a compromised renderer, so let's terminate it.
@@ -184,6 +207,16 @@
     return;
   }
 
+  if (!keep_alive_worklet_after_operation_) {
+    std::move(callback).Run(
+        /*success=*/false,
+        /*error_message=*/kSharedStorageWorkletExpiredMessage,
+        /*result_config=*/absl::nullopt);
+    return;
+  }
+
+  keep_alive_worklet_after_operation_ = keep_alive_after_operation;
+
   size_t shared_storage_fenced_frame_root_count = 0u;
   size_t fenced_frame_depth =
       static_cast<RenderFrameHostImpl&>(render_frame_host())
@@ -229,7 +262,7 @@
 
   GetSharedStorageWorkletHost()->RunURLSelectionOperationOnWorklet(
       name, std::move(urls_with_metadata), serialized_data,
-      std::move(callback));
+      keep_alive_after_operation, std::move(callback));
 }
 
 void SharedStorageDocumentServiceImpl::SharedStorageSet(
diff --git a/content/browser/shared_storage/shared_storage_document_service_impl.h b/content/browser/shared_storage/shared_storage_document_service_impl.h
index 43baa74..b30b94d 100644
--- a/content/browser/shared_storage/shared_storage_document_service_impl.h
+++ b/content/browser/shared_storage/shared_storage_document_service_impl.h
@@ -26,6 +26,7 @@
 extern CONTENT_EXPORT const char kSharedStorageSelectURLDisabledMessage[];
 extern CONTENT_EXPORT const char kSharedStorageAddModuleDisabledMessage[];
 extern CONTENT_EXPORT const char kSharedStorageSelectURLLimitReachedMessage[];
+extern CONTENT_EXPORT const char kSharedStorageWorkletExpiredMessage[];
 
 // Handle renderer-initiated shared storage access and worklet operations. The
 // worklet operations (i.e. `addModule()`, `selectURL()`, `run()`) will be
@@ -55,12 +56,14 @@
                           AddModuleOnWorkletCallback callback) override;
   void RunOperationOnWorklet(const std::string& name,
                              const std::vector<uint8_t>& serialized_data,
+                             bool keep_alive_after_operation,
                              RunOperationOnWorkletCallback callback) override;
   void RunURLSelectionOperationOnWorklet(
       const std::string& name,
       std::vector<blink::mojom::SharedStorageUrlWithMetadataPtr>
           urls_with_metadata,
       const std::vector<uint8_t>& serialized_data,
+      bool keep_alive_after_operation,
       RunURLSelectionOperationOnWorkletCallback callback) override;
   void SharedStorageSet(const std::u16string& key,
                         const std::u16string& value,
@@ -107,6 +110,16 @@
   // to DevTools.
   const std::string main_frame_id_;
 
+  // Whether or not the worklet should be kept alive after the current worklet
+  // operation (i.e. `addModule()`, `run()`, or `selectURL()`). If
+  // `keep_alive_worklet_after_operation_` is false and a subsequent call to one
+  // of these operations is placed, then that new call will fail. Otherwise,
+  // when `keep_alive_worklet_after_operation_` is true, a subsequent call to
+  // `run()` or `selectURL()` will be permitted but the value of
+  // `keep_alive_worklet_after_operation_` will update to the value of the
+  // call's parameter `keep_alive_worklet_after_operation` for any future call.
+  bool keep_alive_worklet_after_operation_ = true;
+
   DOCUMENT_USER_DATA_KEY_DECL();
 
   base::WeakPtrFactory<SharedStorageDocumentServiceImpl> weak_ptr_factory_{
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.cc b/content/browser/shared_storage/shared_storage_worklet_host.cc
index b3520af..ff7b2aa 100644
--- a/content/browser/shared_storage/shared_storage_worklet_host.cc
+++ b/content/browser/shared_storage/shared_storage_worklet_host.cc
@@ -196,13 +196,17 @@
 
 void SharedStorageWorkletHost::RunOperationOnWorklet(
     const std::string& name,
-    const std::vector<uint8_t>& serialized_data) {
+    const std::vector<uint8_t>& serialized_data,
+    bool keep_alive_after_operation) {
   // This function is invoked from `document_service_`. Thus both `page_` and
   // `document_service_` should be valid.
   DCHECK(page_);
   DCHECK(document_service_);
   IncrementPendingOperationsCount();
 
+  DCHECK(keep_alive_after_operation_);
+  keep_alive_after_operation_ = keep_alive_after_operation;
+
   if (add_module_state_ != AddModuleState::kInitiated) {
     OnRunOperationOnWorkletFinished(
         base::TimeTicks::Now(),
@@ -224,6 +228,7 @@
     std::vector<blink::mojom::SharedStorageUrlWithMetadataPtr>
         urls_with_metadata,
     const std::vector<uint8_t>& serialized_data,
+    bool keep_alive_after_operation,
     blink::mojom::SharedStorageDocumentService::
         RunURLSelectionOperationOnWorkletCallback callback) {
   if (add_module_state_ != AddModuleState::kInitiated) {
@@ -257,6 +262,9 @@
   GURL urn_uuid = pending_urn_uuid.value();
   IncrementPendingOperationsCount();
 
+  DCHECK(keep_alive_after_operation_);
+  keep_alive_after_operation_ = keep_alive_after_operation;
+
   std::vector<GURL> urls;
   for (const auto& url_with_metadata : urls_with_metadata)
     urls.emplace_back(url_with_metadata->url);
@@ -796,6 +804,18 @@
   DecrementPendingOperationsCount();
 }
 
+void SharedStorageWorkletHost::ExpireWorklet() {
+  // `this` is not in keep-alive.
+  DCHECK(document_service_);
+  DCHECK(shared_storage_worklet_host_manager_);
+
+  // This will remove this worklet host from the manager.
+  shared_storage_worklet_host_manager_->ExpireWorkletHostForDocumentService(
+      document_service_.get());
+
+  // Do not add code after this. SharedStorageWorkletHost has been destroyed.
+}
+
 bool SharedStorageWorkletHost::IsInKeepAlivePhase() const {
   return !!keep_alive_finished_callback_;
 }
@@ -836,10 +856,18 @@
   // and completed.
   last_operation_finished_time_ = base::TimeTicks::Now();
 
-  if (!IsInKeepAlivePhase())
+  if (!IsInKeepAlivePhase() && keep_alive_after_operation_) {
     return;
+  }
 
-  FinishKeepAlive(/*timeout_reached=*/false);
+  if (IsInKeepAlivePhase()) {
+    FinishKeepAlive(/*timeout_reached=*/false);
+    return;
+  }
+
+  ExpireWorklet();
+
+  // Do not add code after here. The worklet will be closed.
 }
 
 base::TimeDelta SharedStorageWorkletHost::GetKeepAliveTimeout() const {
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.h b/content/browser/shared_storage/shared_storage_worklet_host.h
index b17406f..e46a5b7 100644
--- a/content/browser/shared_storage/shared_storage_worklet_host.h
+++ b/content/browser/shared_storage/shared_storage_worklet_host.h
@@ -47,17 +47,16 @@
  public:
   using BudgetResult = storage::SharedStorageManager::BudgetResult;
 
+  using KeepAliveFinishedCallback =
+      base::OnceCallback<void(SharedStorageWorkletHost*)>;
+
   enum class AddModuleState {
     kNotInitiated,
     kInitiated,
   };
 
-  using KeepAliveFinishedCallback =
-      base::OnceCallback<void(SharedStorageWorkletHost*)>;
-
-  explicit SharedStorageWorkletHost(
-      std::unique_ptr<SharedStorageWorkletDriver> driver,
-      SharedStorageDocumentServiceImpl& document_service);
+  SharedStorageWorkletHost(std::unique_ptr<SharedStorageWorkletDriver> driver,
+                           SharedStorageDocumentServiceImpl& document_service);
   ~SharedStorageWorkletHost() override;
 
   void AddModuleOnWorklet(
@@ -68,12 +67,14 @@
       blink::mojom::SharedStorageDocumentService::AddModuleOnWorkletCallback
           callback);
   void RunOperationOnWorklet(const std::string& name,
-                             const std::vector<uint8_t>& serialized_data);
+                             const std::vector<uint8_t>& serialized_data,
+                             bool keep_alive_after_operation);
   void RunURLSelectionOperationOnWorklet(
       const std::string& name,
       std::vector<blink::mojom::SharedStorageUrlWithMetadataPtr>
           urls_with_metadata,
       const std::vector<uint8_t>& serialized_data,
+      bool keep_alive_after_operation,
       blink::mojom::SharedStorageDocumentService::
           RunURLSelectionOperationOnWorkletCallback callback);
 
@@ -136,6 +137,16 @@
       uint32_t index,
       BudgetResult budget_result);
 
+  // Called if `keep_alive_after_operation_` is false, `IsInKeepAlivePhase()` is
+  // false, and `pending_operations_count_` decrements back to 0u. Runs
+  // `on_no_retention_operations_finished_callback_` to close the worklet.
+  virtual void ExpireWorklet();
+
+  // Returns whether the the worklet has entered keep-alive phase. During
+  // keep-alive: the attempt to log console messages will be ignored; and the
+  // completion of the last pending operation will terminate the worklet.
+  bool IsInKeepAlivePhase() const;
+
   base::OneShotTimer& GetKeepAliveTimerForTesting() {
     return keep_alive_timer_;
   }
@@ -148,11 +159,6 @@
       const std::string& error_message,
       uint32_t index);
 
-  // Returns whether the the worklet has entered keep-alive phase. During
-  // keep-alive: the attempt to log console messages will be ignored; and the
-  // completion of the last pending operation will terminate the worklet.
-  bool IsInKeepAlivePhase() const;
-
   // Run `keep_alive_finished_callback_` to destroy `this`. Called when the last
   // pending operation has finished, or when a timeout is reached after entering
   // the keep-alive phase. `timeout_reached` indicates whether or not the
@@ -236,6 +242,12 @@
   // `selectURL()`, or `run()`.
   uint32_t pending_operations_count_ = 0u;
 
+  // Whether or not the lifetime of the worklet should be extended beyond when
+  // the `pending_operations_count_` returns to 0u. If false, the worklet will
+  // be closed as soon as the count next reaches 0U after being positive. This
+  // bool is updated with each call to `run()` or `selectURL()`.
+  bool keep_alive_after_operation_ = true;
+
   // Timer for starting and ending the keep-alive phase.
   base::OneShotTimer keep_alive_timer_;
 
diff --git a/content/browser/shared_storage/shared_storage_worklet_host_manager.cc b/content/browser/shared_storage/shared_storage_worklet_host_manager.cc
index 4ef52e47..28f9468 100644
--- a/content/browser/shared_storage/shared_storage_worklet_host_manager.cc
+++ b/content/browser/shared_storage/shared_storage_worklet_host_manager.cc
@@ -41,6 +41,11 @@
       base::Unretained(this)));
 }
 
+void SharedStorageWorkletHostManager::ExpireWorkletHostForDocumentService(
+    SharedStorageDocumentServiceImpl* document_service) {
+  attached_shared_storage_worklet_hosts_.erase(document_service);
+}
+
 SharedStorageWorkletHost*
 SharedStorageWorkletHostManager::GetOrCreateSharedStorageWorkletHost(
     SharedStorageDocumentServiceImpl* document_service) {
diff --git a/content/browser/shared_storage/shared_storage_worklet_host_manager.h b/content/browser/shared_storage/shared_storage_worklet_host_manager.h
index 032ba05..e4b0999 100644
--- a/content/browser/shared_storage/shared_storage_worklet_host_manager.h
+++ b/content/browser/shared_storage/shared_storage_worklet_host_manager.h
@@ -66,6 +66,9 @@
   void OnDocumentServiceDestroyed(
       SharedStorageDocumentServiceImpl* document_service);
 
+  void ExpireWorkletHostForDocumentService(
+      SharedStorageDocumentServiceImpl* document_service);
+
   SharedStorageWorkletHost* GetOrCreateSharedStorageWorkletHost(
       SharedStorageDocumentServiceImpl* document_service);
 
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index c3483ee..000c5a2 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -1124,6 +1124,60 @@
   raw_ptr<StoragePartitionImpl> storage_partition_;
 };
 
+class StoragePartitionImpl::ServiceWorkerTrustTokenAccessObserver
+    : public network::mojom::TrustTokenAccessObserver {
+ public:
+  explicit ServiceWorkerTrustTokenAccessObserver(
+      StoragePartitionImpl* storage_partition)
+      : storage_partition_(storage_partition) {}
+
+ private:
+  void Clone(mojo::PendingReceiver<network::mojom::TrustTokenAccessObserver>
+                 observer) override {
+    storage_partition_->service_worker_trust_token_observers_.Add(
+        std::make_unique<ServiceWorkerTrustTokenAccessObserver>(
+            storage_partition_),
+        std::move(observer));
+  }
+
+  void OnTrustTokensAccessed(
+      network::mojom::TrustTokenAccessDetailsPtr details) override {
+    DCHECK_CURRENTLY_ON(BrowserThread::UI);
+    scoped_refptr<ServiceWorkerContextWrapper> service_worker_context =
+        storage_partition_->GetServiceWorkerContext();
+
+    url::Origin origin;
+    switch (details->which()) {
+      case network::mojom::TrustTokenAccessDetails::Tag::kIssuance:
+        origin = details->get_issuance()->origin;
+        break;
+      case network::mojom::TrustTokenAccessDetails::Tag::kRedemption:
+        origin = details->get_redemption()->origin;
+        break;
+      case network::mojom::TrustTokenAccessDetails::Tag::kSigning:
+        origin = details->get_signing()->origin;
+        break;
+    }
+
+    std::vector<GlobalRenderFrameHostId> destinations =
+        *service_worker_context->GetWindowClientFrameRoutingIds(
+            blink::StorageKey::CreateFirstParty(origin));
+    if (destinations.empty()) {
+      return;
+    }
+
+    for (GlobalRenderFrameHostId frame_id : destinations) {
+      if (RenderFrameHostImpl* rfh = RenderFrameHostImpl::FromID(frame_id)) {
+        rfh->OnTrustTokensAccessed(mojo::Clone(details));
+      }
+    }
+  }
+
+  // `storage_partition_` owns this object via UniqueReceiverSet
+  // (service_worker_trust_token_observers_).
+  raw_ptr<StoragePartitionImpl> storage_partition_;
+};
+
 StoragePartitionImpl::StoragePartitionImpl(
     BrowserContext* browser_context,
     const StoragePartitionConfig& config,
@@ -3121,6 +3175,15 @@
   return remote;
 }
 
+mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+StoragePartitionImpl::CreateTrustTokenAccessObserverForServiceWorker() {
+  mojo::PendingRemote<network::mojom::TrustTokenAccessObserver> remote;
+  service_worker_trust_token_observers_.Add(
+      std::make_unique<ServiceWorkerTrustTokenAccessObserver>(this),
+      remote.InitWithNewPipeAndPassReceiver());
+  return remote;
+}
+
 void StoragePartitionImpl::OpenLocalStorageForProcess(
     int process_id,
     const blink::StorageKey& storage_key,
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h
index 1d09bab5..677bdc8 100644
--- a/content/browser/storage_partition_impl.h
+++ b/content/browser/storage_partition_impl.h
@@ -148,10 +148,8 @@
   void OverridePrivateAggregationManagerForTesting(
       std::unique_ptr<PrivateAggregationManager> private_aggregation_manager);
 
-  // Returns the StoragePartitionConfig that represents this StoragePartition.
-  const StoragePartitionConfig& GetConfig();
-
   // StoragePartition interface.
+  const StoragePartitionConfig& GetConfig() override;
   base::FilePath GetPath() override;
   network::mojom::NetworkContext* GetNetworkContext() override;
   network::mojom::URLLoaderFactoryParamsPtr CreateURLLoaderFactoryParams();
@@ -413,6 +411,9 @@
   mojo::PendingRemote<network::mojom::CookieAccessObserver>
   CreateCookieAccessObserverForServiceWorker();
 
+  mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+  CreateTrustTokenAccessObserverForServiceWorker();
+
   mojo::PendingRemote<network::mojom::URLLoaderNetworkServiceObserver>
   CreateAuthCertObserverForServiceWorker();
 
@@ -485,6 +486,7 @@
   class QuotaManagedDataDeletionHelper;
   class URLLoaderFactoryForBrowserProcess;
   class ServiceWorkerCookieAccessObserver;
+  class ServiceWorkerTrustTokenAccessObserver;
 
   friend class BackgroundSyncManagerTest;
   friend class BackgroundSyncServiceImplTestHarness;
@@ -734,6 +736,11 @@
   mojo::UniqueReceiverSet<network::mojom::CookieAccessObserver>
       service_worker_cookie_observers_;
 
+  // A set of connections to the network service used to notify browser process
+  // about Trust Token accesses made by a service worker in this process.
+  mojo::UniqueReceiverSet<network::mojom::TrustTokenAccessObserver>
+      service_worker_trust_token_observers_;
+
   mojo::ReceiverSet<network::mojom::URLLoaderNetworkServiceObserver,
                     URLLoaderNetworkContext>
       url_loader_network_observers_;
diff --git a/content/browser/url_loader_factory_params_helper.cc b/content/browser/url_loader_factory_params_helper.cc
index 6b52d0b..9dfbbb5e 100644
--- a/content/browser/url_loader_factory_params_helper.cc
+++ b/content/browser/url_loader_factory_params_helper.cc
@@ -54,6 +54,8 @@
     bool allow_universal_access_from_file_urls,
     bool is_for_isolated_world,
     mojo::PendingRemote<network::mojom::CookieAccessObserver> cookie_observer,
+    mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+        trust_token_observer,
     mojo::PendingRemote<network::mojom::URLLoaderNetworkServiceObserver>
         url_loader_network_observer,
     mojo::PendingRemote<network::mojom::DevToolsObserver> devtools_observer,
@@ -109,6 +111,7 @@
       params.get());
 
   params->cookie_observer = std::move(cookie_observer);
+  params->trust_token_observer = std::move(trust_token_observer);
   params->url_loader_network_observer = std::move(url_loader_network_observer);
   params->devtools_observer = std::move(devtools_observer);
 
@@ -144,6 +147,7 @@
       frame->GetOrCreateWebPreferences().allow_universal_access_from_file_urls,
       false,  // is_for_isolated_world
       frame->CreateCookieAccessObserver(),
+      frame->CreateTrustTokenAccessObserver(),
       frame->CreateURLLoaderNetworkObserver(),
       NetworkServiceDevToolsObserver::MakeSelfOwned(frame->frame_tree_node()),
       trust_token_redemption_policy, cookie_setting_overrides, debug_tag);
@@ -170,6 +174,7 @@
       frame->GetOrCreateWebPreferences().allow_universal_access_from_file_urls,
       true,  // is_for_isolated_world
       frame->CreateCookieAccessObserver(),
+      frame->CreateTrustTokenAccessObserver(),
       frame->CreateURLLoaderNetworkObserver(),
       NetworkServiceDevToolsObserver::MakeSelfOwned(frame->frame_tree_node()),
       trust_token_redemption_policy, cookie_setting_overrides,
@@ -197,6 +202,7 @@
       frame->GetOrCreateWebPreferences().allow_universal_access_from_file_urls,
       false,  // is_for_isolated_world
       frame->CreateCookieAccessObserver(),
+      frame->CreateTrustTokenAccessObserver(),
       frame->CreateURLLoaderNetworkObserver(),
       NetworkServiceDevToolsObserver::MakeSelfOwned(frame->frame_tree_node()),
       network::mojom::TrustTokenRedemptionPolicy::kForbid,
@@ -232,6 +238,8 @@
       false,  // is_for_isolated_world
       static_cast<StoragePartitionImpl*>(process->GetStoragePartition())
           ->CreateCookieAccessObserverForServiceWorker(),
+      static_cast<StoragePartitionImpl*>(process->GetStoragePartition())
+          ->CreateTrustTokenAccessObserverForServiceWorker(),
       std::move(url_loader_network_observer), std::move(devtools_observer),
       // Trust Token redemption and signing operations require the Permissions
       // Policy. It seems Permissions Policy in worker contexts
@@ -250,7 +258,9 @@
     const url::Origin& tentative_origin,
     NavigationRequest& navigation_request,
     const network::mojom::EarlyHints& early_hints,
-    mojo::PendingRemote<network::mojom::CookieAccessObserver> cookie_observer) {
+    mojo::PendingRemote<network::mojom::CookieAccessObserver> cookie_observer,
+    mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+        trust_token_observer) {
   // TODO(crbug.com/1225556): Consider not using the speculative
   // RenderFrameHostImpl to create URLLoaderNetworkServiceObserver.
   // In general we should avoid using speculative RenderFrameHostImpl
@@ -283,7 +293,7 @@
       /*coep_reporter=*/mojo::NullRemote(),
       /*allow_universal_access_from_file_urls=*/false,
       /*is_for_isolated_world=*/false, std::move(cookie_observer),
-      std::move(url_loader_network_observer),
+      std::move(trust_token_observer), std::move(url_loader_network_observer),
       /*devtools_observer=*/mojo::NullRemote(),
       network::mojom::TrustTokenRedemptionPolicy::kForbid,
       net::CookieSettingOverrides(), "ParamHelper::CreateForEarlyHintsPreload");
diff --git a/content/browser/url_loader_factory_params_helper.h b/content/browser/url_loader_factory_params_helper.h
index 59dbd654..623e9a9 100644
--- a/content/browser/url_loader_factory_params_helper.h
+++ b/content/browser/url_loader_factory_params_helper.h
@@ -100,8 +100,9 @@
       const url::Origin& tentative_origin,
       NavigationRequest& navigation_request,
       const network::mojom::EarlyHints& early_hints,
-      mojo::PendingRemote<network::mojom::CookieAccessObserver>
-          cookie_observer);
+      mojo::PendingRemote<network::mojom::CookieAccessObserver> cookie_observer,
+      mojo::PendingRemote<network::mojom::TrustTokenAccessObserver>
+          trust_token_observer);
 
  private:
   // Only static methods.
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
index 3fa0a8e..17653e5 100644
--- a/content/browser/utility_process_host.cc
+++ b/content/browser/utility_process_host.cc
@@ -269,6 +269,7 @@
       switches::kForceUIDirection,
       switches::kIgnoreCertificateErrors,
       switches::kLoggingLevel,
+      switches::kOverrideUseSoftwareGLForTests,
       switches::kOverrideEnabledCdmInterfaceVersion,
       switches::kProxyServer,
       switches::kDisableAcceleratedMjpegDecode,
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 8cd33cbc..79e0289 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3078,6 +3078,30 @@
   observers_.NotifyObservers(func, rfh, details);
 }
 
+void WebContentsImpl::OnTrustTokensAccessed(
+    NavigationHandle* navigation,
+    const TrustTokenAccessDetails& details) {
+  OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::OnTrustTokensAccessed",
+                        "navigation_handle", navigation);
+  // Use a variable to select between overloads.
+  void (WebContentsObserver::*func)(NavigationHandle*,
+                                    const TrustTokenAccessDetails&) =
+      &WebContentsObserver::OnTrustTokensAccessed;
+  observers_.NotifyObservers(func, navigation, details);
+}
+
+void WebContentsImpl::OnTrustTokensAccessed(
+    RenderFrameHostImpl* rfh,
+    const TrustTokenAccessDetails& details) {
+  OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::OnTrustTokensAccessed",
+                        "render_frame_host", rfh);
+  // Use a variable to select between overloads.
+  void (WebContentsObserver::*func)(RenderFrameHost*,
+                                    const TrustTokenAccessDetails&) =
+      &WebContentsObserver::OnTrustTokensAccessed;
+  observers_.NotifyObservers(func, rfh, details);
+}
+
 void WebContentsImpl::Stop() {
   TRACE_EVENT0("content", "WebContentsImpl::Stop");
   ForEachFrameTree(base::BindRepeating(
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 1b0b92e..6980739 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -716,6 +716,8 @@
       blink::mojom::ResourceLoadInfoPtr resource_load_information) override;
   void OnCookiesAccessed(RenderFrameHostImpl*,
                          const CookieAccessDetails& details) override;
+  void OnTrustTokensAccessed(RenderFrameHostImpl*,
+                             const TrustTokenAccessDetails& details) override;
 
   // Called when WebAudio starts or stops playing audible audio in an
   // AudioContext.
@@ -892,6 +894,8 @@
                                AllowServiceWorkerResult allowed) override;
   void OnCookiesAccessed(NavigationHandle*,
                          const CookieAccessDetails& details) override;
+  void OnTrustTokensAccessed(NavigationHandle*,
+                             const TrustTokenAccessDetails& details) override;
   void RegisterExistingOriginAsHavingDefaultIsolation(
       const url::Origin& origin,
       NavigationRequest* navigation_request_to_exclude) override;
diff --git a/content/browser/xr/service/vr_service_impl.cc b/content/browser/xr/service/vr_service_impl.cc
index 2e9bee39..7d234a2 100644
--- a/content/browser/xr/service/vr_service_impl.cc
+++ b/content/browser/xr/service/vr_service_impl.cc
@@ -702,13 +702,24 @@
   runtime_options->optional_features.assign(request.optional_features.begin(),
                                             request.optional_features.end());
 
-#if BUILDFLAG(IS_ANDROID) && BUILDFLAG(ENABLE_ARCORE)
-  if (request.runtime_id == device::mojom::XRDeviceId::ARCORE_DEVICE_ID) {
-    runtime_options->render_process_id =
-        render_frame_host_->GetProcess()->GetID();
-    runtime_options->render_frame_id = render_frame_host_->GetRoutingID();
-  }
+  if constexpr (BUILDFLAG(IS_ANDROID)) {
+    bool send_renderer_information = false;
+#if BUILDFLAG(ENABLE_ARCORE)
+    send_renderer_information =
+        send_renderer_information ||
+        request.runtime_id == device::mojom::XRDeviceId::ARCORE_DEVICE_ID;
 #endif
+#if BUILDFLAG(ENABLE_CARDBOARD)
+    send_renderer_information =
+        send_renderer_information ||
+        request.runtime_id == device::mojom::XRDeviceId::CARDBOARD_DEVICE_ID;
+#endif
+    if (send_renderer_information) {
+      runtime_options->render_process_id =
+          render_frame_host_->GetProcess()->GetID();
+      runtime_options->render_frame_id = render_frame_host_->GetRoutingID();
+    }
+  }
 
   bool use_dom_overlay =
       base::Contains(runtime_options->required_features,
diff --git a/content/browser/xr/service/xr_runtime_manager_impl.cc b/content/browser/xr/service/xr_runtime_manager_impl.cc
index 7f784777..3d5861e 100644
--- a/content/browser/xr/service/xr_runtime_manager_impl.cc
+++ b/content/browser/xr/service/xr_runtime_manager_impl.cc
@@ -227,15 +227,23 @@
 
 BrowserXRRuntimeImpl* XRRuntimeManagerImpl::GetImmersiveVrRuntime() {
 #if BUILDFLAG(IS_ANDROID)
+#if BUILDFLAG(ENABLE_CARDBOARD)
+  auto* cardboard = GetRuntime(device::mojom::XRDeviceId::CARDBOARD_DEVICE_ID);
+  if (cardboard) {
+    return cardboard;
+  }
+#endif
   auto* gvr = GetRuntime(device::mojom::XRDeviceId::GVR_DEVICE_ID);
-  if (gvr)
+  if (gvr) {
     return gvr;
+  }
 #endif
 
 #if BUILDFLAG(ENABLE_OPENXR)
   auto* openxr = GetRuntime(device::mojom::XRDeviceId::OPENXR_DEVICE_ID);
-  if (openxr)
+  if (openxr) {
     return openxr;
+  }
 #endif
 
   return nullptr;
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index 9e48c0d5..5c1f9bb 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -102,13 +102,11 @@
     "java/src/org/chromium/content/browser/DeviceUtilsImpl.java",
     "java/src/org/chromium/content/browser/ServicificationStartupUma.java",
     "java/src/org/chromium/content/browser/TracingControllerAndroidImpl.java",
-    "java/src/org/chromium/content/browser/UiThreadTaskTraitsImpl.java",
     "java/src/org/chromium/content/common/ContentSwitchUtils.java",
     "java/src/org/chromium/content/common/SurfaceWrapper.java",
     "java/src/org/chromium/content_public/app/ChildProcessServiceFactory.java",
     "java/src/org/chromium/content_public/app/ZygotePreload.java",
     "java/src/org/chromium/content_public/browser/BrowserStartupController.java",
-    "java/src/org/chromium/content_public/browser/BrowserTaskExecutor.java",
     "java/src/org/chromium/content_public/browser/ChildProcessCreationParams.java",
     "java/src/org/chromium/content_public/browser/DeviceUtils.java",
     "java/src/org/chromium/content_public/browser/TracingControllerAndroid.java",
@@ -644,7 +642,6 @@
     "junit/src/org/chromium/content/browser/GestureListenerManagerImplUnitTest.java",
     "junit/src/org/chromium/content/browser/ScreenOrientationProviderImplTest.java",
     "junit/src/org/chromium/content/browser/SpareChildConnectionTest.java",
-    "junit/src/org/chromium/content/browser/UiThreadTaskTraitsImplTest.java",
     "junit/src/org/chromium/content/browser/androidoverlay/DialogOverlayCoreTest.java",
     "junit/src/org/chromium/content/browser/input/InputMethodManagerWrapperImplTest.java",
     "junit/src/org/chromium/content/browser/input/RangeTest.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/UiThreadTaskTraitsImpl.java b/content/public/android/java/src/org/chromium/content/browser/UiThreadTaskTraitsImpl.java
deleted file mode 100644
index 0c56a76..0000000
--- a/content/public/android/java/src/org/chromium/content/browser/UiThreadTaskTraitsImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.content.browser;
-
-import org.chromium.base.task.TaskPriority;
-import org.chromium.base.task.TaskTraits;
-import org.chromium.base.task.TaskTraitsExtensionDescriptor;
-import org.chromium.content_public.browser.BrowserTaskExecutor;
-
-/**
- * Provides the implementation needed in UiThreadTaskTraits.
- */
-public class UiThreadTaskTraitsImpl {
-    private static class Descriptor
-            implements TaskTraitsExtensionDescriptor<UiThreadTaskTraitsImpl> {
-        // Corresponds to content::BrowserTaskTraitsExtension.
-        private static final byte EXTENSION_ID = 1;
-
-        @Override
-        public int getId() {
-            return EXTENSION_ID;
-        }
-
-        @Override
-        public UiThreadTaskTraitsImpl fromSerializedData(byte[] data) {
-            return new UiThreadTaskTraitsImpl();
-        }
-
-        @Override
-        public byte[] toSerializedData(UiThreadTaskTraitsImpl extension) {
-            byte extensionData[] = new byte[TaskTraits.EXTENSION_STORAGE_SIZE];
-
-            // Note we don't specify the UI thread directly here because it's ID 0 and the array is
-            // initialized to zero.
-
-            // Similarly we don't specify BrowserTaskType.Default its ID is also 0.
-            return extensionData;
-        }
-    }
-
-    public static final TaskTraitsExtensionDescriptor<UiThreadTaskTraitsImpl> DESCRIPTOR =
-            new Descriptor();
-
-    private static final UiThreadTaskTraitsImpl IMPL = new UiThreadTaskTraitsImpl();
-
-    public static final TaskTraits BEST_EFFORT =
-            TaskTraits.forExtension(TaskPriority.BEST_EFFORT, DESCRIPTOR, IMPL);
-    public static final TaskTraits USER_VISIBLE =
-            TaskTraits.forExtension(TaskPriority.USER_VISIBLE, DESCRIPTOR, IMPL);
-    public static final TaskTraits USER_BLOCKING =
-            TaskTraits.forExtension(TaskPriority.USER_BLOCKING, DESCRIPTOR, IMPL);
-    public static final TaskTraits DEFAULT = USER_VISIBLE;
-
-    static {
-        BrowserTaskExecutor.register();
-    }
-}
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/BrowserTaskExecutor.java b/content/public/android/java/src/org/chromium/content_public/browser/BrowserTaskExecutor.java
deleted file mode 100644
index 9f6d16f..0000000
--- a/content/public/android/java/src/org/chromium/content_public/browser/BrowserTaskExecutor.java
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.content_public.browser;
-
-import android.os.Handler;
-
-import org.chromium.base.ThreadUtils;
-import org.chromium.base.task.PostTask;
-import org.chromium.base.task.SequencedTaskRunner;
-import org.chromium.base.task.SingleThreadTaskRunner;
-import org.chromium.base.task.SingleThreadTaskRunnerImpl;
-import org.chromium.base.task.TaskExecutor;
-import org.chromium.base.task.TaskRunner;
-import org.chromium.base.task.TaskTraits;
-import org.chromium.content.browser.UiThreadTaskTraitsImpl;
-
-/**
- * This {@link TaskExecutor} is for tasks posted with {@link UiThreadTaskTraits}. It maps directly
- * to content::BrowserTaskExecutor except only UI thread posting is supported from java.
- *
- * NB if you wish to post to the thread pool then use {@link TaskTraits} instead of {@link
- * UiThreadTaskTraits}.
- */
-public class BrowserTaskExecutor implements TaskExecutor {
-    private static boolean sRegistered;
-
-    private final SingleThreadTaskRunner mBestEffortTaskRunner;
-    private final SingleThreadTaskRunner mUserVisibleTaskRunner;
-    private final SingleThreadTaskRunner mUserBlockingTaskRunner;
-
-    public BrowserTaskExecutor() {
-        Handler handler = ThreadUtils.getUiThreadHandler();
-        mBestEffortTaskRunner =
-                new SingleThreadTaskRunnerImpl(handler, UiThreadTaskTraitsImpl.BEST_EFFORT);
-        mUserVisibleTaskRunner =
-                new SingleThreadTaskRunnerImpl(handler, UiThreadTaskTraitsImpl.USER_VISIBLE);
-        mUserBlockingTaskRunner =
-                new SingleThreadTaskRunnerImpl(handler, UiThreadTaskTraitsImpl.USER_BLOCKING);
-    }
-
-    @Override
-    public TaskRunner createTaskRunner(TaskTraits taskTraits) {
-        return createSingleThreadTaskRunner(taskTraits);
-    }
-
-    @Override
-    public SequencedTaskRunner createSequencedTaskRunner(TaskTraits taskTraits) {
-        return createSingleThreadTaskRunner(taskTraits);
-    }
-
-    @Override
-    public SingleThreadTaskRunner createSingleThreadTaskRunner(TaskTraits taskTraits) {
-        if (UiThreadTaskTraitsImpl.BEST_EFFORT.equals(taskTraits)) {
-            return mBestEffortTaskRunner;
-        } else if (UiThreadTaskTraitsImpl.USER_VISIBLE.equals(taskTraits)) {
-            return mUserVisibleTaskRunner;
-        } else if (UiThreadTaskTraitsImpl.USER_BLOCKING.equals(taskTraits)) {
-            return mUserBlockingTaskRunner;
-        } else {
-            // Add support for additional TaskTraits here if encountering this exception.
-            throw new RuntimeException();
-        }
-    }
-
-    @Override
-    public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
-        createSingleThreadTaskRunner(taskTraits).postDelayedTask(task, delay);
-    }
-
-    @Override
-    public boolean canRunTaskImmediately(TaskTraits traits) {
-        return createSingleThreadTaskRunner(traits).belongsToCurrentThread();
-    }
-
-    public static void register() {
-        // In some tests we will get called multiple times.
-        if (sRegistered) return;
-        sRegistered = true;
-
-        PostTask.registerTaskExecutor(
-                UiThreadTaskTraitsImpl.DESCRIPTOR.getId(), new BrowserTaskExecutor());
-    }
-
-    // Git doesn't want to detect this file as moved, so I'm adding some arbitrary
-    // comment lines to get the similarity detection up. Here's ChatGPT's rendition
-    // of "a beautiful ASCII art of a mountain landscape"
-    //
-    //                        /\
-    //                       /  \
-    //                      /    \
-    //                     /      \
-    //                    /        \
-    //                   /          \
-    //                  /            \
-    //                 /              \
-    //                /                \
-    //               /__________________\
-    //              /\                   /\
-    //             /  \                 /  \
-    //            /    \               /    \
-    //           /      \             /      \
-    //          /        \           /        \
-    //         /          \         /          \
-    //        /            \       /            \
-    //       /              \     /              \
-    //      /________________\   /________________\
-    //     /\                   /\                   /\
-    //    /  \                 /  \                 /  \
-    //   /    \               /    \               /    \
-    //  /      \             /      \             /      \
-    // /        \           /        \           /        \
-    //            \         /          \         /          \
-    //             \       /            \       /            \
-    //              \     /              \     /              \
-    //               \   /                \   /                \
-    //                \ /                  \ /                  \
-    //                 V                    V                    V
-}
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/UiThreadTaskTraits.java b/content/public/android/java/src/org/chromium/content_public/browser/UiThreadTaskTraits.java
index 252eb27d..4532a84 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/UiThreadTaskTraits.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/UiThreadTaskTraits.java
@@ -5,7 +5,6 @@
 package org.chromium.content_public.browser;
 
 import org.chromium.base.task.TaskTraits;
-import org.chromium.content.browser.UiThreadTaskTraitsImpl;
 
 /**
  * Traits for tasks that need to run on the Browser UI thread. Keep in sync with
@@ -18,8 +17,8 @@
     private UiThreadTaskTraits() {}
 
     // These are convenience constants for UI thread tasks at different priority levels.
-    public static final TaskTraits DEFAULT = UiThreadTaskTraitsImpl.DEFAULT;
-    public static final TaskTraits BEST_EFFORT = UiThreadTaskTraitsImpl.BEST_EFFORT;
-    public static final TaskTraits USER_VISIBLE = UiThreadTaskTraitsImpl.USER_VISIBLE;
-    public static final TaskTraits USER_BLOCKING = UiThreadTaskTraitsImpl.USER_BLOCKING;
+    public static final @TaskTraits int DEFAULT = TaskTraits.UI_DEFAULT;
+    public static final @TaskTraits int BEST_EFFORT = TaskTraits.UI_BEST_EFFORT;
+    public static final @TaskTraits int USER_VISIBLE = TaskTraits.UI_USER_VISIBLE;
+    public static final @TaskTraits int USER_BLOCKING = TaskTraits.UI_USER_BLOCKING;
 }
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java
index 55845e8..974f125 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java
@@ -25,7 +25,6 @@
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.base.test.task.SchedulerTestHelpers;
 import org.chromium.content.app.ContentMain;
-import org.chromium.content_public.browser.BrowserTaskExecutor;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.content_public.browser.test.NativeLibraryTestUtils;
 import org.chromium.content_public.browser.test.util.UiThreadSchedulerTestUtils;
@@ -41,16 +40,14 @@
 public class UiThreadSchedulerTest {
     @Before
     public void setUp() {
-        // We don't load the browser process since we want tests to control when content
-        // is started and hence the native secheduler is ready.
-        NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess();
-        ThreadUtils.setUiThread(null);
         ThreadUtils.setWillOverrideUiThread(true);
         mUiThread = new HandlerThread("UiThreadForTest");
         mUiThread.start();
         ThreadUtils.setUiThread(mUiThread.getLooper());
-        BrowserTaskExecutor.register();
         mHandler = new Handler(mUiThread.getLooper());
+        // We don't load the browser process since we want tests to control when content
+        // is started and hence the native secheduler is ready.
+        NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess();
         UiThreadSchedulerTestUtils.postBrowserMainLoopStartupTasks(false);
     }
 
@@ -58,8 +55,6 @@
     public void tearDown() {
         UiThreadSchedulerTestUtils.postBrowserMainLoopStartupTasks(true);
         mUiThread.quitSafely();
-        ThreadUtils.setUiThread(null);
-        ThreadUtils.setWillOverrideUiThread(false);
     }
 
     @Test
diff --git a/content/public/android/junit/src/org/chromium/content/browser/UiThreadTaskTraitsImplTest.java b/content/public/android/junit/src/org/chromium/content/browser/UiThreadTaskTraitsImplTest.java
deleted file mode 100644
index d44a4b4..0000000
--- a/content/public/android/junit/src/org/chromium/content/browser/UiThreadTaskTraitsImplTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.content.browser;
-
-import static org.junit.Assert.assertNotNull;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-import org.chromium.base.task.TaskTraits;
-import org.chromium.base.test.BaseRobolectricTestRunner;
-
-/**
- * Tests for {@link UiThreadTaskTraitsImpl}
- */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class UiThreadTaskTraitsImplTest {
-    @Test
-    @SmallTest
-    public void testContainsExtension() {
-        TaskTraits traits = UiThreadTaskTraitsImpl.BEST_EFFORT;
-        UiThreadTaskTraitsImpl impl = traits.getExtension(UiThreadTaskTraitsImpl.DESCRIPTOR);
-
-        assertNotNull(impl);
-    }
-}
diff --git a/content/public/app/content_main_delegate.cc b/content/public/app/content_main_delegate.cc
index 16f97c1c..a687861c 100644
--- a/content/public/app/content_main_delegate.cc
+++ b/content/public/app/content_main_delegate.cc
@@ -60,8 +60,8 @@
 
   // TODO(crbug.com/1351777): remove this workaround once SwANGLE can work with
   // the GPU process sandbox.
-  if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          switches::kUseANGLE) == gl::kANGLEImplementationSwiftShaderName) {
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kOverrideUseSoftwareGLForTests)) {
     base::CommandLine::ForCurrentProcess()->AppendSwitch(
         sandbox::policy::switches::kDisableGpuSandbox);
   }
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index 65e00070..f8feaf3 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -404,6 +404,8 @@
     "tracing_delegate.cc",
     "tracing_delegate.h",
     "tracing_service.h",
+    "trust_token_access_details.cc",
+    "trust_token_access_details.h",
     "tts_controller.h",
     "tts_platform.h",
     "tts_utterance.h",
diff --git a/content/public/browser/browser_task_traits.h b/content/public/browser/browser_task_traits.h
index e32ef32..5a11ad4 100644
--- a/content/public/browser/browser_task_traits.h
+++ b/content/public/browser/browser_task_traits.h
@@ -81,7 +81,6 @@
             base::trait_helpers::GetEnum<BrowserTaskType,
                                          BrowserTaskType::kDefault>(args...)) {}
 
-  // Keep in sync with UiThreadTaskTraits.java
   constexpr base::TaskTraitsExtensionStorage Serialize() const {
     static_assert(8 == sizeof(BrowserTaskTraitsExtension),
                   "Update Serialize() and Parse() when changing "
diff --git a/content/public/browser/desktop_media_id.cc b/content/public/browser/desktop_media_id.cc
index b1a112ca..ee58ae7 100644
--- a/content/public/browser/desktop_media_id.cc
+++ b/content/public/browser/desktop_media_id.cc
@@ -10,6 +10,7 @@
 
 #include "base/containers/id_map.h"
 #include "base/memory/singleton.h"
+#include "base/notreached.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
diff --git a/content/public/browser/storage_partition.h b/content/public/browser/storage_partition.h
index 5d96c0f4..93d776bd 100644
--- a/content/public/browser/storage_partition.h
+++ b/content/public/browser/storage_partition.h
@@ -80,6 +80,7 @@
 class PlatformNotificationContext;
 class ServiceWorkerContext;
 class SharedWorkerService;
+class StoragePartitionConfig;
 class ZoomLevelDelegate;
 class NavigationRequest;
 
@@ -91,6 +92,9 @@
 // the cookies, localStorage, etc., that normal web renderers have access to.
 class CONTENT_EXPORT StoragePartition {
  public:
+  // Returns the StoragePartitionConfig that represents this StoragePartition.
+  virtual const StoragePartitionConfig& GetConfig() = 0;
+
   virtual base::FilePath GetPath() = 0;
 
   // Returns a raw mojom::NetworkContext pointer. When network service crashes
diff --git a/content/public/browser/trust_token_access_details.cc b/content/public/browser/trust_token_access_details.cc
new file mode 100644
index 0000000..e8995b7
--- /dev/null
+++ b/content/public/browser/trust_token_access_details.cc
@@ -0,0 +1,47 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/browser/trust_token_access_details.h"
+
+namespace content {
+
+TrustTokenAccessDetails::TrustTokenAccessDetails() = default;
+TrustTokenAccessDetails::~TrustTokenAccessDetails() = default;
+
+TrustTokenAccessDetails::TrustTokenAccessDetails(
+    const url::Origin& origin,
+    network::mojom::TrustTokenOperationType type,
+    const absl::optional<url::Origin>& issuer,
+    bool blocked)
+    : origin(origin), issuer(issuer), blocked(blocked) {}
+
+TrustTokenAccessDetails::TrustTokenAccessDetails(
+    const TrustTokenAccessDetails& details) = default;
+TrustTokenAccessDetails& TrustTokenAccessDetails::operator=(
+    const TrustTokenAccessDetails& details) = default;
+
+TrustTokenAccessDetails::TrustTokenAccessDetails(
+    const network::mojom::TrustTokenAccessDetailsPtr& details) {
+  switch (details->which()) {
+    case network::mojom::TrustTokenAccessDetails::Tag::kIssuance:
+      type = network::mojom::TrustTokenOperationType::kIssuance;
+      origin = details->get_issuance()->origin;
+      issuer = details->get_issuance()->issuer;
+      blocked = details->get_issuance()->blocked;
+      break;
+    case network::mojom::TrustTokenAccessDetails::Tag::kRedemption:
+      type = network::mojom::TrustTokenOperationType::kRedemption;
+      origin = details->get_redemption()->origin;
+      issuer = details->get_redemption()->issuer;
+      blocked = details->get_redemption()->blocked;
+      break;
+    case network::mojom::TrustTokenAccessDetails::Tag::kSigning:
+      type = network::mojom::TrustTokenOperationType::kSigning;
+      origin = details->get_signing()->origin;
+      blocked = details->get_signing()->blocked;
+      break;
+  }
+}
+
+}  // namespace content
diff --git a/content/public/browser/trust_token_access_details.h b/content/public/browser/trust_token_access_details.h
new file mode 100644
index 0000000..bc4a0062
--- /dev/null
+++ b/content/public/browser/trust_token_access_details.h
@@ -0,0 +1,35 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_BROWSER_TRUST_TOKEN_ACCESS_DETAILS_H_
+#define CONTENT_PUBLIC_BROWSER_TRUST_TOKEN_ACCESS_DETAILS_H_
+
+#include "content/common/content_export.h"
+#include "services/network/public/mojom/trust_token_access_observer.mojom.h"
+#include "url/origin.h"
+
+namespace content {
+
+struct CONTENT_EXPORT TrustTokenAccessDetails {
+  TrustTokenAccessDetails();
+  TrustTokenAccessDetails(const url::Origin& origin,
+                          network::mojom::TrustTokenOperationType type,
+                          const absl::optional<url::Origin>& issuer,
+                          bool blocked);
+  explicit TrustTokenAccessDetails(
+      const network::mojom::TrustTokenAccessDetailsPtr& details);
+  ~TrustTokenAccessDetails();
+
+  TrustTokenAccessDetails(const TrustTokenAccessDetails&);
+  TrustTokenAccessDetails& operator=(const TrustTokenAccessDetails&);
+
+  url::Origin origin;
+  network::mojom::TrustTokenOperationType type;
+  absl::optional<url::Origin> issuer;
+  bool blocked = false;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_BROWSER_TRUST_TOKEN_ACCESS_DETAILS_H_
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h
index f4c8ee3..977cd925 100644
--- a/content/public/browser/web_contents_observer.h
+++ b/content/public/browser/web_contents_observer.h
@@ -69,6 +69,7 @@
 struct MediaPlayerId;
 struct PrunedDetails;
 struct Referrer;
+struct TrustTokenAccessDetails;
 
 // Note: before adding a new `WebContentsObserver` subclass, consider if simpler
 // helpers will suffice:
@@ -470,6 +471,19 @@
   virtual void OnCookiesAccessed(NavigationHandle* navigation_handle,
                                  const CookieAccessDetails& details) {}
 
+  // Called when document accesses a Trust Token (via document.hasTrustToken or
+  // issuing a network request).
+  // Trust Token accesses for a dedicated worker are attributed to the
+  // RenderFrameHost which created it.
+  virtual void OnTrustTokensAccessed(RenderFrameHost* render_frame_host,
+                                     const TrustTokenAccessDetails& details) {}
+
+  // Called when a network request issued by the navigation accesses a Trust
+  // Token. If a notification is received after the navigation has committed, it
+  // will be attributed to the RenderFrameHost created by the navigation.
+  virtual void OnTrustTokensAccessed(NavigationHandle* navigation_handle,
+                                     const TrustTokenAccessDetails& details) {}
+
   // This method is invoked when a new non-pending navigation entry is created.
   // This corresponds to one NavigationController entry being created
   // (in the case of new navigations) or renavigated to (for back/forward
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index a6198a3..07d2de1f 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -474,19 +474,8 @@
   }
 #endif
 
-  // There is only one place where
-  // "HeadlessModeProtocolBrowserTest.ScreencastBasicssets" specifies
-  // --use-angle=swiftshader-webgl through
-  // chrome/browser/headless/headless_mode_util.cc, and by resetting it to
-  // --use-angle=swiftshader, the test crashes.
-  // If not for this test, we should assert kUseANGLE isn't specified below.
-  if (use_software_gl && !use_software_compositing_ &&
-      !command_line->HasSwitch(switches::kUseANGLE)) {
-    command_line->AppendSwitchASCII(switches::kUseGL,
-                                    gl::kGLImplementationANGLEName);
-    command_line->AppendSwitchASCII(switches::kUseANGLE,
-                                    gl::kANGLEImplementationSwiftShaderName);
-  }
+  if (use_software_gl && !use_software_compositing_)
+    command_line->AppendSwitch(switches::kOverrideUseSoftwareGLForTests);
 
   // Use an sRGB color profile to ensure that the machine's color profile does
   // not affect the results.
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index 3dacbce..54fec66 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -3670,6 +3670,72 @@
 }
 
 namespace {
+static constexpr int kEnableLogMessageId = 0;
+static constexpr char kEnableLogMessage[] = R"({"id":0,"method":"Log.enable"})";
+static constexpr int kDisableLogMessageId = 1;
+static constexpr char kDisableLogMessage[] =
+    R"({"id":1,"method":"Log.disable"})";
+}  // namespace
+
+DevToolsInspectorLogWatcher::DevToolsInspectorLogWatcher(
+    WebContents* web_contents) {
+  host_ = DevToolsAgentHost::GetOrCreateFor(web_contents);
+  host_->AttachClient(this);
+
+  host_->DispatchProtocolMessage(
+      this, base::as_bytes(
+                base::make_span(kEnableLogMessage, strlen(kEnableLogMessage))));
+
+  run_loop_enable_log_.Run();
+}
+
+DevToolsInspectorLogWatcher::~DevToolsInspectorLogWatcher() {
+  host_->DetachClient(this);
+}
+
+void DevToolsInspectorLogWatcher::DispatchProtocolMessage(
+    DevToolsAgentHost* host,
+    base::span<const uint8_t> message) {
+  base::StringPiece message_str(reinterpret_cast<const char*>(message.data()),
+                                message.size());
+  auto parsed_message = base::JSONReader::Read(message_str);
+  absl::optional<int> command_id = parsed_message->FindIntPath("id");
+  if (command_id.has_value()) {
+    switch (command_id.value()) {
+      case kEnableLogMessageId:
+        run_loop_enable_log_.Quit();
+        break;
+      case kDisableLogMessageId:
+        run_loop_disable_log_.Quit();
+        break;
+      default:
+        NOTREACHED();
+    }
+    return;
+  }
+
+  std::string* notification = parsed_message->FindStringPath("method");
+  if (notification && *notification == "Log.entryAdded") {
+    std::string* text = parsed_message->FindStringPath("params.entry.text");
+    DCHECK(text);
+    last_message_ = *text;
+    std::string* url = parsed_message->FindStringPath("params.entry.url");
+    if (url) {
+      last_url_ = GURL(*url);
+    }
+  }
+}
+
+void DevToolsInspectorLogWatcher::AgentHostClosed(DevToolsAgentHost* host) {}
+
+void DevToolsInspectorLogWatcher::FlushAndStopWatching() {
+  host_->DispatchProtocolMessage(
+      this, base::as_bytes(base::make_span(kDisableLogMessage,
+                                           strlen(kDisableLogMessage))));
+  run_loop_disable_log_.Run();
+}
+
+namespace {
 mojo::Remote<blink::mojom::FileSystemManager> GetFileSystemManager(
     RenderProcessHost* rph,
     const blink::StorageKey& storage_key) {
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h
index ea41f948..52e90a66 100644
--- a/content/public/test/browser_test_utils.h
+++ b/content/public/test/browser_test_utils.h
@@ -29,6 +29,7 @@
 #include "components/viz/common/quads/compositor_frame.h"
 #include "content/public/browser/browser_message_filter.h"
 #include "content/public/browser/commit_deferring_condition.h"
+#include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/render_frame_metadata_provider.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_process_host_observer.h"
@@ -1982,6 +1983,29 @@
   std::vector<Message> messages_;
 };
 
+// A helper class to get DevTools inspector log messages (e.g. network errors).
+class DevToolsInspectorLogWatcher : public DevToolsAgentHostClient {
+ public:
+  explicit DevToolsInspectorLogWatcher(WebContents* web_contents);
+  ~DevToolsInspectorLogWatcher() override;
+
+  void FlushAndStopWatching();
+  std::string last_message() { return last_message_; }
+  GURL last_url() { return last_url_; }
+
+  // DevToolsAgentHostClient:
+  void DispatchProtocolMessage(DevToolsAgentHost* host,
+                               base::span<const uint8_t> message) override;
+  void AgentHostClosed(DevToolsAgentHost* host) override;
+
+ private:
+  scoped_refptr<DevToolsAgentHost> host_;
+  base::RunLoop run_loop_enable_log_;
+  base::RunLoop run_loop_disable_log_;
+  std::string last_message_;
+  GURL last_url_;
+};
+
 // Static methods that simulates Mojo methods as if they were called by a
 // renderer. Used to simulate a compromised renderer.
 class PwnMessageHelper {
diff --git a/content/public/test/test_storage_partition.cc b/content/public/test/test_storage_partition.cc
index 56e6f5e..9af5062 100644
--- a/content/public/test/test_storage_partition.cc
+++ b/content/public/test/test_storage_partition.cc
@@ -15,6 +15,10 @@
 TestStoragePartition::TestStoragePartition() {}
 TestStoragePartition::~TestStoragePartition() {}
 
+const StoragePartitionConfig& TestStoragePartition::GetConfig() {
+  return config_;
+}
+
 base::FilePath TestStoragePartition::GetPath() {
   return file_path_;
 }
diff --git a/content/public/test/test_storage_partition.h b/content/public/test/test_storage_partition.h
index aefe702..4a7b210 100644
--- a/content/public/test/test_storage_partition.h
+++ b/content/public/test/test_storage_partition.h
@@ -14,6 +14,7 @@
 #include "components/services/storage/public/mojom/cache_storage_control.mojom.h"
 #include "components/services/storage/public/mojom/local_storage_control.mojom.h"
 #include "content/public/browser/storage_partition.h"
+#include "content/public/browser/storage_partition_config.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/network/public/mojom/network_context.mojom.h"
 
@@ -51,6 +52,9 @@
 
   ~TestStoragePartition() override;
 
+  void set_config(StoragePartitionConfig config) { config_ = config; }
+  const StoragePartitionConfig& GetConfig() override;
+
   void set_path(base::FilePath file_path) { file_path_ = file_path; }
   base::FilePath GetPath() override;
 
@@ -234,6 +238,7 @@
   void InvalidateWeakPtrs();
 
  private:
+  StoragePartitionConfig config_;
   base::FilePath file_path_;
   mojo::Remote<network::mojom::NetworkContext> network_context_remote_;
   raw_ptr<network::mojom::NetworkContext> network_context_ = nullptr;
diff --git a/content/shell/app/ios-Info.plist b/content/shell/app/ios-Info.plist
index a7f4a87..8ecdf28f 100644
--- a/content/shell/app/ios-Info.plist
+++ b/content/shell/app/ios-Info.plist
@@ -2,6 +2,8 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
+	<key>CADisableMinimumFrameDurationOnPhone</key>
+	<true/>
 	<key>CFBundleDevelopmentRegion</key>
 	<string>en</string>
 	<key>CFBundleDisplayName</key>
@@ -27,10 +29,10 @@
 		<key>NSAllowsArbitraryLoads</key>
 		<true/>
 	</dict>
-       <key>LSSupportsOpeningDocumentsInPlace</key>
-       <true/>
-       <key>UIFileSharingEnabled</key>
-       <true/>
+	<key>LSSupportsOpeningDocumentsInPlace</key>
+	<true/>
+	<key>UIFileSharingEnabled</key>
+	<true/>
 	<key>UISupportedInterfaceOrientations</key>
 	<array>
 		<string>UIInterfaceOrientationPortrait</string>
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 9e40bf4..ef594eb8 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -2338,6 +2338,7 @@
     "../browser/interest_group/interest_group_storage_unittest.cc",
     "../browser/interest_group/mock_auction_process_manager.cc",
     "../browser/interest_group/mock_auction_process_manager.h",
+    "../browser/interest_group/noiser_and_bucketer_unittest.cc",
     "../browser/interest_group/subresource_url_authorizations_unittest.cc",
     "../browser/interest_group/subresource_url_builder_unittest.cc",
     "../browser/interest_group/test_interest_group_manager_impl.cc",
diff --git a/content/test/content_browser_test_utils_internal.cc b/content/test/content_browser_test_utils_internal.cc
index 78c73123..500a493 100644
--- a/content/test/content_browser_test_utils_internal.cc
+++ b/content/test/content_browser_test_utils_internal.cc
@@ -15,7 +15,6 @@
 #include "base/containers/stack.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
-#include "base/json/json_reader.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/thread_pool.h"
@@ -701,68 +700,6 @@
   return true;
 }
 
-namespace {
-static constexpr int kEnableLogMessageId = 0;
-static constexpr char kEnableLogMessage[] = R"({"id":0,"method":"Log.enable"})";
-static constexpr int kDisableLogMessageId = 1;
-static constexpr char kDisableLogMessage[] =
-    R"({"id":1,"method":"Log.disable"})";
-}  // namespace
-
-DevToolsInspectorLogWatcher::DevToolsInspectorLogWatcher(
-    WebContents* web_contents) {
-  host_ = DevToolsAgentHost::GetOrCreateFor(web_contents);
-  host_->AttachClient(this);
-
-  host_->DispatchProtocolMessage(
-      this, base::as_bytes(
-                base::make_span(kEnableLogMessage, strlen(kEnableLogMessage))));
-
-  run_loop_enable_log_.Run();
-}
-
-DevToolsInspectorLogWatcher::~DevToolsInspectorLogWatcher() {
-  host_->DetachClient(this);
-}
-
-void DevToolsInspectorLogWatcher::DispatchProtocolMessage(
-    DevToolsAgentHost* host,
-    base::span<const uint8_t> message) {
-  base::StringPiece message_str(reinterpret_cast<const char*>(message.data()),
-                                message.size());
-  auto parsed_message = base::JSONReader::Read(message_str);
-  absl::optional<int> command_id = parsed_message->FindIntPath("id");
-  if (command_id.has_value()) {
-    switch (command_id.value()) {
-      case kEnableLogMessageId:
-        run_loop_enable_log_.Quit();
-        break;
-      case kDisableLogMessageId:
-        run_loop_disable_log_.Quit();
-        break;
-      default:
-        NOTREACHED();
-    }
-    return;
-  }
-
-  std::string* notification = parsed_message->FindStringPath("method");
-  if (notification && *notification == "Log.entryAdded") {
-    std::string* text = parsed_message->FindStringPath("params.entry.text");
-    DCHECK(text);
-    last_message_ = *text;
-  }
-}
-
-void DevToolsInspectorLogWatcher::AgentHostClosed(DevToolsAgentHost* host) {}
-
-void DevToolsInspectorLogWatcher::FlushAndStopWatching() {
-  host_->DispatchProtocolMessage(
-      this, base::as_bytes(base::make_span(kDisableLogMessage,
-                                           strlen(kDisableLogMessage))));
-  run_loop_disable_log_.Run();
-}
-
 FrameNavigateParamsCapturer::FrameNavigateParamsCapturer(WebContents* contents)
     : WebContentsObserver(contents) {}
 
diff --git a/content/test/content_browser_test_utils_internal.h b/content/test/content_browser_test_utils_internal.h
index f157f4ff..e8af717 100644
--- a/content/test/content_browser_test_utils_internal.h
+++ b/content/test/content_browser_test_utils_internal.h
@@ -21,7 +21,6 @@
 #include "content/browser/bad_message.h"
 #include "content/browser/renderer_host/back_forward_cache_metrics.h"
 #include "content/browser/renderer_host/navigation_type.h"
-#include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/javascript_dialog_manager.h"
 #include "content/public/browser/web_contents_delegate.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -441,27 +440,6 @@
   std::unique_ptr<base::RunLoop> run_loop_ = std::make_unique<base::RunLoop>();
 };
 
-// A helper class to get DevTools inspector log messages (e.g. network errors).
-class DevToolsInspectorLogWatcher : public DevToolsAgentHostClient {
- public:
-  explicit DevToolsInspectorLogWatcher(WebContents* web_contents);
-  ~DevToolsInspectorLogWatcher() override;
-
-  void FlushAndStopWatching();
-  std::string last_message() { return last_message_; }
-
-  // DevToolsAgentHostClient:
-  void DispatchProtocolMessage(DevToolsAgentHost* host,
-                               base::span<const uint8_t> message) override;
-  void AgentHostClosed(DevToolsAgentHost* host) override;
-
- private:
-  scoped_refptr<DevToolsAgentHost> host_;
-  base::RunLoop run_loop_enable_log_;
-  base::RunLoop run_loop_disable_log_;
-  std::string last_message_;
-};
-
 // Captures various properties of the NavigationHandle on DidFinishNavigation.
 // By default, captures the next navigation (either for a specific frame or
 // any frame in the WebContents) and waits until the navigation completely
diff --git a/content/test/gpu/PRESUBMIT.py b/content/test/gpu/PRESUBMIT.py
index 154c58f..0dd2ca2f 100644
--- a/content/test/gpu/PRESUBMIT.py
+++ b/content/test/gpu/PRESUBMIT.py
@@ -14,7 +14,7 @@
 
 EXTRA_PATHS_COMPONENTS = [
     ('build', ),
-    ('build', 'fuchsia'),
+    ('build', 'fuchsia', 'test'),
     ('build', 'util'),
     ('testing', ),
     ('third_party', 'catapult', 'common', 'py_utils'),
diff --git a/content/test/gpu/fuchsia_util.py b/content/test/gpu/fuchsia_util.py
index 0dafbf2a..543113dd 100644
--- a/content/test/gpu/fuchsia_util.py
+++ b/content/test/gpu/fuchsia_util.py
@@ -10,7 +10,7 @@
 from gpu_path_util import CHROMIUM_SRC_DIR, setup_fuchsia_paths
 # pylint: enable=unused-import
 
-from common import register_common_args  # pylint: disable=no-name-in-module
+from common import register_common_args  # pylint: disable=import-error
 
 
 def RunTestOnFuchsiaDevice(script_type):
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index aa8d928..61f4424 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -578,6 +578,8 @@
 crbug.com/1383180 [ android android-pixel-6 angle-opengles passthrough ] conformance/textures/video/* [ RetryOnFailure ]
 # finder:group-end
 
+crbug.com/1426593 [ android android-pixel-6 no-passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ]
+
 ## Misc failures ##
 
 # Failing webgl passthrough test on nexus 5x.
diff --git a/content/test/gpu/run_pytype.py b/content/test/gpu/run_pytype.py
index 8626602..9de2dcf 100755
--- a/content/test/gpu/run_pytype.py
+++ b/content/test/gpu/run_pytype.py
@@ -19,7 +19,7 @@
 # This list should be kept in sync with EXTRA_PATH_COMPONENTS in PRESUBMIT.py
 EXTRA_PATHS_COMPONENTS = [
     ('build', ),
-    ('build', 'fuchsia'),
+    ('build', 'fuchsia', 'test'),
     ('build', 'util'),
     ('testing', ),
     ('third_party', 'catapult', 'common', 'py_utils'),
diff --git a/content/web_test/browser/web_test_permission_manager.cc b/content/web_test/browser/web_test_permission_manager.cc
index e81d6ce..e15a56a 100644
--- a/content/web_test/browser/web_test_permission_manager.cc
+++ b/content/web_test/browser/web_test_permission_manager.cc
@@ -11,7 +11,10 @@
 #include "base/barrier_callback.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/hash/hash.h"
 #include "components/content_settings/core/common/content_settings.h"
+#include "components/content_settings/core/common/content_settings_pattern.h"
+#include "components/content_settings/core/common/content_settings_utils.h"
 #include "content/browser/permissions/permission_util.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/permission_controller.h"
@@ -22,13 +25,15 @@
 #include "third_party/blink/public/common/permissions/permission_utils.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 
+using content_settings::URLToSchemefulSitePattern;
+
 namespace content {
 
 namespace {
 
 std::vector<ContentSettingPatternSource> GetContentSettings(
-    const GURL& permission_origin,
-    const GURL& embedding_origin,
+    const ContentSettingsPattern& permission_pattern,
+    const ContentSettingsPattern& embedding_pattern,
     blink::mojom::PermissionStatus status) {
   absl::optional<ContentSetting> setting;
   switch (status) {
@@ -43,8 +48,7 @@
   }
   std::vector<ContentSettingPatternSource> patterns;
   if (setting) {
-    patterns.emplace_back(ContentSettingsPattern::FromURL(permission_origin),
-                          ContentSettingsPattern::FromURL(embedding_origin),
+    patterns.emplace_back(permission_pattern, embedding_pattern,
                           base::Value(*setting), /*source=*/"",
                           /*incognito=*/false);
   }
@@ -72,8 +76,20 @@
 
 bool WebTestPermissionManager::PermissionDescription::operator==(
     const PermissionDescription& other) const {
-  return type == other.type && origin == other.origin &&
-         embedding_origin == other.embedding_origin;
+  if (type != other.type) {
+    return false;
+  }
+
+  if (type == blink::PermissionType::STORAGE_ACCESS_GRANT) {
+    const net::SchemefulSite requesting_site(origin);
+    const net::SchemefulSite other_requesting_site(other.origin);
+    const net::SchemefulSite embedding_site(embedding_origin);
+    const net::SchemefulSite other_embedding_site(other.embedding_origin);
+    return requesting_site == other_requesting_site &&
+           embedding_site == other_embedding_site;
+  }
+
+  return origin == other.origin && embedding_origin == other.embedding_origin;
 }
 
 bool WebTestPermissionManager::PermissionDescription::operator!=(
@@ -83,10 +99,19 @@
 
 size_t WebTestPermissionManager::PermissionDescription::Hash::operator()(
     const PermissionDescription& description) const {
-  size_t hash = std::hash<int>()(static_cast<int>(description.type));
-  hash += std::hash<std::string>()(description.embedding_origin.spec());
-  hash += std::hash<std::string>()(description.origin.spec());
-  return hash;
+  const int type_int = static_cast<int>(description.type);
+
+  if (description.type == blink::PermissionType::STORAGE_ACCESS_GRANT) {
+    const net::SchemefulSite requesting_site(description.origin);
+    const net::SchemefulSite embedding_site(description.embedding_origin);
+    const size_t hash =
+        base::HashInts(type_int, base::FastHash(embedding_site.Serialize()));
+    return base::HashInts(hash, base::FastHash(requesting_site.Serialize()));
+  }
+
+  const size_t hash = base::HashInts(
+      type_int, base::FastHash(description.embedding_origin.spec()));
+  return base::HashInts(hash, base::FastHash(description.origin.spec()));
 }
 
 WebTestPermissionManager::WebTestPermissionManager(
@@ -399,8 +424,10 @@
       browser_context_->GetDefaultStoragePartition()
           ->GetCookieManagerForBrowserProcess()
           ->SetStorageAccessGrantSettings(
-              GetContentSettings(permission.origin, permission.embedding_origin,
-                                 status),
+              GetContentSettings(
+                  URLToSchemefulSitePattern(permission.origin),
+                  URLToSchemefulSitePattern(permission.embedding_origin),
+                  status),
               base::BindOnce(std::move(permission_callback), /*success=*/true));
       break;
     case blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS: {
@@ -427,10 +454,14 @@
       browser_context_->GetDefaultStoragePartition()
           ->GetCookieManagerForBrowserProcess()
           ->SetAllStorageAccessSettings(
-              GetContentSettings(permission.origin, permission.embedding_origin,
-                                 status),
-              GetContentSettings(permission.origin, permission.embedding_origin,
-                                 status),
+              GetContentSettings(
+                  ContentSettingsPattern::FromURL(permission.origin),
+                  ContentSettingsPattern::FromURL(permission.embedding_origin),
+                  status),
+              GetContentSettings(
+                  ContentSettingsPattern::FromURL(permission.origin),
+                  ContentSettingsPattern::FromURL(permission.embedding_origin),
+                  status),
               base::BindOnce(barrier_callback, true));
       break;
     }
diff --git a/content/web_test/browser/web_test_permission_manager.h b/content/web_test/browser/web_test_permission_manager.h
index 0bb4e70..a015989 100644
--- a/content/web_test/browser/web_test_permission_manager.h
+++ b/content/web_test/browser/web_test_permission_manager.h
@@ -117,6 +117,10 @@
     PermissionDescription(blink::PermissionType type,
                           const GURL& origin,
                           const GURL& embedding_origin);
+    // Note that the comparison operator does not always require strict
+    // origin equality for the requesting and embedding origin. For permission
+    // types such as STORAGE_ACCESS_GRANT, which are scoped to (requesting
+    // site, embedding site), it will apply a same-site check instead.
     bool operator==(const PermissionDescription& other) const;
     bool operator!=(const PermissionDescription& other) const;
 
diff --git a/device/fido/features.cc b/device/fido/features.cc
index 65eb50b..86abdcb 100644
--- a/device/fido/features.cc
+++ b/device/fido/features.cc
@@ -57,10 +57,10 @@
              "WebAuthenticationCredProtectThree",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Added in M112. Disabled while we wait for Play Services support.
+// Added in M112. Enabled in M113. Remove in or after M116.
 BASE_FEATURE(kWebAuthnPRFAsAuthenticator,
              "WebAuthenticationPRFAsAuthenticator",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Added in M113. Remove in or after M116.
 BASE_FEATURE(kWebAuthnMacPlatformAuthenticatorOptionalUv,
@@ -69,6 +69,11 @@
 
 BASE_FEATURE(kWebAuthnPhoneConfirmationSheet,
              "WebAuthenticationPhoneConfirmationSheet",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
+// Add in M113. Remove in or after M116.
+BASE_FEATURE(kWebAuthnNewPrioritiesImpl,
+             "WebAuthenticationNewPrioritiesImpl",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 }  // namespace device
diff --git a/device/fido/features.h b/device/fido/features.h
index 10d0a15..3a384a6 100644
--- a/device/fido/features.h
+++ b/device/fido/features.h
@@ -70,6 +70,11 @@
 COMPONENT_EXPORT(DEVICE_FIDO)
 BASE_DECLARE_FEATURE(kWebAuthnPhoneConfirmationSheet);
 
+// Use the new implementation of mechanism priorities in
+// AuthenticatorRequestDialogModel.
+COMPONENT_EXPORT(DEVICE_FIDO)
+BASE_DECLARE_FEATURE(kWebAuthnNewPrioritiesImpl);
+
 }  // namespace device
 
 #endif  // DEVICE_FIDO_FEATURES_H_
diff --git a/device/fido/fido_request_handler_base.h b/device/fido/fido_request_handler_base.h
index cbe8323..962102b 100644
--- a/device/fido/fido_request_handler_base.h
+++ b/device/fido/fido_request_handler_base.h
@@ -146,7 +146,13 @@
 
     // request_is_internal_only indicates that this request can only be serviced
     // by internal authenticators (e.g. due to the attachment setting).
+    // See also `make_credential_attachment`.
     bool request_is_internal_only = false;
+
+    // make_credential_attachment contains the attachment preference for
+    // makeCredential requests. See also `request_is_internal_only`, which isn't
+    // specific to makeCredential requests.
+    absl::optional<AuthenticatorAttachment> make_credential_attachment;
   };
 
   class COMPONENT_EXPORT(DEVICE_FIDO) Observer {
diff --git a/device/fido/make_credential_request_handler.cc b/device/fido/make_credential_request_handler.cc
index f1ee4fff..613862c6 100644
--- a/device/fido/make_credential_request_handler.cc
+++ b/device/fido/make_credential_request_handler.cc
@@ -429,6 +429,8 @@
       options_.resident_key;
   transport_availability_info().request_is_internal_only =
       options_.authenticator_attachment == AuthenticatorAttachment::kPlatform;
+  transport_availability_info().make_credential_attachment =
+      options_.authenticator_attachment;
 
   base::flat_set<FidoTransportProtocol> allowed_transports =
       GetTransportsAllowedByRP(options.authenticator_attachment);
diff --git a/docs/ios/testing.md b/docs/ios/testing.md
index 9b019de..8a04bd74 100644
--- a/docs/ios/testing.md
+++ b/docs/ios/testing.md
@@ -87,7 +87,7 @@
 ```objc
 #import "ios_internal/chrome/test/earl_grey2/my_test_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -120,7 +120,6 @@
   deps = [
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/extensions/browser/event_router.cc b/extensions/browser/event_router.cc
index 8ef4527..fb97feb72 100644
--- a/extensions/browser/event_router.cc
+++ b/extensions/browser/event_router.cc
@@ -271,6 +271,18 @@
     process->RemoveObserver(this);
 }
 
+content::RenderProcessHost*
+EventRouter::GetRenderProcessHostForCurrentReceiver() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  auto* process = RenderProcessHost::FromID(receivers_.current_context());
+
+  // process might be nullptr when IPC race with RenderProcessHost destruction.
+  // This may only happen in scenarios that are already inherently racey, so
+  // returning nullptr (and dropping the IPC) is okay and won't lead to any
+  // additional risk of data loss.
+  return process;
+}
+
 BrowserContext* EventRouter::GetIncognitoContextIfAccessible(
     const std::string& extension_id) {
   DCHECK(!extension_id.empty());
@@ -298,8 +310,7 @@
 
 void EventRouter::AddListenerForMainThread(mojom::EventListenerParamPtr param,
                                            const std::string& event_name) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  auto* process = RenderProcessHost::FromID(receivers_.current_context());
+  auto* process = GetRenderProcessHostForCurrentReceiver();
   if (!process)
     return;
 
@@ -318,8 +329,7 @@
                                               const std::string& event_name,
                                               int64_t service_worker_version_id,
                                               int32_t worker_thread_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  auto* process = RenderProcessHost::FromID(receivers_.current_context());
+  auto* process = GetRenderProcessHostForCurrentReceiver();
   if (!process)
     return;
 
@@ -367,8 +377,7 @@
     const std::string& event_name,
     base::Value::Dict filter,
     bool add_lazy_listener) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  auto* process = RenderProcessHost::FromID(receivers_.current_context());
+  auto* process = GetRenderProcessHostForCurrentReceiver();
   if (!process)
     return;
 
@@ -384,8 +393,7 @@
     int32_t worker_thread_id,
     base::Value::Dict filter,
     bool add_lazy_listener) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  auto* process = RenderProcessHost::FromID(receivers_.current_context());
+  auto* process = GetRenderProcessHostForCurrentReceiver();
   if (!process)
     return;
 
@@ -403,8 +411,7 @@
 void EventRouter::RemoveListenerForMainThread(
     mojom::EventListenerParamPtr param,
     const std::string& event_name) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  auto* process = RenderProcessHost::FromID(receivers_.current_context());
+  auto* process = GetRenderProcessHostForCurrentReceiver();
   if (!process)
     return;
 
@@ -424,8 +431,7 @@
     const std::string& event_name,
     int64_t service_worker_version_id,
     int worker_thread_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  auto* process = RenderProcessHost::FromID(receivers_.current_context());
+  auto* process = GetRenderProcessHostForCurrentReceiver();
   if (!process)
     return;
 
@@ -473,8 +479,7 @@
     const std::string& event_name,
     base::Value::Dict filter,
     bool remove_lazy_listener) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  auto* process = RenderProcessHost::FromID(receivers_.current_context());
+  auto* process = GetRenderProcessHostForCurrentReceiver();
   if (!process)
     return;
 
@@ -491,8 +496,7 @@
     int32_t worker_thread_id,
     base::Value::Dict filter,
     bool remove_lazy_listener) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  auto* process = RenderProcessHost::FromID(receivers_.current_context());
+  auto* process = GetRenderProcessHostForCurrentReceiver();
   if (!process)
     return;
 
diff --git a/extensions/browser/event_router.h b/extensions/browser/event_router.h
index bf1add5..a7141360 100644
--- a/extensions/browser/event_router.h
+++ b/extensions/browser/event_router.h
@@ -373,6 +373,8 @@
       UserGestureState user_gesture,
       extensions::mojom::EventFilteringInfoPtr info);
 
+  content::RenderProcessHost* GetRenderProcessHostForCurrentReceiver();
+
   // Gets off-the-record browser context if
   //     - The extension has incognito mode set to "split"
   //     - The on-the-record browser context has an off-the-record context
diff --git a/fuchsia_web/shell/web_engine_shell.cc b/fuchsia_web/shell/web_engine_shell.cc
index 8f40c52..994ef716 100644
--- a/fuchsia_web/shell/web_engine_shell.cc
+++ b/fuchsia_web/shell/web_engine_shell.cc
@@ -166,13 +166,6 @@
   create_context_params.set_content_directories(
       {std::move(content_directories)});
 
-  // WebEngine Contexts can only make use of the services provided by the
-  // embedder application. By passing a handle to this process' service
-  // directory to the ContextProvider, we are allowing the Context access to the
-  // same set of services available to this application.
-  create_context_params.set_service_directory(
-      base::OpenDirectoryHandle(base::FilePath(base::kServiceDirectoryPath)));
-
   // Enable other WebEngine features.
   fuchsia::web::ContextFeatureFlags features =
       fuchsia::web::ContextFeatureFlags::AUDIO |
@@ -211,12 +204,20 @@
 
   if (use_context_provider) {
     // Connect to the system instance of the ContextProvider.
+    // WebEngine Contexts can only make use of the services provided by the
+    // embedder application. By passing a handle to this process' service
+    // directory to the ContextProvider, we are allowing the Context access to
+    // the same set of services available to this application.
+    create_context_params.set_service_directory(
+        base::OpenDirectoryHandle(base::FilePath(base::kServiceDirectoryPath)));
     web_context_provider = base::ComponentContextForProcess()
                                ->svc()
                                ->Connect<fuchsia::web::ContextProvider>();
     web_context_provider->Create(std::move(create_context_params),
                                  context.NewRequest());
   } else {
+    // Route services dynamically from web_engine_shell's parent down into
+    // created web_instances.
     web_instance_host = std::make_unique<WebInstanceHost>(
         *base::ComponentContextForProcess()->outgoing());
     if (enable_web_instance_tmp) {
diff --git a/fuchsia_web/webengine/BUILD.gn b/fuchsia_web/webengine/BUILD.gn
index d5f7c43..2926894 100644
--- a/fuchsia_web/webengine/BUILD.gn
+++ b/fuchsia_web/webengine/BUILD.gn
@@ -391,7 +391,7 @@
     "//base",
     "//components/fuchsia_component_support",
     "//fuchsia_web/common",
-    "//fuchsia_web/webinstance_host:webinstance_host_v1",
+    "//fuchsia_web/webinstance_host:webinstance_host",
     "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp",
     "//third_party/fuchsia-sdk/sdk/pkg/sys_inspect_cpp",
   ]
@@ -454,6 +454,17 @@
   data_deps = [ ":web_engine_exe" ]
 }
 
+fuchsia_component("web_instance_with_svc_directory_component") {
+  manifest = "web_instance_with_svc_directory.cml"
+  data_deps = [ ":web_engine_exe" ]
+
+  # Prevent inclusion of a shard with a `use` `protocol` block because this
+  # conflicts with the `/svc` directory `use` in this manifest.
+  # This component will not provide code coverage data until
+  # https://crbug.com/1426185 is fixed.
+  include_coverage_shard = false
+}
+
 fuchsia_component("web_instance_component_cfv1") {
   manifest = "web_instance.cmx"
   data_deps = [ ":web_engine_exe" ]
@@ -473,6 +484,7 @@
     ":context_provider_component",
     ":web_instance_component",
     ":web_instance_component_cfv1",
+    ":web_instance_with_svc_directory_component",
   ]
   excluded_files = _web_engine_excluded_files
   excluded_dirs = FUCHSIA_PACKAGED_CONTENT_EMBEDDER_EXCLUDED_DIRS
@@ -621,27 +633,6 @@
   }
 }
 
-# Creates a component manifest based on the production web_instance.cmx, with
-# the program name replaced with the web_engine_unittests binary name.
-action("web_engine_unittests_fake_instance_manifest") {
-  _manifest_input = "web_instance.cmx"
-  _manifest_output = "$target_gen_dir/web_engine_unittests_fake_instance.cmx"
-
-  script = "//build/config/fuchsia/build_cmx_from_fragment.py"
-
-  inputs = [ _manifest_input ]
-  outputs = [ _manifest_output ]
-
-  args = [
-    "--cmx-fragment",
-    rebase_path(_manifest_input),
-    "--cmx",
-    rebase_path(_manifest_output),
-    "--program",
-    "web_engine_unittests__exec",
-  ]
-}
-
 test("web_engine_unittests") {
   sources = [
     "browser/cookie_manager_impl_unittest.cc",
@@ -654,8 +645,6 @@
     "browser/url_request_rewrite_type_converters_unittest.cc",
     "browser/web_engine_config_unittest.cc",
     "context_provider_impl_unittest.cc",
-    "fake_context.cc",
-    "fake_context.h",
     "renderer/web_engine_audio_output_device_test.cc",
     "renderer/web_engine_audio_renderer_test.cc",
     "test/run_all_unittests.cc",
@@ -664,9 +653,11 @@
     ":context_provider",
     ":switches",
     ":web_engine_core",
-    ":web_engine_unittests_fake_instance_manifest",
+    "//base",
     "//base/test:test_support",
     "//build:chromecast_buildflags",
+    "//components/fuchsia_component_support",
+    "//components/fuchsia_component_support:test_support",
     "//components/url_rewrite/browser",
     "//components/url_rewrite/common",
     "//components/url_rewrite/mojom",
@@ -681,7 +672,9 @@
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.web:fuchsia.web_hlcpp",
+    "//third_party/fuchsia-sdk/sdk/pkg/fdio",
     "//third_party/fuchsia-sdk/sdk/pkg/scenic_cpp",
+    "//third_party/fuchsia-sdk/sdk/pkg/vfs_cpp",
     "//third_party/widevine/cdm:buildflags",
     "//ui/events:test_support",
     "//ui/ozone",
@@ -692,10 +685,6 @@
     "//build/config/fuchsia/test/network.shard.test-cml",
     "//build/config/fuchsia/test/sysmem.shard.test-cml",
   ]
-  additional_manifests = [
-    # Required by ContextProvider unit-tests to launch the FakeContext process.
-    "$target_gen_dir/web_engine_unittests_fake_instance.cmx",
-  ]
 }
 
 test("web_engine_integration_tests") {
diff --git a/fuchsia_web/webengine/context_provider.cml b/fuchsia_web/webengine/context_provider.cml
index e29d7b3..bd329f4 100644
--- a/fuchsia_web/webengine/context_provider.cml
+++ b/fuchsia_web/webengine/context_provider.cml
@@ -2,41 +2,32 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 {
-    include: [
-        "syslog/client.shard.cml",
+  include: [
+    "//fuchsia_web/webinstance_host/web_instance_host_with_svc_directory.shard.cml",
+    "syslog/client.shard.cml",
+  ],
+  program: {
+    runner: "elf",
+    binary: "web_engine_exe",
+    args: [
+      "--context-provider",
     ],
-    program: {
-        runner: "elf",
-        binary: "web_engine_exe",
-        args: [
-            "--context-provider",
-        ],
+  },
+  capabilities: [
+    {
+      protocol: [
+        "fuchsia.web.ContextProvider",
+        "fuchsia.web.Debug",
+      ],
     },
-    capabilities: [
-        {
-            protocol: [
-                "fuchsia.web.ContextProvider",
-                "fuchsia.web.Debug",
-            ],
-        },
-    ],
-    use: [
-        {
-            protocol: [
-                "fuchsia.feedback.ComponentDataRegister",
-                "fuchsia.feedback.CrashReportingProductRegister",
-                "fuchsia.sys.Environment",
-                "fuchsia.sys.Loader",
-            ],
-        },
-    ],
-    expose: [
-        {
-            protocol: [
-                "fuchsia.web.ContextProvider",
-                "fuchsia.web.Debug",
-            ],
-            from: "self",
-        },
-    ],
+  ],
+  expose: [
+    {
+      protocol: [
+        "fuchsia.web.ContextProvider",
+        "fuchsia.web.Debug",
+      ],
+      from: "self",
+    },
+  ],
 }
diff --git a/fuchsia_web/webengine/context_provider_impl.cc b/fuchsia_web/webengine/context_provider_impl.cc
index 51637b6a..d63e7dbb 100644
--- a/fuchsia_web/webengine/context_provider_impl.cc
+++ b/fuchsia_web/webengine/context_provider_impl.cc
@@ -10,7 +10,9 @@
 #include "base/command_line.h"
 #include "base/logging.h"
 
-ContextProviderImpl::ContextProviderImpl() = default;
+ContextProviderImpl::ContextProviderImpl(
+    sys::OutgoingDirectory& outgoing_directory)
+    : web_instance_host_(outgoing_directory) {}
 
 ContextProviderImpl::~ContextProviderImpl() = default;
 
@@ -40,5 +42,5 @@
 }
 
 fuchsia::web::Debug* ContextProviderImpl::debug_api() {
-  return web_instance_host_.debug_api();
+  return &web_instance_host_.debug_api();
 }
diff --git a/fuchsia_web/webengine/context_provider_impl.h b/fuchsia_web/webengine/context_provider_impl.h
index 95dae19..fe71e006 100644
--- a/fuchsia_web/webengine/context_provider_impl.h
+++ b/fuchsia_web/webengine/context_provider_impl.h
@@ -8,12 +8,20 @@
 #include <fuchsia/web/cpp/fidl.h>
 
 #include "fuchsia_web/webengine/web_engine_export.h"
-#include "fuchsia_web/webinstance_host/web_instance_host_v1.h"
+#include "fuchsia_web/webinstance_host/web_instance_host.h"
+
+namespace sys {
+class OutgoingDirectory;
+}  // namespace sys
 
 class WEB_ENGINE_EXPORT ContextProviderImpl
     : public fuchsia::web::ContextProvider {
  public:
-  ContextProviderImpl();
+  // The impl will offer capabilities to child instances via
+  // `outgoing_directory`. ContextProviderImpl owners must serve the directory
+  // before creating web instances, and must ensure that the directory outlives
+  // the ContextProviderImpl instance.
+  explicit ContextProviderImpl(sys::OutgoingDirectory& outgoing_directory);
   ~ContextProviderImpl() override;
 
   ContextProviderImpl(const ContextProviderImpl&) = delete;
@@ -29,7 +37,7 @@
 
  private:
   // Manages an isolated Environment, and the web instances hosted within it.
-  WebInstanceHostV1 web_instance_host_;
+  WebInstanceHost web_instance_host_;
 };
 
 #endif  // FUCHSIA_WEB_WEBENGINE_CONTEXT_PROVIDER_IMPL_H_
diff --git a/fuchsia_web/webengine/context_provider_impl_unittest.cc b/fuchsia_web/webengine/context_provider_impl_unittest.cc
index cf6d35e3..0d03a3722 100644
--- a/fuchsia_web/webengine/context_provider_impl_unittest.cc
+++ b/fuchsia_web/webengine/context_provider_impl_unittest.cc
@@ -4,682 +4,777 @@
 
 #include "fuchsia_web/webengine/context_provider_impl.h"
 
-#include <fuchsia/sys/cpp/fidl_test_base.h>
 #include <fuchsia/web/cpp/fidl.h>
 #include <lib/fdio/directory.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/sys/cpp/component_context.h>
+#include <lib/fdio/namespace.h>
+#include <lib/fidl/cpp/binding_set.h>
 #include <lib/sys/cpp/outgoing_directory.h>
-#include <lib/zx/socket.h>
-#include <zircon/processargs.h>
+#include <lib/vfs/cpp/pseudo_dir.h>
+#include <lib/vfs/cpp/service.h>
+#include <zircon/status.h>
 #include <zircon/types.h>
 
-#include <functional>
+#include <map>
+#include <memory>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "base/base_switches.h"
 #include "base/command_line.h"
-#include "base/files/file.h"
+#include "base/containers/contains.h"
+#include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/fuchsia/file_utils.h"
-#include "base/fuchsia/fuchsia_logging.h"
-#include "base/fuchsia/process_context.h"
-#include "base/fuchsia/scoped_service_binding.h"
 #include "base/fuchsia/test_component_context_for_process.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
-#include "base/functional/callback_helpers.h"
-#include "base/path_service.h"
-#include "base/strings/strcat.h"
-#include "base/test/bind.h"
-#include "base/test/multiprocess_test.h"
+#include "base/memory/raw_ptr.h"
+#include "base/memory/raw_ref.h"
+#include "base/message_loop/message_pump_type.h"
+#include "base/run_loop.h"
 #include "base/test/task_environment.h"
-#include "base/test/test_timeouts.h"
-#include "build/build_config.h"
-#include "build/chromecast_buildflags.h"
-#include "fuchsia_web/webengine/fake_context.h"
+#include "base/threading/thread.h"
+#include "components/fuchsia_component_support/append_arguments_from_file.h"
+#include "components/fuchsia_component_support/mock_realm.h"
 #include "fuchsia_web/webengine/switches.h"
 #include "services/network/public/cpp/network_switches.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-#include "third_party/widevine/cdm/buildflags.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace {
 
+using ::testing::_;
+using ::testing::Not;
+
 constexpr char kTestDataFileIn[] = "DataFileIn";
 constexpr char kTestDataFileOut[] = "DataFileOut";
 
-constexpr char kUrl[] = "chrome://:emorhc";
-constexpr char kTitle[] = "Palindrome";
-
 constexpr uint64_t kTestQuotaBytes = 1024;
 constexpr char kTestQuotaBytesSwitchValue[] = "1024";
 
-MULTIPROCESS_TEST_MAIN(SpawnContextServer) {
-  base::test::SingleThreadTaskEnvironment task_environment(
-      base::test::SingleThreadTaskEnvironment::MainThreadType::IO);
+// A fake implementation of fuchsia.component/Realm.
+class FakeRealm {
+ public:
+  class Delegate {
+   public:
+    virtual ~Delegate() = default;
+    virtual void OnChildInstanceCreated(const std::string& name) = 0;
 
-  LOG(INFO) << "SpawnContextServer test component started.";
+   protected:
+    Delegate() = default;
+  };
 
-  base::FilePath data_dir(base::kPersistedDataDirectoryPath);
-  if (base::PathExists(data_dir.AppendASCII(kTestDataFileIn))) {
-    auto out_file = data_dir.AppendASCII(kTestDataFileOut);
-    EXPECT_EQ(base::WriteFile(out_file, nullptr, 0), 0);
+  explicit FakeRealm(Delegate& delegate) : delegate_(delegate) {}
+  FakeRealm(const FakeRealm&) = delete;
+  FakeRealm& operator=(const FakeRealm&) = delete;
+  ~FakeRealm() = default;
+
+  // Returns true if the realm has no child instances.
+  bool empty() const { return instances_.empty(); }
+
+  // Sets a callback that will be run when the realm's last child is deleted.
+  void set_on_empty_callback(base::OnceClosure on_empty_callback) {
+    on_empty_callback_ = std::move(on_empty_callback);
   }
 
-  // Publish the fake fuchsia.web.Context implementation for the test to use.
-  FakeContext context;
-  fidl::BindingSet<fuchsia::web::Context> bindings;
-  base::ComponentContextForProcess()->outgoing()->AddPublicService(
-      bindings.GetHandler(&context), "fuchsia.web.Context");
-  base::ComponentContextForProcess()->outgoing()->ServeFromStartupInfo();
+  // Saves copies of `child_decl` and `args` for subsequent validation by tests.
+  void CreateChild(const fuchsia::component::decl::Child& child_decl,
+                   const fuchsia::component::CreateChildArgs& args) {
+    ASSERT_TRUE(!base::Contains(instances_, child_decl.name()));
 
-  // When a Frame's NavigationEventListener is bound, immediately broadcast a
-  // navigation event to its listeners.
-  context.set_on_create_frame_callback(
-      base::BindRepeating([](FakeFrame* frame) {
-        frame->set_on_set_listener_callback(base::BindOnce(
-            [](FakeFrame* frame) {
-              fuchsia::web::NavigationState state;
-              state.set_url(kUrl);
-              state.set_title(kTitle);
-              frame->listener()->OnNavigationStateChanged(std::move(state),
-                                                          []() {});
-            },
-            frame));
-      }));
+    auto& child = instances_[child_decl.name()];
+    child.decl = std::make_unique<fuchsia::component::decl::Child>();
+    ASSERT_EQ(child_decl.Clone(child.decl.get()), ZX_OK);
+    child.args = std::make_unique<fuchsia::component::CreateChildArgs>();
+    ASSERT_EQ(args.Clone(child.args.get()), ZX_OK);
+  }
 
-  // Quit the process when the context is destroyed.
-  base::RunLoop run_loop;
-  bindings.set_empty_set_handler(
-      [quit_loop = run_loop.QuitClosure()]() { quit_loop.Run(); });
-  run_loop.Run();
+  // Satisfies a request for `child_ref`'s dir by serving a PseudoDir on the
+  // current thread containing entries for the Binder and Context protocols.
+  // When the client connects to the last of these protocols, the realm
+  // delegate's `OnChildInstanceCreated` method is called with the child's name.
+  void OpenExposedDir(
+      fuchsia::component::decl::ChildRef child_ref,
+      fidl::InterfaceRequest<fuchsia::io::Directory> exposed_dir,
+      fidl::InterfaceRequest<fuchsia::component::Binder>& binder_request,
+      fidl::InterfaceRequest<fuchsia::web::Context>& context_request) {
+    auto it = instances_.find(child_ref.name);
+    ASSERT_FALSE(it == instances_.end());
 
-  return 0;
+    auto& child = it->second;
+
+    // Publish a fake Binder to the child's exposed directory to capture the
+    // host's request so that the test may close it to trigger child
+    // destruction.
+    child.instances.AddEntry(
+        fuchsia::component::Binder::Name_,
+        std::make_unique<vfs::Service>([&binder_request](zx::channel request,
+                                                         async_dispatcher_t*) {
+          binder_request = fidl::InterfaceRequest<fuchsia::component::Binder>(
+              std::move(request));
+        }));
+
+    // Publish a fake Context that triggers notifying the delegate.
+    child.instances.AddEntry(
+        fuchsia::web::Context::Name_,
+        std::make_unique<vfs::Service>(
+            [&context_request, delegate = delegate_, name = child_ref.name](
+                zx::channel request, async_dispatcher_t*) {
+              context_request = fidl::InterfaceRequest<fuchsia::web::Context>(
+                  std::move(request));
+              delegate->OnChildInstanceCreated(name);
+            }));
+
+    child.instances.Serve(fuchsia::io::OpenFlags::RIGHT_READABLE |
+                              fuchsia::io::OpenFlags::RIGHT_WRITABLE,
+                          exposed_dir.TakeChannel());
+  }
+
+  // Destroys the child and runs the `on_empty_callback` if none remain.
+  void DestroyChild(fuchsia::component::decl::ChildRef child) {
+    ASSERT_EQ(instances_.erase(child.name), 1u);
+    if (instances_.empty() && on_empty_callback_) {
+      std::move(on_empty_callback_).Run();
+    }
+  }
+
+  // Returns true if the realm has a child with the same name as `child`.
+  bool HasChild(const fuchsia::component::decl::Child& child) {
+    return base::Contains(instances_, child.name());
+  }
+
+  // Returns true if the realm has a child with the same name as `child`.
+  bool HasChild(const fuchsia::component::decl::ChildRef& child) {
+    return base::Contains(instances_, child.name);
+  }
+
+  // Returns the component declaration used to create the child named `name`.
+  const fuchsia::component::decl::Child& GetChildDecl(const std::string& name) {
+    return *instances_[name].decl;
+  }
+
+  // Returns the args used to create the child named `name`.
+  const fuchsia::component::CreateChildArgs& GetChildArgs(
+      const std::string& name) {
+    return *instances_[name].args;
+  }
+
+ private:
+  struct Child {
+    vfs::PseudoDir instances;
+    std::unique_ptr<fuchsia::component::decl::Child> decl;
+    std::unique_ptr<fuchsia::component::CreateChildArgs> args;
+  };
+
+  const raw_ref<Delegate> delegate_;
+  std::map<std::string, Child> instances_;
+  base::OnceClosure on_empty_callback_;
+};
+
+class MockFakeRealmDelegate : public FakeRealm::Delegate {
+ public:
+  MOCK_METHOD(void,
+              OnChildInstanceCreated,
+              (const std::string& name),
+              (override));
+};
+
+// Returns true if `arg` (a fuchsia::component::decl::CollectionRef) references
+// `name`.
+MATCHER_P(CollectionNameIs, name, "") {
+  return arg.name == name;
 }
 
-// Fake implementation of the Launcher for the isolated environment in which
-// web instance Components are launched.
-class FakeSysLauncher final : public fuchsia::sys::testing::Launcher_TestBase {
- public:
-  using CreateComponentCallback =
-      base::OnceCallback<void(const base::CommandLine&)>;
+// Returns true if the URL of `arg` (a fuchsia::component::decl::Child) is
+// `url`.
+MATCHER_P(UrlIs, url, "") {
+  return arg.has_url() && arg.url() == url;
+}
 
-  explicit FakeSysLauncher(fuchsia::sys::Launcher* real_launcher)
-      : real_launcher_(real_launcher) {}
-  ~FakeSysLauncher() override = default;
+// Returns true if `realm` knows `arg`.
+MATCHER_P(IsInRealm, realm, "") {
+  return realm->HasChild(arg);
+}
 
-  void set_create_component_callback(CreateComponentCallback callback) {
-    create_component_callback_ = std::move(callback);
+// Returns true if `arg` (a fuchsia::component::CreateChildArgs) has a dynamic
+// directory offer for `name`.
+MATCHER_P2(HasDynamicDirectoryOffer, name, is_writeable, "") {
+  if (!arg.has_dynamic_offers()) {
+    return false;
   }
-
-  void Bind(fidl::InterfaceRequest<fuchsia::sys::Launcher> request) {
-    bindings_.AddBinding(this, std::move(request));
-  }
-
-  // fuchsia::sys::Launcher implementation.
-  void CreateComponent(fuchsia::sys::LaunchInfo launch_info,
-                       fidl::InterfaceRequest<fuchsia::sys::ComponentController>
-                           request) override {
-    // |arguments| should not include argv[0] (i.e. the program name), which
-    // would be empty in a no-program CommandLine instance. Verify that the
-    // |arguments| are either empty or have a non-empty first element.
-    EXPECT_TRUE(launch_info.arguments->empty() ||
-                !launch_info.arguments->at(0).empty());
-
-    // |arguments| omits argv[0] so cannot be used directly to initialize a
-    // CommandLine, but CommandLine provides useful switch processing logic.
-    // Prepend an empty element to a copy of |arguments| and use that to create
-    // a valid CommandLine.
-    std::vector<std::string> command_line_args(*launch_info.arguments);
-    command_line_args.emplace(command_line_args.begin());
-    const base::CommandLine command_line(command_line_args);
-    CHECK(!command_line.HasSwitch(switches::kTestChildProcess));
-
-    // If a create-component-callback is specified then there is no need to
-    // actually launch a component.
-    if (create_component_callback_) {
-      std::move(create_component_callback_).Run(command_line);
-      return;
+  for (const auto& offer : arg.dynamic_offers()) {
+    if (offer.is_directory() && offer.directory().has_target_name() &&
+        offer.directory().target_name() == name &&
+        offer.directory().has_rights() &&
+        offer.directory().rights() == (is_writeable
+                                           ? fuchsia::io::RW_STAR_DIR
+                                           : fuchsia::io::R_STAR_DIR)) {
+      return true;
     }
-
-    // Otherwise, launch another instance of this test executable, configured to
-    // run as a test child (similar to SpawnMultiProcessTestChild()). The
-    // test-suite's component manifest cannot be re-used for this because it
-    // specifies the "isolated-persistent-data" feature, causing the framework
-    // to populate /data, which prevents the |data_directory| supplied in the
-    // CreateContextParams from being mapped.
-    // Launch the component via a fake manifest identical to the one used for
-    // web instances, but which runs this test executable.
-    EXPECT_EQ(launch_info.url,
-              "fuchsia-pkg://fuchsia.com/web_engine#meta/web_instance.cmx");
-    launch_info.url =
-        "fuchsia-pkg://fuchsia.com/web_engine_unittests#meta/"
-        "web_engine_unittests_fake_instance.cmx";
-    launch_info.arguments->push_back(base::StrCat(
-        {"--", switches::kTestChildProcess, "=SpawnContextServer"}));
-
-    // Bind /tmp in the new Component's flat namespace, to allow it to see
-    // the GTest flagfile, if any.
-    fuchsia::io::DirectoryHandle tmp_directory;
-    zx_status_t status = fdio_open(
-        "/tmp", static_cast<uint32_t>(fuchsia::io::OpenFlags::RIGHT_READABLE),
-        tmp_directory.NewRequest().TakeChannel().release());
-    ZX_CHECK(status == ZX_OK, status) << "fdio_open(/tmp)";
-    launch_info.flat_namespace->paths.push_back("/tmp");
-    launch_info.flat_namespace->directories.push_back(std::move(tmp_directory));
-
-    // Redirect the sub-process Component's stderr to feed into the test output.
-    launch_info.err = fuchsia::sys::FileDescriptor::New();
-    launch_info.err->type0 = PA_FD;
-    status = fdio_fd_clone(STDERR_FILENO,
-                           launch_info.err->handle0.reset_and_get_address());
-    ZX_CHECK(status == ZX_OK, status);
-
-    real_launcher_->CreateComponent(std::move(launch_info), std::move(request));
   }
+  return false;
+}
 
- private:
-  void NotImplemented_(const std::string& name) override {
-    ADD_FAILURE() << "Unexpected call: " << name;
-  }
-
-  fidl::BindingSet<fuchsia::sys::Launcher> bindings_;
-  fuchsia::sys::Launcher* const real_launcher_;
-  CreateComponentCallback create_component_callback_;
-};
-
-// Fake implementation of the isolated Environment created by ContextProvider.
-class FakeNestedSysEnvironment
-    : public fuchsia::sys::testing::Environment_TestBase {
- public:
-  explicit FakeNestedSysEnvironment(FakeSysLauncher* fake_launcher)
-      : fake_launcher_(fake_launcher) {}
-  ~FakeNestedSysEnvironment() override = default;
-
-  void Bind(fidl::InterfaceRequest<fuchsia::sys::Environment> request) {
-    bindings_.AddBinding(this, std::move(request));
-  }
-
-  // fuchsia::sys::Environment implementation.
-  void GetLauncher(fidl::InterfaceRequest<fuchsia::sys::Launcher>
-                       launcher_request) override {
-    fake_launcher_->Bind(std::move(launcher_request));
-  }
-
- private:
-  void NotImplemented_(const std::string& name) override {
-    ADD_FAILURE() << "Unexpected call: " << name;
-  }
-
-  FakeSysLauncher* const fake_launcher_;
-  fidl::BindingSet<fuchsia::sys::Environment> bindings_;
-};
-
-// Fake implementation of the Environment in which the ContextProvider runs.
-class FakeSysEnvironment final
-    : public fuchsia::sys::testing::Environment_TestBase {
- public:
-  FakeSysEnvironment(sys::OutgoingDirectory* outgoing_directory,
-                     fuchsia::sys::Launcher* real_launcher)
-      : bindings_(outgoing_directory, this),
-        fake_launcher_(real_launcher),
-        fake_nested_environment_(&fake_launcher_) {}
-  ~FakeSysEnvironment() override = default;
-
-  FakeSysLauncher& fake_launcher() { return fake_launcher_; }
-
-  // fuchsia::sys::Environment implementation.
-  void CreateNestedEnvironment(
-      fidl::InterfaceRequest<fuchsia::sys::Environment> environment_request,
-      fidl::InterfaceRequest<fuchsia::sys::EnvironmentController>
-          controller_request,
-      std::string label,
-      fuchsia::sys::ServiceListPtr additional_services,
-      fuchsia::sys::EnvironmentOptions options) override {
-    EXPECT_TRUE(environment_request);
-    EXPECT_TRUE(controller_request);
-    EXPECT_FALSE(label.empty());
-
-    // The nested environment should receive only the Loader service.
-    ASSERT_TRUE(additional_services);
-    ASSERT_EQ(additional_services->names.size(), 1u);
-    EXPECT_EQ(additional_services->names[0], "fuchsia.sys.Loader");
-    EXPECT_TRUE(additional_services->host_directory);
-
-    EXPECT_FALSE(options.inherit_parent_services);
-    EXPECT_FALSE(options.use_parent_runners);
-    EXPECT_TRUE(options.delete_storage_on_death);
-
-    fake_nested_environment_.Bind(std::move(environment_request));
-    nested_environment_controller_request_ = std::move(controller_request);
-  }
-  void GetDirectory(
-      fidl::InterfaceRequest<::fuchsia::io::Directory> request) override {
-    base::ComponentContextForProcess()->svc()->CloneChannel(std::move(request));
-  }
-
- private:
-  void NotImplemented_(const std::string& name) override {
-    ADD_FAILURE() << "Unexpected call: " << name;
-  }
-
-  base::ScopedServiceBinding<fuchsia::sys::Environment> bindings_;
-  FakeSysLauncher fake_launcher_;
-  FakeNestedSysEnvironment fake_nested_environment_;
-
-  fidl::InterfaceRequest<fuchsia::sys::EnvironmentController>
-      nested_environment_controller_request_;
-};
-
+// Returns a primitive `CreateContextParams` configured to pass the test
+// component's service directory as the service directory to be used by the
+// context.
 fuchsia::web::CreateContextParams BuildCreateContextParams() {
   fuchsia::web::CreateContextParams output;
   zx_status_t result = fdio_service_connect(
       base::kServiceDirectoryPath,
       output.mutable_service_directory()->NewRequest().TakeChannel().release());
-  ZX_CHECK(result == ZX_OK, result) << "Failed to open /svc";
+  EXPECT_EQ(result, ZX_OK) << "Failed to open /svc";
   return output;
 }
 
+// Returns a handle to the test component's `/cache` directory.
 fidl::InterfaceHandle<fuchsia::io::Directory> OpenCacheDirectory() {
   fidl::InterfaceHandle<fuchsia::io::Directory> cache_handle;
   zx_status_t result =
       fdio_service_connect(base::kPersistedCacheDirectoryPath,
                            cache_handle.NewRequest().TakeChannel().release());
-  ZX_CHECK(result == ZX_OK, result) << "Failed to open /cache";
+  EXPECT_EQ(result, ZX_OK) << "Failed to open /cache";
   return cache_handle;
 }
 
 }  // namespace
 
-class ContextProviderImplTest : public base::MultiProcessTest {
- public:
-  ContextProviderImplTest()
-      : sys_launcher_(base::ComponentContextForProcess()
-                          ->svc()
-                          ->Connect<fuchsia::sys::Launcher>()),
-        fake_environment_(test_component_context_.additional_services(),
-                          sys_launcher_.get()),
-        provider_(std::make_unique<ContextProviderImpl>()) {
-    bindings_.AddBinding(provider_.get(), provider_ptr_.NewRequest());
-  }
-
-  ContextProviderImplTest(const ContextProviderImplTest&) = delete;
-  ContextProviderImplTest& operator=(const ContextProviderImplTest&) = delete;
-
-  ~ContextProviderImplTest() override {
-    provider_ptr_.Unbind();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  // Check if a Context is responsive by creating a Frame from it and then
-  // listening for an event.
-  void CheckContextResponsive(
-      fidl::InterfacePtr<fuchsia::web::Context>* context) {
-    // Call a Context method and wait for it to invoke a listener call.
-    base::RunLoop run_loop;
-    context->set_error_handler(
-        [quit_loop = run_loop.QuitClosure()](zx_status_t status) {
-          quit_loop.Run();
-          ZX_LOG(ERROR, status) << " Context lost.";
-          ADD_FAILURE();
-        });
-
-    fuchsia::web::FramePtr frame_ptr;
-    frame_ptr.set_error_handler(
-        [quit_loop = run_loop.QuitClosure()](zx_status_t status) {
-          quit_loop.Run();
-          ZX_LOG(ERROR, status) << " Frame lost.";
-          ADD_FAILURE();
-        });
-    (*context)->CreateFrame(frame_ptr.NewRequest());
-
-    // Create a Frame and expect to see a navigation event.
-    CapturingNavigationStateObserver change_listener(run_loop.QuitClosure());
-    fidl::Binding<fuchsia::web::NavigationEventListener>
-        change_listener_binding(&change_listener);
-    frame_ptr->SetNavigationEventListener2(change_listener_binding.NewBinding(),
-                                           /*flags=*/{});
-    run_loop.Run();
-
-    ASSERT_TRUE(change_listener.captured_state()->has_url());
-    EXPECT_EQ(change_listener.captured_state()->url(), kUrl);
-    ASSERT_TRUE(change_listener.captured_state()->has_title());
-    EXPECT_EQ(change_listener.captured_state()->title(), kTitle);
-  }
-
-  // Checks that the Context channel was dropped.
-  void CheckContextUnresponsive(
-      fidl::InterfacePtr<fuchsia::web::Context>* context) {
-    base::RunLoop run_loop;
-    context->set_error_handler(
-        [quit_loop = run_loop.QuitClosure()](zx_status_t status) {
-          quit_loop.Run();
-          EXPECT_EQ(status, ZX_ERR_PEER_CLOSED);
-        });
-
-    fuchsia::web::FramePtr frame;
-    (*context)->CreateFrame(frame.NewRequest());
-
-    // The error handler should be called here.
-    run_loop.Run();
-  }
-
+class ContextProviderImplTest : public ::testing::Test {
  protected:
+  ContextProviderImplTest()
+      : service_thread_("outgoing server"),
+        mock_realm_(test_component_context_.additional_services()) {
+    provider_.emplace(outgoing_directory_);
+    bindings_.AddBinding(&provider_.value(), provider_ptr_.NewRequest());
+  }
+
+  static void SetUpTestSuite() {
+    // Need to do this once on the main thread before spinning off others.
+    base::PlatformThread::SetCurrentThreadType(base::ThreadType::kDefault);
+  }
+
+  void SetUp() override {
+    // Serve the context provider's outgoing directory on the service thread.
+    ASSERT_TRUE(
+        service_thread_.StartWithOptions({base::MessagePumpType::IO, 0}));
+    fidl::InterfaceHandle<fuchsia::io::Directory> handle;
+    service_thread_.task_runner()->PostTask(
+        FROM_HERE,
+        base::BindOnce(
+            [](sys::OutgoingDirectory* dir,
+               fidl::InterfaceRequest<fuchsia::io::Directory> request) {
+              dir->Serve(std::move(request));
+            },
+            base::Unretained(&outgoing_directory_), handle.NewRequest()));
+    service_thread_.FlushForTesting();
+
+    // Install the outgoing directory in the test's namespace for inspection.
+    fdio_ns_t* ns = nullptr;
+    ASSERT_EQ(::fdio_ns_get_installed(&ns), ZX_OK);
+    global_namespace_ = ns;
+    ASSERT_EQ(::fdio_ns_bind(global_namespace_, kTestOutgoingPath,
+                             handle.TakeChannel().release()),
+              ZX_OK);
+  }
+
+  void TearDown() override {
+    // Shut down the ContextProvider.
+    provider_ptr_.Unbind();
+    provider_.reset();
+
+    // Wait for all children to be destroyed before the mock is destroyed.
+    if (!fake_realm_.empty()) {
+      base::RunLoop run_loop;
+      fake_realm_.set_on_empty_callback(run_loop.QuitClosure());
+      run_loop.Run();
+    }
+
+    ASSERT_EQ(::fdio_ns_unbind(global_namespace_, kTestOutgoingPath), ZX_OK);
+  }
+
+  // Add expectations to the MockRealm for creation and destruction of a single
+  // child web_instance, invoking the respective methods on the test's
+  // FakeRealm. `binder_request` and `context_request` capture the request
+  // channels for the Binder and Context protocols, respectively.
+  void ExpectChildInstance(
+      fidl::InterfaceRequest<fuchsia::component::Binder>& binder_request,
+      fidl::InterfaceRequest<fuchsia::web::Context>& context_request) {
+    ::testing::InSequence sequence;
+
+    EXPECT_CALL(mock_realm_, CreateChild(CollectionNameIs("web_instances"),
+                                         Not(IsInRealm(&fake_realm_)), _, _))
+        .WillOnce([this](const auto& collection, const auto& decl,
+                         const auto& args, auto callback) {
+          fake_realm_.CreateChild(decl, args);
+          callback(
+              fuchsia::component::Realm_CreateChild_Result::WithResponse({}));
+        })
+        .RetiresOnSaturation();
+
+    EXPECT_CALL(mock_realm_, OpenExposedDir(IsInRealm(&fake_realm_), _, _))
+        .WillOnce([this, &binder_request, &context_request](
+                      const auto& child, auto dir_request, auto callback) {
+          fake_realm_.OpenExposedDir(child, std::move(dir_request),
+                                     binder_request, context_request);
+          callback(
+              fuchsia::component::Realm_OpenExposedDir_Result::WithResponse(
+                  {}));
+        })
+        .RetiresOnSaturation();
+
+    EXPECT_CALL(mock_realm_, DestroyChild(IsInRealm(&fake_realm_), _))
+        .WillOnce([this](const auto& child, auto callback) {
+          fake_realm_.DestroyChild(child);
+          callback(
+              fuchsia::component::Realm_DestroyChild_Result::WithResponse({}));
+        })
+        .RetiresOnSaturation();
+  }
+
+  // Calls on `provider` to create a new web instance and waits for its
+  // creation. Returns the name of the newly-created instance.
+  std::string CreateAndWaitForInstance(
+      fuchsia::web::ContextProvider& provider,
+      fuchsia::web::CreateContextParams create_params,
+      fuchsia::web::ContextPtr& context_ptr) {
+    base::RunLoop run_loop;
+
+    // Terminate the loop if there's an error reported via the Context pointer.
+    context_ptr.set_error_handler(
+        [quit_loop = run_loop.QuitClosure()](zx_status_t error_status) {
+          ADD_FAILURE() << "Context unexpectedly closed while waiting for "
+                           "instance: "
+                        << zx_status_get_string(error_status);
+          quit_loop.Run();
+        });
+
+    provider.Create(std::move(create_params), context_ptr.NewRequest());
+
+    // Pump events until the child instance is created and capture its name.
+    std::string instance_name;
+    EXPECT_CALL(mock_fake_realm_delegate_, OnChildInstanceCreated(_))
+        .WillOnce([&instance_name, quit_loop = run_loop.QuitClosure()](
+                      const std::string& name) {
+          instance_name = name;
+          quit_loop.Run();
+        });
+    run_loop.Run();
+    ::testing::Mock::VerifyAndClearExpectations(&mock_fake_realm_delegate_);
+
+    // Clear the error handler since the loop is no longer running.
+    context_ptr.set_error_handler({});
+
+    return instance_name;
+  }
+
+  // Waits for the Context channel to be closed and returns the associated
+  // error or Epitaph.
+  zx_status_t WaitForContextClosedStatus(
+      fidl::InterfacePtr<fuchsia::web::Context>& context) {
+    zx_status_t status = ZX_OK;
+    base::RunLoop run_loop;
+    context.set_error_handler(
+        [&status, quit_loop = run_loop.QuitClosure()](zx_status_t error) {
+          status = error;
+          quit_loop.Run();
+        });
+    run_loop.Run();
+    return status;
+  }
+
+  // Returns the component declaration used to create the child named `name`.
+  const fuchsia::component::decl::Child& GetInstanceDecl(
+      const std::string& name) {
+    return fake_realm_.GetChildDecl(name);
+  }
+
+  // Returns the args used to create the child named `name`.
+  const fuchsia::component::CreateChildArgs& GetInstanceArgs(
+      const std::string& name) {
+    return fake_realm_.GetChildArgs(name);
+  }
+
+  // Returns the path to the directory in the test's namespace holding dynamic
+  // directory offers for the named instance.
+  static base::FilePath GetInstanceDirectory(const std::string& name) {
+    return base::FilePath(kTestOutgoingPath)
+        .AppendASCII("web_instances")
+        .AppendASCII(name);
+  }
+
+  // Returns the command line passed to the named instance.
+  static base::CommandLine GetInstanceCommandLine(const std::string& name) {
+    base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+    EXPECT_TRUE(fuchsia_component_support::AppendArgumentsFromFile(
+        GetInstanceDirectory(name)
+            .AppendASCII("command-line-config")
+            .AppendASCII("argv.json"),
+        command_line));
+    return command_line;
+  }
+
+  fuchsia::web::ContextProvider& context_provider() { return *provider_ptr_; }
+
+  void BindContextProvider(
+      fidl::InterfaceRequest<fuchsia::web::ContextProvider> request) {
+    bindings_.AddBinding(&provider_.value(), std::move(request));
+  }
+
+ private:
+  // The path in the test's namespace where the outgoing directory given to
+  // ContextProvider is bound for the sake of analysis.
+  static constexpr char kTestOutgoingPath[] = "/test_outgoing_path";
+
   base::test::SingleThreadTaskEnvironment task_environment_{
       base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
 
-  // fuchsia.sys.Launcher member must be constructed before the test component
-  // context replaces the process' component context.
-  fuchsia::sys::LauncherPtr sys_launcher_;
+  raw_ptr<fdio_ns_t> global_namespace_ = nullptr;
+  sys::OutgoingDirectory outgoing_directory_;
+  // The thread serving `outgoing_directory_` must be destroyed before the
+  // directory itself.
+  base::Thread service_thread_;
+
+  ::testing::StrictMock<MockFakeRealmDelegate> mock_fake_realm_delegate_;
+  FakeRealm fake_realm_{mock_fake_realm_delegate_};
 
   // Used to replace the process component context with one providing a fake
-  // fuchsia.sys.Environment, through which a nested Environment and fake
-  // Launcher are obtained.
+  // fuchsia.component.Realm.
   base::TestComponentContextForProcess test_component_context_;
-  FakeSysEnvironment fake_environment_;
 
-  std::unique_ptr<ContextProviderImpl> provider_;
-  fuchsia::web::ContextProviderPtr provider_ptr_;
+  // A mock fuchsia::component/Realm used to bridge to `fake_realm_`.
+  ::testing::StrictMock<fuchsia_component_support::MockRealm> mock_realm_;
   fidl::BindingSet<fuchsia::web::ContextProvider> bindings_;
-
- private:
-  struct CapturingNavigationStateObserver
-      : public fuchsia::web::NavigationEventListener {
-   public:
-    explicit CapturingNavigationStateObserver(base::OnceClosure on_change_cb)
-        : on_change_cb_(std::move(on_change_cb)) {}
-    ~CapturingNavigationStateObserver() override = default;
-
-    void OnNavigationStateChanged(
-        fuchsia::web::NavigationState change,
-        OnNavigationStateChangedCallback callback) override {
-      captured_state_ = std::move(change);
-      std::move(on_change_cb_).Run();
-    }
-
-    fuchsia::web::NavigationState* captured_state() { return &captured_state_; }
-
-   private:
-    base::OnceClosure on_change_cb_;
-    fuchsia::web::NavigationState captured_state_;
-  };
+  absl::optional<ContextProviderImpl> provider_;
+  fuchsia::web::ContextProviderPtr provider_ptr_;
 };
 
-TEST_F(ContextProviderImplTest, CanCreateContext) {
-  // Connect to a new context process.
-  fidl::InterfacePtr<fuchsia::web::Context> context;
-  fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
-  provider_ptr_->Create(std::move(create_params), context.NewRequest());
-  CheckContextResponsive(&context);
+TEST_F(ContextProviderImplTest, CanCreateContextWithServiceDirectory) {
+  fidl::InterfaceRequest<fuchsia::component::Binder> binder_request;
+  fidl::InterfaceRequest<fuchsia::web::Context> context_request;
+  ExpectChildInstance(binder_request, context_request);
+
+  fuchsia::web::ContextPtr context;
+  const std::string instance_name = CreateAndWaitForInstance(
+      context_provider(), BuildCreateContextParams(), context);
+  ASSERT_FALSE(instance_name.empty());
+
+  // Requests for both interfaces should have been made.
+  ASSERT_TRUE(binder_request);
+  ASSERT_TRUE(context_request);
+
+  const auto& child = GetInstanceDecl(instance_name);
+  const auto& create_child_args = GetInstanceArgs(instance_name);
+
+  ASSERT_THAT(child, UrlIs("fuchsia-pkg://fuchsia.com/web_engine#meta/"
+                           "web_instance_with_svc_directory.cm"));
+  ASSERT_THAT(create_child_args,
+              HasDynamicDirectoryOffer("svc", /*is_writeable=*/true));
+  ASSERT_PRED1(base::PathExists,
+               GetInstanceDirectory(instance_name).AppendASCII("svc"));
 }
 
-TEST_F(ContextProviderImplTest, CreateValidatesServiceDirectory) {
-  // Attempt to create a Context without specifying a service directory.
-  fidl::InterfacePtr<fuchsia::web::Context> context;
-  fuchsia::web::CreateContextParams create_params;
-  provider_ptr_->Create(std::move(create_params), context.NewRequest());
-  base::RunLoop run_loop;
-  context.set_error_handler(
-      [quit_loop = run_loop.QuitClosure()](zx_status_t status) {
-        quit_loop.Run();
-        EXPECT_EQ(status, ZX_ERR_INVALID_ARGS);
-      });
-  run_loop.Run();
+TEST_F(ContextProviderImplTest, CanCreateContextWithoutServiceDirectory) {
+  fidl::InterfaceRequest<fuchsia::component::Binder> binder_request;
+  fidl::InterfaceRequest<fuchsia::web::Context> context_request;
+  ExpectChildInstance(binder_request, context_request);
+
+  fuchsia::web::ContextPtr context;
+  const std::string instance_name =
+      CreateAndWaitForInstance(context_provider(), {}, context);
+  ASSERT_FALSE(instance_name.empty());
+
+  // Requests for both interfaces should have been made.
+  ASSERT_TRUE(binder_request);
+  ASSERT_TRUE(context_request);
+
+  const auto& child = GetInstanceDecl(instance_name);
+  const auto& create_child_args = GetInstanceArgs(instance_name);
+
+  ASSERT_THAT(child, UrlIs("fuchsia-pkg://fuchsia.com/web_engine#meta/"
+                           "web_instance.cm"));
+  ASSERT_THAT(create_child_args,
+              Not(HasDynamicDirectoryOffer("svc", /*is_writeable=*/true)));
+  ASSERT_FALSE(
+      base::PathExists(GetInstanceDirectory(instance_name).AppendASCII("svc")));
 }
 
 TEST_F(ContextProviderImplTest, CreateValidatesDataDirectory) {
   // Deliberately supply the wrong kind of object as the data-directory.
-  fidl::InterfacePtr<fuchsia::web::Context> context;
   fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
   zx::socket socket1, socket2;
   ASSERT_EQ(zx::socket::create(0, &socket1, &socket2), ZX_OK);
   create_params.set_data_directory(
       fidl::InterfaceHandle<fuchsia::io::Directory>(
           zx::channel(socket1.release())));
-  provider_ptr_->Create(std::move(create_params), context.NewRequest());
-  base::RunLoop run_loop;
-  context.set_error_handler(
-      [quit_loop = run_loop.QuitClosure()](zx_status_t status) {
-        quit_loop.Run();
-        EXPECT_TRUE(status == ZX_ERR_PEER_CLOSED);
-      });
-  run_loop.Run();
+
+  fidl::InterfacePtr<fuchsia::web::Context> context_ptr;
+  context_provider().Create(std::move(create_params), context_ptr.NewRequest());
+  ASSERT_EQ(WaitForContextClosedStatus(context_ptr), ZX_ERR_PEER_CLOSED);
 }
 
-TEST_F(ContextProviderImplTest, CreateValidatesDrmFlags) {
-  {
-    // Request Widevine DRM but do not enable VULKAN.
-    fidl::InterfacePtr<fuchsia::web::Context> context;
-    fuchsia::web::CreateContextParams create_params =
-        BuildCreateContextParams();
-    *create_params.mutable_features() =
-        fuchsia::web::ContextFeatureFlags::WIDEVINE_CDM;
-    *create_params.mutable_cdm_data_directory() = OpenCacheDirectory();
-    provider_ptr_->Create(std::move(create_params), context.NewRequest());
-    base::RunLoop run_loop;
-    context.set_error_handler(
-        [quit_loop = run_loop.QuitClosure()](zx_status_t status) {
-          quit_loop.Run();
-          EXPECT_EQ(status, ZX_ERR_NOT_SUPPORTED);
-        });
-    run_loop.Run();
-  }
+// Request Widevine DRM but do not enable VULKAN.
+TEST_F(ContextProviderImplTest, CreateValidatesWidevineWithoutVulkan) {
+  fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
+  *create_params.mutable_features() =
+      fuchsia::web::ContextFeatureFlags::WIDEVINE_CDM;
+  *create_params.mutable_cdm_data_directory() = OpenCacheDirectory();
 
-  {
-    // Request PlayReady DRM but do not enable VULKAN.
-    fidl::InterfacePtr<fuchsia::web::Context> context;
-    fuchsia::web::CreateContextParams create_params =
-        BuildCreateContextParams();
-    create_params.set_playready_key_system("foo");
-    *create_params.mutable_cdm_data_directory() = OpenCacheDirectory();
-    provider_ptr_->Create(std::move(create_params), context.NewRequest());
-    base::RunLoop run_loop;
-    context.set_error_handler(
-        [quit_loop = run_loop.QuitClosure()](zx_status_t status) {
-          quit_loop.Run();
-          EXPECT_EQ(status, ZX_ERR_NOT_SUPPORTED);
-        });
-    run_loop.Run();
-  }
+  fidl::InterfacePtr<fuchsia::web::Context> context;
+  context_provider().Create(std::move(create_params), context.NewRequest());
+  ASSERT_EQ(WaitForContextClosedStatus(context), ZX_ERR_NOT_SUPPORTED);
+}
 
-  {
-    // Requesting DRM without VULKAN is acceptable for HEADLESS Contexts.
-    fidl::InterfacePtr<fuchsia::web::Context> context;
-    fuchsia::web::CreateContextParams create_params =
-        BuildCreateContextParams();
-    *create_params.mutable_features() =
-        fuchsia::web::ContextFeatureFlags::WIDEVINE_CDM |
-        fuchsia::web::ContextFeatureFlags::HEADLESS;
-    *create_params.mutable_cdm_data_directory() = OpenCacheDirectory();
-    provider_ptr_->Create(std::move(create_params), context.NewRequest());
-    base::RunLoop run_loop;
-    context.set_error_handler(
-        [quit_loop = run_loop.QuitClosure()](zx_status_t status) {
-          quit_loop.Run();
-          ZX_LOG(ERROR, status);
-          ADD_FAILURE();
-        });
-    // Spin the loop to allow CreateContext() to be handled, and the |context|
-    // channel to be disconnected, in case of failure.
-    run_loop.RunUntilIdle();
-  }
+// Request PlayReady DRM but do not enable VULKAN.
+TEST_F(ContextProviderImplTest, CreateValidatesPlayReadyWithoutVulkan) {
+  fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
+  create_params.set_playready_key_system("foo");
+  *create_params.mutable_cdm_data_directory() = OpenCacheDirectory();
+
+  fidl::InterfacePtr<fuchsia::web::Context> context;
+  context_provider().Create(std::move(create_params), context.NewRequest());
+  ASSERT_EQ(WaitForContextClosedStatus(context), ZX_ERR_NOT_SUPPORTED);
+}
+
+// Requesting DRM without VULKAN is acceptable for HEADLESS Contexts.
+TEST_F(ContextProviderImplTest, CreateHeadlessDrmWithoutVulkan) {
+  fidl::InterfaceRequest<fuchsia::component::Binder> binder_request;
+  fidl::InterfaceRequest<fuchsia::web::Context> context_request;
+  ExpectChildInstance(binder_request, context_request);
+
+  fuchsia::web::ContextPtr context;
+  fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
+  *create_params.mutable_features() =
+      fuchsia::web::ContextFeatureFlags::WIDEVINE_CDM |
+      fuchsia::web::ContextFeatureFlags::HEADLESS;
+  *create_params.mutable_cdm_data_directory() = OpenCacheDirectory();
+  const std::string instance_name = CreateAndWaitForInstance(
+      context_provider(), std::move(create_params), context);
+  ASSERT_FALSE(instance_name.empty());
+
+  // Requests for both interfaces should have been made.
+  ASSERT_TRUE(binder_request);
+  ASSERT_TRUE(context_request);
+
+  const auto& child = GetInstanceDecl(instance_name);
+  const auto& create_child_args = GetInstanceArgs(instance_name);
+
+  ASSERT_THAT(child, UrlIs("fuchsia-pkg://fuchsia.com/web_engine#meta/"
+                           "web_instance_with_svc_directory.cm"));
+  ASSERT_THAT(create_child_args,
+              HasDynamicDirectoryOffer("cdm_data", /*is_writeable=*/true));
+  ASSERT_THAT(create_child_args,
+              HasDynamicDirectoryOffer("svc", /*is_writeable=*/true));
+  ASSERT_PRED1(base::PathExists,
+               GetInstanceDirectory(instance_name).AppendASCII("cdm_data"));
+  ASSERT_PRED1(base::PathExists,
+               GetInstanceDirectory(instance_name).AppendASCII("svc"));
 }
 
 TEST_F(ContextProviderImplTest, MultipleConcurrentClients) {
-  // Bind a Provider connection, and create a Context from it.
-  fuchsia::web::ContextProviderPtr provider_1_ptr;
-  bindings_.AddBinding(provider_.get(), provider_1_ptr.NewRequest());
+  fidl::InterfaceRequest<fuchsia::component::Binder> binder_request_1;
+  fidl::InterfaceRequest<fuchsia::web::Context> context_request_1;
+  ExpectChildInstance(binder_request_1, context_request_1);
+  fidl::InterfaceRequest<fuchsia::component::Binder> binder_request_2;
+  fidl::InterfaceRequest<fuchsia::web::Context> context_request_2;
+  ExpectChildInstance(binder_request_2, context_request_2);
+  fidl::InterfaceRequest<fuchsia::component::Binder> binder_request_3;
+  fidl::InterfaceRequest<fuchsia::web::Context> context_request_3;
+  ExpectChildInstance(binder_request_3, context_request_3);
+
+  // Create a Context via the pre-bound Provider pointer.
   fuchsia::web::ContextPtr context_1;
-  provider_1_ptr->Create(BuildCreateContextParams(), context_1.NewRequest());
+  const std::string instance_1_name = CreateAndWaitForInstance(
+      context_provider(), BuildCreateContextParams(), context_1);
+  ASSERT_FALSE(instance_1_name.empty());
 
-  // Do the same on another Provider connection.
+  // Bind a second Provider pointer and create a Context via it.
   fuchsia::web::ContextProviderPtr provider_2_ptr;
-  bindings_.AddBinding(provider_.get(), provider_2_ptr.NewRequest());
+  BindContextProvider(provider_2_ptr.NewRequest());
   fuchsia::web::ContextPtr context_2;
-  provider_2_ptr->Create(BuildCreateContextParams(), context_2.NewRequest());
-
-  CheckContextResponsive(&context_1);
-  CheckContextResponsive(&context_2);
+  const std::string instance_2_name = CreateAndWaitForInstance(
+      *provider_2_ptr, BuildCreateContextParams(), context_2);
+  ASSERT_FALSE(instance_2_name.empty());
 
   // Ensure that the initial ContextProvider connection is still usable, by
   // creating and verifying another Context from it.
   fuchsia::web::ContextPtr context_3;
-  provider_2_ptr->Create(BuildCreateContextParams(), context_3.NewRequest());
-  CheckContextResponsive(&context_3);
+  const std::string instance_3_name = CreateAndWaitForInstance(
+      context_provider(), BuildCreateContextParams(), context_3);
+  ASSERT_FALSE(instance_3_name.empty());
 }
 
 TEST_F(ContextProviderImplTest, WithProfileDir) {
   base::ScopedTempDir profile_temp_dir;
 
-  // Connect to a new context process.
-  fidl::InterfacePtr<fuchsia::web::Context> context;
-  fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
-
   // Setup data dir.
   ASSERT_TRUE(profile_temp_dir.CreateUniqueTempDir());
   ASSERT_TRUE(
       base::WriteFile(profile_temp_dir.GetPath().AppendASCII(kTestDataFileIn),
                       base::StringPiece()));
 
+  fidl::InterfaceRequest<fuchsia::component::Binder> binder_request;
+  fidl::InterfaceRequest<fuchsia::web::Context> context_request;
+  ExpectChildInstance(binder_request, context_request);
+
   // Pass a handle data dir to the context.
+  fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
   create_params.set_data_directory(
       base::OpenDirectoryHandle(profile_temp_dir.GetPath()));
 
-  provider_ptr_->Create(std::move(create_params), context.NewRequest());
+  fuchsia::web::ContextPtr context;
+  const std::string instance_name = CreateAndWaitForInstance(
+      context_provider(), std::move(create_params), context);
+  ASSERT_FALSE(instance_name.empty());
 
-  CheckContextResponsive(&context);
+  // Requests for both interfaces should have been made.
+  ASSERT_TRUE(binder_request);
+  ASSERT_TRUE(context_request);
 
-  // Verify that the context process can write to the data dir.
-  EXPECT_TRUE(base::PathExists(
-      profile_temp_dir.GetPath().AppendASCII(kTestDataFileOut)));
+  const auto& child = GetInstanceDecl(instance_name);
+  const auto& create_child_args = GetInstanceArgs(instance_name);
+  const base::CommandLine command = GetInstanceCommandLine(instance_name);
+
+  ASSERT_THAT(child, UrlIs("fuchsia-pkg://fuchsia.com/web_engine#meta/"
+                           "web_instance_with_svc_directory.cm"));
+  ASSERT_THAT(create_child_args,
+              HasDynamicDirectoryOffer("data", /*is_writeable=*/true));
+  EXPECT_FALSE(command.HasSwitch(switches::kIncognito));
+
+  auto data_dir = GetInstanceDirectory(instance_name).AppendASCII("data");
+  ASSERT_PRED1(base::PathExists, data_dir);
+
+  // Make sure the input file can be seen in the mounted dir.
+  ASSERT_PRED1(base::PathExists, data_dir.AppendASCII(kTestDataFileIn));
+
+  // Make sure that the mapped dir can be written to.
+  ASSERT_TRUE(base::WriteFile(data_dir.AppendASCII(kTestDataFileOut),
+                              base::StringPiece()));
+  ASSERT_PRED1(base::PathExists,
+               profile_temp_dir.GetPath().AppendASCII(kTestDataFileOut));
 }
 
+// Verify that creation fails when passing in a file rather than a directory.
 TEST_F(ContextProviderImplTest, FailsDataDirectoryIsFile) {
+  base::ScopedTempDir profile_temp_dir;
+  ASSERT_TRUE(profile_temp_dir.CreateUniqueTempDir());
+
   base::FilePath temp_file_path;
+  ASSERT_TRUE(base::CreateTemporaryFileInDir(profile_temp_dir.GetPath(),
+                                             &temp_file_path));
 
-  // Connect to a new context process.
-  fidl::InterfacePtr<fuchsia::web::Context> context;
   fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
-
-  // Pass in a handle to a file instead of a directory.
-  CHECK(base::CreateTemporaryFile(&temp_file_path));
   create_params.set_data_directory(base::OpenDirectoryHandle(temp_file_path));
 
-  provider_ptr_->Create(std::move(create_params), context.NewRequest());
-
-  CheckContextUnresponsive(&context);
+  fidl::InterfacePtr<fuchsia::web::Context> context;
+  context_provider().Create(std::move(create_params), context.NewRequest());
+  ASSERT_EQ(WaitForContextClosedStatus(context), ZX_ERR_PEER_CLOSED);
 }
 
 // Tests that unsafely_treat_insecure_origins_as_secure properly adds the right
 // command-line arguments to the Context process.
 TEST_F(ContextProviderImplTest, WithInsecureOriginsAsSecure) {
-  base::RunLoop loop;
-  fake_environment_.fake_launcher().set_create_component_callback(
-      base::BindLambdaForTesting([&loop](const base::CommandLine& command) {
-        const char* kAllowRunningInsecureContent =
-            "allow-running-insecure-content";
-        loop.Quit();
-        EXPECT_TRUE(command.HasSwitch(
-            network::switches::kUnsafelyTreatInsecureOriginAsSecure));
-#if BUILDFLAG(ENABLE_CAST_RECEIVER)
-        ASSERT_STREQ(kAllowRunningInsecureContent,
-                     switches::kAllowRunningInsecureContent);
-        EXPECT_TRUE(command.HasSwitch(kAllowRunningInsecureContent));
-        EXPECT_THAT(command.GetSwitchValueASCII(switches::kDisableFeatures),
-                    testing::HasSubstr("AutoupgradeMixedContent"));
-        EXPECT_EQ(command.GetSwitchValueASCII(
-                      network::switches::kUnsafelyTreatInsecureOriginAsSecure),
-                  "http://example.com,http://example.net");
-#else
-        EXPECT_FALSE(command.HasSwitch(kAllowRunningInsecureContent));
-        EXPECT_FALSE(command.HasSwitch(switches::kDisableFeatures));
-
-        // The unrecognized values are passed on as origins.
-        EXPECT_EQ(command.GetSwitchValueASCII(
-                      network::switches::kUnsafelyTreatInsecureOriginAsSecure),
-                  "allow-running-insecure-content,"
-                  "disable-mixed-content-autoupgrade,"
-                  "http://example.com,http://example.net");
-#endif
-      }));
-
-  fuchsia::web::ContextPtr context;
-  context.set_error_handler([&loop](zx_status_t status) {
-    loop.Quit();
-    ZX_LOG(ERROR, status);
-    ADD_FAILURE();
-  });
+  fidl::InterfaceRequest<fuchsia::component::Binder> binder_request;
+  fidl::InterfaceRequest<fuchsia::web::Context> context_request;
+  ExpectChildInstance(binder_request, context_request);
 
   fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
-  std::vector<std::string> insecure_origins;
-  insecure_origins.push_back("allow-running-insecure-content");
-  insecure_origins.push_back("disable-mixed-content-autoupgrade");
-  insecure_origins.push_back("http://example.com");
-  insecure_origins.push_back("http://example.net");
   create_params.set_unsafely_treat_insecure_origins_as_secure(
-      std::move(insecure_origins));
-  provider_ptr_->Create(std::move(create_params), context.NewRequest());
+      {"allow-running-insecure-content", "disable-mixed-content-autoupgrade",
+       "http://example.com", "http://example.net"});
 
-  loop.Run();
+  fuchsia::web::ContextPtr context;
+  const std::string instance_name = CreateAndWaitForInstance(
+      context_provider(), std::move(create_params), context);
+  ASSERT_FALSE(instance_name.empty());
+
+  // Requests for both interfaces should have been made.
+  ASSERT_TRUE(binder_request);
+  ASSERT_TRUE(context_request);
+
+  static constexpr char kAllowRunningInsecureContent[] =
+      "allow-running-insecure-content";
+
+  const base::CommandLine command = GetInstanceCommandLine(instance_name);
+
+  EXPECT_TRUE(command.HasSwitch(
+      network::switches::kUnsafelyTreatInsecureOriginAsSecure));
+#if BUILDFLAG(ENABLE_CAST_RECEIVER)
+  ASSERT_STREQ(kAllowRunningInsecureContent,
+               switches::kAllowRunningInsecureContent);
+  EXPECT_TRUE(command.HasSwitch(kAllowRunningInsecureContent));
+  EXPECT_THAT(command.GetSwitchValueASCII(switches::kDisableFeatures),
+              ::testing::HasSubstr("AutoupgradeMixedContent"));
+  EXPECT_EQ(command.GetSwitchValueASCII(
+                network::switches::kUnsafelyTreatInsecureOriginAsSecure),
+            "http://example.com,http://example.net");
+#else   // BUILDFLAG(ENABLE_CAST_RECEIVER)
+  EXPECT_FALSE(command.HasSwitch(kAllowRunningInsecureContent));
+  EXPECT_FALSE(command.HasSwitch(switches::kDisableFeatures));
+
+  // The unrecognized values are passed on as origins.
+  EXPECT_EQ(command.GetSwitchValueASCII(
+                network::switches::kUnsafelyTreatInsecureOriginAsSecure),
+            "allow-running-insecure-content,"
+            "disable-mixed-content-autoupgrade,"
+            "http://example.com,http://example.net");
+#endif  // BUILDFLAG(ENABLE_CAST_RECEIVER)
 }
 
 TEST_F(ContextProviderImplTest, WithDataQuotaBytes) {
-  base::RunLoop loop;
-  fake_environment_.fake_launcher().set_create_component_callback(
-      base::BindLambdaForTesting([&loop](const base::CommandLine& command) {
-        loop.Quit();
-        EXPECT_EQ(command.GetSwitchValueASCII("data-quota-bytes"),
-                  kTestQuotaBytesSwitchValue);
-      }));
-
-  fuchsia::web::ContextPtr context;
-  context.set_error_handler([&loop](zx_status_t status) {
-    loop.Quit();
-    ZX_LOG(ERROR, status);
-    ADD_FAILURE();
-  });
-
-  fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
   base::ScopedTempDir profile_temp_dir;
   ASSERT_TRUE(profile_temp_dir.CreateUniqueTempDir());
+
+  fidl::InterfaceRequest<fuchsia::component::Binder> binder_request;
+  fidl::InterfaceRequest<fuchsia::web::Context> context_request;
+  ExpectChildInstance(binder_request, context_request);
+
+  fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
   create_params.set_data_directory(
       base::OpenDirectoryHandle(profile_temp_dir.GetPath()));
   create_params.set_data_quota_bytes(kTestQuotaBytes);
-  provider_ptr_->Create(std::move(create_params), context.NewRequest());
 
-  loop.Run();
+  fuchsia::web::ContextPtr context;
+  const std::string instance_name = CreateAndWaitForInstance(
+      context_provider(), std::move(create_params), context);
+  ASSERT_FALSE(instance_name.empty());
+
+  // Requests for both interfaces should have been made.
+  ASSERT_TRUE(binder_request);
+  ASSERT_TRUE(context_request);
+
+  const base::CommandLine command = GetInstanceCommandLine(instance_name);
+  EXPECT_EQ(command.GetSwitchValueASCII("data-quota-bytes"),
+            kTestQuotaBytesSwitchValue);
 }
 
 TEST_F(ContextProviderImplTest, WithCdmDataQuotaBytes) {
-  base::RunLoop loop;
-  fake_environment_.fake_launcher().set_create_component_callback(
-      base::BindLambdaForTesting([&loop](const base::CommandLine& command) {
-        loop.Quit();
-        EXPECT_EQ(command.GetSwitchValueASCII("cdm-data-quota-bytes"),
-                  kTestQuotaBytesSwitchValue);
-      }));
-
-  fuchsia::web::ContextPtr context;
-  context.set_error_handler([&loop](zx_status_t status) {
-    loop.Quit();
-    ZX_LOG(ERROR, status);
-    ADD_FAILURE();
-  });
-
-  fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
   base::ScopedTempDir profile_temp_dir;
   ASSERT_TRUE(profile_temp_dir.CreateUniqueTempDir());
+
+  fidl::InterfaceRequest<fuchsia::component::Binder> binder_request;
+  fidl::InterfaceRequest<fuchsia::web::Context> context_request;
+  ExpectChildInstance(binder_request, context_request);
+
+  fuchsia::web::CreateContextParams create_params = BuildCreateContextParams();
   create_params.set_cdm_data_directory(
       base::OpenDirectoryHandle(profile_temp_dir.GetPath()));
   create_params.set_features(fuchsia::web::ContextFeatureFlags::HEADLESS |
                              fuchsia::web::ContextFeatureFlags::WIDEVINE_CDM);
   create_params.set_cdm_data_quota_bytes(kTestQuotaBytes);
-  provider_ptr_->Create(std::move(create_params), context.NewRequest());
 
-  loop.Run();
+  fuchsia::web::ContextPtr context;
+  const std::string instance_name = CreateAndWaitForInstance(
+      context_provider(), std::move(create_params), context);
+  ASSERT_FALSE(instance_name.empty());
+
+  // Requests for both interfaces should have been made.
+  ASSERT_TRUE(binder_request);
+  ASSERT_TRUE(context_request);
+
+  const base::CommandLine command = GetInstanceCommandLine(instance_name);
+  EXPECT_EQ(command.GetSwitchValueASCII("cdm-data-quota-bytes"),
+            kTestQuotaBytesSwitchValue);
 }
diff --git a/fuchsia_web/webengine/context_provider_main.cc b/fuchsia_web/webengine/context_provider_main.cc
index 498c77a1..1ed6122 100644
--- a/fuchsia_web/webengine/context_provider_main.cc
+++ b/fuchsia_web/webengine/context_provider_main.cc
@@ -49,11 +49,12 @@
 
   LogComponentStartWithVersion("WebEngine context_provider");
 
-  ContextProviderImpl context_provider;
-
-  // Publish the ContextProvider and Debug services.
   sys::OutgoingDirectory* const directory =
       base::ComponentContextForProcess()->outgoing().get();
+
+  ContextProviderImpl context_provider(*directory);
+
+  // Publish the ContextProvider and Debug services.
   base::ScopedServiceBinding<fuchsia::web::ContextProvider> context_binding(
       directory, &context_provider);
   base::ScopedServiceBinding<fuchsia::web::Debug> debug_hub_binding(
diff --git a/fuchsia_web/webengine/fake_context.cc b/fuchsia_web/webengine/fake_context.cc
deleted file mode 100644
index 972621e7a..0000000
--- a/fuchsia_web/webengine/fake_context.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "fuchsia_web/webengine/fake_context.h"
-
-#include "base/fuchsia/fuchsia_logging.h"
-#include "base/notreached.h"
-
-FakeFrame::FakeFrame(fidl::InterfaceRequest<fuchsia::web::Frame> request)
-    : binding_(this, std::move(request)) {
-  binding_.set_error_handler([this](zx_status_t status) {
-    ZX_CHECK(status == ZX_ERR_PEER_CLOSED, status);
-    delete this;
-  });
-}
-
-FakeFrame::~FakeFrame() = default;
-
-void FakeFrame::GetNavigationController(
-    fidl::InterfaceRequest<fuchsia::web::NavigationController> controller) {
-  if (navigation_controller_) {
-    navigation_controller_bindings_.AddBinding(navigation_controller_,
-                                               std::move(controller));
-  }
-}
-
-void FakeFrame::SetNavigationEventListener(
-    fidl::InterfaceHandle<fuchsia::web::NavigationEventListener> listener) {
-  SetNavigationEventListener2(std::move(listener), /*flags=*/{});
-}
-
-void FakeFrame::SetNavigationEventListener2(
-    fidl::InterfaceHandle<fuchsia::web::NavigationEventListener> listener,
-    fuchsia::web::NavigationEventListenerFlags flags) {
-  listener_.Bind(std::move(listener));
-  if (on_set_listener_callback_) {
-    std::move(on_set_listener_callback_).Run();
-  }
-}
-
-void FakeFrame::NotImplemented_(const std::string& name) {
-  NOTREACHED() << name;
-}
-
-FakeContext::FakeContext() = default;
-FakeContext::~FakeContext() = default;
-
-void FakeContext::CreateFrame(
-    fidl::InterfaceRequest<fuchsia::web::Frame> frame_request) {
-  FakeFrame* new_frame = new FakeFrame(std::move(frame_request));
-  if (on_create_frame_callback_) {
-    on_create_frame_callback_.Run(new_frame);
-  }
-
-  // |new_frame| owns itself, so we intentionally leak the pointer.
-}
-
-void FakeContext::NotImplemented_(const std::string& name) {
-  NOTREACHED() << name;
-}
diff --git a/fuchsia_web/webengine/fake_context.h b/fuchsia_web/webengine/fake_context.h
deleted file mode 100644
index bacd55f..0000000
--- a/fuchsia_web/webengine/fake_context.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef FUCHSIA_WEB_WEBENGINE_FAKE_CONTEXT_H_
-#define FUCHSIA_WEB_WEBENGINE_FAKE_CONTEXT_H_
-
-#include <fuchsia/web/cpp/fidl.h>
-#include <fuchsia/web/cpp/fidl_test_base.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/binding_set.h>
-
-#include <utility>
-
-#include "base/functional/callback.h"
-
-// A fake Frame implementation that manages its own lifetime.
-class FakeFrame : public fuchsia::web::testing::Frame_TestBase {
- public:
-  explicit FakeFrame(fidl::InterfaceRequest<fuchsia::web::Frame> request);
-
-  FakeFrame(const FakeFrame&) = delete;
-  FakeFrame& operator=(const FakeFrame&) = delete;
-
-  ~FakeFrame() override;
-
-  void set_on_set_listener_callback(base::OnceClosure callback) {
-    on_set_listener_callback_ = std::move(callback);
-  }
-
-  // Tests can provide e.g a mock NavigationController, which the FakeFrame will
-  // pass bind GetNavigationController() requests to.
-  void set_navigation_controller(
-      fuchsia::web::NavigationController* controller) {
-    navigation_controller_ = controller;
-  }
-
-  fuchsia::web::NavigationEventListener* listener() { return listener_.get(); }
-
-  // fuchsia::web::Frame implementation.
-  void GetNavigationController(
-      fidl::InterfaceRequest<fuchsia::web::NavigationController> controller)
-      override;
-  void SetNavigationEventListener(
-      fidl::InterfaceHandle<fuchsia::web::NavigationEventListener> listener)
-      override;
-  void SetNavigationEventListener2(
-      fidl::InterfaceHandle<fuchsia::web::NavigationEventListener> listener,
-      fuchsia::web::NavigationEventListenerFlags flags) override;
-
-  // fuchsia::web::testing::Frame_TestBase implementation.
-  void NotImplemented_(const std::string& name) override;
-
- private:
-  fidl::Binding<fuchsia::web::Frame> binding_;
-  fuchsia::web::NavigationEventListenerPtr listener_;
-  base::OnceClosure on_set_listener_callback_;
-
-  fuchsia::web::NavigationController* navigation_controller_ = nullptr;
-  fidl::BindingSet<fuchsia::web::NavigationController>
-      navigation_controller_bindings_;
-};
-
-// An implementation of Context that creates and binds FakeFrames.
-class FakeContext : public fuchsia::web::testing::Context_TestBase {
- public:
-  using CreateFrameCallback = base::RepeatingCallback<void(FakeFrame*)>;
-
-  FakeContext();
-
-  FakeContext(const FakeContext&) = delete;
-  FakeContext& operator=(const FakeContext&) = delete;
-
-  ~FakeContext() override;
-
-  // Sets a callback that is invoked whenever new Frames are bound.
-  void set_on_create_frame_callback(CreateFrameCallback callback) {
-    on_create_frame_callback_ = callback;
-  }
-
-  // fuchsia::web::Context implementation.
-  void CreateFrame(
-      fidl::InterfaceRequest<fuchsia::web::Frame> frame_request) override;
-
-  // fuchsia::web::testing::Context_TestBase implementation.
-  void NotImplemented_(const std::string& name) override;
-
- private:
-  CreateFrameCallback on_create_frame_callback_;
-};
-
-#endif  // FUCHSIA_WEB_WEBENGINE_FAKE_CONTEXT_H_
diff --git a/fuchsia_web/webengine/test/context_provider_for_test.cc b/fuchsia_web/webengine/test/context_provider_for_test.cc
index cf4974a..da2eb11b 100644
--- a/fuchsia_web/webengine/test/context_provider_for_test.cc
+++ b/fuchsia_web/webengine/test/context_provider_for_test.cc
@@ -38,9 +38,29 @@
 
   realm_builder
       .AddRoute(::component_testing::Route{
-          .capabilities = {::component_testing::Protocol{
-                               "fuchsia.sys.Environment"},
-                           ::component_testing::Protocol{"fuchsia.sys.Loader"}},
+          .capabilities =
+              {// Capabilities used/routed by WebInstanceHost:
+               ::component_testing::Directory{"config-data-for-web-instance"},
+               // Required capabilities offered to web-instance.cm:
+               ::component_testing::Directory{"root-ssl-certificates"},
+               ::component_testing::Protocol{"fuchsia.buildinfo.Provider"},
+               ::component_testing::Protocol{"fuchsia.device.NameProvider"},
+               ::component_testing::Protocol{"fuchsia.fonts.Provider"},
+               ::component_testing::Protocol{"fuchsia.hwinfo.Product"},
+               ::component_testing::Protocol{"fuchsia.intl.PropertyProvider"},
+               ::component_testing::Protocol{"fuchsia.kernel.VmexResource"},
+               ::component_testing::Protocol{"fuchsia.logger.LogSink"},
+               ::component_testing::Protocol{"fuchsia.memorypressure.Provider"},
+               ::component_testing::Protocol{"fuchsia.process.Launcher"},
+               ::component_testing::Protocol{"fuchsia.sysmem.Allocator"},
+               // Optional capabilities offered to web-instance.cm:
+               ::component_testing::Protocol{"fuchsia.camera3.DeviceWatcher"},
+               ::component_testing::Protocol{"fuchsia.media.ProfileProvider"},
+               ::component_testing::Protocol{"fuchsia.settings.Display"},
+               ::component_testing::Protocol{
+                   "fuchsia.tracing.perfetto.ProducerConnector"},
+               ::component_testing::Protocol{
+                   "fuchsia.tracing.provider.Registry"}},
           .source = ::component_testing::ParentRef{},
           .targets = {::component_testing::ChildRef{kContextProviderService}}})
       .AddRoute(::component_testing::Route{
diff --git a/fuchsia_web/webengine/web_engine_integration_tests.shard.test-cml b/fuchsia_web/webengine/web_engine_integration_tests.shard.test-cml
index fc83e8f..fb91953 100644
--- a/fuchsia_web/webengine/web_engine_integration_tests.shard.test-cml
+++ b/fuchsia_web/webengine/web_engine_integration_tests.shard.test-cml
@@ -8,16 +8,54 @@
       url: "fuchsia-pkg://fuchsia.com/flatland-scene-manager-test-ui-stack#meta/test-ui-stack.cm",
     },
   ],
+  use: [
+    {
+      protocol: [
+        "fuchsia.accessibility.semantics.SemanticsManager",
+        "fuchsia.ui.composition.Allocator",
+        "fuchsia.ui.composition.Flatland",
+        "fuchsia.ui.input3.Keyboard",
+        "fuchsia.ui.scenic.Scenic",
+      ],
+      from: "#test_ui_stack",
+    },
+    { protocol: "fuchsia.memorypressure.Provider" },
+  ],
   offer: [
     {
       protocol: [
-        "fuchsia.sys.Environment",
-        "fuchsia.sys.Loader",
+        "fuchsia.buildinfo.Provider",
+        "fuchsia.camera3.DeviceWatcher",
+        "fuchsia.device.NameProvider",
+        "fuchsia.fonts.Provider",
+        "fuchsia.hwinfo.Product",
+        "fuchsia.intl.PropertyProvider",
+        "fuchsia.kernel.VmexResource",
+        "fuchsia.logger.LogSink",
+        "fuchsia.media.ProfileProvider",
+        "fuchsia.memorypressure.Provider",
+        "fuchsia.process.Launcher",
+        "fuchsia.settings.Display",
+        "fuchsia.sysmem.Allocator",
+        "fuchsia.tracing.perfetto.ProducerConnector",
+        "fuchsia.tracing.provider.Registry",
       ],
       from: "parent",
       to: "#realm_builder",
     },
     {
+      directory: "root-ssl-certificates",
+      from: "parent",
+      to: "#realm_builder",
+    },
+    {
+      directory: "config-data",
+      from: "parent",
+      as: "config-data-for-web-instance",
+      to: "#realm_builder",
+      subdir: "web_engine",
+    },
+    {
       protocol: [
         "fuchsia.logger.LogSink",
         "fuchsia.scheduler.ProfileProvider",
@@ -29,29 +67,12 @@
       to: "#test_ui_stack",
     },
   ],
-  use: [
-    {
-      protocol: [
-        "fuchsia.accessibility.semantics.SemanticsManager",
-        "fuchsia.ui.composition.Allocator",
-        "fuchsia.ui.composition.Flatland",
-        "fuchsia.ui.input3.Keyboard",
-        "fuchsia.ui.scenic.Scenic",
-      ],
-      from: "#test_ui_stack",
-    },
-    {
-      protocol: [
-        "fuchsia.memorypressure.Provider",
-      ],
-    },
-  ],
   facets: {
     "fuchsia.test": {
       "deprecated-allowed-packages": [
-          "cursor",
-          "flatland-scene-manager-test-ui-stack",
-          "web_engine",
+        "cursor",
+        "flatland-scene-manager-test-ui-stack",
+        "web_engine",
       ],
     },
   },
diff --git a/fuchsia_web/webengine/web_instance-common.shard.cml b/fuchsia_web/webengine/web_instance-common.shard.cml
new file mode 100644
index 0000000..9a55307
--- /dev/null
+++ b/fuchsia_web/webengine/web_instance-common.shard.cml
@@ -0,0 +1,92 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+{
+  program: {
+    runner: "elf",
+    binary: "web_engine_exe",
+
+    // Required to allow JIT in child processes such as renderers.
+    job_policy_ambient_mark_vmo_exec: "true",
+  },
+  capabilities: [
+    {
+      protocol: [
+        "fuchsia.web.Context",
+        "fuchsia.web.Debug",
+        "fuchsia.web.FrameHost",
+      ],
+    },
+  ],
+  use: [
+    // fuchsia.web/CreateContextParams.cdm_data_directory.
+    {
+      directory: "cdm_data",
+      rights: [ "rw*" ],
+      path: "/cdm_data",
+      availability: "optional",
+    },
+
+    // Holds optional .json config files.
+    {
+      directory: "config-data",
+      rights: [ "r*" ],
+      path: "/config/data",
+      availability: "optional",
+    },
+
+    // fuchsia.web/CreateContextParams.content_directories.
+    {
+      directory: "content-directories",
+      rights: [ "r*" ],
+      path: "/content-directories",
+      availability: "optional",
+    },
+
+    // Expected to host an "argv.json" file containing command line args.
+    {
+      directory: "command-line-config",
+      rights: [ "r*" ],
+      path: "/config/command-line",
+      availability: "optional",
+    },
+
+    // fuchsia.web/CreateContextParams.data_directory.
+    {
+      directory: "data",
+      rights: [ "rw*" ],
+      path: "/data",
+      availability: "optional",
+    },
+
+    // Holds cert.pem; the system root certificate store.
+    {
+      directory: "root-ssl-certificates",
+      rights: [ "r*" ],
+      path: "/config/ssl",
+      availability: "optional",
+    },
+
+    // Temporary directory specified by WebInstanceHost.set_tmp_dir.
+    {
+      directory: "tmp",
+      rights: [ "rw*" ],
+      path: "/tmp",
+      availability: "optional",
+    },
+  ],
+  expose: [
+    {
+      protocol: [
+        "fuchsia.web.Context",
+        "fuchsia.web.Debug",
+        "fuchsia.web.FrameHost",
+      ],
+      from: "self",
+    },
+    {
+      protocol: "fuchsia.component.Binder",
+      from: "framework",
+    },
+  ],
+}
diff --git a/fuchsia_web/webengine/web_instance.cml b/fuchsia_web/webengine/web_instance.cml
index 303ca39..e80dae70 100644
--- a/fuchsia_web/webengine/web_instance.cml
+++ b/fuchsia_web/webengine/web_instance.cml
@@ -1,91 +1,17 @@
 // Copyright 2022 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+
+// A component manifest used by WebInstanceHost when creating a Context for
+// which the caller does not provide a service_directory in its
+// CreateContextParams.
 {
   include: [
     "inspect/client.shard.cml",
     "syslog/client.shard.cml",
-  ],
-  program: {
-    runner: "elf",
-    binary: "web_engine_exe",
-
-    // Required to allow JIT in child processes such as renderers.
-    job_policy_ambient_mark_vmo_exec: "true",
-  },
-  capabilities: [
-    {
-      protocol: [
-        "fuchsia.web.Context",
-        "fuchsia.web.Debug",
-        "fuchsia.web.FrameHost",
-      ]
-    }
-  ],
-  expose: [
-    {
-      protocol: [
-        "fuchsia.web.Context",
-        "fuchsia.web.Debug",
-        "fuchsia.web.FrameHost",
-      ],
-      from: "self",
-    },
-    {
-      protocol: "fuchsia.component.Binder",
-      from: "framework",
-    }
+    "//fuchsia_web/webengine/web_instance-common.shard.cml",
   ],
   use: [
-    // fuchsia.web/CreateContextParams.cdm_data_directory.
-    {
-      directory: "cdm_data",
-      path: "/cdm_data",
-      rights: [ "rw*" ],
-      availability: "optional",
-    },
-    // Holds optional .json config files.
-    {
-      directory: "config-data",
-      rights: [ "r*" ],
-      path: "/config/data",
-      availability: "optional",
-    },
-    // fuchsia.web/CreateContextParams.data_directory.
-    {
-      directory: "data",
-      path: "/data",
-      rights: [ "rw*" ],
-      availability: "optional",
-    },
-    // Holds cert.pem; the system root certificate store.
-    {
-      directory: "root-ssl-certificates",
-      rights: [ "r*" ],
-      path: "/config/ssl",
-      availability: "optional",
-    },
-    // fuchsia.web/CreateContextParams.content_directories.
-    {
-      directory: "content-directories",
-      rights: [ "r*" ],
-      path: "/content-directories",
-      availability: "optional",
-    },
-    // Expected to host an "argv.json" file containing command line args.
-    {
-      directory: "command-line-config",
-      rights: [ "r*" ],
-      path: "/config/command-line",
-      availability: "optional",
-    },
-    // Temporary directory specified by WebInstanceHost.set_tmp_dir.
-    {
-      directory: "tmp",
-      path: "/tmp",
-      rights: [ "rw*" ],
-      availability: "optional",
-    },
     {
       // Required capabilities for all configurations.
       protocol: [
diff --git a/fuchsia_web/webengine/web_instance_with_svc_directory.cml b/fuchsia_web/webengine/web_instance_with_svc_directory.cml
new file mode 100644
index 0000000..b92b6ac6
--- /dev/null
+++ b/fuchsia_web/webengine/web_instance_with_svc_directory.cml
@@ -0,0 +1,17 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// A component manifest used by WebInstanceHost when creating a Context for
+// which the caller provides a service_directory in its CreateContextParams.
+{
+  include: [ "//fuchsia_web/webengine/web_instance-common.shard.cml" ],
+  use: [
+    // fuchsia.web/CreateContextParams.service_directory.
+    {
+      directory: "svc",
+      rights: [ "rw*" ],
+      path: "/svc",
+    },
+  ],
+}
diff --git a/fuchsia_web/webinstance_host/web_instance_host.cc b/fuchsia_web/webinstance_host/web_instance_host.cc
index 43552250e..4837c6a7 100644
--- a/fuchsia_web/webinstance_host/web_instance_host.cc
+++ b/fuchsia_web/webinstance_host/web_instance_host.cc
@@ -41,18 +41,22 @@
 
 namespace fcdecl = ::fuchsia::component::decl;
 
-// Production URL for web hosting Component instances.
-// The URL cannot be obtained programmatically - see fxbug.dev/51490.
-constexpr char kWebInstanceComponentUrl[] =
-    "fuchsia-pkg://fuchsia.com/web_engine#meta/web_instance.cm";
-
-// Test-only URL for web hosting Component instances with WebUI resources.
-const char kWebInstanceWithWebUiComponentUrl[] =
-    "fuchsia-pkg://fuchsia.com/web_engine_with_webui#meta/web_instance.cm";
-
 // The name of the component collection hosting the instances.
 constexpr char kCollectionName[] = "web_instances";
 
+// Returns the URL of the WebInstance component to be launched.
+std::string MakeWebInstanceComponentUrl(bool with_webui,
+                                        bool with_service_directory) {
+  // TODO(crbug.com/1010222): Use a relative component URL when the hosting
+  // component is in the same package as web_instance.cm and remove this
+  // workaround.
+  return base::StrCat(
+      {"fuchsia-pkg://fuchsia.com/",
+       (with_webui ? "web_engine_with_webui" : "web_engine"), "#meta/",
+       (with_service_directory ? "web_instance_with_svc_directory.cm"
+                               : "web_instance.cm")});
+}
+
 // Returns the "/web_instances" dir from the component's outgoing directory,
 // creating it if necessary.
 vfs::PseudoDir* GetWebInstancesCollectionDir(
@@ -105,6 +109,11 @@
   // protocol offers.
   void AppendOffersForServices(const std::vector<std::string>& services);
 
+  // Serves `service_directory` to the instance as the 'svc' read-write
+  // directory.
+  void ServeServiceDirectory(
+      fidl::InterfaceHandle<fuchsia::io::Directory> service_directory);
+
   // Offers the read-only root-ssl-certificates directory from the parent.
   void ServeRootSslCertificates();
 
@@ -133,6 +142,7 @@
 
   // Builds and returns the instance, or an error status value.
   Instance Build(
+      const std::string& instance_component_url,
       fidl::InterfaceRequest<fuchsia::io::Directory> services_request);
 
  private:
@@ -183,8 +193,11 @@
   // Returns the capability and directory name for `directory`.
   static base::StringPiece GetDirectoryName(OptionalDirectory directory);
 
-  // Serves `directory` as `offer` in the instance's subtree as a read-only or
-  // a read-write (if `writeable`) directory.
+  // Serves `fs_directory` as `directory`. `fs_directory` may be specific to
+  // this instance (e.g., persistent data storage) or required only in
+  // particular configurations (e.g., CDM data storage), to the instance. Most
+  // common read-only directories (e.g., "root-ssl-certificates") should instead
+  // be offered statically to the `web_instances` collection.
   void ServeOptionalDirectory(
       OptionalDirectory directory,
       std::unique_ptr<vfs::internal::Directory> fs_directory,
@@ -199,9 +212,6 @@
                       std::unique_ptr<vfs::internal::Directory> fs_directory,
                       bool writeable);
 
-  // Offers the read-only directory capability named `name` from the parent.
-  void OfferDirectoryFromParent(base::StringPiece name);
-
   const raw_ref<sys::OutgoingDirectory> outgoing_directory_;
   const raw_ref<fuchsia::component::Realm> realm_;
   const base::GUID id_;
@@ -278,9 +288,12 @@
   }
 }
 
-void InstanceBuilder::ServeRootSslCertificates() {
+void InstanceBuilder::ServeServiceDirectory(
+    fidl::InterfaceHandle<fuchsia::io::Directory> service_directory) {
   DCHECK(instance_dir_);
-  OfferDirectoryFromParent("root-ssl-certificates");
+  ServeDirectory("svc",
+                 std::make_unique<vfs::RemoteDir>(std::move(service_directory)),
+                 /*writeable=*/true);
 }
 
 void InstanceBuilder::ServeDataDirectory(
@@ -336,6 +349,7 @@
 }
 
 Instance InstanceBuilder::Build(
+    const std::string& instance_component_url,
     fidl::InterfaceRequest<fuchsia::io::Directory> services_request) {
   ServeCommandLine();
 
@@ -345,14 +359,7 @@
 
   fcdecl::Child child_decl;
   child_decl.set_name(name_);
-  // TODO(crbug.com/1010222): Make kWebInstanceComponentUrl a relative
-  // component URL and remove this workaround.
-  // TODO(crbug.com/1395054): Better yet, replace the with_webui component with
-  // direct routing of the resources from web_engine_shell.
-  child_decl.set_url(
-      base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kWithWebui)
-          ? kWebInstanceWithWebUiComponentUrl
-          : kWebInstanceComponentUrl);
+  child_decl.set_url(instance_component_url);
   child_decl.set_startup(fcdecl::StartupMode::LAZY);
 
   ::fuchsia::component::CreateChildArgs create_child_args;
@@ -491,29 +498,6 @@
                     .set_availability(fcdecl::Availability::REQUIRED))));
 }
 
-void InstanceBuilder::OfferDirectoryFromParent(base::StringPiece name) {
-  DCHECK(instance_dir_);
-  dynamic_offers_.push_back(fcdecl::Offer::WithDirectory(
-      std::move(fcdecl::OfferDirectory()
-                    .set_source(fcdecl::Ref::WithParent({}))
-                    .set_source_name(std::string(name))
-                    .set_target_name(std::string(name))
-                    .set_rights(::fuchsia::io::R_STAR_DIR)
-                    .set_dependency_type(fcdecl::DependencyType::STRONG)
-                    .set_availability(fcdecl::Availability::SAME_AS_TARGET))));
-}
-
-// Route `root-ssl-certificates` from parent if networking is requested.
-void HandleRootSslCertificates(InstanceBuilder& builder,
-                               fuchsia::web::CreateContextParams& params) {
-  if ((params.features() & fuchsia::web::ContextFeatureFlags::NETWORK) !=
-      fuchsia::web::ContextFeatureFlags::NETWORK) {
-    return;
-  }
-
-  builder.ServeRootSslCertificates();
-}
-
 void HandleCdmDataDirectoryParam(InstanceBuilder& builder,
                                  fuchsia::web::CreateContextParams& params) {
   if (!params.has_cdm_data_directory()) {
@@ -570,11 +554,7 @@
 }  // namespace
 
 WebInstanceHost::WebInstanceHost(sys::OutgoingDirectory& outgoing_directory)
-    : outgoing_directory_(outgoing_directory) {
-  // Ensure WebInstance is registered before launching it.
-  // TODO(crbug.com/1211174): Replace with a different mechanism when available.
-  RegisterWebInstanceProductData(kWebInstanceComponentUrl);
-}
+    : outgoing_directory_(outgoing_directory) {}
 
 WebInstanceHost::~WebInstanceHost() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -586,6 +566,21 @@
     fidl::InterfaceRequest<fuchsia::io::Directory> services_request,
     base::CommandLine extra_args) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  const bool with_service_directory = params.has_service_directory();
+
+  // True if the process includes `--with-webui` on its command line. This is a
+  // test-only feature for `web_engine_shell` that causes `web_instance.cm` to
+  // be run from the `web_engine_with_webui` package rather than the production
+  // `web_engine` package.
+  const bool with_webui =
+      base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kWithWebui);
+
+  // Web UI resources are not supported with a service directory.
+  if (with_webui && with_service_directory) {
+    return ZX_ERR_INVALID_ARGS;
+  }
+
   if (!is_initialized()) {
     Initialize();
   }
@@ -602,18 +597,22 @@
     return status;
   }
 
-  // TODO(grt): What to do about `params.service_directory`? At the moment, we
-  // require that all of web_instance's required and optional protocols are
-  // routed from the embedding component's parent.
-
-  {
+  if (with_service_directory) {
+    builder->ServeServiceDirectory(
+        std::move(*params.mutable_service_directory()));
+  } else {
     std::vector<std::string> services;
-    AppendDynamicServices(params.features(), params.has_playready_key_system(),
+    const auto features = params.has_features()
+                              ? params.features()
+                              : fuchsia::web::ContextFeatureFlags();
+    AppendDynamicServices(features, params.has_playready_key_system(),
                           services);
     builder->AppendOffersForServices(services);
   }
 
-  HandleRootSslCertificates(*builder, params);
+  // The `config-data` directory is statically offered to all instances.
+  // The `root-ssl-certificates` directory is statically offered to all
+  // instances regardless of whether networking is requested.
 
   HandleCdmDataDirectoryParam(*builder, params);
 
@@ -638,7 +637,17 @@
     debug_proxy_.RegisterInstance(std::move(debug_handle));
   }
 
-  auto instance = builder->Build(std::move(services_request));
+  const auto instance_component_url =
+      MakeWebInstanceComponentUrl(with_webui, with_service_directory);
+
+  // Ensure WebInstance is registered before launching it.
+  // TODO(crbug.com/1211174): Replace with a different mechanism when available.
+  RegisterWebInstanceProductData(instance_component_url);
+
+  // TODO(crbug.com/1395054): Replace the with_webui component with direct
+  // routing of the resources from web_engine_shell.
+  auto instance =
+      builder->Build(instance_component_url, std::move(services_request));
   // Monitor the instance's Binder to track its destruction.
   instance.binder_ptr.set_error_handler(
       [this, id = instance.id](zx_status_t status) {
diff --git a/fuchsia_web/webinstance_host/web_instance_host.shard.cml b/fuchsia_web/webinstance_host/web_instance_host.shard.cml
index 0b31652..d3cc9ab 100644
--- a/fuchsia_web/webinstance_host/web_instance_host.shard.cml
+++ b/fuchsia_web/webinstance_host/web_instance_host.shard.cml
@@ -45,6 +45,16 @@
       availability: "optional",
     },
     {
+      // Statically offered to all web_instances regardless of whether they were
+      // created with `ContextFeatureFlags::NETWORK`.
+      directory: "root-ssl-certificates",
+      from: "parent",
+      to: "#web_instances",
+      // Required if the WebInstanceHost may create Contexts with
+      // ContextFeatureFlags::NETWORK.
+      availability: "optional",
+    },
+    {
       protocol: [
         "fuchsia.buildinfo.Provider",
         "fuchsia.device.NameProvider",
diff --git a/fuchsia_web/webinstance_host/web_instance_host_with_svc_directory.shard.cml b/fuchsia_web/webinstance_host/web_instance_host_with_svc_directory.shard.cml
new file mode 100644
index 0000000..54b21e2
--- /dev/null
+++ b/fuchsia_web/webinstance_host/web_instance_host_with_svc_directory.shard.cml
@@ -0,0 +1,54 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+{
+  collections: [
+    // The collection in which child instances are dynamically created.
+    {
+      name: "web_instances",
+      durability: "transient",
+      allowed_offers: "static_and_dynamic",
+      persistent_storage: false,
+    },
+  ],
+  capabilities: [
+    // The root of a directory tree through which directory capabilities are
+    // dynamically routed to child instances.
+    {
+      directory: "web_instances",
+      rights: [ "rw*" ],
+      path: "/web_instances",
+    },
+  ],
+  use: [
+    {
+      protocol: "fuchsia.component.Realm",
+      from: "framework",
+    },
+    {
+      protocol: [
+        "fuchsia.feedback.ComponentDataRegister",
+        "fuchsia.feedback.CrashReportingProductRegister",
+      ],
+    },
+  ],
+  offer: [
+    {
+      directory: "config-data-for-web-instance",
+      from: "parent",
+      as: "config-data",
+      to: "#web_instances",
+      availability: "optional",
+    },
+    {
+      // Statically offered to all web_instances regardless of whether they were
+      // created with `ContextFeatureFlags::NETWORK`.
+      directory: "root-ssl-certificates",
+      from: "parent",
+      to: "#web_instances",
+      // Required because clients may request Contexts with
+      // `ContextFeatureFlags::NETWORK`.
+      availability: "required",
+    },
+  ],
+}
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index 92c8a09..80d05000 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -793,8 +793,7 @@
   }
 
   if (gl_version_info_->is_es3 ||
-      gfx::HasExtension(extensions, "GL_OES_element_index_uint") ||
-      gl::HasDesktopGLFeatures()) {
+      gfx::HasExtension(extensions, "GL_OES_element_index_uint")) {
     AddExtensionString("GL_OES_element_index_uint");
     validators_.index_type.AddValue(GL_UNSIGNED_INT);
   }
@@ -1050,8 +1049,7 @@
     AddExtensionString("GL_EXT_disjoint_timer_query");
   }
 
-  if (gfx::HasExtension(extensions, "GL_OES_rgb8_rgba8") ||
-      gl::HasDesktopGLFeatures()) {
+  if (gfx::HasExtension(extensions, "GL_OES_rgb8_rgba8")) {
     AddExtensionString("GL_OES_rgb8_rgba8");
     validators_.render_buffer_format.AddValue(GL_RGB8_OES);
     validators_.render_buffer_format.AddValue(GL_RGBA8_OES);
@@ -1114,15 +1112,14 @@
   }
 
   if (gfx::HasExtension(extensions, "GL_OES_depth24") ||
-      gl::HasDesktopGLFeatures() || gl_version_info_->is_es3) {
+      gl_version_info_->is_es3) {
     AddExtensionString("GL_OES_depth24");
     feature_flags_.oes_depth24 = true;
     validators_.render_buffer_format.AddValue(GL_DEPTH_COMPONENT24);
   }
 
   if (gl_version_info_->is_es3 ||
-      gfx::HasExtension(extensions, "GL_OES_standard_derivatives") ||
-      gl::HasDesktopGLFeatures()) {
+      gfx::HasExtension(extensions, "GL_OES_standard_derivatives")) {
     AddExtensionString("GL_OES_standard_derivatives");
     feature_flags_.oes_standard_derivatives = true;
     validators_.hint_target.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES);
@@ -1382,8 +1379,7 @@
   }
 
   if (gl_version_info_->is_es3 ||
-      gfx::HasExtension(extensions, "GL_EXT_blend_minmax") ||
-      gl::HasDesktopGLFeatures()) {
+      gfx::HasExtension(extensions, "GL_EXT_blend_minmax")) {
     AddExtensionString("GL_EXT_blend_minmax");
     validators_.equation.AddValue(GL_MIN_EXT);
     validators_.equation.AddValue(GL_MAX_EXT);
@@ -1392,14 +1388,12 @@
   }
 
   // TODO(dshwang): GLES3 supports gl_FragDepth, not gl_FragDepthEXT.
-  if (gfx::HasExtension(extensions, "GL_EXT_frag_depth") ||
-      gl::HasDesktopGLFeatures()) {
+  if (gfx::HasExtension(extensions, "GL_EXT_frag_depth")) {
     AddExtensionString("GL_EXT_frag_depth");
     feature_flags_.ext_frag_depth = true;
   }
 
-  if (gfx::HasExtension(extensions, "GL_EXT_shader_texture_lod") ||
-      gl::HasDesktopGLFeatures()) {
+  if (gfx::HasExtension(extensions, "GL_EXT_shader_texture_lod")) {
     AddExtensionString("GL_EXT_shader_texture_lod");
     feature_flags_.ext_shader_texture_lod = true;
   }
diff --git a/gpu/command_buffer/service/shader_translator_unittest.cc b/gpu/command_buffer/service/shader_translator_unittest.cc
index 0c6ad30..1b9ce45 100644
--- a/gpu/command_buffer/service/shader_translator_unittest.cc
+++ b/gpu/command_buffer/service/shader_translator_unittest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "gpu/command_buffer/service/shader_translator.h"
+#include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_version_info.h"
@@ -22,6 +23,9 @@
 
  protected:
   void SetUp() override {
+#if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)
+    GTEST_SKIP() << "Angle doesn't support OpenGL on Windows";
+#else
     ShBuiltInResources resources;
     sh::InitBuiltInResources(&resources);
     resources.MaxExpressionComplexity = 32;
@@ -36,6 +40,7 @@
     ASSERT_TRUE(fragment_translator_->Init(GL_FRAGMENT_SHADER, SH_GLES2_SPEC,
                                            &resources, shader_output_language_,
                                            {}, false));
+#endif  //  BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)
   }
   void TearDown() override {
     vertex_translator_ = nullptr;
@@ -59,6 +64,9 @@
 
  protected:
   void SetUp() override {
+#if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)
+    GTEST_SKIP() << "Angle doesn't support OpenGL on Windows";
+#else
     ShBuiltInResources resources;
     sh::InitBuiltInResources(&resources);
     resources.MaxExpressionComplexity = 32;
@@ -73,6 +81,7 @@
     ASSERT_TRUE(fragment_translator_->Init(GL_FRAGMENT_SHADER, SH_GLES3_SPEC,
                                            &resources, shader_output_language_,
                                            {}, false));
+#endif  //  BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)
   }
   void TearDown() override {
     vertex_translator_ = nullptr;
@@ -429,6 +438,12 @@
 
 class ShaderTranslatorOutputVersionTest
     : public testing::TestWithParam<testing::tuple<const char*, const char*>> {
+ public:
+#if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)
+  void SetUp() override {
+    GTEST_SKIP() << "Angle doesn't support OpenGL on Windows";
+  }
+#endif
 };
 
 // crbug.com/540543
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
index 886e543..d0fd6007 100644
--- a/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
@@ -7,6 +7,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/bits.h"
 #include "base/memory/raw_ptr_exclusion.h"
 #include "build/build_config.h"
 #include "components/viz/common/resources/resource_format_utils.h"
@@ -30,6 +31,7 @@
 #include "gpu/vulkan/vulkan_util.h"
 #include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 #include "third_party/skia/include/gpu/GrBackendSemaphore.h"
+#include "third_party/skia/include/gpu/vk/GrVkTypes.h"
 #include "ui/gfx/buffer_format_util.h"
 #include "ui/gl/buildflags.h"
 #include "ui/gl/gl_context.h"
@@ -129,7 +131,7 @@
     backend_senampres.back().initVulkan(semaphore.GetVkSemaphore());
   }
   gr_context->wait(backend_senampres.size(), backend_senampres.data(),
-                   /*deleteSemaphoreAfterWait=*/false);
+                   /*deleteSemaphoresAfterWait=*/false);
 }
 
 }  // namespace
@@ -208,7 +210,7 @@
     auto image_info = backing->AsSkImageInfo();
     DCHECK_EQ(pixel_data.size(), image_info.computeMinByteSize());
     SkPixmap pixmap(image_info, pixel_data.data(), image_info.minRowBytes());
-    backing->UploadToVkImage(pixmap);
+    backing->UploadToVkImage({pixmap});
 
     // Mark the backing as cleared.
     backing->SetCleared();
@@ -284,50 +286,70 @@
                                       image->device_size(),
                                       /*is_thread_safe=*/false),
       context_state_(std::move(context_state)),
-      image_(std::move(image)),
-      backend_texture_(size.width(),
-                       size.height(),
-                       CreateGrVkImageInfo(image_.get())),
-      promise_texture_(SkPromiseImageTexture::Make(backend_texture_)),
       command_pool_(command_pool),
-      use_separate_gl_texture_(use_separate_gl_texture) {}
+      use_separate_gl_texture_(use_separate_gl_texture) {
+  vk_textures_.resize(1);
+  auto& vk_texture = vk_textures_[0];
+  vk_texture.vulkan_image = std::move(image);
+  gfx::Size plane_size = vk_texture.vulkan_image->size();
+  GrVkImageInfo vk_image_info =
+      CreateGrVkImageInfo(vk_texture.vulkan_image.get());
+  vk_texture.backend_texture =
+      GrBackendTexture(plane_size.width(), plane_size.height(), vk_image_info);
+  vk_texture.promise_texture =
+      SkPromiseImageTexture::Make(vk_texture.backend_texture);
+}
 
 ExternalVkImageBacking::~ExternalVkImageBacking() {
   auto semaphores = std::move(read_semaphores_);
-  if (write_semaphore_)
+  if (write_semaphore_) {
     semaphores.emplace_back(std::move(write_semaphore_));
+  }
 
   if (!semaphores.empty() && !context_state()->gr_context()->abandoned()) {
     WaitSemaphoresOnGrContext(context_state()->gr_context(), &semaphores);
     ReturnPendingSemaphoresWithFenceHelper(std::move(semaphores));
   }
 
-  fence_helper()->EnqueueVulkanObjectCleanupForSubmittedWork(std::move(image_));
-  backend_texture_ = GrBackendTexture();
+  for (auto& vk_texture : vk_textures_) {
+    fence_helper()->EnqueueVulkanObjectCleanupForSubmittedWork(
+        std::move(vk_texture.vulkan_image));
+  }
+  vk_textures_.clear();
 
-  if (gl_texture_) {
+  if (!gl_textures_.empty()) {
     // Ensure that a context is current before glDeleteTexture().
     MakeGLContextCurrent();
     if (!have_context()) {
-      gl_texture_->SetContextLost();
+      for (auto& gl_texture : gl_textures_) {
+        gl_texture.SetContextLost();
+      }
     }
-    gl_texture_.reset();
+    gl_textures_.clear();
   }
 }
 
 std::vector<GLenum> ExternalVkImageBacking::GetVkImageLayoutsForGL() {
-  GrVkImageInfo info;
-  auto result = backend_texture_.getVkImageInfo(&info);
-  DCHECK(result);
-  DCHECK_EQ(info.fCurrentQueueFamily, VK_QUEUE_FAMILY_EXTERNAL);
-  DCHECK_NE(info.fImageLayout, VK_IMAGE_LAYOUT_UNDEFINED);
-  DCHECK_NE(info.fImageLayout, VK_IMAGE_LAYOUT_PREINITIALIZED);
-  return {VkImageLayoutToGLImageLayout(info.fImageLayout)};
+  std::vector<GLenum> layouts;
+  layouts.reserve(vk_textures_.size());
+  for (auto& vk_texture : vk_textures_) {
+    GrVkImageInfo info = vk_texture.GetGrVkImageInfo();
+    DCHECK_EQ(info.fCurrentQueueFamily, VK_QUEUE_FAMILY_EXTERNAL);
+    DCHECK_NE(info.fImageLayout, VK_IMAGE_LAYOUT_UNDEFINED);
+    DCHECK_NE(info.fImageLayout, VK_IMAGE_LAYOUT_PREINITIALIZED);
+    layouts.push_back(VkImageLayoutToGLImageLayout(info.fImageLayout));
+  }
+  return layouts;
 }
 
 std::vector<sk_sp<SkPromiseImageTexture>>
 ExternalVkImageBacking::GetPromiseTextures() {
-  return {promise_texture_};
+  std::vector<sk_sp<SkPromiseImageTexture>> promise_textures;
+  promise_textures.reserve(vk_textures_.size());
+  for (auto& vk_texture : vk_textures_) {
+    promise_textures.push_back(vk_texture.promise_texture);
+  }
+  return promise_textures;
 }
 
 bool ExternalVkImageBacking::BeginAccess(
@@ -344,7 +366,7 @@
 
   if (readonly && !reads_in_progress_) {
     UpdateContent(kInVkImage);
-    if (gl_texture_) {
+    if (!gl_textures_.empty()) {
       UpdateContent(kInGLTexture);
     }
   }
@@ -356,9 +378,13 @@
     // resume the GL access.
     DCHECK(!is_gl);
     DCHECK(readonly);
-    DCHECK(gl_texture_);
+    DCHECK_EQ(vk_textures_.size(), gl_textures_.size());
 
-    std::vector<GLuint> texture_ids = {gl_texture_->GetServiceId()};
+    std::vector<GLuint> texture_ids;
+    for (auto& gl_texture : gl_textures_) {
+      texture_ids.push_back(gl_texture.GetServiceId());
+    }
+
     MakeGLContextCurrent();
 
     auto release_semaphore =
@@ -383,10 +409,12 @@
     // if ProduceGL*() is never called. In this case, image layout and queue
     // family will not be ready for GL access as well.
     auto* gr_context = context_state()->gr_context();
-    gr_context->setBackendTextureState(
-        backend_texture_,
-        GrBackendSurfaceMutableState(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
-                                     VK_QUEUE_FAMILY_EXTERNAL));
+    for (auto& vk_texture : vk_textures_) {
+      gr_context->setBackendTextureState(
+          vk_texture.backend_texture,
+          GrBackendSurfaceMutableState(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+                                       VK_QUEUE_FAMILY_EXTERNAL));
+    }
 
     ExternalSemaphore external_semaphore =
         external_semaphore_pool()->GetOrCreateSemaphore();
@@ -442,8 +470,13 @@
     // access, we need to resume GL read access.
     DCHECK(!is_gl);
     DCHECK(readonly);
-    DCHECK(gl_texture_);
-    std::vector<GLuint> texture_ids = {gl_texture_->GetServiceId()};
+    DCHECK_EQ(vk_textures_.size(), gl_textures_.size());
+
+    std::vector<GLuint> texture_ids;
+    for (auto& gl_texture : gl_textures_) {
+      texture_ids.push_back(gl_texture.GetServiceId());
+    }
+
     MakeGLContextCurrent();
     std::vector<ExternalSemaphore> external_semaphores;
     BeginAccessInternal(true, &external_semaphores);
@@ -471,18 +504,15 @@
 
 bool ExternalVkImageBacking::UploadFromMemory(
     const std::vector<SkPixmap>& pixmaps) {
-  DCHECK_EQ(pixmaps.size(), 1u);
-  auto& pixmap = pixmaps[0];
-
-  if (!UploadToVkImage(pixmap)) {
+  if (!UploadToVkImage(pixmaps)) {
     return false;
   }
 
   latest_content_ = kInVkImage;
 
   // Also upload to GL texture if there is a separate one.
-  if (use_separate_gl_texture() && gl_texture_) {
-    if (!UploadToGLTexture(pixmap)) {
+  if (use_separate_gl_texture() && !gl_textures_.empty()) {
+    if (!UploadToGLTexture(pixmaps)) {
       return false;
     }
     latest_content_ |= kInGLTexture;
@@ -524,7 +554,8 @@
 }
 
 scoped_refptr<gfx::NativePixmap> ExternalVkImageBacking::GetNativePixmap() {
-  return image_->native_pixmap();
+  DCHECK_EQ(vk_textures_.size(), 1u);
+  return vk_textures_[0].vulkan_image->native_pixmap();
 }
 
 void ExternalVkImageBacking::ReturnPendingSemaphoresWithFenceHelper(
@@ -550,7 +581,8 @@
     return nullptr;
   }
 
-  auto memory_fd = image_->GetMemoryFd();
+  DCHECK_EQ(vk_textures_.size(), 1u);
+  auto memory_fd = vk_textures_[0].vulkan_image->GetMemoryFd();
   if (!memory_fd.is_valid()) {
     return nullptr;
   }
@@ -575,13 +607,14 @@
 bool ExternalVkImageBacking::ProduceGLTextureInternal(bool is_passthrough) {
   gl::GLApi* api = gl::g_current_gl_context;
   absl::optional<ScopedDedicatedMemoryObject> memory_object;
+  auto& vk_texture = vk_textures_[0];
+  auto& vulkan_image = vk_texture.vulkan_image;
+
   if (!use_separate_gl_texture()) {
-    GrVkImageInfo image_info;
-    bool result = backend_texture_.getVkImageInfo(&image_info);
-    DCHECK(result);
+    GrVkImageInfo image_info = vk_texture.GetGrVkImageInfo();
 
 #if BUILDFLAG(IS_POSIX)
-    auto memory_fd = image_->GetMemoryFd();
+    auto memory_fd = vulkan_image->GetMemoryFd();
     if (!memory_fd.is_valid()) {
       return false;
     }
@@ -590,7 +623,7 @@
                                GL_HANDLE_TYPE_OPAQUE_FD_EXT,
                                memory_fd.release());
 #elif BUILDFLAG(IS_WIN)
-    auto memory_handle = image_->GetMemoryHandle();
+    auto memory_handle = vulkan_image->GetMemoryHandle();
     if (!memory_handle.IsValid()) {
       return false;
     }
@@ -599,7 +632,7 @@
         memory_object->id(), image_info.fAlloc.fSize,
         GL_HANDLE_TYPE_OPAQUE_WIN32_EXT, memory_handle.Take());
 #elif BUILDFLAG(IS_FUCHSIA)
-    zx::vmo vmo = image_->GetMemoryZirconHandle();
+    zx::vmo vmo = vulkan_image->GetMemoryZirconHandle();
     if (!vmo)
       return false;
     memory_object.emplace(api);
@@ -647,12 +680,12 @@
     // Currently, no extension structs are appended to VkImageCreateInfo::pNext
     // when creating the image, so communicate that information to ANGLE.  This
     // makes sure that ANGLE recreates the VkImage identically to Chromium.
-    DCHECK(image_->usage() != 0);
+    DCHECK_NE(vulkan_image->usage(), 0u);
     if (UseMinimalUsageFlags(context_state())) {
       api->glTexStorageMemFlags2DANGLEFn(
           GL_TEXTURE_2D, 1, format_desc.storage_internal_format, size().width(),
-          size().height(), memory_object->id(), 0, image_->flags(),
-          image_->usage(), nullptr);
+          size().height(), memory_object->id(), 0, vulkan_image->flags(),
+          vulkan_image->usage(), nullptr);
     } else {
       api->glTexStorageMem2DEXTFn(
           GL_TEXTURE_2D, 1, format_desc.storage_internal_format, size().width(),
@@ -660,8 +693,8 @@
     }
   }
 
-  gl_texture_ = std::make_unique<GLTextureHolder>(
-      format().resource_format(), size(), is_passthrough, nullptr);
+  auto& gl_texture = gl_textures_.emplace_back(format().resource_format(),
+                                               size(), is_passthrough, nullptr);
 
   if (is_passthrough) {
     auto texture = base::MakeRefCounted<gpu::gles2::TexturePassthrough>(
@@ -669,7 +702,7 @@
         size().width(), size().height(),
         /*depth=*/1, /*border=*/0, format_desc.data_format,
         format_desc.data_type);
-    gl_texture_->InitializeWithTexture(format_desc, std::move(texture));
+    gl_texture.InitializeWithTexture(format_desc, std::move(texture));
   } else {
     auto* texture = gles2::CreateGLES2TextureWithLightRef(texture_service_id,
                                                           GL_TEXTURE_2D);
@@ -684,7 +717,7 @@
                           format_desc.data_format, format_desc.data_type,
                           cleared_rect);
     texture->SetImmutable(true, true);
-    gl_texture_->InitializeWithTexture(format_desc, texture);
+    gl_texture.InitializeWithTexture(format_desc, texture);
   }
 
   return true;
@@ -698,13 +731,18 @@
     return nullptr;
   }
 
-  if (!gl_texture_) {
+  if (gl_textures_.empty()) {
     if (!ProduceGLTextureInternal(/*is_passthrough=*/false)) {
       return nullptr;
     }
   }
 
-  std::vector<gles2::Texture*> textures = {gl_texture_->texture()};
+  std::vector<gles2::Texture*> textures;
+  textures.reserve(gl_textures_.size());
+  for (auto& gl_texture : gl_textures_) {
+    textures.push_back(gl_texture.texture());
+  }
+
   return std::make_unique<ExternalVkImageGLRepresentation>(
       manager, this, tracker, std::move(textures));
 }
@@ -718,14 +756,18 @@
     return nullptr;
   }
 
-  if (!gl_texture_) {
+  if (gl_textures_.empty()) {
     if (!ProduceGLTextureInternal(/*is_passthrough=*/true)) {
       return nullptr;
     }
   }
 
-  std::vector<scoped_refptr<gles2::TexturePassthrough>> textures = {
-      gl_texture_->passthrough_texture()};
+  std::vector<scoped_refptr<gles2::TexturePassthrough>> textures;
+  textures.reserve(gl_textures_.size());
+  for (auto& gl_texture : gl_textures_) {
+    textures.push_back(gl_texture.passthrough_texture());
+  }
+
   return std::make_unique<ExternalVkImageGLPassthroughRepresentation>(
       manager, this, tracker, std::move(textures));
 }
@@ -784,9 +826,29 @@
   }
 }
 
+std::pair<std::vector<ExternalVkImageBacking::MapPlaneData>, size_t>
+ExternalVkImageBacking::GetMapPlaneData() const {
+  std::vector<MapPlaneData> data;
+  size_t total_data_bytes = 0;
+  size_t num_planes = vk_textures_.size();
+  for (size_t plane = 0; plane < num_planes; ++plane) {
+    data.push_back({AsSkImageInfo(plane), total_data_bytes});
+
+    // Ensure that the start of the next plane is 4 byte aligned. For all
+    // multi-planar formats the max texel block size is 4 bytes so this will
+    // always satisfy the next planes alignment requirement.
+    size_t plane_bytes = data.back().image_info.computeMinByteSize();
+    base::bits::AlignUp<size_t>(plane_bytes, 4u);
+
+    total_data_bytes += plane_bytes;
+  }
+
+  return {data, total_data_bytes};
+}
+
 void ExternalVkImageBacking::CopyPixelsFromGLTextureToVkImage() {
   DCHECK(use_separate_gl_texture());
-  DCHECK(gl_texture_);
+  DCHECK_EQ(vk_textures_.size(), gl_textures_.size());
 
   // Make sure GrContext is not using GL. So we don't need reset GrContext
   DCHECK(!context_state_->GrContextIsGL());
@@ -797,12 +859,10 @@
     return;
   }
 
-  SkImageInfo sk_image_info = AsSkImageInfo();
-  size_t data_size = sk_image_info.computeMinByteSize();
-
+  auto [plane_data, total_data_bytes] = GetMapPlaneData();
   VkBufferCreateInfo buffer_create_info = {
       .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
-      .size = data_size,
+      .size = total_data_bytes,
       .usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
       .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
   };
@@ -831,11 +891,16 @@
     return;
   }
 
-  SkPixmap pixmap(sk_image_info, buffer, sk_image_info.minRowBytes());
-  if (!gl_texture_->ReadbackToMemory(pixmap)) {
-    DLOG(ERROR) << "GL readback failed";
-    vma::UnmapMemory(allocator, stage_allocation);
-    return;
+  for (size_t plane = 0; plane < vk_textures_.size(); ++plane) {
+    auto& sk_image_info = plane_data[plane].image_info;
+    uint8_t* memory = static_cast<uint8_t*>(buffer) + plane_data[plane].offset;
+    SkPixmap pixmap(sk_image_info, memory, sk_image_info.minRowBytes());
+
+    if (!gl_textures_[plane].ReadbackToMemory(pixmap)) {
+      DLOG(ERROR) << "GL readback failed";
+      vma::UnmapMemory(allocator, stage_allocation);
+      return;
+    }
   }
 
   vma::UnmapMemory(allocator, stage_allocation);
@@ -854,18 +919,23 @@
   CHECK(command_buffer);
   {
     ScopedSingleUseCommandBufferRecorder recorder(*command_buffer);
-    GrVkImageInfo image_info;
-    bool success = backend_texture_.getVkImageInfo(&image_info);
-    DCHECK(success);
-    if (image_info.fImageLayout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
-      command_buffer->TransitionImageLayout(
-          image_info.fImage, image_info.fImageLayout,
-          VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
-      backend_texture_.setVkImageLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+
+    for (size_t plane = 0; plane < vk_textures_.size(); ++plane) {
+      GrVkImageInfo image_info = vk_textures_[plane].GetGrVkImageInfo();
+      if (image_info.fImageLayout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
+        command_buffer->TransitionImageLayout(
+            image_info.fImage, image_info.fImageLayout,
+            VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+        vk_textures_[plane].backend_texture.setVkImageLayout(
+            VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+      }
+
+      auto& sk_image_info = plane_data[plane].image_info;
+      command_buffer->CopyBufferToImage(
+          stage_buffer, image_info.fImage, sk_image_info.width(),
+          sk_image_info.height(), sk_image_info.width(), sk_image_info.height(),
+          plane_data[plane].offset);
     }
-    command_buffer->CopyBufferToImage(stage_buffer, image_info.fImage,
-                                      size().width(), size().height(),
-                                      size().width(), size().height());
   }
 
   if (!need_synchronization()) {
@@ -905,7 +975,7 @@
 
 void ExternalVkImageBacking::CopyPixelsFromVkImageToGLTexture() {
   DCHECK(use_separate_gl_texture());
-  DCHECK(gl_texture_);
+  DCHECK_EQ(vk_textures_.size(), gl_textures_.size());
 
   // Make sure GrContext is not using GL. So we don't need reset GrContext
   DCHECK(!context_state_->GrContextIsGL());
@@ -916,12 +986,10 @@
     return;
   }
 
-  SkImageInfo sk_image_info = AsSkImageInfo();
-  size_t data_size = sk_image_info.computeMinByteSize();
-
+  auto [plane_data, total_data_bytes] = GetMapPlaneData();
   VkBufferCreateInfo buffer_create_info = {
       .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
-      .size = data_size,
+      .size = total_data_bytes,
       .usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT,
       .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
   };
@@ -957,18 +1025,23 @@
   CHECK(command_buffer);
   {
     ScopedSingleUseCommandBufferRecorder recorder(*command_buffer);
-    GrVkImageInfo image_info;
-    bool success = backend_texture_.getVkImageInfo(&image_info);
-    DCHECK(success);
-    if (image_info.fImageLayout != VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) {
-      command_buffer->TransitionImageLayout(
-          image_info.fImage, image_info.fImageLayout,
-          VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
-      backend_texture_.setVkImageLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+
+    for (size_t plane = 0; plane < vk_textures_.size(); ++plane) {
+      GrVkImageInfo image_info = vk_textures_[plane].GetGrVkImageInfo();
+      if (image_info.fImageLayout != VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) {
+        command_buffer->TransitionImageLayout(
+            image_info.fImage, image_info.fImageLayout,
+            VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+        vk_textures_[plane].backend_texture.setVkImageLayout(
+            VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+      }
+
+      auto& sk_image_info = plane_data[plane].image_info;
+      command_buffer->CopyImageToBuffer(
+          stage_buffer, image_info.fImage, sk_image_info.width(),
+          sk_image_info.height(), sk_image_info.width(), sk_image_info.height(),
+          plane_data[plane].offset);
     }
-    command_buffer->CopyImageToBuffer(stage_buffer, image_info.fImage,
-                                      size().width(), size().height(),
-                                      size().width(), size().height());
   }
 
   command_buffer->Submit(0, nullptr, 0, nullptr);
@@ -983,15 +1056,22 @@
     return;
   }
 
-  SkPixmap pixmap(sk_image_info, buffer, sk_image_info.minRowBytes());
-  if (!gl_texture_->UploadFromMemory(pixmap)) {
-    DLOG(ERROR) << "GL upload failed";
+  for (size_t plane = 0; plane < vk_textures_.size(); ++plane) {
+    auto& sk_image_info = plane_data[plane].image_info;
+    uint8_t* memory = static_cast<uint8_t*>(buffer) + plane_data[plane].offset;
+    SkPixmap pixmap(sk_image_info, memory, sk_image_info.minRowBytes());
+    if (!gl_textures_[plane].UploadFromMemory(pixmap)) {
+      DLOG(ERROR) << "GL upload failed";
+    }
   }
 
   vma::UnmapMemory(allocator, stage_allocation);
 }
 
-bool ExternalVkImageBacking::UploadToVkImage(const SkPixmap& pixmap) {
+bool ExternalVkImageBacking::UploadToVkImage(
+    const std::vector<SkPixmap>& pixmaps) {
+  DCHECK_EQ(pixmaps.size(), vk_textures_.size());
+
   std::vector<ExternalSemaphore> external_semaphores;
   if (!BeginAccessInternal(/*readonly=*/false, &external_semaphores)) {
     DLOG(ERROR) << "BeginAccess() failed.";
@@ -1000,11 +1080,14 @@
   auto* gr_context = context_state_->gr_context();
   WaitSemaphoresOnGrContext(gr_context, &external_semaphores);
 
-  bool success =
-      gr_context->updateBackendTexture(backend_texture_, &pixmap,
-                                       /*numLevels=*/1, nullptr, nullptr);
-  if (!success) {
-    DLOG(ERROR) << "updateBackendTexture() failed.";
+  bool success = true;
+  for (size_t plane = 0; plane < vk_textures_.size(); ++plane) {
+    if (!gr_context->updateBackendTexture(vk_textures_[plane].backend_texture,
+                                          &pixmaps[plane],
+                                          /*numLevels=*/1, nullptr, nullptr)) {
+      success = false;
+      DLOG(ERROR) << "updateBackendTexture() failed.";
+    }
   }
 
   if (!need_synchronization()) {
@@ -1014,10 +1097,12 @@
   }
 
   gr_context->flush({});
-  gr_context->setBackendTextureState(
-      backend_texture_,
-      GrBackendSurfaceMutableState(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
-                                   VK_QUEUE_FAMILY_EXTERNAL));
+  for (auto& vk_texture : vk_textures_) {
+    gr_context->setBackendTextureState(
+        vk_texture.backend_texture,
+        GrBackendSurfaceMutableState(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+                                     VK_QUEUE_FAMILY_EXTERNAL));
+  }
 
   auto end_access_semaphore = external_semaphore_pool()->GetOrCreateSemaphore();
   VkSemaphore vk_end_access_semaphore = end_access_semaphore.GetVkSemaphore();
@@ -1039,9 +1124,10 @@
   return success;
 }
 
-bool ExternalVkImageBacking::UploadToGLTexture(const SkPixmap& pixmap) {
+bool ExternalVkImageBacking::UploadToGLTexture(
+    const std::vector<SkPixmap>& pixmaps) {
   DCHECK(use_separate_gl_texture());
-  DCHECK(gl_texture_);
+  DCHECK_EQ(gl_textures_.size(), pixmaps.size());
 
   // Make sure a gl context is current, since textures are shared between all gl
   // contexts, we don't care which gl context is current.
@@ -1049,7 +1135,12 @@
     return false;
   }
 
-  return gl_texture_->UploadFromMemory(pixmap);
+  for (size_t i = 0; i < gl_textures_.size(); ++i) {
+    if (!gl_textures_[i].UploadFromMemory(pixmaps[i])) {
+      return false;
+    }
+  }
+  return true;
 }
 
 bool ExternalVkImageBacking::BeginAccessInternal(
@@ -1123,4 +1214,20 @@
   }
 }
 
+ExternalVkImageBacking::TextureHolderVk::TextureHolderVk() = default;
+ExternalVkImageBacking::TextureHolderVk::TextureHolderVk(
+    TextureHolderVk&& other) = default;
+ExternalVkImageBacking::TextureHolderVk&
+ExternalVkImageBacking::TextureHolderVk::operator=(TextureHolderVk&& other) =
+    default;
+ExternalVkImageBacking::TextureHolderVk::~TextureHolderVk() = default;
+
+GrVkImageInfo ExternalVkImageBacking::TextureHolderVk::GetGrVkImageInfo()
+    const {
+  GrVkImageInfo info;
+  bool result = backend_texture.getVkImageInfo(&info);
+  DCHECK(result);
+  return info;
+}
+
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing.h b/gpu/command_buffer/service/shared_image/external_vk_image_backing.h
index c4c1743..ab545f0c1 100644
--- a/gpu/command_buffer/service/shared_image/external_vk_image_backing.h
+++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing.h
@@ -76,8 +76,10 @@
   ~ExternalVkImageBacking() override;
 
   SharedContextState* context_state() const { return context_state_.get(); }
-  const GrBackendTexture& backend_texture() const { return backend_texture_; }
-  VulkanImage* image() const { return image_.get(); }
+  const GrBackendTexture& backend_texture() const {
+    return vk_textures_[0].backend_texture;
+  }
+  VulkanImage* image() const { return vk_textures_[0].vulkan_image.get(); }
   viz::VulkanContextProvider* context_provider() const {
     return context_state()->vk_context_provider();
   }
@@ -97,7 +99,7 @@
     }
 
     if (usage() & SHARED_IMAGE_USAGE_GLES2) {
-      return !use_separate_gl_texture() && gl_texture_;
+      return !use_separate_gl_texture() && !gl_textures_.empty();
     }
 
     if ((usage() & SHARED_IMAGE_USAGE_RASTER) &&
@@ -172,6 +174,25 @@
       MemoryTypeTracker* tracker) override;
 
  private:
+  struct TextureHolderVk {
+    TextureHolderVk();
+    TextureHolderVk(TextureHolderVk&& other);
+    TextureHolderVk& operator=(TextureHolderVk&& other);
+    ~TextureHolderVk();
+
+    GrVkImageInfo GetGrVkImageInfo() const;
+
+    std::unique_ptr<VulkanImage> vulkan_image;
+    GrBackendTexture backend_texture;
+    sk_sp<SkPromiseImageTexture> promise_texture;
+  };
+
+  // Holds format + offset information for Vulkan mapped memory.
+  struct MapPlaneData {
+    SkImageInfo image_info;
+    size_t offset = 0;
+  };
+
   // Makes GL context current if not already. Will return false if MakeCurrent()
   // failed.
   bool MakeGLContextCurrent();
@@ -179,15 +200,19 @@
   // Allocates GL texture and returns true if successful.
   bool ProduceGLTextureInternal(bool is_passthrough);
 
-  bool UploadToVkImage(const SkPixmap& pixmap);
-  bool UploadToGLTexture(const SkPixmap& pixmap);
+  bool UploadToVkImage(const std::vector<SkPixmap>& pixmap);
+  bool UploadToGLTexture(const std::vector<SkPixmap>& pixmaps);
+
+  // Return format+offset per plane along with total data bytes required when
+  // mapping VkImage.
+  std::pair<std::vector<MapPlaneData>, size_t> GetMapPlaneData() const;
+
   void CopyPixelsFromGLTextureToVkImage();
   void CopyPixelsFromVkImageToGLTexture();
 
   scoped_refptr<SharedContextState> context_state_;
-  std::unique_ptr<VulkanImage> image_;
-  GrBackendTexture backend_texture_;
-  sk_sp<SkPromiseImageTexture> promise_texture_;
+  std::vector<TextureHolderVk> vk_textures_;
+
   const raw_ptr<VulkanCommandPool, DanglingUntriaged> command_pool_;
   const bool use_separate_gl_texture_;
 
@@ -198,7 +223,7 @@
   uint32_t reads_in_progress_ = 0;
   uint32_t gl_reads_in_progress_ = 0;
 
-  std::unique_ptr<GLTextureHolder> gl_texture_;
+  std::vector<GLTextureHolder> gl_textures_;
 
   enum LatestContent {
     kInVkImage = 1 << 0,
diff --git a/gpu/command_buffer/service/shared_image/shared_image_backing.cc b/gpu/command_buffer/service/shared_image/shared_image_backing.cc
index a47ba46..3eb1a9f 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/shared_image_backing.cc
@@ -96,10 +96,11 @@
   have_context_ = false;
 }
 
-SkImageInfo SharedImageBacking::AsSkImageInfo() const {
-  return SkImageInfo::Make(size_.width(), size_.height(),
+SkImageInfo SharedImageBacking::AsSkImageInfo(int plane_index) const {
+  gfx::Size plane_size = format_.GetPlaneSize(plane_index, size_);
+  return SkImageInfo::Make(plane_size.width(), plane_size.height(),
                            viz::ToClosestSkColorType(
-                               /*gpu_compositing=*/true, format()),
+                               /*gpu_compositing=*/true, format(), plane_index),
                            alpha_type_, color_space_.ToSkColorSpace());
 }
 
diff --git a/gpu/command_buffer/service/shared_image/shared_image_backing.h b/gpu/command_buffer/service/shared_image/shared_image_backing.h
index f136b243..bb54546 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_backing.h
+++ b/gpu/command_buffer/service/shared_image/shared_image_backing.h
@@ -124,8 +124,9 @@
 
   void OnContextLost();
 
-  // Creates SkImageInfo matching backing size, format, alpha and color space.
-  SkImageInfo AsSkImageInfo() const;
+  // Creates SkImageInfo matching backing size, format, alpha and color space
+  // for the specified `plane_index`.
+  SkImageInfo AsSkImageInfo(int plane_index = 0) const;
 
   // Disables reference counting for backing. No references should be added,
   // either before or after this is called.
diff --git a/gpu/ipc/service/image_transport_surface_linux.cc b/gpu/ipc/service/image_transport_surface_linux.cc
index 67b690c..a02a653 100644
--- a/gpu/ipc/service/image_transport_surface_linux.cc
+++ b/gpu/ipc/service/image_transport_surface_linux.cc
@@ -34,8 +34,7 @@
   scoped_refptr<gl::GLSurface> surface =
       gl::init::CreateViewGLSurface(display, surface_handle);
   bool override_vsync_for_multi_window_swap = false;
-  if (gl::GetGLImplementation() == gl::kGLImplementationDesktopGL ||
-      gl::GetGLImplementation() == gl::kGLImplementationEGLANGLE) {
+  if (gl::GetGLImplementation() == gl::kGLImplementationEGLANGLE) {
     override_vsync_for_multi_window_swap = true;
   }
   if (!surface)
diff --git a/gpu/vulkan/vulkan_command_buffer.cc b/gpu/vulkan/vulkan_command_buffer.cc
index fbab1625..874b6343 100644
--- a/gpu/vulkan/vulkan_command_buffer.cc
+++ b/gpu/vulkan/vulkan_command_buffer.cc
@@ -244,9 +244,10 @@
                                             uint32_t buffer_width,
                                             uint32_t buffer_height,
                                             uint32_t width,
-                                            uint32_t height) {
+                                            uint32_t height,
+                                            uint64_t buffer_offset) {
   VkBufferImageCopy region = {};
-  region.bufferOffset = 0;
+  region.bufferOffset = buffer_offset;
   region.bufferRowLength = buffer_width;
   region.bufferImageHeight = buffer_height;
   region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
@@ -264,9 +265,10 @@
                                             uint32_t buffer_width,
                                             uint32_t buffer_height,
                                             uint32_t width,
-                                            uint32_t height) {
+                                            uint32_t height,
+                                            uint64_t buffer_offset) {
   VkBufferImageCopy region = {};
-  region.bufferOffset = 0;
+  region.bufferOffset = buffer_offset;
   region.bufferRowLength = buffer_width;
   region.bufferImageHeight = buffer_height;
   region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
diff --git a/gpu/vulkan/vulkan_command_buffer.h b/gpu/vulkan/vulkan_command_buffer.h
index 92db569..88bc9da 100644
--- a/gpu/vulkan/vulkan_command_buffer.h
+++ b/gpu/vulkan/vulkan_command_buffer.h
@@ -61,13 +61,15 @@
                          uint32_t buffer_width,
                          uint32_t buffer_height,
                          uint32_t width,
-                         uint32_t height);
+                         uint32_t height,
+                         uint64_t buffer_offset = 0);
   void CopyImageToBuffer(VkBuffer buffer,
                          VkImage image,
                          uint32_t buffer_width,
                          uint32_t buffer_height,
                          uint32_t width,
-                         uint32_t height);
+                         uint32_t height,
+                         uint64_t buffer_offset = 0);
 
  private:
   friend class CommandBufferRecorderBase;
diff --git a/headless/test/data/protocol/emulation/virtual-time-svg-expected.txt b/headless/test/data/protocol/emulation/virtual-time-svg-expected.txt
new file mode 100644
index 0000000..10f0404
--- /dev/null
+++ b/headless/test/data/protocol/emulation/virtual-time-svg-expected.txt
@@ -0,0 +1,3 @@
+Tests virtual time with history navigation.
+Request to http://test.com/index.html, type: Document
+Request to http://test.com/circle.svg, type: Image
\ No newline at end of file
diff --git a/headless/test/data/protocol/emulation/virtual-time-svg.js b/headless/test/data/protocol/emulation/virtual-time-svg.js
new file mode 100644
index 0000000..28e2413
--- /dev/null
+++ b/headless/test/data/protocol/emulation/virtual-time-svg.js
@@ -0,0 +1,34 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function(testRunner) {
+  const {dp} = await testRunner.startBlank(
+      `Tests virtual time with history navigation.`);
+
+  const FetchHelper = await testRunner.loadScriptAbsolute(
+      '../fetch/resources/fetch-test.js');
+  const fetcher = new FetchHelper(testRunner, dp);
+  await fetcher.enable();
+
+  fetcher.onceRequest('http://test.com/index.html').fulfill(
+    FetchHelper.makeContentResponse(`<html><img src="circle.svg"><html>`));
+
+  fetcher.onceRequest('http://test.com/circle.svg').fulfill(
+    FetchHelper.makeContentResponse(
+        `<?xml version="1.0" encoding="iso-8859-1"?>
+        <svg width="100" height="100"
+            xmlns="http://www.w3.org/2000/svg"
+            xmlns:xlink="http://www.w3.org/1999/xlink">
+            <circle cx="50" cy="50" r="50" fill="green" />
+        </svg>
+    `, 'image/svg+xml'));
+
+  await dp.Page.enable();
+  dp.Page.navigate({url: 'http://test.com/index.html'});
+  await dp.Page.onceLoadEventFired();
+  dp.Emulation.setVirtualTimePolicy({
+      policy: 'pauseIfNetworkFetchesPending', budget: 5000});
+  await dp.Emulation.onceVirtualTimeBudgetExpired();
+  testRunner.completeTest();
+})
diff --git a/headless/test/headless_protocol_browsertest.cc b/headless/test/headless_protocol_browsertest.cc
index 68a9e96..f3a17e3 100644
--- a/headless/test/headless_protocol_browsertest.cc
+++ b/headless/test/headless_protocol_browsertest.cc
@@ -268,6 +268,7 @@
                        "emulation/virtual-time-history-navigation.js")
 HEADLESS_PROTOCOL_TEST(VirtualTimeHistoryNavigationSameDoc,
                        "emulation/virtual-time-history-navigation-same-doc.js")
+HEADLESS_PROTOCOL_TEST(VirtualTimeSVG, "emulation/virtual-time-svg.js")
 
 // Flaky on Mac. TODO(crbug.com/1419801): Re-enable.
 #if BUILDFLAG(IS_MAC)
diff --git a/ios/chrome/app/feed_app_agent.mm b/ios/chrome/app/feed_app_agent.mm
index 7cd27680..fc3e8bf 100644
--- a/ios/chrome/app/feed_app_agent.mm
+++ b/ios/chrome/app/feed_app_agent.mm
@@ -82,7 +82,9 @@
   if (IsFeedBackgroundRefreshEnabled()) {
     [self scheduleBackgroundRefresh];
   }
-  if (IsFeedAppCloseForegroundRefreshEnabled()) {
+  if (IsFeedAppCloseBackgroundRefreshEnabled()) {
+    [self scheduleBackgroundRefresh];
+  } else if (IsFeedAppCloseForegroundRefreshEnabled()) {
     [self feedService]->RefreshFeed(FeedRefreshTrigger::kForegroundAppClose);
   }
 }
@@ -138,7 +140,8 @@
   // Do not DCHECK IsFeedBackgroundRefreshEnabled() because this is also called
   // from the background task handler, and the value could have changed during a
   // cold start.
-  if (!IsFeedBackgroundRefreshEnabled()) {
+  if (!IsFeedBackgroundRefreshEnabled() ||
+      !IsFeedAppCloseBackgroundRefreshEnabled()) {
     return;
   }
   BGAppRefreshTaskRequest* request = [[BGAppRefreshTaskRequest alloc]
@@ -158,6 +161,10 @@
   if (IsFeedOverrideDefaultsEnabled()) {
     earliestBeginDate = [NSDate
         dateWithTimeIntervalSinceNow:GetBackgroundRefreshIntervalInSeconds()];
+  } else if (IsFeedAppCloseBackgroundRefreshEnabled()) {
+    earliestBeginDate =
+        [NSDate dateWithTimeIntervalSinceNow:
+                    GetAppCloseBackgroundRefreshIntervalInSeconds()];
   } else {
     // This is expected to crash if FeedService is not available.
     earliestBeginDate =
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index d308506f..ec16cb7 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -186,6 +186,9 @@
       <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE" desc="Title of the sync description section on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
         Sync your passwords, history &amp; more on all devices
       </message>
+      <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE_WITHOUT_PASSWORDS" desc="Title of the sync description section on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
+        Sync your bookmarks, history &amp; more on all devices
+      </message>
       <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_MANAGED_TITLE" desc="Title of the sync description section on the sync consent dialog to explain why sync can be useful for the user when sync types are limited (i.e. managed by policies). [iOS only]">
         To sync and personalize accross devices, turn on sync.
       </message>
@@ -2541,7 +2544,7 @@
         Make sure you're saving your current password for this site.
       </message>
       <message name="IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION" desc="Footer text shown when the user is trying to add or edit a credential manually via settings and the note typed by user is too long. [iOS only]">
-        Notes can save up to 1000 characters.
+        Notes can save up to <ph name="CHARACTER_LIMIT">$1<ex>1000</ex></ph> characters.
       </message>
       <message name="IDS_IOS_SETTINGS_PASSWORDS_MISSING_TLD_DESCRIPTION" desc="Footer text shown when the website field data misses the top-level domain when creating a new credential via settings [iOS only]" meaning="Suggesting user to add the top-level domain in the website text.">
         Did you mean <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>?
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE_WITHOUT_PASSWORDS.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE_WITHOUT_PASSWORDS.png.sha1
new file mode 100644
index 0000000..a96987ff
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE_WITHOUT_PASSWORDS.png.sha1
@@ -0,0 +1 @@
+38f43ed211f07205d9462e50fd52f851c6820c20
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION.png.sha1
index d89fef1f5..0136fcc 100644
--- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION.png.sha1
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION.png.sha1
@@ -1 +1 @@
-b0e86532582d24aa56837dbd4012e3dd944fedd6
\ No newline at end of file
+bf809d64b44e1b60fa0a5fcce7578d43965e0dbf
\ No newline at end of file
diff --git a/ios/chrome/browser/autofill/BUILD.gn b/ios/chrome/browser/autofill/BUILD.gn
index 372deab..d91635ca2 100644
--- a/ios/chrome/browser/autofill/BUILD.gn
+++ b/ios/chrome/browser/autofill/BUILD.gn
@@ -232,7 +232,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public",
     "//ios/web/public/test:element_selector",
     "//net:test_support",
diff --git a/ios/chrome/browser/autofill/automation/BUILD.gn b/ios/chrome/browser/autofill/automation/BUILD.gn
index 41e41e3..a1aa15d 100644
--- a/ios/chrome/browser/autofill/automation/BUILD.gn
+++ b/ios/chrome/browser/autofill/automation/BUILD.gn
@@ -25,7 +25,6 @@
     "//ios/chrome/browser/ui/infobars:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//net:test_support",
   ]
@@ -68,5 +67,5 @@
     "automation_app_interface.h",
     "automation_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
diff --git a/ios/chrome/browser/autofill/automation/automation_app_interface_stub.mm b/ios/chrome/browser/autofill/automation/automation_app_interface_stub.mm
index 7a811be5..450657e 100644
--- a/ios/chrome/browser/autofill/automation/automation_app_interface_stub.mm
+++ b/ios/chrome/browser/autofill/automation/automation_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/autofill/automation/automation_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/device_sharing/BUILD.gn b/ios/chrome/browser/device_sharing/BUILD.gn
index 61eb84ea..d734d78 100644
--- a/ios/chrome/browser/device_sharing/BUILD.gn
+++ b/ios/chrome/browser/device_sharing/BUILD.gn
@@ -78,7 +78,7 @@
     "handoff_manager_app_interface.h",
     "handoff_manager_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
 
 source_set("eg2_tests") {
@@ -95,7 +95,6 @@
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net",
     "//net:test_support",
     "//url",
diff --git a/ios/chrome/browser/device_sharing/handoff_manager_app_interface_stub.mm b/ios/chrome/browser/device_sharing/handoff_manager_app_interface_stub.mm
index eeae5c9..583a46fc 100644
--- a/ios/chrome/browser/device_sharing/handoff_manager_app_interface_stub.mm
+++ b/ios/chrome/browser/device_sharing/handoff_manager_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/device_sharing/handoff_manager_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/feature_engagement/BUILD.gn b/ios/chrome/browser/feature_engagement/BUILD.gn
index 1f9ad341..fa9cc5ca8 100644
--- a/ios/chrome/browser/feature_engagement/BUILD.gn
+++ b/ios/chrome/browser/feature_engagement/BUILD.gn
@@ -61,7 +61,7 @@
   ]
   deps = [
     "//base",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
 
@@ -82,7 +82,6 @@
     "//ios/chrome/browser/ui/popup_menu:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
     "//url",
diff --git a/ios/chrome/browser/feature_engagement/feature_engagement_app_interface_stub.mm b/ios/chrome/browser/feature_engagement/feature_engagement_app_interface_stub.mm
index 2f5e95d..a13b105 100644
--- a/ios/chrome/browser/feature_engagement/feature_engagement_app_interface_stub.mm
+++ b/ios/chrome/browser/feature_engagement/feature_engagement_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/feature_engagement/feature_engagement_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/find_in_page/BUILD.gn b/ios/chrome/browser/find_in_page/BUILD.gn
index ed48e6e3..06959584 100644
--- a/ios/chrome/browser/find_in_page/BUILD.gn
+++ b/ios/chrome/browser/find_in_page/BUILD.gn
@@ -109,5 +109,5 @@
     "find_in_page_app_interface.h",
     "find_in_page_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
diff --git a/ios/chrome/browser/find_in_page/find_in_page_app_interface_stub.mm b/ios/chrome/browser/find_in_page/find_in_page_app_interface_stub.mm
index 47094a1..8a1ef37a 100644
--- a/ios/chrome/browser/find_in_page/find_in_page_app_interface_stub.mm
+++ b/ios/chrome/browser/find_in_page/find_in_page_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/find_in_page/find_in_page_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 5152b6e9..5001ce9df 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -427,10 +427,16 @@
 // Feed Foreground Refresh Feature Params.
 const FeatureEntry::FeatureParam kFeedSessionCloseForegroundRefresh[] = {
     {kEnableFeedSessionCloseForegroundRefresh, "true"},
-    {kEnableFeedAppCloseForegroundRefresh, "false"}};
+    {kEnableFeedAppCloseForegroundRefresh, "false"},
+    {kEnableFeedAppCloseBackgroundRefresh, "false"}};
 const FeatureEntry::FeatureParam kFeedAppCloseForegroundRefresh[] = {
     {kEnableFeedSessionCloseForegroundRefresh, "false"},
-    {kEnableFeedAppCloseForegroundRefresh, "true"}};
+    {kEnableFeedAppCloseForegroundRefresh, "true"},
+    {kEnableFeedAppCloseBackgroundRefresh, "false"}};
+const FeatureEntry::FeatureParam kFeedAppCloseBackgroundRefresh[] = {
+    {kEnableFeedSessionCloseForegroundRefresh, "false"},
+    {kEnableFeedAppCloseForegroundRefresh, "false"},
+    {kEnableFeedAppCloseBackgroundRefresh, "true"}};
 
 // Feed Invisible Foreground Refresh Feature Variations.
 const FeatureEntry::FeatureVariation
@@ -439,6 +445,8 @@
          std::size(kFeedSessionCloseForegroundRefresh), nullptr},
         {"app close foreground refresh", kFeedAppCloseForegroundRefresh,
          std::size(kFeedAppCloseForegroundRefresh), nullptr},
+        {"app close background refresh", kFeedAppCloseBackgroundRefresh,
+         std::size(kFeedAppCloseBackgroundRefresh), nullptr},
 };
 
 const FeatureEntry::FeatureParam kTrendingQueriesEnableAllUsers[] = {
@@ -1422,7 +1430,7 @@
      flag_descriptions::kIndicateAccountStorageErrorInAccountCellName,
      flag_descriptions::kIndicateAccountStorageErrorInAccountCellDescription,
      flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(kIndicateAccountStorageErrorInAccountCell)},
+     FEATURE_VALUE_TYPE(syncer::kIndicateAccountStorageErrorInAccountCell)},
     {"enable-bookmarks-account-storage",
      flag_descriptions::kEnableBookmarksAccountStorageName,
      flag_descriptions::kEnableBookmarksAccountStorageDescription,
diff --git a/ios/chrome/browser/https_upgrades/BUILD.gn b/ios/chrome/browser/https_upgrades/BUILD.gn
index 560625c5..d80dcdb 100644
--- a/ios/chrome/browser/https_upgrades/BUILD.gn
+++ b/ios/chrome/browser/https_upgrades/BUILD.gn
@@ -72,7 +72,7 @@
 
   deps = [
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
 
@@ -130,7 +130,6 @@
     "//ios/net:test_support",
     "//ios/testing:embedded_test_server_support",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common:features",
     "//ios/web/public/test:element_selector",
     "//ios/web/public/test/http_server",
diff --git a/ios/chrome/browser/https_upgrades/https_upgrade_app_interface_stub.mm b/ios/chrome/browser/https_upgrades/https_upgrade_app_interface_stub.mm
index d982dd5..66f3ba3 100644
--- a/ios/chrome/browser/https_upgrades/https_upgrade_app_interface_stub.mm
+++ b/ios/chrome/browser/https_upgrades/https_upgrade_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/https_upgrades/https_upgrade_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn
index 1b93213..dd81d66f 100644
--- a/ios/chrome/browser/metrics/BUILD.gn
+++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -288,7 +288,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//ios/web/public/test/http_server",
     "//ui/base:base",
@@ -352,7 +351,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//third_party/metrics_proto",
   ]
 }
diff --git a/ios/chrome/browser/net/BUILD.gn b/ios/chrome/browser/net/BUILD.gn
index 3ea46f6b..f0bdbfa 100644
--- a/ios/chrome/browser/net/BUILD.gn
+++ b/ios/chrome/browser/net/BUILD.gn
@@ -91,7 +91,6 @@
   deps = [
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
     "//url",
diff --git a/ios/chrome/browser/ntp/features.h b/ios/chrome/browser/ntp/features.h
index a4dd8c7..d187506 100644
--- a/ios/chrome/browser/ntp/features.h
+++ b/ios/chrome/browser/ntp/features.h
@@ -72,6 +72,14 @@
 // on app backgrounding.
 extern const char kEnableFeedAppCloseForegroundRefresh[];
 
+// Feature param under `kEnableFeedInvisibleForegroundRefresh` to enable refresh
+// soon after the app is backgrounded.
+extern const char kEnableFeedAppCloseBackgroundRefresh[];
+
+// Feature param under `kEnableFeedInvisibleForegroundRefresh` for the
+// background refresh interval in seconds.
+extern const char kAppCloseBackgroundRefreshIntervalInSeconds[];
+
 // Feature param under `kEnableFeedInvisibleForegroundRefresh` for the time
 // interval used to set the session end timer.
 extern const char kFeedSessionEndTimerTimeoutInSeconds[];
@@ -138,6 +146,9 @@
 // Returns the background refresh max age in seconds.
 double GetBackgroundRefreshMaxAgeInSeconds();
 
+// Whether feed can be refreshed while not visible.
+bool IsFeedInvisibleForegroundRefreshEnabled();
+
 // Whether feed is refreshed after the user ends a Feed session, but while the
 // app is still in the foreground (e.g., user switches tabs, user navigates away
 // from Feed in current tab).
@@ -147,6 +158,14 @@
 // different from background refresh.
 bool IsFeedAppCloseForegroundRefreshEnabled();
 
+// Whether feed is refreshed in the background soon after the app is
+// backgrounded.
+bool IsFeedAppCloseBackgroundRefreshEnabled();
+
+// The earliest interval to refresh in the background after app enters the
+// background in app close background refresh.
+double GetAppCloseBackgroundRefreshIntervalInSeconds();
+
 // Returns the time interval used to set the session end timer.
 double GetFeedSessionEndTimerTimeoutInSeconds();
 
diff --git a/ios/chrome/browser/ntp/features.mm b/ios/chrome/browser/ntp/features.mm
index 5a94398c..dcd43e2 100644
--- a/ios/chrome/browser/ntp/features.mm
+++ b/ios/chrome/browser/ntp/features.mm
@@ -78,6 +78,10 @@
     "EnableFeedSessionCloseForegroundRefresh";
 const char kEnableFeedAppCloseForegroundRefresh[] =
     "EnableFeedAppCloseForegroundRefresh";
+const char kEnableFeedAppCloseBackgroundRefresh[] =
+    "EnableFeedAppCloseBackgroundRefresh";
+const char kAppCloseBackgroundRefreshIntervalInSeconds[] =
+    "AppCloseBackgroundRefreshIntervalInSeconds";
 const char kFeedSessionEndTimerTimeoutInSeconds[] =
     "FeedSessionEndTimerTimeoutInSeconds";
 const char kFeedSeenRefreshThresholdInSeconds[] =
@@ -198,6 +202,10 @@
       /*default=*/0);
 }
 
+bool IsFeedInvisibleForegroundRefreshEnabled() {
+  return base::FeatureList::IsEnabled(kEnableFeedInvisibleForegroundRefresh);
+}
+
 bool IsFeedSessionCloseForegroundRefreshEnabled() {
   return base::GetFieldTrialParamByFeatureAsBool(
       kEnableFeedInvisibleForegroundRefresh,
@@ -212,6 +220,20 @@
       /*default=*/false);
 }
 
+bool IsFeedAppCloseBackgroundRefreshEnabled() {
+  return base::GetFieldTrialParamByFeatureAsBool(
+      kEnableFeedInvisibleForegroundRefresh,
+      kEnableFeedAppCloseBackgroundRefresh,
+      /*default=*/false);
+}
+
+double GetAppCloseBackgroundRefreshIntervalInSeconds() {
+  return base::GetFieldTrialParamByFeatureAsDouble(
+      kEnableFeedInvisibleForegroundRefresh,
+      kAppCloseBackgroundRefreshIntervalInSeconds,
+      /*default=*/base::Minutes(5).InSecondsF());
+}
+
 double GetFeedSessionEndTimerTimeoutInSeconds() {
   double override_value = [[NSUserDefaults standardUserDefaults]
       doubleForKey:@"FeedSessionEndTimerTimeoutInSeconds"];
diff --git a/ios/chrome/browser/ntp_tiles/BUILD.gn b/ios/chrome/browser/ntp_tiles/BUILD.gn
index e99c920..feba4ff 100644
--- a/ios/chrome/browser/ntp_tiles/BUILD.gn
+++ b/ios/chrome/browser/ntp_tiles/BUILD.gn
@@ -43,7 +43,6 @@
     "//ios/chrome/browser/ui/content_suggestions:feature_flags",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server:http_server",
     "//net",
   ]
diff --git a/ios/chrome/browser/optimization_guide/BUILD.gn b/ios/chrome/browser/optimization_guide/BUILD.gn
index 611bddaf..8f984dca 100644
--- a/ios/chrome/browser/optimization_guide/BUILD.gn
+++ b/ios/chrome/browser/optimization_guide/BUILD.gn
@@ -137,7 +137,7 @@
   ]
   deps = [
     "//components/optimization_guide/proto:optimization_guide_proto",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
 
@@ -155,7 +155,6 @@
     "//ios/chrome/browser/metrics:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/optimization_guide/optimization_guide_test_app_interface_stub.mm b/ios/chrome/browser/optimization_guide/optimization_guide_test_app_interface_stub.mm
index 6488525..ab624402 100644
--- a/ios/chrome/browser/optimization_guide/optimization_guide_test_app_interface_stub.mm
+++ b/ios/chrome/browser/optimization_guide/optimization_guide_test_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/optimization_guide/optimization_guide_test_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/passwords/BUILD.gn b/ios/chrome/browser/passwords/BUILD.gn
index 39e1711..26fb1ea 100644
--- a/ios/chrome/browser/passwords/BUILD.gn
+++ b/ios/chrome/browser/passwords/BUILD.gn
@@ -254,7 +254,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net:test_support",
     "//ui/base:base",
@@ -279,6 +278,9 @@
     "//components/autofill/core/common",
     "//components/keyed_service/core",
     "//components/password_manager/core/browser",
+    "//components/password_manager/core/common",
+    "//components/prefs",
+    "//ios/chrome/browser/browser_state",
     "//ios/chrome/test/app:test_support",
     "//ios/testing:nserror_support",
     "//ios/web/public",
@@ -296,5 +298,5 @@
     "password_manager_app_interface.h",
     "password_manager_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm
index f4b3be2..97c2a4e 100644
--- a/ios/chrome/browser/passwords/password_controller.mm
+++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -40,6 +40,7 @@
 #import "components/password_manager/core/browser/password_manager.h"
 #import "components/password_manager/core/browser/password_manager_client.h"
 #import "components/password_manager/core/browser/password_sync_util.h"
+#import "components/password_manager/core/common/password_manager_pref_names.h"
 #import "components/password_manager/ios/account_select_fill_data.h"
 #import "components/password_manager/ios/password_controller_driver_helper.h"
 #import "components/password_manager/ios/password_form_helper.h"
@@ -62,6 +63,7 @@
 #import "ios/chrome/browser/shared/public/commands/password_breach_commands.h"
 #import "ios/chrome/browser/shared/public/commands/password_protection_commands.h"
 #import "ios/chrome/browser/shared/public/commands/password_suggestion_commands.h"
+#import "ios/chrome/browser/shared/public/commands/passwords_account_storage_notice_commands.h"
 #import "ios/chrome/browser/signin/authentication_service.h"
 #import "ios/chrome/browser/signin/authentication_service_factory.h"
 #import "ios/chrome/browser/sync/sync_service_factory.h"
@@ -277,17 +279,17 @@
 - (void)showSavePasswordInfoBar:
             (std::unique_ptr<PasswordFormManagerForUI>)formToSave
                          manual:(BOOL)manual {
-  [self showInfoBarForForm:std::move(formToSave)
-               infoBarType:PasswordInfoBarType::SAVE
-                    manual:manual];
+  [self maybeShowAccountStorageNoticeBeforeInfobar:std::move(formToSave)
+                                            manual:manual
+                                       infobarType:PasswordInfoBarType::SAVE];
 }
 
 - (void)showUpdatePasswordInfoBar:
             (std::unique_ptr<PasswordFormManagerForUI>)formToUpdate
                            manual:(BOOL)manual {
-  [self showInfoBarForForm:std::move(formToUpdate)
-               infoBarType:PasswordInfoBarType::UPDATE
-                    manual:manual];
+  [self maybeShowAccountStorageNoticeBeforeInfobar:std::move(formToUpdate)
+                                            manual:manual
+                                       infobarType:PasswordInfoBarType::UPDATE];
 }
 
 - (void)removePasswordInfoBarManualFallback:(BOOL)manual {
@@ -479,6 +481,30 @@
   self.notifyAutoSigninViewController = nil;
 }
 
+- (void)maybeShowAccountStorageNoticeBeforeInfobar:
+            (std::unique_ptr<PasswordFormManagerForUI>)form
+                                            manual:(BOOL)manual
+                                       infobarType:
+                                           (PasswordInfoBarType)infobarType {
+  // Ignore manual saves/updates (they are infrequent enough that we don't care,
+  // this is an FYI not a consent).
+  if (manual || ![self shouldShowAccountStorageNotice]) {
+    [self showInfoBarForForm:std::move(form)
+                 infoBarType:infobarType
+                      manual:manual];
+    return;
+  }
+
+  __weak __typeof(self) weakSelf = self;
+  __block std::unique_ptr<PasswordFormManagerForUI> blockForm = std::move(form);
+  [self showAccountStorageNotice:^{
+    // No need to handle opt-outs here, the infobar adapts the strings.
+    [weakSelf showInfoBarForForm:std::move(blockForm)
+                     infoBarType:infobarType
+                          manual:manual];
+  }];
+}
+
 #pragma mark - SharedPasswordControllerDelegate
 
 - (void)sharedPasswordController:(SharedPasswordController*)controller
@@ -498,4 +524,19 @@
   }
 }
 
+- (BOOL)shouldShowAccountStorageNotice {
+  return _passwordManagerClient->GetPasswordFeatureManager()
+             ->IsOptedInForAccountStorage() &&
+         !self.browserState->GetPrefs()->GetBoolean(
+             password_manager::prefs::kAccountStorageNoticeShown);
+}
+
+- (void)showAccountStorageNotice:(void (^)())completion {
+  CHECK([self shouldShowAccountStorageNotice]);
+  self.browserState->GetPrefs()->SetBoolean(
+      password_manager::prefs::kAccountStorageNoticeShown, true);
+  [HandlerForProtocol(self.dispatcher, PasswordsAccountStorageNoticeCommands)
+      showPasswordsAccountStorageNoticeWithDismissalHandler:completion];
+}
+
 @end
diff --git a/ios/chrome/browser/passwords/password_controller_egtest.mm b/ios/chrome/browser/passwords/password_controller_egtest.mm
index 91dcd28..8774d435 100644
--- a/ios/chrome/browser/passwords/password_controller_egtest.mm
+++ b/ios/chrome/browser/passwords/password_controller_egtest.mm
@@ -7,7 +7,9 @@
 
 #import <memory>
 
+#import "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
+#import "components/password_manager/core/common/password_manager_features.h"
 #import "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/passwords/password_manager_app_interface.h"
 #import "ios/chrome/browser/signin/fake_system_identity.h"
@@ -23,6 +25,7 @@
 #import "ios/chrome/test/earl_grey/web_http_server_chrome_test_case.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
 #import "ios/testing/earl_grey/matchers.h"
+#import "net/base/mac/url_conversions.h"
 #import "net/test/embedded_test_server/default_handlers.h"
 #import "ui/base/l10n/l10n_util.h"
 
@@ -81,6 +84,10 @@
   // Set up server.
   net::test_server::RegisterDefaultHandlers(self.testServer);
   GREYAssertTrue(self.testServer->Start(), @"Server did not start.");
+
+  // Prefs aren't reset between tests, crbug.com/1069086. Most tests don't care
+  // about the account storage notice, so suppress it by marking it as shown.
+  [PasswordManagerAppInterface setAccountStorageNoticeShown:YES];
 }
 
 - (void)tearDown {
@@ -88,6 +95,18 @@
   [super tearDown];
 }
 
+- (AppLaunchConfiguration)appConfigurationForTestCase {
+  AppLaunchConfiguration config;
+  if ([self
+          isRunningTest:@selector(testShowAccountStorageNoticeBeforeSaving)] ||
+      [self
+          isRunningTest:@selector(testShowAccountStorageNoticeBeforeFilling)]) {
+    config.features_enabled.push_back(
+        password_manager::features::kEnablePasswordsAccountStorage);
+  }
+  return config;
+}
+
 #pragma mark - Helper methods
 
 // Loads simple page on localhost.
@@ -131,6 +150,57 @@
   GREYAssertEqual(1, credentialsCount, @"Wrong number of stored credentials.");
 }
 
+- (void)testShowAccountStorageNoticeBeforeSaving {
+  [PasswordManagerAppInterface setAccountStorageNoticeShown:NO];
+  FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity enableSync:NO];
+  [self loadLoginPage];
+
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
+      performAction:chrome_test_util::TapWebElementWithId("submit_button")];
+
+  [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
+                      grey_accessibilityLabel(l10n_util::GetNSString(
+                          IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_TITLE))];
+
+  [[EarlGrey selectElementWithMatcher:
+                 grey_accessibilityLabel(l10n_util::GetNSString(
+                     IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_BUTTON_TEXT))]
+      performAction:grey_tap()];
+
+  [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
+                      grey_accessibilityLabel(l10n_util::GetNSStringF(
+                          IDS_IOS_PASSWORD_MANAGER_ON_ACCOUNT_SAVE_SUBTITLE,
+                          base::SysNSStringToUTF16(fakeIdentity.userEmail)))];
+}
+
+- (void)testShowAccountStorageNoticeBeforeFilling {
+  [PasswordManagerAppInterface
+      storeCredentialWithUsername:@"user"
+                         password:@"password"
+                              URL:net::NSURLWithGURL(self.testServer->GetURL(
+                                      "/simple_login_form.html"))];
+  [PasswordManagerAppInterface setAccountStorageNoticeShown:NO];
+  [SigninEarlGreyUI signinWithFakeIdentity:[FakeSystemIdentity fakeIdentity1]
+                                enableSync:NO];
+  [self loadLoginPage];
+
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
+      performAction:chrome_test_util::TapWebElementWithId(kFormPassword)];
+
+  [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
+                      grey_accessibilityLabel(l10n_util::GetNSString(
+                          IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_TITLE))];
+
+  [[EarlGrey selectElementWithMatcher:
+                 grey_accessibilityLabel(l10n_util::GetNSString(
+                     IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_BUTTON_TEXT))]
+      performAction:grey_tap()];
+
+  [ChromeEarlGrey waitForUIElementToAppearWithMatcher:grey_accessibilityLabel(
+                                                          @"user ••••••••")];
+}
+
 // Tests that update password prompt is shown on submitting the new password
 // for an already stored login.
 - (void)testUpdatePromptAppearsOnFormSubmission {
diff --git a/ios/chrome/browser/passwords/password_manager_app_interface.h b/ios/chrome/browser/passwords/password_manager_app_interface.h
index 048af48d..39e581e 100644
--- a/ios/chrome/browser/passwords/password_manager_app_interface.h
+++ b/ios/chrome/browser/passwords/password_manager_app_interface.h
@@ -25,6 +25,10 @@
 // Returns the number of stored credentials.
 + (int)storedCredentialsCount;
 
+// Sets the pref recording whether the one-time account storage notice was
+// shown. Used to either suppress or force the notice to appear in tests.
++ (void)setAccountStorageNoticeShown:(BOOL)shown;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_MANAGER_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/passwords/password_manager_app_interface.mm b/ios/chrome/browser/passwords/password_manager_app_interface.mm
index 0545923..7346ca7 100644
--- a/ios/chrome/browser/passwords/password_manager_app_interface.mm
+++ b/ios/chrome/browser/passwords/password_manager_app_interface.mm
@@ -11,6 +11,9 @@
 #import "components/password_manager/core/browser/password_form.h"
 #import "components/password_manager/core/browser/password_store_consumer.h"
 #import "components/password_manager/core/browser/password_store_interface.h"
+#import "components/password_manager/core/common/password_manager_pref_names.h"
+#import "components/prefs/pref_service.h"
+#import "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
@@ -125,4 +128,9 @@
   return credentials.size();
 }
 
++ (void)setAccountStorageNoticeShown:(BOOL)shown {
+  chrome_test_util::GetOriginalBrowserState()->GetPrefs()->SetBoolean(
+      password_manager::prefs::kAccountStorageNoticeShown, shown);
+}
+
 @end
diff --git a/ios/chrome/browser/passwords/password_manager_app_interface_stub.mm b/ios/chrome/browser/passwords/password_manager_app_interface_stub.mm
index 3c9ecfb..25058c2 100644
--- a/ios/chrome/browser/passwords/password_manager_app_interface_stub.mm
+++ b/ios/chrome/browser/passwords/password_manager_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/passwords/password_manager_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/policy/BUILD.gn b/ios/chrome/browser/policy/BUILD.gn
index e95c816..936c86d 100644
--- a/ios/chrome/browser/policy/BUILD.gn
+++ b/ios/chrome/browser/policy/BUILD.gn
@@ -294,7 +294,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:switches",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
     "//url",
@@ -344,6 +343,5 @@
   deps = [
     "//base",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
 }
diff --git a/ios/chrome/browser/policy/policy_app_interface_stub.mm b/ios/chrome/browser/policy/policy_app_interface_stub.mm
index 9e5758cf..391c561 100644
--- a/ios/chrome/browser/policy/policy_app_interface_stub.mm
+++ b/ios/chrome/browser/policy/policy_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/policy/policy_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/policy_url_blocking/BUILD.gn b/ios/chrome/browser/policy_url_blocking/BUILD.gn
index 8d0cda6..5cbe90c1 100644
--- a/ios/chrome/browser/policy_url_blocking/BUILD.gn
+++ b/ios/chrome/browser/policy_url_blocking/BUILD.gn
@@ -48,7 +48,6 @@
     "//ios/chrome/browser/policy:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net:test_support",
   ]
diff --git a/ios/chrome/browser/prefs/browser_prefs.mm b/ios/chrome/browser/prefs/browser_prefs.mm
index 86af3c2..fd58e11 100644
--- a/ios/chrome/browser/prefs/browser_prefs.mm
+++ b/ios/chrome/browser/prefs/browser_prefs.mm
@@ -415,6 +415,11 @@
 
   // Register pref used to determine if the Price Tracking UI has been shown.
   registry->RegisterBooleanPref(prefs::kPriceNotificationsHasBeenShown, false);
+
+  // Register pref used to determine if the Bring Android Tabs prompt has been
+  // shown.
+  registry->RegisterBooleanPref(prefs::kIosBringAndroidTabsPromptDisplayed,
+                                false);
 }
 
 // This method should be periodically pruned of year+ old migrations.
diff --git a/ios/chrome/browser/prefs/pref_names.cc b/ios/chrome/browser/prefs/pref_names.cc
index ac299181..9b2e2cf 100644
--- a/ios/chrome/browser/prefs/pref_names.cc
+++ b/ios/chrome/browser/prefs/pref_names.cc
@@ -102,6 +102,11 @@
 const char kIosBookmarkSigninPromoDisplayedCount[] =
     "ios.bookmark.signin_promo_displayed_count";
 
+// Boolean to represent if the Bring Android Tabs prompt has been displayed for
+// the user.
+const char kIosBringAndroidTabsPromptDisplayed[] =
+    "ios.bring_android_tabs.prompt_displayed";
+
 // Boolean that is true when the CredentialProviderPromoEnabled policy is
 // enabled.
 const char kIosCredentialProviderPromoPolicyEnabled[] =
diff --git a/ios/chrome/browser/prefs/pref_names.h b/ios/chrome/browser/prefs/pref_names.h
index c4637fa..54517c5b 100644
--- a/ios/chrome/browser/prefs/pref_names.h
+++ b/ios/chrome/browser/prefs/pref_names.h
@@ -34,6 +34,7 @@
 extern const char kIosBookmarkFolderDefault[];
 extern const char kIosBookmarkPromoAlreadySeen[];
 extern const char kIosBookmarkSigninPromoDisplayedCount[];
+extern const char kIosBringAndroidTabsPromptDisplayed[];
 extern const char kIosShareChromeCount[];
 extern const char kIosShareChromeLastShare[];
 extern const char kIosDiscoverFeedLastRefreshTime[];
diff --git a/ios/chrome/browser/prerender/BUILD.gn b/ios/chrome/browser/prerender/BUILD.gn
index d3bc1d6..5dd8c39 100644
--- a/ios/chrome/browser/prerender/BUILD.gn
+++ b/ios/chrome/browser/prerender/BUILD.gn
@@ -99,7 +99,6 @@
     "//ios/chrome/browser/ui/popup_menu:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common:user_agent",
     "//net:test_support",
   ]
diff --git a/ios/chrome/browser/safe_browsing/BUILD.gn b/ios/chrome/browser/safe_browsing/BUILD.gn
index 1d3c5afa..b8391ef 100644
--- a/ios/chrome/browser/safe_browsing/BUILD.gn
+++ b/ios/chrome/browser/safe_browsing/BUILD.gn
@@ -125,7 +125,6 @@
     "//ios/chrome/browser/ui/settings/privacy:privacy_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common:features",
     "//ios/web/public/test:element_selector",
     "//ios/web/public/test/http_server",
diff --git a/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.h b/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.h
index e3cb19b..1b1d70cc 100644
--- a/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.h
+++ b/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.h
@@ -12,6 +12,7 @@
 
 namespace segmentation_platform {
 
+class DeviceSwitcherResultDispatcher;
 class SegmentationPlatformService;
 
 // Factory for SegmentationPlatformService.
@@ -28,6 +29,11 @@
   SegmentationPlatformServiceFactory& operator=(
       SegmentationPlatformServiceFactory&) = delete;
 
+  // Returns the dispatcher used to retrieve or store the classification result
+  // for the user in the given browser state.
+  static DeviceSwitcherResultDispatcher* GetDispatcherForBrowserState(
+      ChromeBrowserState* context);
+
   // Returns the default factory used to build SegmentationPlatformService. Can
   // be registered with SetTestingFactory to use real instances during testing.
   static TestingFactory GetDefaultFactory();
diff --git a/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.mm b/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.mm
index 9318863..3573623 100644
--- a/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.mm
+++ b/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.mm
@@ -191,6 +191,15 @@
     default;
 
 // static
+DeviceSwitcherResultDispatcher*
+SegmentationPlatformServiceFactory::GetDispatcherForBrowserState(
+    ChromeBrowserState* context) {
+  return static_cast<segmentation_platform::DeviceSwitcherResultDispatcher*>(
+      GetForBrowserState(context)->GetUserData(
+          kSegmentationDeviceSwitcherUserDataKey));
+}
+
+// static
 BrowserStateKeyedServiceFactory::TestingFactory
 SegmentationPlatformServiceFactory::GetDefaultFactory() {
   return base::BindRepeating(&BuildSegmentationPlatformService);
diff --git a/ios/chrome/browser/shared/public/features/features.cc b/ios/chrome/browser/shared/public/features/features.cc
index 24a62e4..607c361d 100644
--- a/ios/chrome/browser/shared/public/features/features.cc
+++ b/ios/chrome/browser/shared/public/features/features.cc
@@ -209,15 +209,6 @@
   return BringYourOwnTabsPromptType::kDisabled;
 }
 
-BASE_FEATURE(kIndicateAccountStorageErrorInAccountCell,
-             "IndicatePassphraseErrorForSignedInUser",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
-bool IsIndicateAccountStorageErrorInAccountCellEnabled() {
-  return base::FeatureList::IsEnabled(
-      kIndicateAccountStorageErrorInAccountCell);
-}
-
 BASE_FEATURE(kNewNTPOmniboxLayout,
              "kNewNTPOmniboxLayout",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h
index 31bd26e6..de9e1a0 100644
--- a/ios/chrome/browser/shared/public/features/features.h
+++ b/ios/chrome/browser/shared/public/features/features.h
@@ -155,14 +155,6 @@
 // Helper function to check the feature add to home screen.
 bool ShouldAddToHomeScreen(bool in_incognito);
 
-// Feature flag to enable indicating the Account Storage error in the Account
-// Cell when Sync is turned OFF.
-BASE_DECLARE_FEATURE(kIndicateAccountStorageErrorInAccountCell);
-
-// Returns true if the `kIndicateAccountStorageErrorInAccountCell` feature is
-// enabled.
-bool IsIndicateAccountStorageErrorInAccountCellEnabled();
-
 // Feature flag to enable the new layout of the NTP omnibox.
 BASE_DECLARE_FEATURE(kNewNTPOmniboxLayout);
 
diff --git a/ios/chrome/browser/shared/ui/table_view/cells/table_view_header_footer_item.h b/ios/chrome/browser/shared/ui/table_view/cells/table_view_header_footer_item.h
index 5822b8c7..ce94183 100644
--- a/ios/chrome/browser/shared/ui/table_view/cells/table_view_header_footer_item.h
+++ b/ios/chrome/browser/shared/ui/table_view/cells/table_view_header_footer_item.h
@@ -7,13 +7,13 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/shared/ui/list_model/list_item.h"
+#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_item.h"
 
 @class ChromeTableViewStyler;
 
 // TableViewHeaderFooterItem holds the model data for a given table view
 // header/footer item.
-@interface TableViewHeaderFooterItem : ListItem
+@interface TableViewHeaderFooterItem : TableViewItem
 
 // Configures the given headerFooter view with the item's information. Override
 // this method to specialize. At this level, only accessibility properties are
diff --git a/ios/chrome/browser/shared/ui/util/BUILD.gn b/ios/chrome/browser/shared/ui/util/BUILD.gn
index 71f43ca0..56088e03 100644
--- a/ios/chrome/browser/shared/ui/util/BUILD.gn
+++ b/ios/chrome/browser/shared/ui/util/BUILD.gn
@@ -168,6 +168,5 @@
   deps = [
     ":util",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
 }
diff --git a/ios/chrome/browser/signin/BUILD.gn b/ios/chrome/browser/signin/BUILD.gn
index 1324a01..f1f869a 100644
--- a/ios/chrome/browser/signin/BUILD.gn
+++ b/ios/chrome/browser/signin/BUILD.gn
@@ -417,7 +417,6 @@
     "//ios/chrome/browser/ui/authentication:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/translate/BUILD.gn b/ios/chrome/browser/translate/BUILD.gn
index 00fd8ea..8aa70ed 100644
--- a/ios/chrome/browser/translate/BUILD.gn
+++ b/ios/chrome/browser/translate/BUILD.gn
@@ -165,7 +165,6 @@
   deps = [
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
 }
 
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn
index 75659e4..7e08017 100644
--- a/ios/chrome/browser/ui/authentication/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -235,7 +235,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
 }
diff --git a/ios/chrome/browser/ui/authentication/signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/BUILD.gn
index 5603779..df84277 100644
--- a/ios/chrome/browser/ui/authentication/signin/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/signin/BUILD.gn
@@ -146,7 +146,6 @@
     "//ios/chrome/browser/ui/settings/google_services:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn
index 3f45b27..64cc16e 100644
--- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/BUILD.gn
@@ -96,7 +96,6 @@
     "//ios/chrome/browser/ui/settings/google_services:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/BUILD.gn
index fd918de..1920db6 100644
--- a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/BUILD.gn
@@ -90,7 +90,6 @@
     "//ios/chrome/browser/ui/authentication/signin:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net",
     "//net:test_support",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn
index f501a2be..d3dd852 100644
--- a/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn
@@ -54,7 +54,6 @@
     "//ios/chrome/common/ui/promo_style:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net",
     "//net:test_support",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn
index 7c64790d..8c1c3ef 100644
--- a/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn
@@ -66,6 +66,7 @@
     ":user_signin",
     "//base/test:test_support",
     "//components/consent_auditor:test_support",
+    "//components/password_manager/core/common:features",
     "//components/prefs",
     "//components/prefs:test_support",
     "//components/sync:test_support",
@@ -119,7 +120,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:switches",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm
index ed63dc19..33b738c 100644
--- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm
@@ -6,9 +6,11 @@
 
 #import <UIKit/UIKit.h>
 
+#import "base/feature_list.h"
 #import "base/functional/callback_helpers.h"
 #import "base/strings/sys_string_conversions.h"
 #import "components/consent_auditor/fake_consent_auditor.h"
+#import "components/password_manager/core/common/password_manager_features.h"
 #import "components/sync/test/mock_sync_service.h"
 #import "components/sync_preferences/pref_service_mock_factory.h"
 #import "components/sync_preferences/pref_service_syncable.h"
@@ -218,9 +220,14 @@
   // then the consent is given. The list is ordered according to the position
   // on the screen.
   const std::vector<int> ExpectedConsentStringIds() const {
+    const int sync_dialog_title =
+        base::FeatureList::IsEnabled(
+            password_manager::features::kEnablePasswordsAccountStorage)
+            ? IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE_WITHOUT_PASSWORDS
+            : IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE;
     return {
         IDS_IOS_ACCOUNT_UNIFIED_CONSENT_TITLE,
-        IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE,
+        sync_dialog_title,
         IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_SUBTITLE,
         IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SETTINGS,
     };
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn b/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn
index 504a8a0..d6459202 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn
@@ -39,6 +39,7 @@
     "resources:unified_consent_header",
     "//base",
     "//components/google/core/common",
+    "//components/password_manager/core/common:features",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/application_context",
     "//ios/chrome/browser/shared/public/features",
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
index 73f019f7..7480414 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
@@ -7,9 +7,11 @@
 #import <ostream>
 
 #import "base/check_op.h"
+#import "base/feature_list.h"
 #import "base/ios/ns_range.h"
 #import "base/notreached.h"
 #import "components/google/core/common/google_util.h"
+#import "components/password_manager/core/common/password_manager_features.h"
 #import "ios/chrome/browser/application_context/application_context.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/authentication/authentication_constants.h"
@@ -181,9 +183,14 @@
   [container addSubview:self.identityButtonControl];
 
   // Sync title and subtitle.
-  int stringId = self.delegate.unifiedConsentCoordinatorHasManagedSyncDataType
-                     ? IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_MANAGED_TITLE
-                     : IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE;
+  int stringId = IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_MANAGED_TITLE;
+  if (!self.delegate.unifiedConsentCoordinatorHasManagedSyncDataType) {
+    stringId =
+        base::FeatureList::IsEnabled(
+            password_manager::features::kEnablePasswordsAccountStorage)
+            ? IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE_WITHOUT_PASSWORDS
+            : IDS_IOS_ACCOUNT_UNIFIED_CONSENT_SYNC_TITLE;
+  }
   UILabel* syncTitleLabel =
       [self addLabelWithStringId:stringId
                        fontStyle:UIFontTextStyleSubheadline
diff --git a/ios/chrome/browser/ui/autofill/BUILD.gn b/ios/chrome/browser/ui/autofill/BUILD.gn
index 1169e89..9e23ab5 100644
--- a/ios/chrome/browser/ui/autofill/BUILD.gn
+++ b/ios/chrome/browser/ui/autofill/BUILD.gn
@@ -158,7 +158,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net:test_support",
     "//services/network/public/cpp",
@@ -212,7 +211,6 @@
   deps = [
     "//base",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
 }
 
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
index 19591de..ae839b39 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
+++ b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
@@ -242,7 +242,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//net:test_support",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn
index 3b6c6066..7cc4f9a 100644
--- a/ios/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -182,7 +182,6 @@
     "//ios/chrome/browser/ui/popup_menu:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net",
     "//net:test_support",
@@ -252,7 +251,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//ui/base",
     "//url",
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface_stub.mm b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface_stub.mm
index 9061be7..c56a9ce 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.mm
index 913acdc..3b7508d 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.mm
@@ -50,7 +50,10 @@
   self = [super init];
   if (self) {
     _delegate = delegate;
-    ChromeBrowserState* browserState = browser->GetBrowserState();
+    ChromeBrowserState* browserState =
+        browser->GetBrowserState()->GetOriginalChromeBrowserState();
+    // TODO(crbug.com/1426262): Decide whether to show the signin promo in
+    // incognito mode and revisit this code.
     // Incognito browser can go away before this class is released (once the
     // last incognito winwdow is closed), this code avoids keeping a pointer to
     // it.
@@ -109,7 +112,8 @@
   }
 
   DCHECK(_browser);
-  ChromeBrowserState* browserState = _browser->GetBrowserState();
+  ChromeBrowserState* browserState =
+      _browser->GetBrowserState()->GetOriginalChromeBrowserState();
   AuthenticationService* authenticationService =
       AuthenticationServiceFactory::GetForBrowserState(browserState);
   if ([SigninPromoViewMediator
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm
index 083a3b9..f53a13de 100644
--- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm
+++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm
@@ -107,7 +107,7 @@
   DCHECK(self.sharedState);
 
   // Set up observers.
-  ChromeBrowserState* browserState = _browser->GetBrowserState();
+  ChromeBrowserState* browserState = [self originalBrowserState];
   _modelBridge = std::make_unique<BookmarkModelBridge>(
       self, self.sharedState.profileBookmarkModel);
   _syncedBookmarksObserver =
@@ -244,7 +244,7 @@
   }
 
   // Add "Managed Bookmarks" to the table if it exists.
-  ChromeBrowserState* browserState = _browser->GetBrowserState();
+  ChromeBrowserState* browserState = [self originalBrowserState];
   bookmarks::ManagedBookmarkService* managedBookmarkService =
       ManagedBookmarkServiceFactory::GetForBrowserState(browserState);
   const BookmarkNode* managedNode = managedBookmarkService->managed_node();
@@ -553,6 +553,13 @@
 
 #pragma mark - Private Helpers
 
+// The original chrome browser state used for services that don't exist in
+// incognito mode. E.g., `_syncSetupService`, `_syncService` and
+// `ManagedBookmarkService`.
+- (ChromeBrowserState*)originalBrowserState {
+  return _browser->GetBrowserState()->GetOriginalChromeBrowserState();
+}
+
 - (BOOL)hasBookmarksOrFolders {
   if (self.sharedState.tableViewDisplayedRootNode ==
       self.sharedState.profileBookmarkModel->root_node()) {
@@ -587,7 +594,7 @@
 // Returns YES if the user cannot turn on sync for enterprise policy reasons.
 - (BOOL)isSyncDisabledByAdministrator {
   DCHECK(self.syncService);
-  ChromeBrowserState* browserState = _browser->GetBrowserState();
+  ChromeBrowserState* browserState = [self originalBrowserState];
   bool syncDisabledPolicy = self.syncService->GetDisableReasons().Has(
       syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY);
   PrefService* prefService = browserState->GetPrefs();
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn
index 18d301c4..7f1635f 100644
--- a/ios/chrome/browser/ui/browser_view/BUILD.gn
+++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -371,7 +371,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//ui/base",
     "//url",
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
index 55c34d7..a5d394a 100644
--- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -361,7 +361,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
     "//ui/strings",
@@ -381,7 +380,7 @@
     "new_tab_page_app_interface_stub.mm",
   ]
 
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
 
 source_set("eg_app_support+eg2") {
diff --git a/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface_stub.mm b/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface_stub.mm
index 941fcf5..1e57b955 100644
--- a/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/context_menu/BUILD.gn b/ios/chrome/browser/ui/context_menu/BUILD.gn
index 31b4f99..c25892e 100644
--- a/ios/chrome/browser/ui/context_menu/BUILD.gn
+++ b/ios/chrome/browser/ui/context_menu/BUILD.gn
@@ -98,7 +98,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common:features",
     "//ios/web/public/test:element_selector",
     "//net:test_support",
diff --git a/ios/chrome/browser/ui/default_promo/BUILD.gn b/ios/chrome/browser/ui/default_promo/BUILD.gn
index d2bbc5b..391e13f2022 100644
--- a/ios/chrome/browser/ui/default_promo/BUILD.gn
+++ b/ios/chrome/browser/ui/default_promo/BUILD.gn
@@ -153,7 +153,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/dialogs/BUILD.gn b/ios/chrome/browser/ui/dialogs/BUILD.gn
index aed62ba..a2a1018 100644
--- a/ios/chrome/browser/ui/dialogs/BUILD.gn
+++ b/ios/chrome/browser/ui/dialogs/BUILD.gn
@@ -125,7 +125,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//ios/web/public/test/http_server",
     "//net:test_support",
diff --git a/ios/chrome/browser/ui/download/BUILD.gn b/ios/chrome/browser/ui/download/BUILD.gn
index 1eb53ad..f3bea2c3 100644
--- a/ios/chrome/browser/ui/download/BUILD.gn
+++ b/ios/chrome/browser/ui/download/BUILD.gn
@@ -150,7 +150,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing:embedded_test_server_support",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common",
     "//ios/web/public/test:element_selector",
     "//net:test_support",
diff --git a/ios/chrome/browser/ui/find_bar/BUILD.gn b/ios/chrome/browser/ui/find_bar/BUILD.gn
index f1af1fe..4bf4252 100644
--- a/ios/chrome/browser/ui/find_bar/BUILD.gn
+++ b/ios/chrome/browser/ui/find_bar/BUILD.gn
@@ -76,7 +76,6 @@
     "//ios/chrome/browser/ui/toolbar/accessory:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net:test_support",
     "//ui/base",
@@ -107,5 +106,5 @@
     "java_script_find_in_page_controller_app_interface.h",
     "java_script_find_in_page_controller_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
diff --git a/ios/chrome/browser/ui/find_bar/java_script_find_in_page_controller_app_interface_stub.mm b/ios/chrome/browser/ui/find_bar/java_script_find_in_page_controller_app_interface_stub.mm
index 25d6ce6..6ea4e13 100644
--- a/ios/chrome/browser/ui/find_bar/java_script_find_in_page_controller_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/find_bar/java_script_find_in_page_controller_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/find_bar/java_script_find_in_page_controller_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn
index 83a4ba3..835f81f 100644
--- a/ios/chrome/browser/ui/first_run/BUILD.gn
+++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -245,7 +245,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:switches",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
@@ -290,6 +289,5 @@
   deps = [
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
 }
diff --git a/ios/chrome/browser/ui/fullscreen/BUILD.gn b/ios/chrome/browser/ui/fullscreen/BUILD.gn
index a60dd0d..e429463 100644
--- a/ios/chrome/browser/ui/fullscreen/BUILD.gn
+++ b/ios/chrome/browser/ui/fullscreen/BUILD.gn
@@ -179,7 +179,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common",
     "//ios/web/public/test/http_server",
     "//url",
diff --git a/ios/chrome/browser/ui/fullscreen/test/BUILD.gn b/ios/chrome/browser/ui/fullscreen/test/BUILD.gn
index 57351f6..fcce246 100644
--- a/ios/chrome/browser/ui/fullscreen/test/BUILD.gn
+++ b/ios/chrome/browser/ui/fullscreen/test/BUILD.gn
@@ -55,8 +55,5 @@
     "fullscreen_app_interface.h",
     "fullscreen_app_interface_stub.mm",
   ]
-  deps = [
-    "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
-  ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn
index fbd5b3a..55cb3d5 100644
--- a/ios/chrome/browser/ui/history/BUILD.gn
+++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -184,7 +184,6 @@
     "//ios/chrome/common:string_util",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/incognito_interstitial/BUILD.gn b/ios/chrome/browser/ui/incognito_interstitial/BUILD.gn
index 6b7129b..64de73e0 100644
--- a/ios/chrome/browser/ui/incognito_interstitial/BUILD.gn
+++ b/ios/chrome/browser/ui/incognito_interstitial/BUILD.gn
@@ -75,7 +75,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/infobars/BUILD.gn b/ios/chrome/browser/ui/infobars/BUILD.gn
index 0d4297d..4c95f3b 100644
--- a/ios/chrome/browser/ui/infobars/BUILD.gn
+++ b/ios/chrome/browser/ui/infobars/BUILD.gn
@@ -43,7 +43,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/components/webui:url_constants",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net",
     "//net:test_support",
@@ -106,5 +105,5 @@
     "infobar_manager_app_interface.h",
     "infobar_manager_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
diff --git a/ios/chrome/browser/ui/infobars/infobar_manager_app_interface_stub.mm b/ios/chrome/browser/ui/infobars/infobar_manager_app_interface_stub.mm
index 64e2903..3bd72cf 100644
--- a/ios/chrome/browser/ui/infobars/infobar_manager_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/infobars/infobar_manager_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/infobars/infobar_manager_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/integration_tests/BUILD.gn b/ios/chrome/browser/ui/integration_tests/BUILD.gn
index a101836..b5d21e14 100644
--- a/ios/chrome/browser/ui/integration_tests/BUILD.gn
+++ b/ios/chrome/browser/ui/integration_tests/BUILD.gn
@@ -12,7 +12,6 @@
   deps = [
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/keyboard/BUILD.gn b/ios/chrome/browser/ui/keyboard/BUILD.gn
index e92ce54..2fe3f647 100644
--- a/ios/chrome/browser/ui/keyboard/BUILD.gn
+++ b/ios/chrome/browser/ui/keyboard/BUILD.gn
@@ -48,7 +48,6 @@
     "//ios/chrome/browser/ui/popup_menu:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
   ]
   frameworks = [
diff --git a/ios/chrome/browser/ui/link_to_text/BUILD.gn b/ios/chrome/browser/ui/link_to_text/BUILD.gn
index 2fb844e..438d38f 100644
--- a/ios/chrome/browser/ui/link_to_text/BUILD.gn
+++ b/ios/chrome/browser/ui/link_to_text/BUILD.gn
@@ -60,7 +60,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common:features",
     "//ios/web/public/navigation:navigation",
     "//ios/web/public/test:element_selector",
diff --git a/ios/chrome/browser/ui/ntp/BUILD.gn b/ios/chrome/browser/ui/ntp/BUILD.gn
index 8353a8a..18a6813 100644
--- a/ios/chrome/browser/ui/ntp/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/BUILD.gn
@@ -380,7 +380,6 @@
     "//ios/chrome/browser/url:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/ntp/feed_management/BUILD.gn b/ios/chrome/browser/ui/ntp/feed_management/BUILD.gn
index 6677efe..e7e01aa 100644
--- a/ios/chrome/browser/ui/ntp/feed_management/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/feed_management/BUILD.gn
@@ -105,6 +105,5 @@
     "//ios/chrome/browser/ui/authentication:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
 }
diff --git a/ios/chrome/browser/ui/ntp/metrics/BUILD.gn b/ios/chrome/browser/ui/ntp/metrics/BUILD.gn
index 8308bbf..96e04f3 100644
--- a/ios/chrome/browser/ui/ntp/metrics/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/metrics/BUILD.gn
@@ -13,6 +13,7 @@
     "feed_session_recorder+testing.h",
     "feed_session_recorder.h",
     "feed_session_recorder.mm",
+    "feed_state_tracker.h",
     "metrics.h",
     "metrics.mm",
   ]
diff --git a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h
index 46002dde..de799cfb 100644
--- a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h
+++ b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h
@@ -10,6 +10,7 @@
 #import "base/time/time.h"
 #import "ios/chrome/browser/discover_feed/feed_constants.h"
 #import "ios/chrome/browser/ui/ntp/metrics/feed_metrics_constants.h"
+#import "ios/chrome/browser/ui/ntp/metrics/feed_state_tracker.h"
 
 class DiscoverFeedRefresher;
 @protocol FeedControlDelegate;
@@ -20,7 +21,7 @@
 }
 
 // Records different metrics for the NTP feeds.
-@interface FeedMetricsRecorder : NSObject
+@interface FeedMetricsRecorder : NSObject <FeedStateTracker>
 
 // Delegate to get the currently selected feed.
 @property(nonatomic, weak) id<FeedControlDelegate> feedControlDelegate;
@@ -220,10 +221,6 @@
 // Records a user action for the Following feed sort type being selected.
 - (void)recordFollowingFeedSortTypeSelected:(FollowingFeedSortType)sortType;
 
-// Returns YES if the user has engaged with the latest refreshed content. The
-// term "engaged" is an implementation detail of this class.
-- (BOOL)hasEngagedWithLatestRefreshedContent;
-
 #pragma mark - Follow
 
 // Record metrics for when the user request to follow/unfollow a website,
diff --git a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm
index f0f63994..6b66800 100644
--- a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm
+++ b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm
@@ -87,6 +87,9 @@
 // YES if the NTP is visible.
 @property(nonatomic, assign) BOOL isNTPVisible;
 
+// YES if the feed is toggled on in the feed header menu.
+@property(nonatomic, assign) BOOL isFeedVisible;
+
 @end
 
 @implementation FeedMetricsRecorder
@@ -306,6 +309,7 @@
 }
 
 - (void)recordDiscoverFeedVisibilityChanged:(BOOL)visible {
+  self.isFeedVisible = visible;
   if (visible) {
     [self
         recordDiscoverFeedUserActionHistogram:FeedUserActionType::kTappedTurnOn
@@ -645,6 +649,12 @@
   }
 }
 
+#pragma mark - FeedStateTracker
+
+- (BOOL)isNTPAndFeedVisible {
+  return self.isNTPVisible && self.isFeedVisible;
+}
+
 #pragma mark - Follow
 
 - (void)recordFollowRequestedWithType:(FollowRequestType)followRequestType {
@@ -1275,18 +1285,16 @@
   self.sessionEndTimer = [NSTimer
       scheduledTimerWithTimeInterval:GetFeedSessionEndTimerTimeoutInSeconds()
                               target:weakSelf
-                            selector:@selector
-                            (refreshFeedIfSessionConditionsAreMet)
+                            selector:@selector(sessionEndTimerEnded)
                             userInfo:nil
                              repeats:NO];
 }
 
-// Refresh the feed if session conditions are met. See implementation for which
-// specific conditions are used.
-- (void)refreshFeedIfSessionConditionsAreMet {
+// Signals that the session end timer ended.
+- (void)sessionEndTimerEnded {
   [self.sessionEndTimer invalidate];
   self.sessionEndTimer = nil;
-  if (!self.isNTPVisible) {
+  if (![self isNTPAndFeedVisible]) {
     // The feed refresher checks feed engagement criteria.
     self.feedRefresher->RefreshFeed(
         FeedRefreshTrigger::kForegroundFeedNotVisible);
diff --git a/ios/chrome/browser/ui/ntp/metrics/feed_state_tracker.h b/ios/chrome/browser/ui/ntp/metrics/feed_state_tracker.h
new file mode 100644
index 0000000..bacd075a
--- /dev/null
+++ b/ios/chrome/browser/ui/ntp/metrics/feed_state_tracker.h
@@ -0,0 +1,22 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_NTP_METRICS_FEED_STATE_TRACKER_H_
+#define IOS_CHROME_BROWSER_UI_NTP_METRICS_FEED_STATE_TRACKER_H_
+
+// Tracks state of the feed, such as whether the feed is user visible, or if the
+// user has engaged with the latest refresh content.
+@protocol FeedStateTracker
+
+// Returns YES if the user has engaged with the latest refreshed content. The
+// term "engaged" is an implementation detail of the receiver.
+- (BOOL)hasEngagedWithLatestRefreshedContent;
+
+// Returns YES if the NTP and feed is visible to the user. Returns NO if the NTP
+// is not visible or if the feed is toggled off in the feed header menu.
+- (BOOL)isNTPAndFeedVisible;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_NTP_METRICS_FEED_STATE_TRACKER_H_
diff --git a/ios/chrome/browser/ui/omnibox/BUILD.gn b/ios/chrome/browser/ui/omnibox/BUILD.gn
index 3c828eb..0a6a16b 100644
--- a/ios/chrome/browser/ui/omnibox/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/BUILD.gn
@@ -253,7 +253,7 @@
     "omnibox_app_interface.h",
     "omnibox_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
 
 source_set("eg2_tests") {
@@ -273,7 +273,6 @@
     "//ios/chrome/browser/ui/omnibox/popup:popup_accessibility_identifier_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//net:test_support",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search@2x.png b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search@2x.png
index 0601f2bb..032fb95e 100644
--- a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search@2x.png
+++ b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search@3x.png b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search@3x.png
index 7b51edb..1bcc485 100644
--- a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search@3x.png
+++ b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search_dark@2x.png b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search_dark@2x.png
index b319c1c..c4b24e1d 100644
--- a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search_dark@2x.png
+++ b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search_dark@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search_dark@3x.png b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search_dark@3x.png
index f347f35..da3adb4 100644
--- a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search_dark@3x.png
+++ b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_voice_search.imageset/keyboard_accessory_voice_search_dark@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_app_interface_stub.mm b/ios/chrome/browser/ui/omnibox/omnibox_app_interface_stub.mm
index 381a341..08afebd5 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/omnibox/omnibox_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
index 06c2021..7941ee5c 100644
--- a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
@@ -293,7 +293,6 @@
     "//ios/chrome/browser/url:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
     "//ui/strings",
diff --git a/ios/chrome/browser/ui/page_info/BUILD.gn b/ios/chrome/browser/ui/page_info/BUILD.gn
index 20e921c..f9668d9 100644
--- a/ios/chrome/browser/ui/page_info/BUILD.gn
+++ b/ios/chrome/browser/ui/page_info/BUILD.gn
@@ -149,7 +149,6 @@
     "//ios/chrome/browser/ui/permissions:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common",
     "//ios/web/public/permissions",
     "//net:test_support",
diff --git a/ios/chrome/browser/ui/passwords/BUILD.gn b/ios/chrome/browser/ui/passwords/BUILD.gn
index b8cd4fc2..0170fc0 100644
--- a/ios/chrome/browser/ui/passwords/BUILD.gn
+++ b/ios/chrome/browser/ui/passwords/BUILD.gn
@@ -97,7 +97,7 @@
   deps = [
     ":constants",
     "//base",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
 
@@ -120,7 +120,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net:test_support",
     "//testing/gtest",
diff --git a/ios/chrome/browser/ui/passwords/password_breach_app_interface_stub.mm b/ios/chrome/browser/ui/passwords/password_breach_app_interface_stub.mm
index f1087a3c..98cc7af7 100644
--- a/ios/chrome/browser/ui/passwords/password_breach_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/passwords/password_breach_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/passwords/password_breach_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/permissions/BUILD.gn b/ios/chrome/browser/ui/permissions/BUILD.gn
index ccf9f8e..9cb779e 100644
--- a/ios/chrome/browser/ui/permissions/BUILD.gn
+++ b/ios/chrome/browser/ui/permissions/BUILD.gn
@@ -67,7 +67,7 @@
     "permissions_app_interface.h",
     "permissions_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
 
 source_set("eg2_tests") {
@@ -92,7 +92,6 @@
     "//ios/chrome/browser/ui/permissions:permission_info",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common",
     "//ios/web/public/permissions",
     "//net:test_support",
diff --git a/ios/chrome/browser/ui/permissions/permissions_app_interface_stub.mm b/ios/chrome/browser/ui/permissions/permissions_app_interface_stub.mm
index 031b029..af34fc4 100644
--- a/ios/chrome/browser/ui/permissions/permissions_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/permissions/permissions_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/permissions/permissions_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn
index fd863fa..66f25c9 100644
--- a/ios/chrome/browser/ui/popup_menu/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -227,7 +227,6 @@
     "//ios/chrome/browser/ui/settings:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common:features",
     "//ios/web/common:user_agent",
     "//ios/web/public/test/http_server:http_server",
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/BUILD.gn b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/BUILD.gn
index 77b4fb21..6b15f9f 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/BUILD.gn
@@ -49,7 +49,6 @@
     "//ios/chrome/browser/ui/popup_menu:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator_unittest.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator_unittest.mm
index 32a7113..a789e58 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator_unittest.mm
@@ -21,6 +21,7 @@
 #import "components/policy/core/common/mock_configuration_policy_provider.h"
 #import "components/prefs/pref_registry_simple.h"
 #import "components/prefs/testing_pref_service.h"
+#import "components/sync/base/features.h"
 #import "components/sync/driver/sync_service.h"
 #import "components/sync/test/mock_sync_service.h"
 #import "components/translate/core/browser/translate_pref_names.h"
@@ -641,9 +642,10 @@
 // eligible identity error that can be resolved from the Settings menu.
 TEST_F(OverflowMenuMediatorTest, TestEligibleIdentityErrorWhenSyncOff) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({kIndicateSyncErrorInOverflowMenu,
-                                 kIndicateAccountStorageErrorInAccountCell},
-                                {});
+  feature_list.InitWithFeatures(
+      {kIndicateSyncErrorInOverflowMenu,
+       syncer::kIndicateAccountStorageErrorInAccountCell},
+      {});
 
   CreateMediator(/*is_incognito=*/NO);
 
@@ -669,9 +671,10 @@
 // there is no eligible identity error. Sync is OFF.
 TEST_F(OverflowMenuMediatorTest, TestNoEligibleIdentityErrorWhenSyncOff) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({kIndicateSyncErrorInOverflowMenu,
-                                 kIndicateAccountStorageErrorInAccountCell},
-                                {});
+  feature_list.InitWithFeatures(
+      {kIndicateSyncErrorInOverflowMenu,
+       syncer::kIndicateAccountStorageErrorInAccountCell},
+      {});
 
   CreateMediator(/*is_incognito=*/NO);
 
@@ -695,9 +698,10 @@
 // signed in and has Sync turned ON.
 TEST_F(OverflowMenuMediatorTest, TestSyncError) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({kIndicateSyncErrorInOverflowMenu,
-                                 kIndicateAccountStorageErrorInAccountCell},
-                                {});
+  feature_list.InitWithFeatures(
+      {kIndicateSyncErrorInOverflowMenu,
+       syncer::kIndicateAccountStorageErrorInAccountCell},
+      {});
 
   CreateMediator(/*is_incognito=*/NO);
 
@@ -723,9 +727,10 @@
 // destination when there is no error in both Sync and Identity levels.
 TEST_F(OverflowMenuMediatorTest, TestNoSyncError) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({kIndicateSyncErrorInOverflowMenu,
-                                 kIndicateAccountStorageErrorInAccountCell},
-                                {});
+  feature_list.InitWithFeatures(
+      {kIndicateSyncErrorInOverflowMenu,
+       syncer::kIndicateAccountStorageErrorInAccountCell},
+      {});
 
   CreateMediator(/*is_incognito=*/NO);
 
@@ -751,7 +756,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       {kIndicateSyncErrorInOverflowMenu,
-       kIndicateAccountStorageErrorInAccountCell, kWhatsNewIOS},
+       syncer::kIndicateAccountStorageErrorInAccountCell, kWhatsNewIOS},
       {});
 
   const GURL kUrl("https://chromium.test");
@@ -791,7 +796,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       {kIndicateSyncErrorInOverflowMenu,
-       kIndicateAccountStorageErrorInAccountCell, kWhatsNewIOS},
+       syncer::kIndicateAccountStorageErrorInAccountCell, kWhatsNewIOS},
       {});
 
   CreateMediator(/*is_incognito=*/NO);
diff --git a/ios/chrome/browser/ui/qr_scanner/BUILD.gn b/ios/chrome/browser/ui/qr_scanner/BUILD.gn
index c37107c..8c24cc66 100644
--- a/ios/chrome/browser/ui/qr_scanner/BUILD.gn
+++ b/ios/chrome/browser/ui/qr_scanner/BUILD.gn
@@ -64,7 +64,6 @@
     "//ios/chrome/browser/ui/scanner:camera_state",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net",
     "//net:test_support",
     "//third_party/ocmock",
@@ -121,6 +120,6 @@
   ]
   deps = [
     "//ios/chrome/browser/ui/scanner:camera_state",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
diff --git a/ios/chrome/browser/ui/qr_scanner/qr_scanner_app_interface_stub.mm b/ios/chrome/browser/ui/qr_scanner/qr_scanner_app_interface_stub.mm
index 78d0523..f6ca322 100644
--- a/ios/chrome/browser/ui/qr_scanner/qr_scanner_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/qr_scanner/qr_scanner_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/qr_scanner/qr_scanner_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/reading_list/BUILD.gn b/ios/chrome/browser/ui/reading_list/BUILD.gn
index 28c3ce9f..d092eb58 100644
--- a/ios/chrome/browser/ui/reading_list/BUILD.gn
+++ b/ios/chrome/browser/ui/reading_list/BUILD.gn
@@ -219,7 +219,6 @@
     "//ios/chrome/common/ui/table_view:cells_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common:features",
     "//ios/web/public/navigation:navigation",
     "//net",
@@ -262,6 +261,5 @@
   deps = [
     "//base",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
 }
diff --git a/ios/chrome/browser/ui/recent_tabs/BUILD.gn b/ios/chrome/browser/ui/recent_tabs/BUILD.gn
index 2f5dc00e..cdf44e4 100644
--- a/ios/chrome/browser/ui/recent_tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/recent_tabs/BUILD.gn
@@ -195,7 +195,7 @@
   ]
   deps = [
     "//base",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
 
@@ -224,7 +224,6 @@
     "//ios/chrome/browser/ui/history:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/BUILD.gn b/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/BUILD.gn
index 53ec7a3e..fcb3cd1 100644
--- a/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/BUILD.gn
@@ -12,14 +12,24 @@
 }
 
 source_set("util") {
+  configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
-    "bring_android_tabs_util.cc",
     "bring_android_tabs_util.h",
+    "bring_android_tabs_util.mm",
   ]
   deps = [
+    ":metrics",
     "//base",
     "//components/prefs",
+    "//components/segmentation_platform/embedder/default_model",
+    "//components/segmentation_platform/public",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/flags:system_flags",
+    "//ios/chrome/browser/prefs:pref_names",
+    "//ios/chrome/browser/segmentation_platform",
+    "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/sync",
+    "//ios/chrome/browser/ui/first_run:utils",
     "//ios/chrome/browser/ui/recent_tabs:synced_sessions",
   ]
 }
diff --git a/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_metrics.h b/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_metrics.h
index c7966b3..15bdb37 100644
--- a/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_metrics.h
+++ b/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_metrics.h
@@ -19,30 +19,31 @@
 // review tabs table.
 extern const char kTabListActionHistogramName[];
 
-// Name of tab count histogram; logged when the bring android tabs prompt
-// appears.
-extern const char kTabCountHistogramName[];
-
 // Name of deselected tab count histogram; logged the review Android tabs table
 // is dismissed.
 extern const char kDeselectedTabCountHistogramName[];
 
-// The result of prompting the set of tabs for an Android switcher. This is
+// Name of the prompt attempt status histogram; logged when the set of tabs is
+// prompted for an Android switcher.
+extern const char kPromptAttemptStatusHistogramName[];
+
+// The result of prompting the set of tabs for a user. This is
 // mapped to the IOSPromptTabsForAndroidSwitcherState enum in enums.xml for
 // metrics.
-enum class IOSPromptTabsForAndroidSwitcherState {
+enum class PromptAttemptStatus {
   kSyncDisabled = 0,
   kSegmentationIncomplete = 1,
-  kPromptDismissed = 2,
+  kPromptShownAndDismissed = 2,
   kTabSyncDisabled = 3,
   kNoActiveTabs = 4,
-  kSuccess = 5,
+  kNotAndroidSwitcher = 5,
+  kSuccess = 6,
   kMaxValue = kSuccess,
 };
 
 // Interactions with the initial Bring Android Tabs prompt. This is mapped to
 // the IOSBringAndroidTabsPromptActionType enum in enums.xml for metrics.
-enum class IOSBringAndroidTabsPromptActionType {
+enum class PromptActionType {
   kReviewTabs = 0,
   kOpenTabs = 1,
   kCancel = 2,
@@ -52,7 +53,7 @@
 
 // Interactions with the Bring Android Tabs Tab List view. This is mapped to the
 // IOSBringAndroidTabsTabsListActionType enum in enums.xml for metrics.
-enum class IOSBringAndroidTabsTabsListActionType {
+enum class TabsListActionType {
   kCancel = 0,
   kSwipeDown = 1,
   kOpenTabs = 2,
diff --git a/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_metrics.mm b/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_metrics.mm
index b214cdc..4d285d2 100644
--- a/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_metrics.mm
+++ b/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_metrics.mm
@@ -21,4 +21,7 @@
 extern const char kDeselectedTabCountHistogramName[] =
     "IOS.BringAndroidTabs.DeselectedTabCount";
 
+extern const char kPromptAttemptStatusHistogramName[] =
+    "IOS.BringAndroidTabs.PromptTabsStatus";
+
 }  // namespace bring_android_tabs
diff --git a/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_util.cc b/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_util.cc
deleted file mode 100644
index a4380ec5..0000000
--- a/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_util.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_util.h"
-#include "components/prefs/pref_service.h"
-#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-
-synced_sessions::DistantTabVector PromptTabsForAndroidSwitcher(
-    ChromeBrowserState* browser_state) {
-  // TODO(crbug.com/1418114): Add implementation.
-  return synced_sessions::DistantTabVector();
-}
-
-void OnBringAndroidTabsPromptDisplayed(PrefService* user_prefs) {
-  // TODO(crbug.com/1418114): Add implementation.
-}
-
-void OnUserInteractWithBringAndroidTabsPrompt() {
-  // TODO(crbug.com/1418114): Add implementation.
-}
diff --git a/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_util.mm b/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_util.mm
new file mode 100644
index 0000000..86359297
--- /dev/null
+++ b/ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_util.mm
@@ -0,0 +1,186 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_util.h"
+
+#import <string>
+
+#import "base/containers/contains.h"
+#import "base/files/file.h"
+#import "base/metrics/histogram_functions.h"
+#import "components/prefs/pref_service.h"
+#import "components/segmentation_platform/embedder/default_model/device_switcher_model.h"
+#import "components/segmentation_platform/embedder/default_model/device_switcher_result_dispatcher.h"
+#import "components/segmentation_platform/public/field_trial_register.h"
+#import "components/segmentation_platform/public/result.h"
+#import "components/sync/base/sync_prefs.h"
+#import "components/sync/driver/sync_service.h"
+#import "components/sync/driver/sync_user_settings.h"
+#import "components/sync_sessions/session_sync_service.h"
+#import "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/flags/system_flags.h"
+#import "ios/chrome/browser/prefs/pref_names.h"
+#import "ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory.h"
+#import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/sync/session_sync_service_factory.h"
+#import "ios/chrome/browser/sync/sync_service_factory.h"
+#import "ios/chrome/browser/ui/first_run/first_run_util.h"
+#import "ios/chrome/browser/ui/recent_tabs/bring_android_tabs/bring_android_tabs_metrics.h"
+#import "ui/base/device_form_factor.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+bool prompt_shown_current_session = false;
+bool prompt_interacted = false;
+
+// Returns true if the user is segmented as an Android switcher, either by
+// the segmentation platform or by using the forced device switcher flag.
+bool UserIsAndroidSwitcher(ChromeBrowserState* browser_state) {
+  bool device_switcher_forced =
+      experimental_flags::GetSegmentForForcedDeviceSwitcherExperience() ==
+      segmentation_platform::DeviceSwitcherModel::kAndroidPhoneLabel;
+  if (device_switcher_forced) {
+    return true;
+  }
+
+  segmentation_platform::DeviceSwitcherResultDispatcher* dispatcher =
+      segmentation_platform::SegmentationPlatformServiceFactory::
+          GetDispatcherForBrowserState(browser_state);
+
+  segmentation_platform::ClassificationResult result =
+      dispatcher->GetCachedClassificationResult();
+  if (result.status != segmentation_platform::PredictionStatus::kSucceeded) {
+    base::UmaHistogramEnumeration(
+        bring_android_tabs::kPromptAttemptStatusHistogramName,
+        bring_android_tabs::PromptAttemptStatus::kSegmentationIncomplete);
+    return false;
+  }
+
+  if (base::Contains(
+          result.ordered_labels,
+          segmentation_platform::DeviceSwitcherModel::kIosPhoneChromeLabel)) {
+    base::UmaHistogramEnumeration(
+        bring_android_tabs::kPromptAttemptStatusHistogramName,
+        bring_android_tabs::PromptAttemptStatus::kNotAndroidSwitcher);
+    return false;
+  }
+
+  if (result.ordered_labels[0] ==
+      segmentation_platform::DeviceSwitcherModel::kNotSyncedLabel) {
+    base::UmaHistogramEnumeration(
+        bring_android_tabs::kPromptAttemptStatusHistogramName,
+        bring_android_tabs::PromptAttemptStatus::kSyncDisabled);
+  }
+
+  if (result.ordered_labels[0] !=
+      segmentation_platform::DeviceSwitcherModel::kAndroidPhoneLabel) {
+    base::UmaHistogramEnumeration(
+        bring_android_tabs::kPromptAttemptStatusHistogramName,
+        bring_android_tabs::PromptAttemptStatus::kNotAndroidSwitcher);
+    return false;
+  }
+  return true;
+}
+
+// Returns true if the user is eligible for the Bring Android Tabs prompt.
+bool UserEligibleForAndroidSwitcherPrompt(ChromeBrowserState* browser_state) {
+  absl::optional<base::Time> first_run_time = GetFirstRunTime();
+  bool first_run_over_7_days_ago =
+      first_run_time.has_value() &&
+      (base::Time::Now() - first_run_time.value()) > base::Days(7);
+  if (!ShouldPresentFirstRunExperience() && first_run_over_7_days_ago) {
+    return false;
+  }
+
+  if (GetBringYourOwnTabsPromptType() ==
+      BringYourOwnTabsPromptType::kDisabled) {
+    return false;
+  }
+
+  if (ui::GetDeviceFormFactor() != ui::DEVICE_FORM_FACTOR_PHONE) {
+    return false;
+  }
+
+  bool prompt_shown = browser_state->GetPrefs()->GetBoolean(
+      prefs::kIosBringAndroidTabsPromptDisplayed);
+  if (prompt_interacted || (prompt_shown && !prompt_shown_current_session)) {
+    base::UmaHistogramEnumeration(
+        bring_android_tabs::kPromptAttemptStatusHistogramName,
+        bring_android_tabs::PromptAttemptStatus::kPromptShownAndDismissed);
+    return false;
+  }
+
+  return UserIsAndroidSwitcher(browser_state);
+}
+
+// Returns the set of DistantTabs for an android switcher.
+synced_sessions::DistantTabVector AndroidSwitcherTabs(
+    ChromeBrowserState* browser_state) {
+  syncer::SyncService* sync_service =
+      SyncServiceFactory::GetForBrowserState(browser_state);
+  bool tab_sync_disabled =
+      !sync_service || !sync_service->GetUserSettings()->GetSelectedTypes().Has(
+                           syncer::UserSelectableType::kTabs);
+  if (tab_sync_disabled) {
+    base::UmaHistogramEnumeration(
+        bring_android_tabs::kPromptAttemptStatusHistogramName,
+        bring_android_tabs::PromptAttemptStatus::kTabSyncDisabled);
+    return synced_sessions::DistantTabVector();
+  }
+
+  sync_sessions::SessionSyncService* session_sync_service =
+      SessionSyncServiceFactory::GetForBrowserState(browser_state);
+  auto synced_sessions =
+      std::make_unique<synced_sessions::SyncedSessions>(session_sync_service);
+  synced_sessions::DistantTabVector android_tabs;
+
+  for (size_t s = 0; s < synced_sessions->GetSessionCount(); s++) {
+    const synced_sessions::DistantSession* session =
+        synced_sessions->GetSession(s);
+    for (auto const& tab : session->tabs) {
+      std::unique_ptr<synced_sessions::DistantTab> tab_copy =
+          std::make_unique<synced_sessions::DistantTab>();
+      tab_copy->session_tag = tab->session_tag;
+      tab_copy->tab_id = tab->tab_id;
+      tab_copy->title = tab->title;
+      tab_copy->virtual_url = tab->virtual_url;
+      android_tabs.push_back(std::move(tab_copy));
+    }
+  }
+
+  return android_tabs;
+}
+
+}  // namespace
+
+synced_sessions::DistantTabVector PromptTabsForAndroidSwitcher(
+    ChromeBrowserState* browser_state) {
+  if (!UserEligibleForAndroidSwitcherPrompt(browser_state)) {
+    return synced_sessions::DistantTabVector();
+  }
+  synced_sessions::DistantTabVector tabs = AndroidSwitcherTabs(browser_state);
+  if (tabs.empty()) {
+    base::UmaHistogramEnumeration(
+        bring_android_tabs::kPromptAttemptStatusHistogramName,
+        bring_android_tabs::PromptAttemptStatus::kNoActiveTabs);
+  } else {
+    base::UmaHistogramEnumeration(
+        bring_android_tabs::kPromptAttemptStatusHistogramName,
+        bring_android_tabs::PromptAttemptStatus::kSuccess);
+  }
+  return tabs;
+}
+
+void OnBringAndroidTabsPromptDisplayed(PrefService* user_prefs) {
+  user_prefs->SetBoolean(prefs::kIosBringAndroidTabsPromptDisplayed, true);
+  prompt_shown_current_session = true;
+}
+
+void OnUserInteractWithPrompt() {
+  prompt_interacted = true;
+}
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_app_interface_stub.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_app_interface_stub.mm
index cc429d0..6907923f 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/sad_tab/BUILD.gn b/ios/chrome/browser/ui/sad_tab/BUILD.gn
index 97dc55b5..5d1e340 100644
--- a/ios/chrome/browser/ui/sad_tab/BUILD.gn
+++ b/ios/chrome/browser/ui/sad_tab/BUILD.gn
@@ -108,7 +108,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing:embedded_test_server_support",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/safe_mode/BUILD.gn b/ios/chrome/browser/ui/safe_mode/BUILD.gn
index f8d41c0..d1585732 100644
--- a/ios/chrome/browser/ui/safe_mode/BUILD.gn
+++ b/ios/chrome/browser/ui/safe_mode/BUILD.gn
@@ -57,7 +57,7 @@
     "safe_mode_app_interface.h",
     "safe_mode_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
 
 source_set("eg2_tests") {
@@ -75,7 +75,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing:block_swizzler",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/safe_mode/safe_mode_app_interface_stub.mm b/ios/chrome/browser/ui/safe_mode/safe_mode_app_interface_stub.mm
index cb7971ff..2fa2f55 100644
--- a/ios/chrome/browser/ui/safe_mode/safe_mode_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/safe_mode/safe_mode_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/safe_mode/safe_mode_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn b/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn
index 92cb8c4..d09191b 100644
--- a/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn
+++ b/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn
@@ -84,7 +84,6 @@
     "//ios/chrome/browser/ui/authentication:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index 64848f1..b93a8fe 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -396,7 +396,7 @@
   public_deps = [ "//components/content_settings/core/common" ]
   deps = [
     "//base",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
 
@@ -431,7 +431,6 @@
     "//ios/chrome/common/ui/table_view:cells_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net:test_support",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/settings/autofill/BUILD.gn b/ios/chrome/browser/ui/settings/autofill/BUILD.gn
index ca23941f..29fb424 100644
--- a/ios/chrome/browser/ui/settings/autofill/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/autofill/BUILD.gn
@@ -150,7 +150,6 @@
     "//ios/chrome/browser/ui/elements:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//net:test_support",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
index 221ed20e..db9c2a00 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
@@ -150,7 +150,6 @@
     "//ios/chrome/browser/ui/settings/cells:clear_browsing_data_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/settings/content_settings/BUILD.gn b/ios/chrome/browser/ui/settings/content_settings/BUILD.gn
index 32f4a34..ed4b0bb 100644
--- a/ios/chrome/browser/ui/settings/content_settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/content_settings/BUILD.gn
@@ -122,7 +122,7 @@
   deps = [
     "//base",
     "//components/content_settings/core/common",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
 
@@ -142,7 +142,6 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net:test_support",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/settings/content_settings/block_popups_app_interface_stub.mm b/ios/chrome/browser/ui/settings/content_settings/block_popups_app_interface_stub.mm
index 55e4f655..3a69a64 100644
--- a/ios/chrome/browser/ui/settings/content_settings/block_popups_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/settings/content_settings/block_popups_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/settings/content_settings/block_popups_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/settings/google_services/BUILD.gn b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
index ae950ec..43a943e 100644
--- a/ios/chrome/browser/ui/settings/google_services/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
@@ -130,7 +130,7 @@
     "google_services_settings_app_interface.h",
     "google_services_settings_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
 
 source_set("eg2_tests") {
@@ -169,7 +169,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:switches",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_unittest.mm
index c15e7c6..3ea25fa 100644
--- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_unittest.mm
@@ -10,6 +10,7 @@
 #import "base/strings/sys_string_conversions.h"
 #import "base/test/scoped_feature_list.h"
 #import "components/signin/public/identity_manager/account_info.h"
+#import "components/sync/base/features.h"
 #import "components/sync/driver/sync_service.h"
 #import "components/sync/test/test_sync_service.h"
 #import "components/variations/scoped_variations_ids_provider.h"
@@ -219,7 +220,7 @@
 TEST_F(AccountsTableViewControllerTest, HoldPassphraseErrorWhenEligible) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
-      kIndicateAccountStorageErrorInAccountCell);
+      syncer::kIndicateAccountStorageErrorInAccountCell);
 
   const std::string email = "foo@gmail.com";
   const std::string gaia_id = "fooID";
@@ -255,7 +256,7 @@
 TEST_F(AccountsTableViewControllerTest, ClearPassphraseErrorWhenResolved) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
-      kIndicateAccountStorageErrorInAccountCell);
+      syncer::kIndicateAccountStorageErrorInAccountCell);
 
   const std::string email = "foo@gmail.com";
   const std::string gaia_id = "fooID";
@@ -301,7 +302,7 @@
 TEST_F(AccountsTableViewControllerTest, DontHoldPassphraseErrorWhenIneligible) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
-      kIndicateAccountStorageErrorInAccountCell);
+      syncer::kIndicateAccountStorageErrorInAccountCell);
 
   const std::string email = "foo@gmail.com";
   const std::string gaia_id = "fooID";
@@ -336,7 +337,7 @@
        DontHoldPassphraseErrorWhenEligibleNoError) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
-      kIndicateAccountStorageErrorInAccountCell);
+      syncer::kIndicateAccountStorageErrorInAccountCell);
 
   const std::string email = "foo@gmail.com";
   const std::string gaia_id = "fooID";
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_app_interface_stub.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_app_interface_stub.mm
index 235296e7..b1f8ae3 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/settings/language/BUILD.gn b/ios/chrome/browser/ui/settings/language/BUILD.gn
index bcf130bf..d695348 100644
--- a/ios/chrome/browser/ui/settings/language/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/language/BUILD.gn
@@ -128,10 +128,7 @@
     "language_settings_app_interface.h",
     "language_settings_app_interface_stub.mm",
   ]
-  deps = [
-    "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
-  ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
 
 source_set("eg2_tests") {
@@ -151,7 +148,6 @@
     "//ios/chrome/browser/ui/settings/language:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/strings:ui_strings_grit",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/settings/password/BUILD.gn b/ios/chrome/browser/ui/settings/password/BUILD.gn
index 9c6eec51b..9092bc8 100644
--- a/ios/chrome/browser/ui/settings/password/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/password/BUILD.gn
@@ -265,7 +265,7 @@
 
   deps = [
     "//ios/chrome/common/ui/reauthentication",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
 
@@ -284,6 +284,7 @@
     ":password_constants",
     "//base:base",
     "//base/test:test_support",
+    "//components/password_manager/core/common",
     "//components/password_manager/core/common:features",
     "//components/policy:generated",
     "//components/strings",
@@ -303,7 +304,6 @@
     "//ios/chrome/common/ui/table_view:cells_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//ios/web/public/test/http_server:http_server",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/settings/password/account_storage_utils.cc b/ios/chrome/browser/ui/settings/password/account_storage_utils.cc
index c4a8a560..b7989ae 100644
--- a/ios/chrome/browser/ui/settings/password/account_storage_utils.cc
+++ b/ios/chrome/browser/ui/settings/password/account_storage_utils.cc
@@ -33,6 +33,7 @@
     case SyncState::kSyncingWithCustomPassphrase:
       return false;
     case SyncState::kAccountPasswordsActiveNormalEncryption:
+    case SyncState::kAccountPasswordsActiveWithCustomPassphrase:
       // If the data is stored both in kProfileStore and kAccountStore, it's
       // backed up, no need to bother the user.
       return !credential.stored_in.contains(
diff --git a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
index 9032a310..0274806f 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
@@ -75,6 +75,7 @@
     "//components/autofill/core/common",
     "//components/password_manager/core/browser:affiliation",
     "//components/password_manager/core/browser:browser",
+    "//components/password_manager/core/common",
     "//components/password_manager/core/common:features",
     "//components/strings",
     "//ios/chrome/app/strings",
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm
index 387684b..5a672a5 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_view_controller.mm
@@ -12,6 +12,7 @@
 #import "base/metrics/user_metrics_action.h"
 #import "base/strings/sys_string_conversions.h"
 #import "components/password_manager/core/browser/password_manager_metrics_util.h"
+#import "components/password_manager/core/common/password_manager_constants.h"
 #import "components/password_manager/core/common/password_manager_features.h"
 #import "components/sync/base/features.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
@@ -73,8 +74,6 @@
 const CGFloat kSymbolSize = 15;
 // Minimal amount of characters in password note to display the warning.
 const int kMinNoteCharAmountForWarning = 901;
-// Maximal amount of characters that a password note can contain.
-const int kMaxNoteCharAmount = 1000;
 
 }  // namespace
 
@@ -115,7 +114,8 @@
 // Yes, when the footer informing about the max note length is shown.
 @property(nonatomic, assign) BOOL isNoteFooterShown;
 
-// Yes, when the note's length is less or equal than `kMaxNoteCharAmount`.
+// Yes, when the note's length is less or equal than
+// `password_manager::constants::kMaxPasswordNoteLength`.
 @property(nonatomic, assign) BOOL isNoteValid;
 
 // If YES, the password details are shown without requiring any authentication.
@@ -358,8 +358,10 @@
 - (TableViewLinkHeaderFooterItem*)tooLongNoteMessageFooterItem {
   TableViewLinkHeaderFooterItem* item =
       [[TableViewLinkHeaderFooterItem alloc] initWithType:ItemTypeFooter];
-  item.text = l10n_util::GetNSString(
-      IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION);
+  item.text = l10n_util::GetNSStringF(
+      IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION,
+      base::NumberToString16(
+          password_manager::constants::kMaxPasswordNoteLength));
   return item;
 }
 
@@ -616,7 +618,8 @@
 
   // Update save button state based on the note's length and validity of other
   // input fields.
-  BOOL noteValid = tableViewItem.text.length <= kMaxNoteCharAmount;
+  BOOL noteValid = tableViewItem.text.length <=
+                   password_manager::constants::kMaxPasswordNoteLength;
   if (self.isNoteValid != noteValid) {
     self.isNoteValid = noteValid;
     tableViewItem.validText = noteValid;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
index cd70293..4dd4427 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
@@ -10,6 +10,7 @@
 #import "base/metrics/histogram_macros.h"
 #import "base/strings/sys_string_conversions.h"
 #import "components/password_manager/core/browser/password_manager_metrics_util.h"
+#import "components/password_manager/core/common/password_manager_constants.h"
 #import "components/password_manager/core/common/password_manager_features.h"
 #import "components/sync/base/features.h"
 #import "ios/chrome/browser/shared/public/commands/application_commands.h"
@@ -52,6 +53,7 @@
 namespace {
 
 using base::UmaHistogramEnumeration;
+using password_manager::constants::kMaxPasswordNoteLength;
 using password_manager::metrics_util::LogPasswordSettingsReauthResult;
 using password_manager::metrics_util::PasswordCheckInteraction;
 using password_manager::metrics_util::ReauthResult;
@@ -85,8 +87,6 @@
 const CGFloat kRecommendationSymbolSize = 22;
 // Minimal amount of characters in password note to display the warning.
 const int kMinNoteCharAmountForWarning = 901;
-// Maximal amount of characters that a password note can contain.
-const int kMaxNoteCharAmount = 1000;
 
 }  // namespace
 
@@ -435,8 +435,9 @@
     int password = IsPasswordGroupingEnabled() ? section : 0;
     NSString* footerText =
         self.passwordDetailsInfoItems[password].isNoteFooterShown
-            ? l10n_util::GetNSString(
-                  IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION)
+            ? l10n_util::GetNSStringF(
+                  IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION,
+                  base::NumberToString16(kMaxPasswordNoteLength))
             : @"";
     [footer setSubtitle:footerText];
   }
@@ -691,7 +692,7 @@
   [self setOrExtendAuthValidityTimer];
   // Update save button state based on the note's length and validity of other
   // input fields.
-  BOOL noteValid = tableViewItem.text.length <= kMaxNoteCharAmount;
+  BOOL noteValid = tableViewItem.text.length <= kMaxPasswordNoteLength;
   tableViewItem.validText = noteValid;
   self.shouldEnableEditDoneButton =
       noteValid && [self checkIfValidUsernames] && [self checkIfValidPasswords];
@@ -717,8 +718,9 @@
         base::mac::ObjCCastStrict<TableViewTextHeaderFooterView>(footer);
     NSString* footerText =
         shouldDisplayNoteFooter
-            ? l10n_util::GetNSString(
-                  IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION)
+            ? l10n_util::GetNSStringF(
+                  IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION,
+                  base::NumberToString16(kMaxPasswordNoteLength))
             : @"";
     [textFooter setSubtitle:footerText];
   }
@@ -956,7 +958,7 @@
 
   for (NSUInteger i = 0; i < self.passwordDetailsInfoItems.count; i++) {
     if (self.passwordDetailsInfoItems[i].passwordNoteItem.text.length >
-        kMaxNoteCharAmount) {
+        kMaxPasswordNoteLength) {
       return NO;
     }
   }
@@ -1093,8 +1095,9 @@
                 initWithType:PasswordDetailsItemTypeNoteFooter];
         footer.subtitle =
             passwordItem.isNoteFooterShown
-                ? l10n_util::GetNSString(
-                      IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION)
+                ? l10n_util::GetNSStringF(
+                      IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION,
+                      base::NumberToString16(kMaxPasswordNoteLength))
                 : @"";
         [model setFooter:footer forSectionWithIdentifier:sectionForPassword];
       }
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
index 20b2e6b4..102e4f9e 100644
--- a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
+++ b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
@@ -12,6 +12,7 @@
 #import "base/test/ios/wait_util.h"
 #import "base/test/scoped_feature_list.h"
 #import "base/time/time.h"
+#import "components/password_manager/core/common/password_manager_constants.h"
 #import "components/password_manager/core/common/password_manager_features.h"
 #import "components/policy/policy_constants.h"
 #import "components/strings/grit/components_strings.h"
@@ -382,8 +383,10 @@
 // Returns matcher for the password details / add password view footer displayed
 // when the note length is approaching max limit.
 id<GREYMatcher> TooLongNoteFooter() {
-  return grey_text(l10n_util::GetNSString(
-      IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION));
+  return grey_text(l10n_util::GetNSStringF(
+      IDS_IOS_SETTINGS_PASSWORDS_TOO_LONG_NOTE_DESCRIPTION,
+      base::NumberToString16(
+          password_manager::constants::kMaxPasswordNoteLength)));
 }
 
 // Saves an example form in the store.
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm
index 0b2a0464..1fb3c92 100644
--- a/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm
@@ -165,6 +165,23 @@
   }
 }
 
+// TODO(crbug.com/1426463): Remove when CredentialUIEntry operator== is fixed.
+template <typename T>
+bool AreNotesEqual(const T& lhs, const T& rhs) {
+  return base::ranges::equal(lhs, rhs, {},
+                             &password_manager::CredentialUIEntry::note,
+                             &password_manager::CredentialUIEntry::note);
+}
+
+bool AreNotesEqual(const std::vector<password_manager::AffiliatedGroup>& lhs,
+                   const std::vector<password_manager::AffiliatedGroup>& rhs) {
+  return base::ranges::equal(
+      lhs, rhs,
+      AreNotesEqual<base::span<const password_manager::CredentialUIEntry>>,
+      &password_manager::AffiliatedGroup::GetCredentials,
+      &password_manager::AffiliatedGroup::GetCredentials);
+}
+
 template <typename T>
 bool AreStoresEqual(const T& lhs, const T& rhs) {
   return base::ranges::equal(lhs, rhs, {},
@@ -324,6 +341,9 @@
   TableViewTextItem* _setUpOnDeviceEncryptionItem;
   // The list of the user's saved passwords.
   std::vector<password_manager::CredentialUIEntry> _passwords;
+  // Boolean indicating that passwords are being saved in an account if YES,
+  // and locally if NO.
+  BOOL _savingPasswordsToAccount;
   // The list of the user's blocked sites.
   std::vector<password_manager::CredentialUIEntry> _blockedSites;
   // The list of the user's saved grouped passwords.
@@ -943,7 +963,7 @@
   TableViewLinkHeaderFooterItem* header =
       [[TableViewLinkHeaderFooterItem alloc] initWithType:ItemTypeLinkHeader];
 
-  if ([self.delegate isSyncingPasswords]) {
+  if (_savingPasswordsToAccount) {
     header.text =
         l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORDS_MANAGE_ACCOUNT_HEADER);
 
@@ -1288,8 +1308,11 @@
   } else {
     // The CredentialUIEntry equality operator ignores the password stores, but
     // this UI cares, c.f. password_manager::ShouldShowLocalOnlyIcon().
+    // The CredentialUIEntry equality operator ignores password notes, but the
+    // UI should be updated so that any changes to just notes are visible.
     if (_passwords == passwords && _blockedSites == blockedSites &&
-        AreStoresEqual(_passwords, passwords)) {
+        AreStoresEqual(_passwords, passwords) &&
+        AreNotesEqual(_passwords, passwords)) {
       return;
     }
 
@@ -1300,6 +1323,14 @@
   }
 }
 
+- (void)setSavingPasswordsToAccount:(BOOL)savingPasswordsToAccount {
+  if (_savingPasswordsToAccount == savingPasswordsToAccount) {
+    return;
+  }
+  _savingPasswordsToAccount = savingPasswordsToAccount;
+  [self reloadData];
+}
+
 - (void)setAffiliatedGroups:
             (const std::vector<password_manager::AffiliatedGroup>&)
                 affiliatedGroups
@@ -1314,9 +1345,12 @@
   } else {
     // The AffiliatedGroup equality operator ignores the password stores, but
     // this UI cares, see password_manager::ShouldShowLocalOnlyIcon().
+    // The AffiliatedGroup equality operator ignores password notes, but the UI
+    // should be updated so that any changes to just notes are visible.
     if (_affiliatedGroups == affiliatedGroups &&
         _blockedSites == blockedSites &&
-        AreStoresEqual(_affiliatedGroups, affiliatedGroups)) {
+        AreStoresEqual(_affiliatedGroups, affiliatedGroups) &&
+        AreNotesEqual(_affiliatedGroups, affiliatedGroups)) {
       return;
     }
 
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_delegate.h b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_delegate.h
index cbe805c..c4e57a62 100644
--- a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_delegate.h
+++ b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_delegate.h
@@ -59,9 +59,6 @@
 // Returns the on-device encryption state according to the sync service.
 - (OnDeviceEncryptionState)onDeviceEncryptionState;
 
-// Returns whether or not passwords are currently syncing.
-- (BOOL)isSyncingPasswords;
-
 // Returns whether a special icon should be shown next to `credential` that
 // indicates it's not backed up to any account.
 - (BOOL)shouldShowLocalOnlyIconForCredential:
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_items.mm b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_items.mm
index 4bb49b3..caff1744 100644
--- a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_items.mm
+++ b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_items.mm
@@ -70,7 +70,7 @@
   _faviconContainerView = [[FaviconContainerView alloc] init];
   _localOnlyIcon = [[UIImageView alloc] init];
   _localOnlyIcon.image = CustomSymbolWithPointSize(kCloudSlashSymbol, 20);
-  _localOnlyIcon.tintColor = [UIColor colorNamed:kTextSecondaryColor];
+  _localOnlyIcon.tintColor = [UIColor colorNamed:kTextTertiaryColor];
   [_localOnlyIcon setContentHuggingPriority:UILayoutPriorityRequired
                                     forAxis:UILayoutConstraintAxisHorizontal];
   [_localOnlyIcon setContentHuggingPriority:UILayoutPriorityRequired
diff --git a/ios/chrome/browser/ui/settings/password/password_settings_app_interface_stub.mm b/ios/chrome/browser/ui/settings/password/password_settings_app_interface_stub.mm
index e22fa58..7e74723 100644
--- a/ios/chrome/browser/ui/settings/password/password_settings_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/settings/password/password_settings_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/settings/password/password_settings_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/settings/password/passwords_consumer.h b/ios/chrome/browser/ui/settings/password/passwords_consumer.h
index eed7853..fffc36d 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_consumer.h
+++ b/ios/chrome/browser/ui/settings/password/passwords_consumer.h
@@ -50,6 +50,9 @@
         blockedSites:
             (std::vector<password_manager::CredentialUIEntry>)blockedSites;
 
+// Updates whether passwords are being saved to an account or only locally.
+- (void)setSavingPasswordsToAccount:(BOOL)savingPasswordsToAccount;
+
 // Displays affiliated groups for the Password Manager.
 // This method relates to the -setPasswords method above. This will eventually
 // replace it when the feature is done.
diff --git a/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/BUILD.gn b/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/BUILD.gn
index 936448a..1593498 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/BUILD.gn
@@ -114,7 +114,7 @@
     "passwords_in_other_apps_app_interface.h",
     "passwords_in_other_apps_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
 
 source_set("eg2_tests") {
@@ -135,7 +135,6 @@
     "//ios/chrome/browser/ui/settings/password/password_settings:password_settings_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/passwords_in_other_apps_app_interface_stub.mm b/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/passwords_in_other_apps_app_interface_stub.mm
index 54a087d..1495d74d 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/passwords_in_other_apps_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/passwords_in_other_apps_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/settings/password/passwords_in_other_apps/passwords_in_other_apps_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
index 7dba9bd..e66ad2e 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
@@ -130,6 +130,10 @@
 
   _currentState = _passwordCheckManager->GetPasswordCheckState();
   [self updateConsumerPasswordCheckState:_currentState];
+  [self.consumer
+      setSavingPasswordsToAccount:password_manager_util::GetPasswordSyncState(
+                                      _syncService) !=
+                                  password_manager::SyncState::kNotSyncing];
 }
 
 - (void)disconnect {
@@ -251,11 +255,6 @@
   return OnDeviceEncryptionStateNotShown;
 }
 
-- (BOOL)isSyncingPasswords {
-  return password_manager_util::GetPasswordSyncState(_syncService) !=
-         password_manager::SyncState::kNotSyncing;
-}
-
 - (BOOL)shouldShowLocalOnlyIconForCredential:
     (const password_manager::CredentialUIEntry&)credential {
   return password_manager::ShouldShowLocalOnlyIcon(
@@ -441,6 +440,10 @@
 
 - (void)onSyncStateChanged {
   [self.consumer updateOnDeviceEncryptionSessionAndUpdateTableView];
+  [self.consumer
+      setSavingPasswordsToAccount:password_manager_util::GetPasswordSyncState(
+                                      _syncService) !=
+                                  password_manager::SyncState::kNotSyncing];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
index 340099777..2363633 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
@@ -85,6 +85,9 @@
   _blockedSites = blockedSites;
 }
 
+- (void)setSavingPasswordsToAccount:(BOOL)savingPasswordsToAccount {
+}
+
 - (void)setAffiliatedGroups:
             (const std::vector<password_manager::AffiliatedGroup>&)
                 affiliatedGroups
diff --git a/ios/chrome/browser/ui/settings/price_notifications/BUILD.gn b/ios/chrome/browser/ui/settings/price_notifications/BUILD.gn
index 4771f5a1..2ea3fc9 100644
--- a/ios/chrome/browser/ui/settings/price_notifications/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/price_notifications/BUILD.gn
@@ -67,7 +67,6 @@
     "//components/commerce/core:feature_list",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/BUILD.gn b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/BUILD.gn
index c85b8a6..9cc0111 100644
--- a/ios/chrome/browser/ui/settings/price_notifications/tracking_price/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/price_notifications/tracking_price/BUILD.gn
@@ -74,7 +74,6 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/settings/privacy/BUILD.gn b/ios/chrome/browser/ui/settings/privacy/BUILD.gn
index 7e9d59e..cff714e3 100644
--- a/ios/chrome/browser/ui/settings/privacy/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/privacy/BUILD.gn
@@ -181,7 +181,6 @@
     "//ios/chrome/common/ui/table_view:cells_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/settings/settings_app_interface_stub.mm b/ios/chrome/browser/ui/settings/settings_app_interface_stub.mm
index 39a6bf4..3596f1f 100644
--- a/ios/chrome/browser/ui/settings/settings_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/settings/settings_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/settings/settings_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller_unittest.mm
index d5518c3..a7130bcb 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller_unittest.mm
@@ -14,6 +14,7 @@
 #import "components/policy/core/common/policy_loader_ios_constants.h"
 #import "components/policy/policy_constants.h"
 #import "components/signin/public/base/signin_pref_names.h"
+#import "components/sync/base/features.h"
 #import "components/sync/test/mock_sync_service.h"
 #import "ios/chrome/browser/application_context/application_context.h"
 #import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
@@ -381,7 +382,7 @@
 TEST_F(SettingsTableViewControllerTest, HoldAccountStorageErrorWhenEligible) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
-      kIndicateAccountStorageErrorInAccountCell);
+      syncer::kIndicateAccountStorageErrorInAccountCell);
 
   // Set account error.
   ON_CALL(*sync_service_mock_, GetUserActionableError())
@@ -409,7 +410,7 @@
 TEST_F(SettingsTableViewControllerTest, ClearAccountStorageErrorWhenResolved) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
-      kIndicateAccountStorageErrorInAccountCell);
+      syncer::kIndicateAccountStorageErrorInAccountCell);
 
   // Set account error to resolve.
   ON_CALL(*sync_service_mock_, GetUserActionableError())
@@ -453,7 +454,7 @@
 TEST_F(SettingsTableViewControllerTest, DontHoldAccountErrorWhenIneligible) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
-      kIndicateAccountStorageErrorInAccountCell);
+      syncer::kIndicateAccountStorageErrorInAccountCell);
 
   // Enable Sync to make the account item ineligible to indicate errors.
   SetupSyncServiceEnabledExpectations();
@@ -485,7 +486,7 @@
 TEST_F(SettingsTableViewControllerTest, DontHoldAccountErrorWhenNoError) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
-      kIndicateAccountStorageErrorInAccountCell);
+      syncer::kIndicateAccountStorageErrorInAccountCell);
 
   // Set no account error state.
   ON_CALL(*sync_service_mock_, GetUserActionableError())
diff --git a/ios/chrome/browser/ui/settings/signin_settings_app_interface_stub.mm b/ios/chrome/browser/ui/settings/signin_settings_app_interface_stub.mm
index ae8fe4b..b986693 100644
--- a/ios/chrome/browser/ui/settings/signin_settings_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/settings/signin_settings_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/settings/signin_settings_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/settings/sync/BUILD.gn b/ios/chrome/browser/ui/settings/sync/BUILD.gn
index cb4ebab..92924b4 100644
--- a/ios/chrome/browser/ui/settings/sync/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/sync/BUILD.gn
@@ -111,7 +111,6 @@
     "//ios/chrome/browser/ui/settings/google_services:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/settings/sync/utils/BUILD.gn b/ios/chrome/browser/ui/settings/sync/utils/BUILD.gn
index 2c451bb3..368cf06 100644
--- a/ios/chrome/browser/ui/settings/sync/utils/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/sync/utils/BUILD.gn
@@ -104,8 +104,9 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
+    "//net",
+    "//net:test_support",
   ]
 
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/settings/sync/utils/identity_error_util.mm b/ios/chrome/browser/ui/settings/sync/utils/identity_error_util.mm
index 392ca6a..2ce95c1 100644
--- a/ios/chrome/browser/ui/settings/sync/utils/identity_error_util.mm
+++ b/ios/chrome/browser/ui/settings/sync/utils/identity_error_util.mm
@@ -4,6 +4,8 @@
 
 #import "ios/chrome/browser/ui/settings/sync/utils/identity_error_util.h"
 
+#import "base/feature_list.h"
+#import "components/sync/base/features.h"
 #import "components/sync/driver/sync_service.h"
 #import "components/sync/driver/sync_user_settings.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
@@ -34,7 +36,8 @@
 }  // namespace
 
 AccountErrorUIInfo* GetAccountErrorUIInfo(syncer::SyncService* sync_service) {
-  if (!IsIndicateAccountStorageErrorInAccountCellEnabled()) {
+  if (!base::FeatureList::IsEnabled(
+          syncer::kIndicateAccountStorageErrorInAccountCell)) {
     return nil;
   }
 
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
index fb3e2ef0..1207d7e 100644
--- a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
+++ b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
@@ -6,6 +6,7 @@
 #import "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #import "base/time/time.h"
+#import "components/sync/base/command_line_switches.h"
 #import "components/sync/base/features.h"
 #import "ios/chrome/browser/signin/fake_system_identity.h"
 #import "ios/chrome/browser/ui/authentication/signin_earl_grey.h"
@@ -18,6 +19,8 @@
 #import "ios/testing/earl_grey/earl_grey_test.h"
 #import "ios/web/public/test/http_server/http_server.h"
 #import "ios/web/public/test/http_server/http_server_util.h"
+#import "net/base/mac/url_conversions.h"
+#import "net/test/embedded_test_server/embedded_test_server.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -67,7 +70,11 @@
   [ChromeEarlGrey clearBookmarks];
 
   [ChromeEarlGrey clearSyncServerData];
+
   WaitForEntitiesOnFakeServer(0, syncer::AUTOFILL_PROFILE);
+  WaitForEntitiesOnFakeServer(0, syncer::BOOKMARKS);
+  WaitForEntitiesOnFakeServer(0, syncer::HISTORY);
+  WaitForEntitiesOnFakeServer(0, syncer::TYPED_URLS);
 
   [super tearDown];
 }
@@ -75,15 +82,20 @@
 - (void)setUp {
   [super setUp];
 
+  GREYAssertTrue(self.testServer->Start(), @"Server did not start.");
+
   [ChromeEarlGrey clearSyncServerData];
 
   WaitForEntitiesOnFakeServer(0, syncer::AUTOFILL_PROFILE);
   WaitForEntitiesOnFakeServer(0, syncer::BOOKMARKS);
+  WaitForEntitiesOnFakeServer(0, syncer::HISTORY);
   WaitForEntitiesOnFakeServer(0, syncer::TYPED_URLS);
 }
 
 - (AppLaunchConfiguration)appConfigurationForTestCase {
-  AppLaunchConfiguration config;
+  AppLaunchConfiguration config = [super appConfigurationForTestCase];
+  config.additional_args.push_back(std::string("--") +
+                                   syncer::kSyncShortNudgeDelayForTest);
   if ([self isRunningTest:@selector(testSyncInvalidationsEnabled)]) {
     config.features_enabled.push_back(syncer::kUseSyncInvalidations);
   } else if ([self isRunningTest:@selector(testSyncTypedURLUpload)] ||
@@ -93,6 +105,9 @@
     // TypedURL tests need to disable the History data type, since that one
     // replaced TypedURLs.
     config.features_disabled.push_back(syncer::kSyncEnableHistoryDataType);
+  } else if ([self isRunningTest:@selector(testSyncHistoryUpload)] ||
+             [self isRunningTest:@selector(testSyncHistoryDownload)]) {
+    config.features_enabled.push_back(syncer::kSyncEnableHistoryDataType);
   }
   return config;
 }
@@ -399,9 +414,9 @@
                                    syncTimeout:kSyncOperationTimeout];
 
   // Wait for typed url to appear on client.
-  [ChromeEarlGrey waitForTypedURL:mockURL
-                    expectPresent:YES
-                          timeout:kSyncOperationTimeout];
+  [ChromeEarlGrey waitForHistoryURL:mockURL
+                      expectPresent:YES
+                            timeout:kSyncOperationTimeout];
 }
 
 // Tests that when typed url is deleted on the client, sync the change gets
@@ -426,9 +441,9 @@
                                    syncTimeout:kSyncOperationTimeout];
 
   // Wait for typed url to appear on client.
-  [ChromeEarlGrey waitForTypedURL:mockURL
-                    expectPresent:YES
-                          timeout:kSyncOperationTimeout];
+  [ChromeEarlGrey waitForHistoryURL:mockURL
+                      expectPresent:YES
+                            timeout:kSyncOperationTimeout];
   GREYAssert(
       [ChromeEarlGrey numberOfSyncEntitiesWithType:syncer::TYPED_URLS] == 1,
       @"There should be 1 typed URL entity");
@@ -469,9 +484,74 @@
 
   // Trigger sync and wait for fake server to be updated.
   [ChromeEarlGrey triggerSyncCycleForType:syncer::TYPED_URLS];
-  [ChromeEarlGrey waitForTypedURL:mockURL
-                    expectPresent:NO
-                          timeout:kSyncOperationTimeout];
+  [ChromeEarlGrey waitForHistoryURL:mockURL
+                      expectPresent:NO
+                            timeout:kSyncOperationTimeout];
+}
+
+// Tests that browsing history is uploaded to the Sync server.
+- (void)testSyncHistoryUpload {
+  const GURL preSyncURL = self.testServer->GetURL("/console.html");
+  const GURL whileSyncURL = self.testServer->GetURL("/pony.html");
+  const GURL postSyncURL = self.testServer->GetURL("/destination.html");
+
+  [ChromeEarlGrey clearBrowsingHistory];
+  [self setTearDownHandler:^{
+    [ChromeEarlGrey clearBrowsingHistory];
+  }];
+
+  // Visit a URL before turning on Sync.
+  [ChromeEarlGrey loadURL:preSyncURL];
+
+  // Navigate away from that URL.
+  [ChromeEarlGrey loadURL:whileSyncURL];
+
+  // Sign in and wait for sync to become active.
+  FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
+
+  [ChromeEarlGrey
+      waitForSyncTransportStateActiveWithTimeout:kSyncOperationTimeout];
+
+  // Navigate again. This URL, plus the URL that was currently open when Sync
+  // was turned on, should arrive on the Sync server.
+  [ChromeEarlGrey loadURL:postSyncURL];
+
+  // This URL, plus the URL that was currently open when Sync was turned on,
+  // should arrive on the Sync server.
+  NSArray<NSURL*>* URLs = @[
+    net::NSURLWithGURL(whileSyncURL),
+    net::NSURLWithGURL(postSyncURL),
+  ];
+  [ChromeEarlGrey waitForSyncServerHistoryURLs:URLs
+                                       timeout:kSyncOperationTimeout];
+}
+
+// Tests that typed url is downloaded from sync server.
+- (void)testSyncHistoryDownload {
+  const GURL mockURL("http://not-a-real-site/");
+
+  [ChromeEarlGrey clearBrowsingHistory];
+  [self setTearDownHandler:^{
+    [ChromeEarlGrey clearBrowsingHistory];
+  }];
+
+  // Inject a history visit on the server.
+  [ChromeEarlGrey addFakeSyncServerHistoryVisit:mockURL];
+
+  // Sign in and wait for sync to become active.
+  FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
+
+  [ChromeEarlGrey
+      waitForSyncTransportStateActiveWithTimeout:kSyncOperationTimeout];
+
+  // Wait for the visit to appear on the client.
+  [ChromeEarlGrey waitForHistoryURL:mockURL
+                      expectPresent:YES
+                            timeout:kSyncOperationTimeout];
 }
 
 // Tests download of two legacy bookmarks with the same item id.
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_util.mm b/ios/chrome/browser/ui/settings/sync/utils/sync_util.mm
index 138fe97..281117d5 100644
--- a/ios/chrome/browser/ui/settings/sync/utils/sync_util.mm
+++ b/ios/chrome/browser/ui/settings/sync/utils/sync_util.mm
@@ -4,10 +4,12 @@
 
 #import "ios/chrome/browser/ui/settings/sync/utils/sync_util.h"
 
+#import "base/feature_list.h"
 #import "base/metrics/histogram_macros.h"
 #import "components/infobars/core/infobar_manager.h"
 #import "components/signin/public/identity_manager/identity_manager.h"
 #import "components/strings/grit/components_strings.h"
+#import "components/sync/base/features.h"
 #import "components/sync/driver/sync_service.h"
 #import "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
@@ -16,7 +18,6 @@
 #import "ios/chrome/browser/shared/public/commands/browser_commands.h"
 #import "ios/chrome/browser/shared/public/commands/browsing_data_commands.h"
 #import "ios/chrome/browser/shared/public/commands/show_signin_command.h"
-#import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/signin/identity_manager_factory.h"
 #import "ios/chrome/browser/sync/sync_service_factory.h"
 #import "ios/chrome/browser/ui/settings/settings_root_view_controlling.h"
@@ -281,7 +282,8 @@
 }
 
 AccountErrorUIInfo* GetAccountErrorUIInfo(ChromeBrowserState* browserState) {
-  if (!IsIndicateAccountStorageErrorInAccountCellEnabled()) {
+  if (!base::FeatureList::IsEnabled(
+          syncer::kIndicateAccountStorageErrorInAccountCell)) {
     return nil;
   }
 
diff --git a/ios/chrome/browser/ui/sharing/activity_services/BUILD.gn b/ios/chrome/browser/ui/sharing/activity_services/BUILD.gn
index 27acb0c8..6afce391 100644
--- a/ios/chrome/browser/ui/sharing/activity_services/BUILD.gn
+++ b/ios/chrome/browser/ui/sharing/activity_services/BUILD.gn
@@ -109,7 +109,6 @@
     "//ios/chrome/browser/ui/popup_menu/overflow_menu:feature_flags",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/side_swipe/BUILD.gn b/ios/chrome/browser/ui/side_swipe/BUILD.gn
index 5c6e8a8..713a6e3 100644
--- a/ios/chrome/browser/ui/side_swipe/BUILD.gn
+++ b/ios/chrome/browser/ui/side_swipe/BUILD.gn
@@ -82,7 +82,6 @@
     "//base",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net:test_support",
   ]
diff --git a/ios/chrome/browser/ui/start_surface/BUILD.gn b/ios/chrome/browser/ui/start_surface/BUILD.gn
index 6534a1c..a45081e 100644
--- a/ios/chrome/browser/ui/start_surface/BUILD.gn
+++ b/ios/chrome/browser/ui/start_surface/BUILD.gn
@@ -97,7 +97,6 @@
     "//ios/chrome/browser/ui/content_suggestions:feature_flags",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
index 4cbf647..2c1fd558 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
@@ -294,7 +294,6 @@
     "//ios/chrome/common/ui/table_view:cells_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test/http_server",
     "//net:test_support",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/tabs/BUILD.gn b/ios/chrome/browser/ui/tabs/BUILD.gn
index 51977ec..32c05b1 100644
--- a/ios/chrome/browser/ui/tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/tabs/BUILD.gn
@@ -150,7 +150,6 @@
     ":constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/text_fragments/BUILD.gn b/ios/chrome/browser/ui/text_fragments/BUILD.gn
index b4f18f8..afc0ee0a 100644
--- a/ios/chrome/browser/ui/text_fragments/BUILD.gn
+++ b/ios/chrome/browser/ui/text_fragments/BUILD.gn
@@ -41,7 +41,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common:features",
     "//ios/web/public/test:element_selector",
     "//ios/web/public/test/http_server",
diff --git a/ios/chrome/browser/ui/thumb_strip/BUILD.gn b/ios/chrome/browser/ui/thumb_strip/BUILD.gn
index 12e5217..9b5b714 100644
--- a/ios/chrome/browser/ui/thumb_strip/BUILD.gn
+++ b/ios/chrome/browser/ui/thumb_strip/BUILD.gn
@@ -64,7 +64,6 @@
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//net:test_support",
     "//url",
   ]
diff --git a/ios/chrome/browser/ui/toolbar/BUILD.gn b/ios/chrome/browser/ui/toolbar/BUILD.gn
index d136ce9..d12dbaf 100644
--- a/ios/chrome/browser/ui/toolbar/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/BUILD.gn
@@ -216,7 +216,7 @@
     "adaptive_toolbar_app_interface_stub.mm",
   ]
 
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
 
 source_set("eg2_tests") {
@@ -240,7 +240,6 @@
     "//ios/chrome/browser/ui/toolbar/public:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common:features",
     "//ios/web/public/test:element_selector",
     "//ios/web/public/test/http_server",
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_app_interface_stub.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_app_interface_stub.mm
index 7e7b914..5f6c6da 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_app_interface_stub.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/webui/BUILD.gn b/ios/chrome/browser/ui/webui/BUILD.gn
index 04ad8cd5..684608e 100644
--- a/ios/chrome/browser/ui/webui/BUILD.gn
+++ b/ios/chrome/browser/ui/webui/BUILD.gn
@@ -166,7 +166,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/components/webui:url_constants",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//net:test_support",
     "//ui/base",
@@ -190,7 +189,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/components/webui:url_constants",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//url",
   ]
 }
diff --git a/ios/chrome/browser/ui/webui/interstitials/BUILD.gn b/ios/chrome/browser/ui/webui/interstitials/BUILD.gn
index 092a537..0dd0c32 100644
--- a/ios/chrome/browser/ui/webui/interstitials/BUILD.gn
+++ b/ios/chrome/browser/ui/webui/interstitials/BUILD.gn
@@ -59,7 +59,6 @@
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/components/webui:url_constants",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//net:test_support",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/webui/optimization_guide_internals/BUILD.gn b/ios/chrome/browser/ui/webui/optimization_guide_internals/BUILD.gn
index 909c3b7..320401c3 100644
--- a/ios/chrome/browser/ui/webui/optimization_guide_internals/BUILD.gn
+++ b/ios/chrome/browser/ui/webui/optimization_guide_internals/BUILD.gn
@@ -38,6 +38,5 @@
     "//ios/chrome/browser/ui/webui:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
 }
diff --git a/ios/chrome/browser/variations/BUILD.gn b/ios/chrome/browser/variations/BUILD.gn
index d5b05d1..22e60e43 100644
--- a/ios/chrome/browser/variations/BUILD.gn
+++ b/ios/chrome/browser/variations/BUILD.gn
@@ -119,7 +119,7 @@
   ]
   deps = [
     "//base",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
 
@@ -144,7 +144,6 @@
     "//components/variations/service:service",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/chrome/browser/variations/variations_app_interface_stub.mm b/ios/chrome/browser/variations/variations_app_interface_stub.mm
index 955e456..28832f3 100644
--- a/ios/chrome/browser/variations/variations_app_interface_stub.mm
+++ b/ios/chrome/browser/variations/variations_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/variations/variations_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/web/BUILD.gn b/ios/chrome/browser/web/BUILD.gn
index 81f5b6f..12e2f17 100644
--- a/ios/chrome/browser/web/BUILD.gn
+++ b/ios/chrome/browser/web/BUILD.gn
@@ -406,7 +406,7 @@
 
   deps = [
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
   ]
 }
 
@@ -493,7 +493,6 @@
     "//ios/net:test_support",
     "//ios/testing:embedded_test_server_support",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common:features",
     "//ios/web/public/test:element_selector",
     "//ios/web/public/test/http_server",
diff --git a/ios/chrome/browser/web/lookalike_url_app_interface_stub.mm b/ios/chrome/browser/web/lookalike_url_app_interface_stub.mm
index f86432e..495b0861 100644
--- a/ios/chrome/browser/web/lookalike_url_app_interface_stub.mm
+++ b/ios/chrome/browser/web/lookalike_url_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/web/lookalike_url_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/web/progress_indicator_app_interface_stub.mm b/ios/chrome/browser/web/progress_indicator_app_interface_stub.mm
index 119f5fd..a536af81 100644
--- a/ios/chrome/browser/web/progress_indicator_app_interface_stub.mm
+++ b/ios/chrome/browser/web/progress_indicator_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/web/progress_indicator_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn
index 47683b6..c5c6a3a 100644
--- a/ios/chrome/test/BUILD.gn
+++ b/ios/chrome/test/BUILD.gn
@@ -96,7 +96,6 @@
   deps = [
     "//base",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
   frameworks = [ "XCTest.framework" ]
   all_dependent_configs = [ "//third_party/protobuf:protobuf_config" ]
diff --git a/ios/chrome/test/app/sync_test_util.h b/ios/chrome/test/app/sync_test_util.h
index 4377796..f420e3a 100644
--- a/ios/chrome/test/app/sync_test_util.h
+++ b/ios/chrome/test/app/sync_test_util.h
@@ -114,15 +114,18 @@
 // Injects a typed URL into the fake sync server.
 void AddTypedURLToFakeSyncServer(const std::string& url);
 
+// Injects a HISTORY visit into the fake sync server.
+void AddHistoryVisitToFakeSyncServer(const GURL& url);
+
 // Injects a device info into the fake sync server.
 void AddDeviceInfoToFakeSyncServer(const std::string& device_name,
                                    base::Time last_updated_timestamp);
 
 // Returns YES if the provided `url` is present (or not) if `expected_present`
 // is YES (or NO).
-BOOL IsTypedUrlPresentOnClient(const GURL& url,
-                               BOOL expect_present,
-                               NSError** error);
+BOOL IsUrlPresentOnClient(const GURL& url,
+                          BOOL expect_present,
+                          NSError** error);
 
 // Deletes typed URL from HistoryService.
 void DeleteTypedUrlFromClient(const GURL& url);
diff --git a/ios/chrome/test/app/sync_test_util.mm b/ios/chrome/test/app/sync_test_util.mm
index 25f7b9a..a4e86e0 100644
--- a/ios/chrome/test/app/sync_test_util.mm
+++ b/ios/chrome/test/app/sync_test_util.mm
@@ -360,6 +360,25 @@
   gSyncFakeServer->InjectEntity(std::move(entity));
 }
 
+void AddHistoryVisitToFakeSyncServer(const GURL& url) {
+  sync_pb::EntitySpecifics entitySpecifics;
+  sync_pb::HistorySpecifics* history = entitySpecifics.mutable_history();
+  history->set_visit_time_windows_epoch_micros(
+      base::Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds());
+  history->set_originator_cache_guid("originator_cache_guid");
+  history->mutable_page_transition()->set_core_transition(
+      sync_pb::SyncEnums_PageTransition_LINK);
+  auto* redirect_entry = history->add_redirect_entries();
+  redirect_entry->set_url(url.spec());
+  std::unique_ptr<syncer::LoopbackServerEntity> entity =
+      syncer::PersistentUniqueClientEntity::CreateFromSpecificsForTesting(
+          /*non_unique_name=*/std::string(), /*client_tag=*/
+          base::NumberToString(history->visit_time_windows_epoch_micros()),
+          entitySpecifics, /*creation_time=*/12345,
+          /*last_modified_time=*/12345);
+  gSyncFakeServer->InjectEntity(std::move(entity));
+}
+
 void AddDeviceInfoToFakeSyncServer(const std::string& device_name,
                                    base::Time last_updated_timestamp) {
   sync_pb::EntitySpecifics specifics;
@@ -382,9 +401,9 @@
           /*creation_time=*/mtime, mtime));
 }
 
-BOOL IsTypedUrlPresentOnClient(const GURL& url,
-                               BOOL expect_present,
-                               NSError** error) {
+BOOL IsUrlPresentOnClient(const GURL& url,
+                          BOOL expect_present,
+                          NSError** error) {
   // Call the history service.
   ChromeBrowserState* browser_state =
       chrome_test_util::GetOriginalBrowserState();
@@ -417,9 +436,9 @@
     error_message = @"History::GetCountsAndLastVisitForOrigins callback never "
                      "called, app will probably crash later.";
   } else if (count == 0 && expect_present) {
-    error_message = @"Typed URL isn't found in HistoryService.";
+    error_message = @"URL isn't found in HistoryService.";
   } else if (count > 0 && !expect_present) {
-    error_message = @"Typed URL isn't supposed to be in HistoryService.";
+    error_message = @"URL isn't supposed to be in HistoryService.";
   }
 
   if (error_message != nil && error != nil) {
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index a8725039..5681954 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -15,7 +15,6 @@
     ":eg_test_support+eg2",
     "//components/strings",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//ui/base",
     "//url",
@@ -285,7 +284,6 @@
     "//ios/testing:http_server_bundle_data",
     "//ios/testing:nserror_support",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/third_party/edo",
     "//ios/third_party/gtx:gtx+link",
     "//ios/web/common:features",
diff --git a/ios/chrome/test/earl_grey/chrome_actions_app_interface_stub.mm b/ios/chrome/test/earl_grey/chrome_actions_app_interface_stub.mm
index d0c09ec..83aee26d 100644
--- a/ios/chrome/test/earl_grey/chrome_actions_app_interface_stub.mm
+++ b/ios/chrome/test/earl_grey/chrome_actions_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/test/earl_grey/chrome_actions_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h
index c9d7d3c..bd7e865e 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -231,9 +231,12 @@
                      originator_client_item_id:
                          (const std::string&)originator_client_item_id;
 
-// Injects typed URL to sync FakeServer.
+// Injects a typed URL to the sync FakeServer.
 - (void)addFakeSyncServerTypedURL:(const GURL&)URL;
 
+// Injects a HISTORY visit to the sync FakeServer.
+- (void)addFakeSyncServerHistoryVisit:(const GURL&)URL;
+
 // Injects device info to sync FakeServer.
 - (void)addFakeSyncServerDeviceInfo:(NSString*)deviceName
                lastUpdatedTimestamp:(base::Time)lastUpdatedTimestamp;
@@ -263,11 +266,11 @@
 - (void)waitForSyncServerHistoryURLs:(NSArray<NSURL*>*)URLs
                              timeout:(base::TimeDelta)timeout;
 
-// Induces a GREYAssert if `expected_present` is YES and the provided `url` is
-// not present, or vice versa.
-- (void)waitForTypedURL:(const GURL&)URL
-          expectPresent:(BOOL)expectPresent
-                timeout:(base::TimeDelta)timeout;
+// Induces a GREYAssert if `expectPresent` is YES and the provided `URL` is
+// not present in the history DB, or vice versa.
+- (void)waitForHistoryURL:(const GURL&)URL
+            expectPresent:(BOOL)expectPresent
+                  timeout:(base::TimeDelta)timeout;
 
 // Waits for sync invalidation field presence in the DeviceInfo data type on the
 // server.
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
index 8eb9bec..d921509 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -43,8 +43,7 @@
 NSString* const kWaitForPageToStartLoadingError = @"Page did not start to load";
 NSString* const kWaitForPageToFinishLoadingError =
     @"Page did not finish loading";
-NSString* const kTypedURLError =
-    @"Error occurred during typed URL verification.";
+NSString* const kHistoryError = @"Error occurred during history verification.";
 NSString* const kWaitForRestoreSessionToFinishError =
     @"Session restoration did not finish";
 
@@ -841,6 +840,11 @@
   [ChromeEarlGreyAppInterface addFakeSyncServerTypedURL:spec];
 }
 
+- (void)addFakeSyncServerHistoryVisit:(const GURL&)URL {
+  [ChromeEarlGreyAppInterface
+      addFakeSyncServerHistoryVisit:net::NSURLWithGURL(URL)];
+}
+
 - (void)addHistoryServiceTypedURL:(const GURL&)URL {
   NSString* spec = base::SysUTF8ToNSString(URL.spec());
   [ChromeEarlGreyAppInterface addHistoryServiceTypedURL:spec];
@@ -851,20 +855,19 @@
   [ChromeEarlGreyAppInterface deleteHistoryServiceTypedURL:spec];
 }
 
-- (void)waitForTypedURL:(const GURL&)URL
-          expectPresent:(BOOL)expectPresent
-                timeout:(base::TimeDelta)timeout {
+- (void)waitForHistoryURL:(const GURL&)URL
+            expectPresent:(BOOL)expectPresent
+                  timeout:(base::TimeDelta)timeout {
   NSString* spec = base::SysUTF8ToNSString(URL.spec());
-  GREYCondition* waitForTypedURL =
-      [GREYCondition conditionWithName:kTypedURLError
-                                 block:^{
-                                   return [ChromeEarlGreyAppInterface
-                                            isTypedURL:spec
-                                       presentOnClient:expectPresent];
-                                 }];
+  GREYCondition* waitForURL = [GREYCondition
+      conditionWithName:kHistoryError
+                  block:^{
+                    return [ChromeEarlGreyAppInterface isURL:spec
+                                             presentOnClient:expectPresent];
+                  }];
 
-  bool success = [waitForTypedURL waitWithTimeout:timeout.InSecondsF()];
-  EG_TEST_HELPER_ASSERT_TRUE(success, kTypedURLError);
+  bool success = [waitForURL waitWithTimeout:timeout.InSecondsF()];
+  EG_TEST_HELPER_ASSERT_TRUE(success, kHistoryError);
 }
 
 - (void)waitForSyncInvalidationFields {
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
index 2eac1b89..088bd4f 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -398,9 +398,12 @@
                      originator_client_item_id:
                          (NSString*)originator_client_item_id;
 
-// Injects typed URL to sync FakeServer.
+// Injects a typed URL to the sync FakeServer.
 + (void)addFakeSyncServerTypedURL:(NSString*)URL;
 
+// Injects a HISTORY visit to the sync FakeServer.
++ (void)addFakeSyncServerHistoryVisit:(NSURL*)URL;
+
 // Injects device info to sync FakeServer.
 + (void)addFakeSyncServerDeviceInfo:(NSString*)deviceName
                lastUpdatedTimestamp:(base::Time)lastUpdatedTimestamp;
@@ -414,7 +417,7 @@
 // If the provided URL `spec` is either present or not present in HistoryService
 // (depending on `expectPresent`), return YES. If the present status of `spec`
 // is not what is expected, or there is an error, return NO.
-+ (BOOL)isTypedURL:(NSString*)spec presentOnClient:(BOOL)expectPresent;
++ (BOOL)isURL:(NSString*)spec presentOnClient:(BOOL)expectPresent;
 
 // Triggers a sync cycle for a `type`.
 + (void)triggerSyncCycleForType:(syncer::ModelType)type;
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
index fc09a71..03fc68b 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -809,6 +809,10 @@
   chrome_test_util::AddTypedURLToFakeSyncServer(base::SysNSStringToUTF8(URL));
 }
 
++ (void)addFakeSyncServerHistoryVisit:(NSURL*)URL {
+  chrome_test_util::AddHistoryVisitToFakeSyncServer(net::GURLWithNSURL(URL));
+}
+
 + (void)addFakeSyncServerDeviceInfo:(NSString*)deviceName
                lastUpdatedTimestamp:(base::Time)lastUpdatedTimestamp {
   chrome_test_util::AddDeviceInfoToFakeSyncServer(
@@ -824,11 +828,11 @@
       GURL(base::SysNSStringToUTF8(URL)));
 }
 
-+ (BOOL)isTypedURL:(NSString*)spec presentOnClient:(BOOL)expectPresent {
++ (BOOL)isURL:(NSString*)spec presentOnClient:(BOOL)expectPresent {
   NSError* error = nil;
   GURL URL(base::SysNSStringToUTF8(spec));
   BOOL success =
-      chrome_test_util::IsTypedUrlPresentOnClient(URL, expectPresent, &error);
+      chrome_test_util::IsUrlPresentOnClient(URL, expectPresent, &error);
   return success && !error;
 }
 
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface_stub.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface_stub.mm
index 866a105..72fa981 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface_stub.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface_stub.mm b/ios/chrome/test/earl_grey/chrome_matchers_app_interface_stub.mm
index 142fadf..b9ee5d66 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface_stub.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/test/earl_grey/chrome_matchers_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/test/earl_grey/chrome_test_case_app_interface_stub.mm b/ios/chrome/test/earl_grey/chrome_test_case_app_interface_stub.mm
index 6ef96d0..f1c2f07 100644
--- a/ios/chrome/test/earl_grey/chrome_test_case_app_interface_stub.mm
+++ b/ios/chrome/test/earl_grey/chrome_test_case_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/test/earl_grey/chrome_test_case_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/test/earl_grey/earl_grey_scoped_block_swizzler_app_interface_stub.mm b/ios/chrome/test/earl_grey/earl_grey_scoped_block_swizzler_app_interface_stub.mm
index b0e42dc..e1255d9 100644
--- a/ios/chrome/test/earl_grey/earl_grey_scoped_block_swizzler_app_interface_stub.mm
+++ b/ios/chrome/test/earl_grey/earl_grey_scoped_block_swizzler_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/test/earl_grey/earl_grey_scoped_block_swizzler_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/test/earl_grey/smoke_egtest.mm b/ios/chrome/test/earl_grey/smoke_egtest.mm
index 6e76d03..9a87f2c 100644
--- a/ios/chrome/test/earl_grey/smoke_egtest.mm
+++ b/ios/chrome/test/earl_grey/smoke_egtest.mm
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import <EarlGrey/EarlGrey.h>
 #import <UIKit/UIKit.h>
 #import <XCTest/XCTest.h>
 
@@ -10,6 +9,7 @@
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/test/earl_grey2/BUILD.gn b/ios/chrome/test/earl_grey2/BUILD.gn
index d373bba7..d2ba920 100644
--- a/ios/chrome/test/earl_grey2/BUILD.gn
+++ b/ios/chrome/test/earl_grey2/BUILD.gn
@@ -255,7 +255,6 @@
     "//ios/chrome/browser/ui/settings/password/password_settings:password_settings_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/common",
     "//ui/base",
   ]
diff --git a/ios/chrome/test/earl_grey2/smoke_egtest.mm b/ios/chrome/test/earl_grey2/smoke_egtest.mm
index 41402867..ca56105cd 100644
--- a/ios/chrome/test/earl_grey2/smoke_egtest.mm
+++ b/ios/chrome/test/earl_grey2/smoke_egtest.mm
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
 #import <UIKit/UIKit.h>
 
 #import "base/ios/ios_util.h"
diff --git a/ios/chrome/test/variations_smoke_test/BUILD.gn b/ios/chrome/test/variations_smoke_test/BUILD.gn
index 5ed78ad..3294271b 100644
--- a/ios/chrome/test/variations_smoke_test/BUILD.gn
+++ b/ios/chrome/test/variations_smoke_test/BUILD.gn
@@ -16,7 +16,6 @@
     "//base",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
 }
 
@@ -48,5 +47,5 @@
     "variations_smoke_test_app_interface.h",
     "variations_smoke_test_app_interface_stub.mm",
   ]
-  deps = [ "//ios/third_party/earl_grey2:test_lib" ]
+  deps = [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 }
diff --git a/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface_stub.mm b/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface_stub.mm
index 0ddbb10..a81b95ff 100644
--- a/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface_stub.mm
+++ b/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index 0ff0c1f..7849625 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-0426cd6e39e8f63624bb5768452b715750885c33
\ No newline at end of file
+3620f869682513d28d5e9528993c0550a66c4a15
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index 6d70aea0..708f7aab3 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-2e8974f3edb21484458da67a4a14fdf282e75414
\ No newline at end of file
+89c47ed2a7100f69d21ed7062b087a00d7828331
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index ba69282..ec7bce2 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-4a4fcc20147f00034bfa7b43e3135fded1b46a7a
\ No newline at end of file
+87c10a7761c1158568fbeb9b48417f67fa5ed1a4
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 5eec14c..2adb361 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-b0935fb4f109b770c2e70778121ab65474242fe7
\ No newline at end of file
+c384772fcf3f152cea7356d75f67f4b906c1b2fb
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index d36faf60..66d0c7c6 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-ca14adc3e3e5cba095c4c2ce248ab3be48a62a33
\ No newline at end of file
+d07cd249284b0aa08c2170de76b73e8d966a85ad
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 7feff57c..47620c0 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-88fb12dd0099cc3b71f6b6cc8f4120a4437de33b
\ No newline at end of file
+7d5f0d63e4fde02e32051f3420f95ce4719270b7
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index 33cb55bd..abef974d 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-ea951c4574fdaec85bd2db520435589d23161f1a
\ No newline at end of file
+56aa1722d4b87321972aaa0aa17aaeb50a29a72d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 95e064ef..18f4f2b5 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-7483391e71a70173e1229f24d570d6f169e1653a
\ No newline at end of file
+0eb91fca31e8b69a07aa0ecb61ce9c52da8d1514
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 751dd5c..acdd710 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-dc240098e9698962fe6c3f8e381f13f4dced6dfd
\ No newline at end of file
+a89831ceb0321ef2b5f8a63b948fd016eb0c7b12
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index a0ca7c0..11b177c 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-9d757682acfe6f1d0bf3bca27d896df95d4c6186
\ No newline at end of file
+78a84528d4160d266381f1e131d5d60471198e82
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 858fd81..34bfd67 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-25a681b4c0e843100fb87ee50bbda83f49c2ec51
\ No newline at end of file
+e1d4950fa411d15876e93afd2af36721077bdb6a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 51998ab..520b50a4 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-84618883b3a2ca6db20107b7ddce8e6c1d117cd4
\ No newline at end of file
+95ae896799c9cd4b14e91cb28980253228720f26
\ No newline at end of file
diff --git a/ios/showcase/badges/BUILD.gn b/ios/showcase/badges/BUILD.gn
index fe1c125..fec23f7a 100644
--- a/ios/showcase/badges/BUILD.gn
+++ b/ios/showcase/badges/BUILD.gn
@@ -45,7 +45,6 @@
     "//ios/chrome/browser/ui/badges:public",
     "//ios/showcase/test:eg2_test",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/showcase/bubble/BUILD.gn b/ios/showcase/bubble/BUILD.gn
index db92fb7e..9feaa543 100644
--- a/ios/showcase/bubble/BUILD.gn
+++ b/ios/showcase/bubble/BUILD.gn
@@ -25,7 +25,6 @@
   deps = [
     "//ios/showcase/test:eg2_test",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/showcase/core/BUILD.gn b/ios/showcase/core/BUILD.gn
index 1066df8..caae4a5 100644
--- a/ios/showcase/core/BUILD.gn
+++ b/ios/showcase/core/BUILD.gn
@@ -81,7 +81,6 @@
   deps = [
     "//ios/showcase/test:eg2_test",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/showcase/credential_provider/BUILD.gn b/ios/showcase/credential_provider/BUILD.gn
index 6f69c7c..7706b6b 100644
--- a/ios/showcase/credential_provider/BUILD.gn
+++ b/ios/showcase/credential_provider/BUILD.gn
@@ -34,7 +34,6 @@
     "//ios/chrome/common/ui/promo_style:constants",
     "//ios/showcase/test:eg2_test",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
 
diff --git a/ios/showcase/default_browser/BUILD.gn b/ios/showcase/default_browser/BUILD.gn
index 8615c5f6..31f4d8e0 100644
--- a/ios/showcase/default_browser/BUILD.gn
+++ b/ios/showcase/default_browser/BUILD.gn
@@ -28,7 +28,6 @@
     "//ios/chrome/common/ui/confirmation_alert",
     "//ios/showcase/test:eg2_test",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ui/base",
   ]
 
diff --git a/ios/showcase/discover_feed_preview/BUILD.gn b/ios/showcase/discover_feed_preview/BUILD.gn
index b996e091..d21083dd 100644
--- a/ios/showcase/discover_feed_preview/BUILD.gn
+++ b/ios/showcase/discover_feed_preview/BUILD.gn
@@ -28,7 +28,6 @@
     "//ios/chrome/browser/ui/context_menu/link_preview:constants",
     "//ios/showcase/test:eg2_test",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/showcase/infobars/BUILD.gn b/ios/showcase/infobars/BUILD.gn
index ffb37436..ff1f213 100644
--- a/ios/showcase/infobars/BUILD.gn
+++ b/ios/showcase/infobars/BUILD.gn
@@ -56,7 +56,6 @@
     "//ios/chrome/browser/ui/infobars/modals:public",
     "//ios/showcase/test:eg2_test",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/showcase/test/BUILD.gn b/ios/showcase/test/BUILD.gn
index 8dffc1f..5fcceed 100644
--- a/ios/showcase/test/BUILD.gn
+++ b/ios/showcase/test/BUILD.gn
@@ -21,7 +21,6 @@
   deps = [
     ":eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
 }
 
@@ -40,7 +39,7 @@
   public_deps = [ "//base" ]
 
   deps = [
-    "//ios/third_party/earl_grey2:test_lib",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
     "//ui/base",
 
     # This is required to load the resources for the EG2 tests.
diff --git a/ios/showcase/test/showcase_test_case_app_interface_stub.mm b/ios/showcase/test/showcase_test_case_app_interface_stub.mm
index c987e97..ea627af 100644
--- a/ios/showcase/test/showcase_test_case_app_interface_stub.mm
+++ b/ios/showcase/test/showcase_test_case_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/showcase/test/showcase_test_case_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/showcase/text_badge_view/BUILD.gn b/ios/showcase/text_badge_view/BUILD.gn
index 9dfb0da..04a9e219 100644
--- a/ios/showcase/text_badge_view/BUILD.gn
+++ b/ios/showcase/text_badge_view/BUILD.gn
@@ -18,7 +18,6 @@
   deps = [
     "//ios/showcase/test:eg2_test",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/testing/earl_grey/app_launch_manager_app_interface_stub.mm b/ios/testing/earl_grey/app_launch_manager_app_interface_stub.mm
index 4ec5912..6e9ed9b 100644
--- a/ios/testing/earl_grey/app_launch_manager_app_interface_stub.mm
+++ b/ios/testing/earl_grey/app_launch_manager_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/testing/earl_grey/app_launch_manager_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/testing/earl_grey/base_earl_grey_test_case_app_interface_stub.mm b/ios/testing/earl_grey/base_earl_grey_test_case_app_interface_stub.mm
index 87a33f7f..8b374309 100644
--- a/ios/testing/earl_grey/base_earl_grey_test_case_app_interface_stub.mm
+++ b/ios/testing/earl_grey/base_earl_grey_test_case_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/testing/earl_grey/base_earl_grey_test_case_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/third_party/earl_grey2/ios_eg2_test.gni b/ios/third_party/earl_grey2/ios_eg2_test.gni
index be795539..52947f7 100644
--- a/ios/third_party/earl_grey2/ios_eg2_test.gni
+++ b/ios/third_party/earl_grey2/ios_eg2_test.gni
@@ -84,7 +84,7 @@
     if (!defined(deps)) {
       deps = []
     }
-    deps += [ "//ios/third_party/earl_grey2:test_lib" ]
+    deps += [ "//ios/testing/earl_grey:eg_test_support+eg2" ]
 
     # TODO(crbug.com/1056328) Because we change the target name, the subnodes
     # are going to append with the _test in the naming, which won't be backwards
diff --git a/ios/web/shell/test/BUILD.gn b/ios/web/shell/test/BUILD.gn
index b78f54e21..0f42ff3 100644
--- a/ios/web/shell/test/BUILD.gn
+++ b/ios/web/shell/test/BUILD.gn
@@ -84,7 +84,6 @@
     "//ios/testing:http_server_bundle_data",
     "//ios/testing:nserror_support",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//ios/web/shell:shell_interfaces",
     "//net:test_support",
@@ -109,7 +108,6 @@
     ":eg_test_support+eg2",
     "//base",
     "//ios/testing/earl_grey:eg_test_support+eg2",
-    "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
     "//ios/web/public/test/http_server",
     "//net:test_support",
diff --git a/ios/web/shell/test/earl_grey/shell_actions_app_interface_stub.mm b/ios/web/shell/test/earl_grey/shell_actions_app_interface_stub.mm
index 5a38220f..535c361d 100644
--- a/ios/web/shell/test/earl_grey/shell_actions_app_interface_stub.mm
+++ b/ios/web/shell/test/earl_grey/shell_actions_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/web/shell/test/earl_grey/shell_actions_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/web/shell/test/earl_grey/shell_earl_grey_app_interface_stub.mm b/ios/web/shell/test/earl_grey/shell_earl_grey_app_interface_stub.mm
index 2af8632..e3fb8e5 100644
--- a/ios/web/shell/test/earl_grey/shell_earl_grey_app_interface_stub.mm
+++ b/ios/web/shell/test/earl_grey/shell_earl_grey_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/web/shell/test/earl_grey/shell_earl_grey_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/web/shell/test/earl_grey/shell_matchers_app_interface_stub.mm b/ios/web/shell/test/earl_grey/shell_matchers_app_interface_stub.mm
index 854dcfa..89d78a9 100644
--- a/ios/web/shell/test/earl_grey/shell_matchers_app_interface_stub.mm
+++ b/ios/web/shell/test/earl_grey/shell_matchers_app_interface_stub.mm
@@ -4,7 +4,7 @@
 
 #import "ios/web/shell/test/earl_grey/shell_matchers_app_interface.h"
 
-#import <TestLib/EarlGreyImpl/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller.mm b/ios/web_view/internal/autofill/cwv_autofill_controller.mm
index d31cd50..bdc22aa 100644
--- a/ios/web_view/internal/autofill/cwv_autofill_controller.mm
+++ b/ios/web_view/internal/autofill/cwv_autofill_controller.mm
@@ -10,6 +10,7 @@
 
 #import "base/functional/callback.h"
 #import "base/mac/foundation_util.h"
+#import "base/notreached.h"
 #import "base/ranges/algorithm.h"
 #import "base/strings/sys_string_conversions.h"
 #import "base/values.h"
@@ -727,4 +728,12 @@
   // No op.
 }
 
+- (BOOL)shouldShowAccountStorageNotice {
+  return false;
+}
+
+- (void)showAccountStorageNotice:(void (^)())completion {
+  NOTREACHED_NORETURN();
+}
+
 @end
diff --git a/ios/web_view/shell/test/earl_grey/web_view_shell_matchers.mm b/ios/web_view/shell/test/earl_grey/web_view_shell_matchers.mm
index a5859bb1..9f2b9fe 100644
--- a/ios/web_view/shell/test/earl_grey/web_view_shell_matchers.mm
+++ b/ios/web_view/shell/test/earl_grey/web_view_shell_matchers.mm
@@ -4,7 +4,7 @@
 
 #import "ios/web_view/shell/test/earl_grey/web_view_shell_matchers.h"
 
-#import <EarlGrey/EarlGrey.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #include "base/mac/foundation_util.h"
 #include "base/strings/sys_string_conversions.h"
diff --git a/ios/web_view/shell/test/shell_egtest.mm b/ios/web_view/shell/test/shell_egtest.mm
index 2c4b42d..c7f9aa8 100644
--- a/ios/web_view/shell/test/shell_egtest.mm
+++ b/ios/web_view/shell/test/shell_egtest.mm
@@ -5,8 +5,8 @@
 #include <memory>
 
 #import <ChromeWebView/ChromeWebView.h>
-#import <EarlGrey/EarlGrey.h>
 #import <XCTest/XCTest.h>
+#import "ios/testing/earl_grey/earl_grey_test.h"
 
 #include "base/strings/sys_string_conversions.h"
 #import "ios/web_view/shell/shell_view_controller.h"
diff --git a/media/renderers/win/media_foundation_renderer.cc b/media/renderers/win/media_foundation_renderer.cc
index aa9620db..be92fac 100644
--- a/media/renderers/win/media_foundation_renderer.cc
+++ b/media/renderers/win/media_foundation_renderer.cc
@@ -376,6 +376,18 @@
   UINT device_reset_token;
   RETURN_IF_FAILED(
       MFLockDXGIDeviceManager(&device_reset_token, &dxgi_device_manager_));
+  // `dxgi_device_manager_` returned is a singleton object, thus all
+  // MediaFoundationRenderer instances will all receive the
+  // `dxgi_device_manager_` pointing to the same object. Therefore we only need
+  // to and can only call `ResetDevice()` once, If it's called more than once,
+  // all open device handles become invalid, even when it is the same device as
+  // before. This will cause an existing instance attempting to use the invalid
+  // handle to error out.
+  // https://learn.microsoft.com/en-us/windows/win32/api/mfobjects/nf-mfobjects-imfdxgidevicemanager-resetdevice
+  DXGIDeviceScopedHandle dxgi_device_handle(dxgi_device_manager_.Get());
+  if (dxgi_device_handle.GetDevice()) {
+    return S_OK;
+  }
 
   ComPtr<ID3D11Device> d3d11_device;
   UINT creation_flags =
@@ -390,6 +402,9 @@
   RETURN_IF_FAILED(CreateDXGIFactory1(IID_PPV_ARGS(&factory)));
 
   Microsoft::WRL::ComPtr<IDXGIAdapter> adapter_to_use;
+  // TODO(crbug.com/1426249): Need to handle the case when Adapter LUID is
+  // specific per instance of the video playback. This will now allow all
+  // instances to use the default DXGI device manager.
   if (gpu_process_adapter_luid_.LowPart || gpu_process_adapter_luid_.HighPart) {
     Microsoft::WRL::ComPtr<IDXGIAdapter> temp_adapter;
     for (UINT i = 0; SUCCEEDED(factory->EnumAdapters(i, &temp_adapter)); i++) {
diff --git a/net/base/features.cc b/net/base/features.cc
index f2d01d51..643585d 100644
--- a/net/base/features.cc
+++ b/net/base/features.cc
@@ -94,6 +94,10 @@
              "SplitCacheByNetworkIsolationKey",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kSplitCodeCacheByNetworkIsolationKey,
+             "SplitCodeCacheByNetworkIsolationKey",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kSplitHostCacheByNetworkIsolationKey,
              "SplitHostCacheByNetworkIsolationKey",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/net/base/features.h b/net/base/features.h
index a0a84e60..a0c689c 100644
--- a/net/base/features.h
+++ b/net/base/features.h
@@ -116,6 +116,11 @@
 // available.
 NET_EXPORT BASE_DECLARE_FEATURE(kSplitCacheByNetworkIsolationKey);
 
+// Splits the generated code cache by the request's NetworkIsolationKey if one
+// is available. Note that this feature is also gated behind
+// `net::HttpCache::IsSplitCacheEnabled()`.
+NET_EXPORT BASE_DECLARE_FEATURE(kSplitCodeCacheByNetworkIsolationKey);
+
 // Splits host cache entries by the DNS request's NetworkIsolationKey if one is
 // available. Also prevents merging live DNS lookups when there is a NIK
 // mismatch.
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index 4981b3cf..965f7df7 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -1391,7 +1391,6 @@
     { "name": "fastcomcorp.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "itshost.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jmedved.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "keepclean.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "leonardcamacho.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mdfnet.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "michalspacek.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -1764,7 +1763,6 @@
     { "name": "heute-kaufen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hushfile.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "interasistmen.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kamikano.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kintone.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "koenrouwhorst.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lillpopp.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -1959,7 +1957,6 @@
     { "name": "pirateproxy.sx", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "proxybay.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "red-t-shirt.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "siewert-kau.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "skeeley.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "soia.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "suos.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -2283,7 +2280,6 @@
     { "name": "vyplnto.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "webmaniabr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wettertoertchen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "williamsonshore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wtfismyip.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xpd.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "zifb.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -2311,7 +2307,6 @@
     { "name": "bownty.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "braineet.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "brks.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "businesshosting.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bygningsregistrering.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cardoni.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "carlosalves.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -2424,7 +2419,6 @@
     { "name": "projectascension.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "prospo.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "purewebmasters.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "qualityhomesystems.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "railgun.ac", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "raydobe.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "redlink.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3467,7 +3461,6 @@
     { "name": "fastaim.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "matrip.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "1co-jp.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "1password.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ad-notam.pt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "adblock.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "admsel.ec", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3556,7 +3549,6 @@
     { "name": "liquid.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lukasunger.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mac-torrents.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "marlen.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "melted.pw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "missdream.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "moreapp.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3765,7 +3757,6 @@
     { "name": "vm0.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vnvisa.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "watersb.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "watertrails.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "westerhoud.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "whatsapp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "whey-protein.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -4228,7 +4219,6 @@
     { "name": "untoldstory.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "unun.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "valmagus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "vanitas.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vansieleghem.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vfdworld.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "viperdns.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5337,7 +5327,6 @@
     { "name": "johannes.wtf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "johnrom.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "johnverkerk.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "jonasgroth.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jonn.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jopsens.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jrgold.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5714,7 +5703,6 @@
     { "name": "thescientists.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thesled.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thetradinghall.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "thetuxkeeper.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thezero.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thibautcharles.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thinkcoding.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5774,7 +5762,6 @@
     { "name": "weltmeisterschaft.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "werkplaatsoost.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "werkruimtebottendaal.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "wessner.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "westcountrystalking.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wetofu.top", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wetthost.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6589,7 +6576,6 @@
     { "name": "wolfesden.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wxukang.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yagihiro.tech", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "zenithmedia.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "zhendingresources.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "3s-hosting.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "7kovrikov.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6919,7 +6905,6 @@
     { "name": "michel-wein.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "miku.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mmonit.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mobal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "monobank.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "moveek.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mtg-tutor.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6977,7 +6962,6 @@
     { "name": "planete-cocoon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "plexusmd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "politologos.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "posylka.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pro-link.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "punknews.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pvcvoordeel.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7670,7 +7654,6 @@
     { "name": "collegepulse.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "commerciallocker.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "commoncore4kids.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "compareandrecycle.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "compliance-systeme.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "complymd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "confirm365.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7937,7 +7920,6 @@
     { "name": "feuerwehr-oberkotzau.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fexmen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ffmradio.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ficus.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fid.to", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "filhodohomem.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "financieringsportaal.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9169,16 +9151,13 @@
     { "name": "throwaway.link", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tibbitshall.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ticketoplichting.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "tickreport.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tigerdile.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "timbuktutimber.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "time-river.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "timestamp.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "timmersgems.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "timwittenberg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tippspiel.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tjenestetorvet.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "tls.care", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tmi-products.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tmi-produkter.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tmpraider.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9216,7 +9195,6 @@
     { "name": "trident-online.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "trinityaffirmations.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "trinnes.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "tripdelta.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tripseats.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "troi.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "truckerswereld.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9607,7 +9585,6 @@
     { "name": "cantrack.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "charitystreet.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "charl.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "chiropracticwpb.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "churchthemes.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cheapestgamecards.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cheapestgamecards.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9774,7 +9751,6 @@
     { "name": "freemanning.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fusionmate.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "frforms.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "futuresonline.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "frogeye.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "frtn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fuwafuwa.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10314,7 +10290,6 @@
     { "name": "testadren.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tensionup.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tf2stadium.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "tenni.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thebigdatacompany.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thecapitalbank.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thecharlestonwaldorf.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10497,7 +10472,6 @@
     { "name": "anonymo.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "anxietyspace.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "apk4fun.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "apply.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "army24.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "armyprodej.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arne-petersen.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10675,7 +10649,6 @@
     { "name": "georgioskontaxis.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "georgioskontaxis.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gerritcodereview.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "getblys.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "getgeek.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "getgeek.nu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "getgeek.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11186,7 +11159,6 @@
     { "name": "andrewregan.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "androide.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "annejan.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "anojan.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ansogning-sg.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "anthonyavon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "anystack.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -12243,7 +12215,6 @@
     { "name": "schd.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schizoids.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schlechtewitze.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "schnellsuche.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schopenhauer-institut.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schrauger.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schrauger.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -12445,7 +12416,6 @@
     { "name": "tpbunblocked.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "trade.gov.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "traindb.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "transfile.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "transparentcorp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "travality.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "travisforte.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13328,7 +13298,6 @@
     { "name": "kisa.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kennethaasan.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kaela.design", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kannchen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lafillepolyvalente.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kaufkraftkiel.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jodlajodla.si", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13446,7 +13415,6 @@
     { "name": "lostg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "laos.dating", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "madusecurity.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "jyoti-fairworks.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mentorithm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "markcp.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "medifi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13670,7 +13638,6 @@
     { "name": "papygeek.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "photoancestry.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "npm.li", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "perezdecastro.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pe-bank.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "paul-kerebel.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pnut.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14239,7 +14206,6 @@
     { "name": "anthropoid.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "acara-yoga.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "4miners.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "007-preisvergleich.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "alumni-kusa.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ablak-nyilaszaro.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "90smthng.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14380,7 +14346,6 @@
     { "name": "comfy.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "charlenevondell.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cavzodiaco.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "cwage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "coincoin.eu.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cosmundi.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cuetoems.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14712,7 +14677,6 @@
     { "name": "ila.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jarondl.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "intrp.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "hoiku-map.tokyo", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jarrettgraham.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "iruca.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hosted-oswa.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -15439,7 +15403,6 @@
     { "name": "39sihu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "2600edinburgh.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "1kando.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "2pay.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "0ik.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "0xda.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "adhesivelaundry.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -15816,7 +15779,6 @@
     { "name": "computerslotopschool.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "criminal.enterprises", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "collectdocs.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "bierbringer.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "colombian.dating", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "comchezmeme.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "combron.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16629,7 +16591,6 @@
     { "name": "moobo.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "moovablestorage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "musewearflipflops.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mhermans.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mondedie.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mticareportal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mxihan.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -17479,7 +17440,6 @@
     { "name": "zwollemagazine.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yasutomonodokoiko.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "zojadravai.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "zonecb.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "z-konzept-nutrition.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yuricarlenzoli.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wibuw.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -17897,7 +17857,6 @@
     { "name": "coreum.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "confuddledpenguin.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudbased.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "corderoscleaning.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cmso-cal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cernega.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "coolrc.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18104,7 +18063,6 @@
     { "name": "erinn.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "esphigmenou.gr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "eengezinswoning-in-pekela-kopen.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "elhall.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "elektrokarges.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "eichel.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "eprofitacademy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18191,7 +18149,6 @@
     { "name": "drjacquesmalan.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "firenza.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "flinch.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "firegoby.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "filme-online.eu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fliptable.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "filebox.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18428,7 +18385,6 @@
     { "name": "imacs.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "homezhi.com.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "identity-hash.online", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ichbinkeinreh.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hyphen.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "handmadegobelin.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "grossmisconduct.news", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18962,7 +18918,6 @@
     { "name": "openrealestate.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "onthecheap.store", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "online24.pt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "oblikdom.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oelsner.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nchristo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oemwolf.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -19268,7 +19223,6 @@
     { "name": "sevenhillsapartments.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "saz.sh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sengokulife.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "rondreis-planner.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shardsoft.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schatzibaers.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "secwall.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -19282,7 +19236,6 @@
     { "name": "sfirat-haomer.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "securitywatch.co.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sapac.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "seefunk.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "scriptenforcer.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shadowsocks.com.hk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schadevergoedingen.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -20071,7 +20024,6 @@
     { "name": "figura.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "film-tutorial.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "filterlists.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "finform.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "firmenverzeichnis.nu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "first.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "firstfinca.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -20592,7 +20544,6 @@
     { "name": "tiliaze.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tiliaze.biz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "timebox.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "timoxbrow.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tinkerboard.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tittarpuls.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tmhlive.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -21032,7 +20983,6 @@
     { "name": "bariller.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "baropkamp.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "barracuda.blog", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "barracuda.com.tr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "basculasconfiables.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "basementdoctornorthwest.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "basilm.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -21315,7 +21265,6 @@
     { "name": "cloudpengu.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudwarez.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "clounix.online", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "clsimage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "clubdeslecteurs.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "clusterfuck.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cmcressy.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22135,7 +22084,6 @@
     { "name": "internshipandwork.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "intersectraven.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "interseller.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "intracom.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "inventionsteps.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "investingtrader.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ipal.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22159,7 +22107,6 @@
     { "name": "islam.si", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "islazia.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "isliada.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ismat.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ismetroonfiretoday.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "isn.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "isoroc-nidzica.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22246,7 +22193,6 @@
     { "name": "jreinert.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jrtapsell.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jslidong.top", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "juan23.edu.uy", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "juergen-elbert.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "juka.pp.ua", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "julegoerke.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22752,7 +22698,6 @@
     { "name": "nethunter.top", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "netsparkercloud.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "networkersdiary.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "neurochip.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "neurotransmitter.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "never.pet", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "neverwetturkey.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23145,7 +23090,6 @@
     { "name": "rejahrehim.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "relax.hn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "relaxdom.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "relsak.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "relvan.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "remedium.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rengarenkblog.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23241,7 +23185,6 @@
     { "name": "sainetworks.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "saipariwar.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "saiyasu-search.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "sajdowski.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sakib.ninja", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sallydowns.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "salmonella.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23815,7 +23758,6 @@
     { "name": "vsesrazu-raiffeisen.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vstehn.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vuakhuyenmai.vn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "vulpine.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vuvanhon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vwittich.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vxml.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23850,7 +23792,6 @@
     { "name": "websitedesign.bg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "websiteservice.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "webspotter.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "wedos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "weeknummers.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "weerstationgiethoorn.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wegvielfalt.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -24218,7 +24159,6 @@
     { "name": "amesvacuumrepair.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "asisee.photography", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "animalstropic.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "annangela.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "artleading.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "austinsutphin.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "alertonline.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25436,7 +25376,6 @@
     { "name": "kingofshooting.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ko.si", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kaanduman.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kiehls.pt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kelm.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "keezin.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kolin.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25700,7 +25639,6 @@
     { "name": "midterm.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "miamicityballet.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mestazitrka.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mentaltraining-fuer-musiker.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mercedes-benz-usedcars.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "millhousenchurch.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "metrans-spedition.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25789,8 +25727,6 @@
     { "name": "msz-fotografie.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "moveisfit.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "my-static-demo-808795.c.cdn77.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "musik-mentaltraining.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "muzeumkomiksu.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "myriadof.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mycamda.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "music-is-my-life.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26737,7 +26673,6 @@
     { "name": "tvsheerenhoek.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "touchscreentills.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "theory.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "tvoru.com.ua", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "unusualhatclub.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "undercovercondoms.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "unblocked.pub", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26752,7 +26687,6 @@
     { "name": "upperbeaconsfield.org.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "uflixit.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "twilleys.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "urbansparrow.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ungern.guide", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "uptoon.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "uvocorp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26809,7 +26743,6 @@
     { "name": "visaexpert.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vrlaid.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "voidshift.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "vladislavstoyanov.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "uniformecomgas.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "versfin.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vagabondgal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -27590,7 +27523,6 @@
     { "name": "ecfnorte.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "elementalict.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "eatfitoutlet.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "evaartinger.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "eyesoccer-didikh.rhcloud.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "erotpo.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fantasiapainter.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -27894,7 +27826,6 @@
     { "name": "kakoo-media.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "joomlant.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kgb.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kimiris.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kartacha.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "keechain.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kakoo.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28075,7 +28006,6 @@
     { "name": "michel.pt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "miss-platinum.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mjmnagy.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mj420.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "madeinstudio3.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "minorshadows.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "moondrop.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28494,7 +28424,6 @@
     { "name": "secretar.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sharperedge.pw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sharperedgecomputers.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "servingbaby.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shiftleft.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shopifycloud.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "safetycloud.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28505,7 +28434,6 @@
     { "name": "sharedhost.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shakebox.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shuzicai.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "sidonge.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shethbox.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sim-sim.appspot.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sera.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28518,10 +28446,8 @@
     { "name": "skynetnetwork.eu.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shitagi-shop.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sientemendoza.com.ar", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "serverlog.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "slingoweb.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "skwile-cafe.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "skates.guru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "silvergoldbull.tt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "smart-informatics.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "siao-mei.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28529,7 +28455,6 @@
     { "name": "skryptersi.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "snuff.porn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "smartbiz.vn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "shock.ee", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sicklepod.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "skypoker.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shaken-kyoto.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28796,7 +28721,6 @@
     { "name": "viscoelastico.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vialibido.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "websitesdallas.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "vialorran.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vivasports.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "villageunique.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "viplentes.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -29429,7 +29353,6 @@
     { "name": "allmend-ru.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "alloutatl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "amandasage.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ambrosius.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "amg-microwave.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "amin.one", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "amua.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -29735,7 +29658,6 @@
     { "name": "padzilla.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "passionatehorsemanship.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pastorsuico.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "paul-bronski.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "penticton.photography", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "peoplelikemeapp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "performaride.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -29891,7 +29813,6 @@
     { "name": "vidiproject.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vierdaagsehotel.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "viltsu.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "virtusaero.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "voltimax.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "voxfilmeonline.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wahidhasan.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -30626,7 +30547,6 @@
     { "name": "hideouswebsite.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hirezzportal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hivatalinfo.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "holad.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "holidaysportugal.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "homatism.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "homeodynamics.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31017,7 +30937,6 @@
     { "name": "parisescortgirls.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "parleamonluc.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "partycentrumdebinnenhof.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "pascal-kannchen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "passfoto-deinfoto.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "passionpictures.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "passports.govt.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31179,7 +31098,6 @@
     { "name": "scheuchenstuel.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schlafguru.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schmetterlingsapp.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "schroepfi.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schwarzes-muenchen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schwinnbike.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "science-network.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -32707,7 +32625,6 @@
     { "name": "gfbouncycastles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gfcleisure.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "giggletotz.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "giliamor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gillyscastles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "giraffeinflatables.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gladwellentertainments.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -33563,7 +33480,6 @@
     { "name": "thablubb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thefanimatrix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tiihosen.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tracelight.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tsumegumi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ubermail.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vida-it.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -34051,7 +33967,6 @@
     { "name": "sipc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smaltimento-rifiuti.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smtp.bz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "smutba.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snip.run", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snowchamps.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -35177,7 +35092,6 @@
     { "name": "4flex.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "52b9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "52b9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "53ningen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "788da.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "81uc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8951889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -35495,7 +35409,6 @@
     { "name": "coldstreamcreekfarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "collectorknives.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coltonrb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "comidasperuanas.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "commco.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comoeliminarlaspapulasperladasenelglande.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comosatisfaceraunhombreenlacamaydejarloloco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -37933,7 +37846,6 @@
     { "name": "myting.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myyubikey.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myyubikey.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nabidkamajetku.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "namu.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nds-helicopter.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nearbi.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38479,7 +38391,6 @@
     { "name": "greenhats.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "groentebesteld.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guides-et-admin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hakaru.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hamburgerbesteld.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "happydietplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "healthstar-dev.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38550,7 +38461,6 @@
     { "name": "kuttler.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lakehavasuhomes.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lamp.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "laparoscopia.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "laranjada.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "larbertbaptist.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lavasing.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38609,7 +38519,6 @@
     { "name": "mormonleaks.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "movie1000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mtgsuomi.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "muckrack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myadpost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myphotoshopbrushes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mytfg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38662,7 +38571,6 @@
     { "name": "pixabay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pizzabesteld.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "placedaffiliate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "planetknauer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "play-charades.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plumbingcentral.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "policesromandesrecrutement.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38739,7 +38647,6 @@
     { "name": "skatesins.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skid.church", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skomski.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "smartservices.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snackbesteld.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sodomojo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "somaliaonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -39350,7 +39257,6 @@
     { "name": "gubagoo.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gupfen.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gxmyqy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "healthgames.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hg525.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "himekomi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hjkbm.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40287,7 +40193,6 @@
     { "name": "asmik-armenie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "astral.org.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atherosense.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "atlassignsandplaques.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avalon-rpg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avatardiffusion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avocatbeziau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40322,7 +40227,6 @@
     { "name": "blockedyourcar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blockedyourcar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blockedyourcar.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "blokino.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bluewavewebdesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bluiandaj.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bluop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40386,7 +40290,6 @@
     { "name": "dc-elektro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dc-elektro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dc-elektro.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "deliciousmedia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "derattizzazioni.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diesteppenreiter.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dinheirolucrar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40407,7 +40310,6 @@
     { "name": "eco-wiki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecobin.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecodesigns.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ecombustibil.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "economycarrentalscyprus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educnum.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "efinity.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40644,7 +40546,6 @@
     { "name": "ndhlink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "neilshealthymeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nejlevnejsi-parapety.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "neonknight.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netbox.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netflixlife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netrewrite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40728,7 +40629,6 @@
     { "name": "raisecorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ramezanloo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rapidhubs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rdmrotterdam.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reactdatepicker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "redchat.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "redlinelap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40977,7 +40877,6 @@
     { "name": "desveja.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "detroitrocs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dharma.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dierencompleet.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dinocarrozzeria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "disinfestazioni.treviso.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "disinfestazionivespe.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -42612,7 +42511,6 @@
     { "name": "san.ac.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sandtears.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "satsang-uwe.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "saviezvousque.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schlaf.guru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schmid.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schoring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -42844,7 +42742,6 @@
     { "name": "asystent-dzierzawy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atacadocervejeiro.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "augmented-portal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "august-don.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "austin-pearce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autod.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autospurgo.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43618,7 +43515,6 @@
     { "name": "999998722.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aa1718.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aca-creative.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "accesskeycloning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "achwo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acoshift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acoshift.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43889,7 +43785,6 @@
     { "name": "gfahnen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gluit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gnaptracker.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "go-wild.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "go2ubl.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goerlitz-zgorzelec.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "golfmeile.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -44028,7 +43923,6 @@
     { "name": "mail.storage", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "malibu-electric.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "malibuexteriorlighting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "malikzinad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "manfredschafer.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "manuelahidalgo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marcel-veronetzki.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -44665,7 +44559,6 @@
     { "name": "tamriel-rebuilt.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tecnologino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "telamon.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "theastrocoach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theel0ja.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thej0lt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thekeytobusiness.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -44960,7 +44853,6 @@
     { "name": "fsfxpackages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fsvoboda.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fuselight.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ganzgraph.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gardinte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "garethkirk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "garethkirkreviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -45099,7 +44991,6 @@
     { "name": "maatwerkopruimcoaching.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maatwerkzorgcoaching.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "macgenius.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "macksproductions.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maderasbrown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maidoty.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "malesoowki.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -45241,7 +45132,6 @@
     { "name": "provisionircd.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proxi.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "q5118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "qa-team.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qiuxian.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radiumtree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rambo.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -45351,7 +45241,6 @@
     { "name": "teknoforums.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teleshop.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "templum.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "the-gdn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thecamels.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thecameradivision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thecoffeecamp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -45471,7 +45360,6 @@
     { "name": "zlaty-tyden.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zlatytyden.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zq789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "12photos.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "20zq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "319k3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5518k3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -45706,7 +45594,6 @@
     { "name": "sgsp.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shadowstack.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "siel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sioeckes.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sl899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sl998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "slate.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -46705,7 +46592,6 @@
     { "name": "smartietop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smtpdev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snaptier.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "snowpaws.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snowyluma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "social-media-strategy.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "socialmarketingday.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -47583,7 +47469,6 @@
     { "name": "cloudcite.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "club-slow.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "club-yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cm3.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "computercraft.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "concordsoftwareleasing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "contents.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -47597,7 +47482,6 @@
     { "name": "devragu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dirkjonker.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "divinasaiamodas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dorpshuiskesteren.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dota2huds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dowell.media", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dreamersgiftshopec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -47617,7 +47501,6 @@
     { "name": "everything-everywhere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "evilbeasts.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "figure.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "film-storyboards.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "filmsphoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "finanstilsynet.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flacandmp3.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -47711,7 +47594,6 @@
     { "name": "nulap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nxit.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "odinseye.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "odisealinux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "offgridhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onionbot.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ontsnappingskamer.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48375,7 +48257,6 @@
     { "name": "mimemoriadepez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mipueblohoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "misskey.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mit-dem-rad-zur-arbeit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mityinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mitylite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mixrepairs.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48488,7 +48369,6 @@
     { "name": "ranfurlychambers.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raphaelmoura.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rcmpsplib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rebeagle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rebelonline.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "receptionpoint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reesmichael1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48818,7 +48698,6 @@
     { "name": "actioncleaningnd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "addictionresource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "advanced-fleet-services.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "advertis.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aegialis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aerospace-schools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "affloc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50053,7 +49932,6 @@
     { "name": "aidanmitchell.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "airlibre-parachutisme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "airswap.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alibiloungelv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alis-test.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allpointsheating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allstarcashforcars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50326,7 +50204,6 @@
     { "name": "poodleassassin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pro-ben.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "promedyczny.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "properchels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pushoflove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qaq.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qiu521119.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50656,7 +50533,6 @@
     { "name": "djeung.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dmparish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dndesign.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "domainspeicher.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domakidis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domenicam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "donnaandscottmcelweerealestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52142,7 +52018,6 @@
     { "name": "larabergmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lasowy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lastbutnotyeast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "latabaccheria.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "le0yn.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "learnlux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lebensraum-kurse.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52327,7 +52202,6 @@
     { "name": "older-racer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oliverschmid.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "olomercy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "olsh-hilltown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "on.tax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onkentessegertdij.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onlinemarketingmuscle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52816,7 +52690,6 @@
     { "name": "williampuckering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "win88-line.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "win88-line.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wiss.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wissamnr.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wizzair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wolfshuegelturm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52856,7 +52729,6 @@
     { "name": "xn--circul-u3a.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--fiestadefindeao-crb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--labanskllermark-ftb.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xn--lskieradio-3gb44h.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--mgbuq0c.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--schpski-c1a.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--yrvp1ac68c.xn--6qq986b3xl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52890,7 +52762,6 @@
     { "name": "0ii0.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "233now.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3dgep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "affarsnatverk.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "afterdwi.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agenceactiv.immo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agendazilei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53455,7 +53326,6 @@
     { "name": "familie-mischak.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fantasy-judo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feldmann-stachelscheid.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "feminism.lgbt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ffrev.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fiestagenial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "finecraft.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53721,7 +53591,6 @@
     { "name": "pvamg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pwt.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pxgamer.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "qarea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quickrelations.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quietboy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rabbitinternet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -54101,7 +53970,6 @@
     { "name": "amzanalyzer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anatoray.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andrewletson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "angrido.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anoboy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anodas.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antonok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -56674,7 +56542,6 @@
     { "name": "funkazoid-radio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gaddini.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gajowniczek.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gamerepublic.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gornergrat-kulm.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "govsurvey.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -56795,7 +56662,6 @@
     { "name": "paleoso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "payment-express.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pgwap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "playmei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pourmoi.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "princefamilylaw.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "privateservice.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57313,7 +57179,6 @@
     { "name": "centermk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cfc-swc.gc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "charset.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "checktechnology.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chefz.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chengarda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chrono-ski-aravis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -58229,7 +58094,6 @@
     { "name": "thecyberaid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tmadev.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tonnie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "topshelf.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "totalaccessnicaragua.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "touhou.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tronlaserarena.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -58696,7 +58560,6 @@
     { "name": "coffee-machine.reviews", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "colchonesmoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "colourmanagementpro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "complete-it.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "contrasentido.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coon.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cozywebsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59372,7 +59235,6 @@
     { "name": "globalhealthstrategiesnetwork.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gloeckle-gruppe.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gloryholefucking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gondola-parkinson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodiesoft.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goonfleet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gotrek.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59637,7 +59499,6 @@
     { "name": "orde.red", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orfelios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orgyporngroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "osteendiner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ota365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "outfunnel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "outinjersey.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59998,7 +59859,6 @@
     { "name": "wois.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wondercris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wops.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "words.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workplace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workshopengine.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wound-doc.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60358,7 +60218,6 @@
     { "name": "xb872.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xb873.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xb8801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xb8806.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xb8808.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xb8861.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xb891.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61969,7 +61828,6 @@
     { "name": "j9504.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "j9512.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "j95aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "j95bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jaiestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jakewales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jbeta.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62358,7 +62216,6 @@
     { "name": "paninohome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peluqueriaalcobendas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peluqueriaalcobendas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pengepung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pensionecani.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pillitteriobgyn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pj5588.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62373,7 +62230,6 @@
     { "name": "promovite.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pulsr.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "puntacananetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "purexis.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qabel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qpresentes.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qristianuliarkhi.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62407,7 +62263,6 @@
     { "name": "salt-documentary.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sample-site.click", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scale.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "schweingehabt.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scienceofpeople.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sdyzmun.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "se.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62433,7 +62288,6 @@
     { "name": "stevenlepen.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stevenpilger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "strm.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stroke-of-luck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sttammanyurology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stview.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sumitchahal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63549,7 +63403,6 @@
     { "name": "triozon.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trophy-discount.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trophy-solution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tukdesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "u6729.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unicode.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unitedbaby.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63755,7 +63608,6 @@
     { "name": "inboxceo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "industinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inewroom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "instantdomainsearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "investforum.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "italiataxi.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "itaporanga.se.gov.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65135,7 +64987,6 @@
     { "name": "yomi.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "your28days.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yumiandryan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yunhu365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zalaxx.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zerocash.msk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0d111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65949,18 +65800,15 @@
     { "name": "mundosuiri.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mynaturalmood.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mysteriesandmargaritasblogspot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nachrichten-heute.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naide.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nanaimoneighbourhoods.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "natur-care.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "natureshive.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "necord.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netcials.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "new-jersey-online-casinos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nuovavetro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "officina.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oreadstudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "orifonline.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oriontravel.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "outwesthunts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "passau-webdesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66335,7 +66183,6 @@
     { "name": "66321x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "66321y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "66321z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "664048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "666111bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "666222bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "666333bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66714,7 +66561,6 @@
     { "name": "bulgariablog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bulgariya.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bulvar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bungabuket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buquesdeguerra.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buselefante.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bushland.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -68181,7 +68027,6 @@
     { "name": "ty927.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ty935.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ty937.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ty953.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ty965.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ty980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tyumen.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70820,7 +70665,6 @@
     { "name": "mokhan.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "monkatos.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "monodejuegos.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mr-moulding-knives.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mralonas.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mralonas.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mralonas.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71106,7 +70950,6 @@
     { "name": "eristajanmutka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "esdacademy.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "esehospitalsabanagrande.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eumr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "facturama.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "familie-witzik.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "festival-transform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71379,7 +71222,6 @@
     { "name": "brightpool-markets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "broodingblogger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bviphotovideo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "carlosmfalves.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catalogobiblioteca.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cdigitale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chathund.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71562,7 +71404,6 @@
     { "name": "phoenixnow.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phukienchanh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pirateproxy.vet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "plus-aliance.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "praladofuturo.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "praveenravichandran.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "progaudio.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71759,7 +71600,6 @@
     { "name": "digitalframe.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dnssecandipv6.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doctorcalefon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dotnetdocs.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dsbmradio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dsdesign.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eciso.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72162,7 +72002,6 @@
     { "name": "locksmithresidentialspringtx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "locksmithservice-cypress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "logactiond.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lukaszwojcik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luvhacks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mahalux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mahalux.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72348,7 +72187,6 @@
     { "name": "aw.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bdpestsolutionsstlouis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beatrice-raws.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bhglamour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "billionairemailinglist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "biuropulawy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bookingtool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72920,7 +72758,6 @@
     { "name": "the-spoonfeed.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theboulders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theepicsponge.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "theolivetreerestaurants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thetuco.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thevenuevr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toddcullumresearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73022,7 +72859,6 @@
     { "name": "aussieseobrisbane.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autodilyhulin.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avalyuan.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "avivaplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aycasac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b36594.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baese.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73351,7 +73187,6 @@
     { "name": "souzanabellydance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sqreemtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "storgaarddieu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "strick-welt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "studiotres.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sujblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunsmartresorts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74084,9 +73919,7 @@
     { "name": "b99318.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b99418.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b9954.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b9962.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b99718.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b9973.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bairuo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baiurl.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bekolite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75726,7 +75559,6 @@
     { "name": "kalisch.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kantoportraits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kimsnagelstudio.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kkutu.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "klempin.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koolerbythelake.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koplax-online.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76117,7 +75949,6 @@
     { "name": "expatfire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eyal-dvorkin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "f8921.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fady.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "falsterhus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "falsterhus.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fanohus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76138,7 +75969,6 @@
     { "name": "flyersmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fotoblog.nrw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fourfourcrew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fromtheboxoffice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frozenfutures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fruxprivatebank.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fullcirclestudio.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76181,7 +76011,6 @@
     { "name": "imoveisavenda.rio.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impact-fluids.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "investuji.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "iocp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iotekha.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iqsecurity.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "istormsolutions.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76604,7 +76433,6 @@
     { "name": "blaulicht-giessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blogofapps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blrjmt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "boats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "botcamp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "botmedia.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brainstobrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77315,7 +77143,6 @@
     { "name": "cefinco.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "celestialisms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "centraljerseyrcca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ceverett.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chabad360.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "choservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cirvapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78072,7 +77899,6 @@
     { "name": "descargarwhatsappplusgratis.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diaconat.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diariorp.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "digitalgyan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "djurklinikenangelholm.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "donotcallgov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dreamswelcome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78303,7 +78129,6 @@
     { "name": "mpodraza.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "msc-corps.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "munzlocal10.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "musingsatmidnight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myammo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mygedit.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mygedit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78956,7 +78781,6 @@
     { "name": "mafia-penguin.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magicafacil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maigesellschaft-lammersdorf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "makelinks.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "makepro.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mariasandoli.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mattcronin.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79150,7 +78974,6 @@
     { "name": "worcestervetsreferrals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wordfence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workinghardinit.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "workinnorway.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wouterbruijning.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wprecommend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wpresscoder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79178,7 +79001,6 @@
     { "name": "173jsh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "178jsh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1minutoomenos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1simplesolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "317jsh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "318jsh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "33123000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79608,7 +79430,6 @@
     { "name": "satellitetv-deal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schellenberger.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schizomatrix.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "scotts-restaurant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "serdarwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sexyfish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sha.bi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80519,7 +80340,6 @@
     { "name": "soniaai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spaceanimalnutrition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "speme-design.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "spicemoney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sprintkitchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "srkarra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stabilimento.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80603,7 +80423,6 @@
     { "name": "unlock-my-sprint.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "upguard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "upr.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vaan-arbeidsrecht.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vacation-croatia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valescaind.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valkohalla.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80893,7 +80712,6 @@
     { "name": "mankier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marulaweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mdpparish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mega-loteria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "michaelklos.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mijnnaamdag.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mikeprocopio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80919,7 +80737,6 @@
     { "name": "otakurumi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pano.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pasquinelli-truebag.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pbdigital.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "penguindrum.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pethood.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "planetravel.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81307,7 +81124,6 @@
     { "name": "soulshinecreators.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stefanviehbacher.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stehlik.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "studiodpe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "study-support-beans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "suburbansites.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunrichtec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82935,7 +82751,6 @@
     { "name": "jadidgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jan-becker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "janbilek.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jannesmeyer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "japanesque.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "japanesque.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jarett-lee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83065,7 +82880,6 @@
     { "name": "mileyweasel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minicampingshalom.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mississippigenealogy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mitchkalf.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mmxx-distribution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moabit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobileinternetbanking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83195,8 +83009,6 @@
     { "name": "pfonks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phenonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pheromones.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pheromonetalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pherotalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "philippegoffin.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "philly-injury-law.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phuket-rawai.school", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83587,7 +83399,6 @@
     { "name": "ae86.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ae86.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agari-mj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "agenciaingenium.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agentur-circumplex.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agilee.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aidaccess.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83954,7 +83765,6 @@
     { "name": "hxkvm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hxkvm.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hyb7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hyperion.gmbh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hyperlocal.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iamlifeplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ibtraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83986,7 +83796,6 @@
     { "name": "intec.edu.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "interesnyimir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "investcarpremium.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "investissementimmobilier.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "investmotores.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "io.gp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "io.kg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84425,7 +84234,6 @@
     { "name": "techlearningcollective.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "technicaltrainer.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techto.date", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tecnipuntoseguridad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "telecallsrl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "televisionrepairnearme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tenckhoff.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84471,7 +84279,6 @@
     { "name": "trumk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trumppresidency.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trundr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tsacloud.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tsla.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tview.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twfwd.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -85692,7 +85499,6 @@
     { "name": "73fp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "73fq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "73fw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "73fy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "73fz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "73ga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "73gb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86022,7 +85828,6 @@
     { "name": "berzkalne.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "besiktasmtsk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestsellers.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bestweleenbeetje.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bethematch.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bethematchclinical.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bibisbootypalace.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86068,7 +85873,6 @@
     { "name": "cryptocurrencyfare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cryptoearnblog.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cubikus.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dabstairs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "danbs.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "darci.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "darkmilknyeremeny.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86089,7 +85893,6 @@
     { "name": "drsarah.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dufort.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "duinomaker.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dukeipai.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecodepur.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecuapaginas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edarlyn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86201,7 +86004,6 @@
     { "name": "johnex.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joomlainfo.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jubodarpan.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jult.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaminastudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kandwliquor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kantoorboel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86351,14 +86153,6 @@
     { "name": "stzur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "supplementalconditions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "t8805.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "t88vip0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "t88vip1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "t88vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "t88vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "t88vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "t88vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "t88vip6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "t88vip7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tamiloburgos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tangramins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tascout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86397,18 +86191,8 @@
     { "name": "trevormarron.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "triplejprints.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tsk.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tt0766.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tt0966.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tt2866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tt3699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tt3766.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tt3999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tt7199.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tt7299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tt7399.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tt8166.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tt8266.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tt8366.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "umanews.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "upsihologa.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v156.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86460,9 +86244,6 @@
     { "name": "6yue.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "80078.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9u.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "adaio.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "adaio.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "adaio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adfisicateca.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "advancedheatinginc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag2911.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86520,7 +86301,6 @@
     { "name": "desertedisland.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "devskiller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "disciplescloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "docuconta.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "downunderbeach.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drenergysaverpdx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drenergysaverpnw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86534,7 +86314,6 @@
     { "name": "eg7.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ehometools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elboogieboutique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "emedos.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "energysaveroregon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enquetebeteiligung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entheorie.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86636,14 +86415,6 @@
     { "name": "maxundlara.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maycarivero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mellareese.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "menfis.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "menfis.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "menfis.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "menfisnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "menfisnet.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "menfisnet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "menfisonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "menfisonline.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mesa.aero", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mesareal.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meteosolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86706,8 +86477,6 @@
     { "name": "pro3ozonio.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "progolfnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prosoft.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "prosoft.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "prosoft.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pruebapg.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quiz.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raymundo.doctor", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86726,8 +86495,6 @@
     { "name": "shadefix.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shucheng.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "signalxtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sigridcrm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sigriderp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sinvid.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sjsanchezjeans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smprecords.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86789,7 +86556,6 @@
     { "name": "ygets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zenisi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhengouwu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "002.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0514.chat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0chan.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3niu16.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86969,7 +86735,6 @@
     { "name": "nic199.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nickfoerster.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nowzarimd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "numismatica.info.ve", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nusaceningan.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nybcreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oralee.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -87114,7 +86879,6 @@
     { "name": "3466bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3477bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "36588800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3658887654.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3niu11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3niu12.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3niu13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -87843,7 +87607,6 @@
     { "name": "nzguns.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oceanofpdf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ohiobrewweek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "omniga.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onetrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onmyside.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openbsdhosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -90675,7 +90438,6 @@
     { "name": "estrogens.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "estudiomantis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "estudiosalmogavares.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "esturadio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "esvaco.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "esys.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "esystems.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -93359,7 +93121,6 @@
     { "name": "myclon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mycommerce.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myconferencion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mycrm.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mydarkness.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mydarksite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mydistance.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -97390,7 +97151,6 @@
     { "name": "booksmp3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "borza.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brightsparks.com.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bvb.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cabale.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cabeceirasdebasto.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cables-pro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -97683,7 +97443,6 @@
     { "name": "meterinsight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "micah.soy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "michelgolfier.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "migrainereliefplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mindomo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minigermanauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minternals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -97791,7 +97550,6 @@
     { "name": "tannextcloud.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tarahancenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tardics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tartu.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tcmk-tomsk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techsna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theatrepremol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -97970,7 +97728,6 @@
     { "name": "dontkeylog.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drawguess.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drone33.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ds-hostingsolutions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dsiteam.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dutchwaredesign.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dwell.property", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -98192,7 +97949,6 @@
     { "name": "pedrolamas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pegfer.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peopleorders.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "perali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "philippehannes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "philpatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "piezus.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -98389,7 +98145,6 @@
     { "name": "canopy.garden", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cardoneshop.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "careify.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cateromarket.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catsgalore.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cbdbflo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cdrjapan.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -98623,7 +98378,6 @@
     { "name": "monicahq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moondsee.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moovhl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mostardela.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mtp-services.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muir.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muslimah.boutique", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -98962,7 +98716,6 @@
     { "name": "d25sxbgdpzj1st.cloudfront.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daken.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daktariwildlife.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dallydushigrill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dalmun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dang-designs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "danielgaughan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99282,7 +99035,6 @@
     { "name": "topinjust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "topporn.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tosshi-life.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "townofsweetwater.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "traininglife.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "transformasion.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trendsuites.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99366,8 +99118,6 @@
     { "name": "antonioordonez.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antwire.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aoicollege.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aprendafotografia.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "apur.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aqlami.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arcosdequejana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asperatechnology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99398,7 +99148,6 @@
     { "name": "bt-kc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buyitmalta.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cakalnedobe.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "camilalima.adv.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "canukseeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "capitaliz.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carolcollv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99413,11 +99162,9 @@
     { "name": "chenui.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cheto.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chinamextrading.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "choiceuniontown.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chrissx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clevyr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clinux.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cmweb.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coachjehond.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coffeeinvestigator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cogsys.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99988,7 +99735,6 @@
     { "name": "desapego.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "desimpelaere.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "desteniiprocess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "detali-if.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "devz.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dewereldwerktthuis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dewereldwerktthuis.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102169,7 +101915,6 @@
     { "name": "kevinperrow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keyserve.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kopieid.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kreidl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kristall.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kushfest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kushfest.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102204,7 +101949,6 @@
     { "name": "maxiutov.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "megawhat.energy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "menufree.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mercadopago.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mercadopago.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mercadopago.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mercadopago.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102297,7 +102041,6 @@
     { "name": "rko.guru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rogue.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roguecoder.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "romantica90.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "royal939.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rsrv.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rszm.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102327,7 +102070,6 @@
     { "name": "smartit.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smileback.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smkn5smg.sch.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "snacdata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snohomishdragons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sodermans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "some.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102755,7 +102497,6 @@
     { "name": "readyscif.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "readysetscif.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "regalador.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "remigius-michael.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reviewpipe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "richfieldsean.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "road-safety.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102821,7 +102562,6 @@
     { "name": "thoplam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tiendamaquillajes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tinmarin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tradeshift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trains.sexy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "transdev.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "transdev.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -103226,7 +102966,6 @@
     { "name": "principalstest.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "problempaws.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "processout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "profitimages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "propertyupdate.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prospa.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prostoporno.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -103317,7 +103056,6 @@
     { "name": "telemedi.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teodw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teodw.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "terranovadesignbuild.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tf2pickup.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tfsound.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thecolourcloset.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -103365,7 +103103,6 @@
     { "name": "whiskersandtails.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whiteglovemoving.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "willenberg.family", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wisemen.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wisersp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "withgentlent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wordpress-szakerto.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -103681,7 +103418,6 @@
     { "name": "laveriebyk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lawyersofmissouri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lawzava.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "leclicbazar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lemans.com.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "letrissimas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "levico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104057,7 +103793,6 @@
     { "name": "gengive-smalto-oralb.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getpet.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gkepm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "glenwhitememorial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gluecksmomente.boutique", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gonadotropina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gopuntaisla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104190,7 +103925,6 @@
     { "name": "michaelamead.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mijncloud.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minhng99.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mjstudios.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modesalination.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moeloli.ac.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "msfishingcharter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104532,7 +104266,6 @@
     { "name": "chiamami.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chihirev.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chooseyourdesinty.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ciblogin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ciltskillnet.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "circuses.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clearvisiontea.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105415,7 +105148,6 @@
     { "name": "snazel.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sociologyk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sohka.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "solace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "solofi.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "souldigging.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soundlight.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105609,7 +105341,6 @@
     { "name": "clickclickmalware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clickclickvirus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudstoragecompare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cncs.gob.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cochem-zell.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "commentjaichangedevie.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "congnghe.so", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105808,7 +105539,6 @@
     { "name": "marthakenney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maskerking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mathchall.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "matrixread.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "matsushima-kosodate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mediskin.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "milarelectrodomesticos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -106576,7 +106306,6 @@
     { "name": "arete.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aritmetic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arthurlewis.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "artia.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "assomydesk.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "astrolojiyorumcusu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aurorasa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -106917,7 +106646,6 @@
     { "name": "rtestore.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saludakeuring.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saygoodbyetoie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "scevity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "semillasdelucha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "serra.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shawfactor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -107391,7 +107119,6 @@
     { "name": "xenrox.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--24-6kc5agehpdf5a.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xpressmedics.co.ke", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yangshangzhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yardthyme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yogularm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yogunet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -107432,7 +107159,6 @@
     { "name": "anoujaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "answersreviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aprendaingles123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "apsnewcastle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arabapps.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aridhia.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arjasmaa.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108345,7 +108071,6 @@
     { "name": "hacknet-bar.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hackthecat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hakuna.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "haluan.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "happiestoutdoors.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "happycolors.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "harakahdaily.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108799,7 +108524,6 @@
     { "name": "strong-sport.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "strtrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stylistbazaar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sunnyx3m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "superservecorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "supperclub.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "swagger.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108819,7 +108543,6 @@
     { "name": "techbumper.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techcody.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techexplorist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "technolux.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tecmobile.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tecnick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tecno-pack.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108844,7 +108567,6 @@
     { "name": "thesslstore.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thetopflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thetravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thewrenchmonkey.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theyucatantimes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thompsonfunerals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "threeshipswhisky.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109609,7 +109331,6 @@
     { "name": "oliviers-co.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opendoorsnsh.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "origenarts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ourcoast.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "outsourcingdenomina.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pad.wf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pamvo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -110103,7 +109824,6 @@
     { "name": "solvin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sosgate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soundrelief.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "southmarengo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sova.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "specialtyjets.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spind.energy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -110207,7 +109927,6 @@
     { "name": "zmc.com.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zrobysama.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "000g.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "0707.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "22times.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4000ok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4929.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -110984,7 +110703,6 @@
     { "name": "whitelynx.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "winteringent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "woningent.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "worldtreechocolate.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wurmannsquick.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xnoe.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xnopyt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111125,7 +110843,6 @@
     { "name": "dfwmv.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "difc.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dld.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dmwaste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "docsend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dokidokimodding.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domowejroboty.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111546,7 +111263,6 @@
     { "name": "airportstuttgart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "airpost.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aitci.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "akbtv.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "akinlau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "akouryy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aktivpark-lumdatal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111622,7 +111338,6 @@
     { "name": "brio.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "britney-galaxy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "britneyuniverse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "brokgency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brunettipesco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bubbelwafel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "builterra2.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111667,7 +111382,6 @@
     { "name": "coral-study.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "craftychameleonbar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "creativecityofmusic.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "crex24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crimsonlettersmusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "csdisaster.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "csx.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111879,7 +111593,6 @@
     { "name": "ionnex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iransculpture.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "itgeeks.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "itshealthtea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iventuresolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jack.fr.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jacobpleiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112005,13 +111718,11 @@
     { "name": "mobiliteit.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobiliteitstadgent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "momochrome.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "monamurlite.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "montuan.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moonbooth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moonpay.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "morifuji.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "morriganbe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mostqbalwatanalqahirah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mstazakka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "multifruttisystems.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muon.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112035,7 +111746,6 @@
     { "name": "netrino.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netrino.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netsoftit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "newissuesmagazine.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newnationalstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ninasofian.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nitinpandey.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112151,7 +111861,6 @@
     { "name": "saisyuusyou-omiya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saisyuusyou-takasaki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saisyuusyou-utsunomiya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "salalfoundation.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sald.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salo.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schoolheads.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112698,7 +112407,6 @@
     { "name": "sanity.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sapphirepack.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sbetinsiders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "seatsurfing.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "senseful-online.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sexfactory.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sfpmall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112779,7 +112487,6 @@
     { "name": "viperperformance.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vitabsolu.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vivetoluca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vjshi.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vps.management", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vulkanprotektor.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "waffle-backend-sanggyu.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -113505,7 +113212,6 @@
     { "name": "zchuyot.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhf.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ziegenhagel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zitadel.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zivot.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zonadetestes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zouaouitransport.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -113845,7 +113551,6 @@
     { "name": "metavr.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mia.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "michellelowery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mihealthl.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mikeylab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "milesaddict.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "millesime-communication.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114033,7 +113738,6 @@
     { "name": "schubertnest.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sdhb.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sdhblatnice.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sdhda.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sebeobrana.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sedico.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seedspark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114202,7 +113906,6 @@
     { "name": "watertrailspr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webfence.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "westernname.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "widderplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "winchat365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "windycitylawgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xaydungnamcuong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114289,7 +113992,6 @@
     { "name": "angione.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anillosdecompromiso.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anima.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "animaalternative.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anixa.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anna-mai.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "annasadzik.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114711,7 +114413,6 @@
     { "name": "impactartstudy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impaqservices.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impec-cable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "indramdhani.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infoaboutlawyers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infoarenales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infosecdecompress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114830,7 +114531,6 @@
     { "name": "lolifamily.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lsesteticaavancada.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lucdethier.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "luchshie-experty.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ludivine-viguie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luotbike.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lurishop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -116129,7 +115829,6 @@
     { "name": "chiro-merksplas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chiroherne.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chiromeisjes-boxberg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chiropraktik-wildner.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chizouworld.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chollospain.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chosenos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -117879,7 +117578,6 @@
     { "name": "magdalenatransa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magicvaporizers.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magnetto.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "magnewspress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magniezetassocies.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mahabharat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mahayana.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120063,7 +119761,6 @@
     { "name": "earthpixz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ebaifzf.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ec.ath.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "echorain.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eco69.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "economydiva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecosdesociedad.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120134,7 +119831,6 @@
     { "name": "fastfloorscreed.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fati.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fbo.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fdmg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feastshare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fedoralinux.or.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feedthefood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120162,7 +119858,6 @@
     { "name": "fm-digitize.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "focalpointvr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "folkfests.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "foodfirefriends.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "foodieso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "foodnachos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "foodonbook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120221,7 +119916,6 @@
     { "name": "goldschmiede-suessenguth.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gomelagromashplus.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goprozone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "goyumoilexpeller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "graetgossip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "graetintelligence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "graetnew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120509,7 +120203,6 @@
     { "name": "mat-berenbostel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mathschool.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "matrimonial24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "matthewselby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mattprice.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maximegagnon.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mayaxelstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120962,7 +120655,6 @@
     { "name": "tavda.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tavda.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tazarcorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tbbank.gov.tm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tcsemotion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tcshairandbeauty.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teachermommylife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -123244,7 +122936,6 @@
     { "name": "gravityfitness-tennis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "greatbarrierisland.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gruver.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gwandalancobras.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gypsymama.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "haigure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "han-nas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -123989,7 +123680,6 @@
     { "name": "email4u.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "energyflows.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enotar.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ensonyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ergaran.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ergwebs.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ericseankennedy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -125212,7 +124902,6 @@
     { "name": "ecvma.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eduardomaio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educourse.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "edudaddy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "egipet-tiz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ekmanager.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ekol-2001.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -126148,7 +125837,6 @@
     { "name": "otuts.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oujj.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ouldlamara.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ourcoastmedia.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oursc.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "out-of-england.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "out-of-england.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -126512,7 +126200,6 @@
     { "name": "saraton-kasalligi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "satl-lelystad.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "savonlinnatrujillo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "savons-arthur.bio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sawansasaram.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saxmasters.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saxobroko.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -126546,7 +126233,6 @@
     { "name": "sergiopereiracouto.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sergiyskorobogatov.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sergiyskorobogatov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "serioos.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seroquelonline.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "serraniadecuencaafondo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "serreshikeclub.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -126879,7 +126565,6 @@
     { "name": "travelfiesta.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelsites.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelunique.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "travely.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trellisandtrugs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trendocracy.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trendocracy.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127058,7 +126743,6 @@
     { "name": "xvadimx.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xxxgr.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xxxshades.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yan.net.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ycodendauteradio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yokocho373.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yongxiang.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127799,7 +127483,6 @@
     { "name": "lanagiselle.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "landhof-scout.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "landifer.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lanehealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "laralove.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "larax.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lasiodora.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127841,7 +127524,6 @@
     { "name": "lzt.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "macroeng.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "macropremia.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "magicalmemories4you.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mahdeabzar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "makanivzw.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "malatyahaberleri.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127872,7 +127554,6 @@
     { "name": "mctea.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meanit.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medicinasportpadova.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mega.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "megalibrarygirl.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "megin.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mejor-broker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -129111,7 +128792,6 @@
     { "name": "masterenenologiaonline.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "masterenmarketingdigitaldq.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "masteringenieriadelfuego.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "matts.software", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maxh.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mbwsignup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medscope.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -129257,7 +128937,6 @@
     { "name": "samclarke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "samscollection.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sanalsergi.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "santafesilversaddlemotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saudecoluna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "save-me-aachen.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "savesilvercreek.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -129269,7 +128948,6 @@
     { "name": "scommessenonaams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scootermalagarental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scor.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "secureqbplugin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seitanic-cookbook.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sexyleni.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shigizemi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131542,7 +131220,6 @@
     { "name": "thingformatter.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "threethirty.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tilecenters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "toku.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tomdougiamas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "top-aanbiedingen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "top-messenger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131793,7 +131470,6 @@
     { "name": "bookjira.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bospiraat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bouncetothebeat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "boycewire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "breaksome.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bremink.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brianna.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131862,7 +131538,6 @@
     { "name": "cyberhost.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cybernode.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cypherbot.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cyrex.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d5k.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dacsanchatviet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dailytrip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -132919,7 +132594,6 @@
     { "name": "frishop.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fullo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fyp-aiman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gabskent.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gailnoglephoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gamerbits.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gasoline.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -133604,7 +133278,6 @@
     { "name": "kalimantan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kamrad.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kansasconstruction.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "karenroldan.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kavli-express.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kdrive.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "khadishalatina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -133791,7 +133464,6 @@
     { "name": "pregnancytips.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prepr.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prestatest.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "prestigemix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "printbase.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "privatedata.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proctor.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -133854,7 +133526,6 @@
     { "name": "sanoyalab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "savconventioncenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scandata.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "schemmel.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schuurmanopleidingen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sclub7esp.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scoutnation.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134010,7 +133681,6 @@
     { "name": "vipertechnology.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "visualcmj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "viveremediglia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vllyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "volunteerham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vravi.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vshipit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134045,7 +133715,6 @@
     { "name": "zeblog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zinhar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zonneglossis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zoppigioielli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "000814.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0o0o.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "100nome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135284,7 +134953,6 @@
     { "name": "belarus-mtz.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belgive.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belieber.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bellsapplianceservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ben-deneme.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bengalifake.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bengou.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -136902,7 +136570,6 @@
     { "name": "opensim.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openspot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oportunidadeganhos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "oppekepe.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opskins.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opstrengning.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "optilan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -137024,7 +136691,6 @@
     { "name": "plikiai.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ploof-cleaning.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ploptec.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pluminate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plushev.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pockettraveling.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "poetics.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -137751,7 +137417,6 @@
     { "name": "web-treff.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webcamyoung.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webcoder.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "webdesign-moellers.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weberl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webescucha.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weblian.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139585,7 +139250,6 @@
     { "name": "solarfaa.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sosoft.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "souldecorpaints.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "soundmk.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sourceaudio.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sourceaudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sourceaudiodetect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -143648,7 +143312,6 @@
     { "name": "nationalgridrenewables.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netgen.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newgardenfarms.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nexlight.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ngocchaua.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ngplus.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nhance.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -143674,7 +143337,6 @@
     { "name": "only2chat.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onpreise.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "optimadental.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "opusclassical.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "os.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "osdeployments.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "otomny.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144266,7 +143928,6 @@
     { "name": "nissanpartsdeal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nm.sl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "noctys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nono.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "notabug.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "notrecinema.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nvme.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144310,7 +143971,6 @@
     { "name": "quantuin.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rackbikes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radialplus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "radioranking.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radopsec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rainuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raketaholst.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144440,7 +144100,6 @@
     { "name": "ysun.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yucatanhoney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zanthed.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zarcik.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zerodhacapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zofoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zxtremetech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144800,7 +144459,6 @@
     { "name": "karet-stroy24.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kastmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keep.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "keithrainz.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keiyuki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kenguru.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kfgsa.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144813,7 +144471,6 @@
     { "name": "kunnen.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kylelovell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kyncostyle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ladderfinance.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lamparassevilla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lancerm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lata.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145005,7 +144662,6 @@
     { "name": "roams.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "robinzone.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rodrigoamozu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rodriguezsanchezabogados.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "romeroeletro.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rootly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rootlyhq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145289,7 +144945,6 @@
     { "name": "cosmichpc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cosmichpc.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cryptox-trading.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ctf-archive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cubic-lynx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "curio.lk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "customcraft.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145635,7 +145290,6 @@
     { "name": "viv.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vogel-verhuizingen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w-hub.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "waldo.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "walldealer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wataclinic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wearemojo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145891,7 +145545,6 @@
     { "name": "goadulttoys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gocornwallbus.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goldentriangletourindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "granstor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grapplinginsider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "greenfy.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "greenwichbiosciences-influence-beta.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146210,7 +145863,6 @@
     { "name": "udemons.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uniex.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uniex.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "unitedbeautysupply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "usdigitalresponse.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "useful-thing.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vaarfoto.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146560,7 +146212,6 @@
     { "name": "prepareforthesat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "producerwereld.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "projectplacebo.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "psychoterapia-skuteczna.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "psyllabus.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pulinkai.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quizwhip.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146738,7 +146389,6 @@
     { "name": "atemon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atugan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atyuan.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "audaces.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ava360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avamix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avantcoequipment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148002,7 +147652,6 @@
     { "name": "orchidplantscare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oreomuhely.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ornikar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ottorinoferilli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "outinnationalsecurity.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oversight.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "p2pool.observer", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148164,7 +147813,6 @@
     { "name": "stallone.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "start.stockholm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ste2.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "steenkolenmijn.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stibal.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stockyards.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stoptheperio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148607,7 +148255,6 @@
     { "name": "fundacion.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "futbolok.net.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "g1mra.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gabby.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gamebrick.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gamegossips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gaminguniverse.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148846,7 +148493,6 @@
     { "name": "payarpolymer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paysap.bt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pegdown.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pentacodes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "percussiontonal-forum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "personalhydroponics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pesananonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148962,7 +148608,6 @@
     { "name": "smitsmail.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smoothweblife.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smoothweblife.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "socialist-alliance.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "societatis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soellc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "solista.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149099,7 +148744,6 @@
     { "name": "worthygp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wozekinwalidzki.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wpduta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wpify.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wpspeedcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wz.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xcucu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149220,7 +148864,6 @@
     { "name": "asterobot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asyaturk.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atelierkuni.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "atila.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atlassart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atriamediagroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atwel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149354,7 +148997,6 @@
     { "name": "ddoscyber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dehop.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dentistree.in.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "depcompower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "depedclick.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "depedclick.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "depressionanon.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149469,7 +149111,6 @@
     { "name": "gethdporn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gigarange.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gizemlibilgi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gncbilgi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "godalyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodglow.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gpremium.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149543,7 +149184,6 @@
     { "name": "jeremyhodges.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jessacharlie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jitendrapatro.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jkmoving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jktu.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "johncleary.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joinmatrix.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149713,7 +149353,6 @@
     { "name": "opelim.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openbible.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openbiblebookstore.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ophelia.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "optimon.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opusdei.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opuspremiumfilms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149819,7 +149458,6 @@
     { "name": "rodiler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rondacan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rootgsm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "royalsleeping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rozataki.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rubblesandton.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rubyonremote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150063,7 +149701,6 @@
     { "name": "1g.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2022ccbji-sales-convention.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2ndface.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "301.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "403for.bid", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "423down.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abilitylifesolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150416,7 +150053,6 @@
     { "name": "socratec-pharma.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soliujing.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sonbilgi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sontaycamera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "starrosesandplants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "statscrew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stjh.org.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150545,7 +150181,6 @@
     { "name": "bankina.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "banksulselbar.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bardtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "barzus.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "basilicproduction.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bazaleev.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150693,7 +150328,6 @@
     { "name": "facedeplook.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "farmqa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fenns.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fermateh.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fionafuchs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flexurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "florianysantiago.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150802,7 +150436,6 @@
     { "name": "lovell.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loyaltech.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luizluz.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lumizor.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lytkins.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m-a-s.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mahtabichat.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151383,7 +151016,6 @@
     { "name": "apparelmusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "applaus-kornwestheim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "applesaph.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "appleseedcontent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "apppage.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aprende.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "apretender.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151429,7 +151061,6 @@
     { "name": "artel.od.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artepinas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artetbalade.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "artinfo.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artisanportrait.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artomili.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artuu.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151620,7 +151251,6 @@
     { "name": "besikta.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "best-survival-bag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "besta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bestcorner.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestcriminallawyerinsingapore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "betfair.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "betondrew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151871,7 +151501,6 @@
     { "name": "canile.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cannabistraininguniversity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cannedcyberlabs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "caos.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "capitalise.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "capitaltruepartner.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "capitaltruepartnertechnology.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151895,7 +151524,6 @@
     { "name": "catalogingpro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catchup-enschede.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catrybayart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "catsofcapetown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cattellar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cattiau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catto.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152024,7 +151652,6 @@
     { "name": "cloudways.cm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudways.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudwxys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "clouglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clouvways.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clouwways.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "club-soul.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152382,7 +152009,6 @@
     { "name": "domainsearchindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domainservice.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domaintm.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "domenick-lieneweg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domenico.lviv.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domp.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "donghua-europe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153001,7 +152627,6 @@
     { "name": "gifhelittlestars.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gifsonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gift4ever.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "giftcardstarz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gigagaaf.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gil.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gilacms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153135,7 +152760,6 @@
     { "name": "hackablestuff.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hackdown.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hackernewsuk.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hadopi.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hady.boutique", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "haifaworld.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hailogroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153208,7 +152832,6 @@
     { "name": "heinonen.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "helenakmiec.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "helenvalsj.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "helion.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hellblade.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hellhammer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hellocentral.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153332,7 +152955,6 @@
     { "name": "hrejterzy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hrtechnologypro.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hs-hire.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hsbc-zertifikate.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hselectricalservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hstsbadnosniff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "htcclan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153503,7 +153125,6 @@
     { "name": "irzumshafiq.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isabelle-delannoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isbpanel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "iskin.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "islam-net.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "islam-penzberg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "islamfirst.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153540,7 +153161,6 @@
     { "name": "ivana-models-escortservice.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivana-models-escortservice.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivifashion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ivioschool.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivo-ouwerkerk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivs-tech.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iwantyoutocomment.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154450,7 +154070,6 @@
     { "name": "natreningu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "natum.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naturabuy.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "natureandculture.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "natureisland.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nauticlink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nauticlux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154462,9 +154081,7 @@
     { "name": "neero.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "neetflix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "neguzelsozler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nej.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nejsvetla.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nekomanten.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "neonigma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nephelae.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nephelae.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154499,7 +154116,6 @@
     { "name": "newterritorialclaims.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newzvilla.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nexscience.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nextgen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nextitstep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nharper.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nibblehole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154508,9 +154124,7 @@
     { "name": "nicholsonkring.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nichtkunst.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nicknamez.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nicktamin.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nickwatton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nicolettevandervalk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nidosinu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "niedlaechelt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nien.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155067,7 +154681,6 @@
     { "name": "secunit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "secure.wang", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "secureapplicationaccess.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "securepanel.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "securesite.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "securimail.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seedbox.hosting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155374,7 +154987,6 @@
     { "name": "steamcn.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "steelzone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stefandesign.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stelling.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stepplanning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stevebanks.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stevinson.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155734,7 +155346,6 @@
     { "name": "trachtenwolf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tradeplotter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tradet.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "traegerbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "traghetti.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trailrighttraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "traitement-punaise.paris", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -156382,7 +155993,6 @@
     { "name": "godark.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zuu.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "10961096.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "10minutesemail.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "19gold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "21hours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "21pet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -156734,7 +156344,6 @@
     { "name": "bgmsquad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "biblionet.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bigmuff.duckdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bignet.bid", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bigorangelab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bigrivercn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bigriverintl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157041,7 +156650,6 @@
     { "name": "crime-task-force.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cristinaperea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crmzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "crosslakefibre.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crowleycycles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crucerosplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cryovex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157760,7 +157368,6 @@
     { "name": "immoisrael.org.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impact-flash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impartner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "imperivm-romanvm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impianti.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impreg-group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "improbo-group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158107,7 +157714,6 @@
     { "name": "linfordco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "linkla.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "linnvefald.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "linu.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "linuxiac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "listening-skills.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "listoyou.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158546,13 +158152,10 @@
     { "name": "oparideal.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openawallet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openbriefing.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "openmarkets.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "openmarkets.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openmindsec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openmindsec.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opennet.fund", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openpolicing.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "opentrader.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opgani7.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opiskelijaradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opiskelijaradio.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159086,7 +158689,6 @@
     { "name": "ribit4u.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "richard-offermanns.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rickhoekman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rickrussellhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rightbraingroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rightsupply.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "riietr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159602,7 +159204,6 @@
     { "name": "undeductive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unisontech.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unisunvn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "unitedforwildlife.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "universityadmissions.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unstoppabledomains.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unterfrauner.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160147,7 +159748,6 @@
     { "name": "ciel.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cisoshare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "citizens.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "citroenc3owners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cityutilities.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cleaner-en.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clearsoftcomputacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160352,7 +159952,6 @@
     { "name": "genocideofua.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gentlent.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "geoflowerstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "geosever.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "geotruth.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gerards-abenteuer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gerrit078.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160542,7 +160141,6 @@
     { "name": "kondakovvg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "konetsu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "konoex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "koosaline.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kopyandsonslandscaping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koujiao.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kredi-hesaplama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160565,7 +160163,6 @@
     { "name": "lbinstitut.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "leakeandersson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "learnapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "leepakjsc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lefaivre-ferry.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "legiofte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "leibniz-trifft.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160714,7 +160311,6 @@
     { "name": "nextdayvapes.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nginxlibrary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nicgoa.nic.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "niniasur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nipplefucking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "niuco.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "niwoo.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160769,7 +160365,6 @@
     { "name": "parakazanmafikirleri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paranoid.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "parasympathy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "paris-elysees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "parisa-panahi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "parklandtopdressing.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "partykanal.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161328,7 +160923,6 @@
     { "name": "byostasys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "byteflies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cache.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "calref.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "calref.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "camella.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carbonswap.finance", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161589,7 +161183,6 @@
     { "name": "nicoforconi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ninadeissler.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nirma.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nitter.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nobori.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nobori.ltd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nobori.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161692,7 +161285,6 @@
     { "name": "sli.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "slideshare.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "slo.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "smartshoppers.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smarty.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smetana.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snorgtees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163042,7 +162634,6 @@
     { "name": "co2checker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coassessment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cobquecura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cocinaconalegria.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cocue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "codegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163820,7 +163411,6 @@
     { "name": "fitmommyinheels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fitnessgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fiumefreddo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fixapc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fizeau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fjfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flaite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163831,7 +163421,6 @@
     { "name": "flaszka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fliessestrich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flohmarkte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "floneo.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "florante.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flotille.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flower123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -166740,7 +166329,6 @@
     { "name": "rulota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "runcitadel.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "runfang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rungie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "runlide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "runqiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "runtian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -168605,7 +168193,6 @@
     { "name": "zineb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zipgraphics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zitadel.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zitadel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ziwu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zixiamen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zjcm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -168738,7 +168325,6 @@
     { "name": "acquari.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acquisita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acvarii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "adeshome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "admeco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "admirando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adolesce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -168989,7 +168575,6 @@
     { "name": "cityvision.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cityvision.net.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cityvision.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "claraanalytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clbmconsultancy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clco.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clean-cubes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -169439,7 +169024,6 @@
     { "name": "kimama-protein.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kingdomshow.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kingslate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kitchenguides.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "km8.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "knecht.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "knechtology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -169653,13 +169237,11 @@
     { "name": "numismatic-sd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nwmd.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nyanor.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ochemindessens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oddoo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oficoex.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ogznet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "okiefrog.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oliver-wenzel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "olydent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "omicaorganics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "omicawholesale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "omlingeriemasculine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -169674,7 +169256,6 @@
     { "name": "osaketori.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ossrox.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oudersvannu.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "outsidetheboxcreation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "owlhollowbakery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "owlnull.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oxots.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -169792,7 +169373,6 @@
     { "name": "rmhpbrokers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rogerdumas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rollerwarehouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ronasit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roodarvasi.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roskillcv.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roskillcv.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -169844,7 +169424,6 @@
     { "name": "sfee.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shareeri.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sharehabor.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "shawnleetttt.cyou", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sheetstutorial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shehansanjula.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sheo-tech.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -169855,7 +169434,6 @@
     { "name": "shopbysarah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shunhuiyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "si.insure", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sicherheitsschuhe.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sidiprojects.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "siebenhirten7.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "siemplifyg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170070,7 +169648,6 @@
     { "name": "vpbuilds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vponline.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vsgcommunity.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vtwonen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w2ang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w60.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wallcs.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170137,7 +169714,6 @@
     { "name": "zozitdat.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zq.com.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zta.training", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zuiderlokaal.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zzdiesel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0trust.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0trust.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170321,7 +169897,6 @@
     { "name": "dctsimmigration.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "decathlon.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dehumanizer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "deletecat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "derdevel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deskdesign.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deutex.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170391,7 +169966,6 @@
     { "name": "embarcados.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emergencyplumbertoronto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "empireliverfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "enno.mom", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "equiptoelec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "erhydro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "esmart.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170740,8 +170314,6 @@
     { "name": "ozbolt.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ozelguvenlik.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paarberatung-duesseldorf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "page-audit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "page-audit.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "palpitediario.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pantaleon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "passionsorigen.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171036,7 +170608,6 @@
     { "name": "bananabeer.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bashoutter.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bayou.energy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bcis.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beautymadel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beescloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beetech.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171114,9 +170685,7 @@
     { "name": "getlessgivemore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grupomultiservicio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grupovendap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hagen-bauer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hazza.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hbauer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "howandwhys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "icenter.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imageglue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171280,7 +170849,6 @@
     { "name": "ptmco.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ptserver.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pygos.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "qbookstaxpros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quartsandlugnuts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radicallycanadian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radwebhosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171300,7 +170868,6 @@
     { "name": "ruavan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rucinski.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rucinski.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rusticus-consulting.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salisucre.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sandrabamboo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sanpatigroup-recruit.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171414,7 +170981,6 @@
     { "name": "vjuliano.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vmaxleclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voetbalwedden.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "volant.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "web-snadno.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "websgroup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wentworthconsultinggroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171475,7 +171041,6 @@
     { "name": "airportzo.net.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "airportzostage.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ajorban.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "akhenaten.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alamak.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ambulatori.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amoderm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171547,7 +171112,6 @@
     { "name": "cgunited.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cheapestdirectdebit.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cheapticketsfrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "checkjelinkje.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chizra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chrisshort.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171743,7 +171307,6 @@
     { "name": "mynametags.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mynametags.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mypeople.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nahrung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "namlcftc.gov.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nas.gov.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newfld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171773,7 +171336,6 @@
     { "name": "poorvika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prakharvarta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proxy-bay.onl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "puettba.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quemvende.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rama.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "randompasswordgenerator.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171997,7 +171559,6 @@
     { "name": "bedful.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beepcar.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "benjaminfulford.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bepersia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "berkadia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "berkshireesupply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestparking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172492,7 +172053,6 @@
     { "name": "neuca24.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newplxx.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newpointeg-broker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "newpointeg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newportit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "next-tms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nightflow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172615,7 +172175,6 @@
     { "name": "rhdiscovery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ripplematch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ritepriceheatingcooling.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "roc.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rosacosmos.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rosty.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "royal880.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172746,7 +172305,6 @@
     { "name": "totalexpert.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "touristsense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "traceyjsvorusphd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "transcendcareers.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "translations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trawox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172985,7 +172543,6 @@
     { "name": "commentfaire.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "commercepartnerhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "commonwealthsl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "computel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comtois.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "concor.ne.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "contrastsecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173236,7 +172793,6 @@
     { "name": "otaku.fm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "outletstoresmalls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "outletszone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "paaster.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "palmbeachbusinessbroker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pamorana.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paris-luttes.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173746,7 +173302,6 @@
     { "name": "chadwhitepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chakrastone.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chanelprestonpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "charcoalmachines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chase.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cheapairfarefrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cheapairfaresdeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -175536,7 +175091,6 @@
     { "name": "americaninsuranceplus.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "americanmessaging.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "americanrag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "amfi.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amg.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amoc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amorszexshop.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -175585,7 +175139,6 @@
     { "name": "anguloconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "angusbarn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anhembi.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "animaeducacao.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "animeclipsraw.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "animecollective.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "animekompi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -175931,7 +175484,6 @@
     { "name": "bajajhousingfinance.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bakersfieldboardup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bakivaxti.az", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bakoma.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "balancingeverything.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "balboacapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baleinesendirect.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -176309,7 +175861,6 @@
     { "name": "blackmaleme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blackmesa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blackmilftube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "blackstone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blackstoneone.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blaetter.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blendjet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -176599,7 +176150,6 @@
     { "name": "carbaza.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cardinus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cardmates.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cardtronics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "careernet.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carefix.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caretaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -176804,7 +176354,6 @@
     { "name": "churchm.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "churchsuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ci.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cialisbmed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cialisisa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cialismen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cialisrmed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -176832,7 +176381,6 @@
     { "name": "cityofglasgowcollege.ac.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cityonfire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ciuci.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "civfund.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "civilunfold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cjp.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ckalist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -176996,7 +176544,6 @@
     { "name": "conscia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "conseildesarts.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "consensus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "consolemania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "consoom.soy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "consortiumhealthplans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "construguia.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -177026,7 +176573,6 @@
     { "name": "cooptravel.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coordonnees-gps.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "copasulassessoria.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "copper.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "copyright.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "copyrighted.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "copyrightservice.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -177262,7 +176808,6 @@
     { "name": "dbildungscloud.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dbushell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dclm.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dcm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dcparts.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ddma.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ddnsip.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -177281,7 +176826,6 @@
     { "name": "decathlon.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "decathlon.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "decathlon.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "decisely.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deciso.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dedoho.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deeezy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -177323,7 +176867,6 @@
     { "name": "designbro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "designdept.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "designengineering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "designgurus.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "designideasguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "designstripe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "desinfection-gale.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -177341,7 +176884,6 @@
     { "name": "dewberry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dexie.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dfactory.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dfm.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dg-hyp.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dg-hyp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dgap.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -177555,7 +177097,6 @@
     { "name": "duwitmu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dvminsight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dwservice.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dwtonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dynamicservers.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dynamixsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dyncdn2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -177766,9 +177307,7 @@
     { "name": "entertainmentmesh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entpe.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entreprises.gouv.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "envir.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "envistacu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eohima.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eopac.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "epdigital.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "epic.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -178022,7 +177561,6 @@
     { "name": "fieradellibro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fifauteam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fifehg.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fifthwall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "figure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fija.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "filehippo.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -178081,7 +177619,6 @@
     { "name": "fixpart.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fkbae.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fl-ad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fl3xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flagma.biz.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flagma.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flagma.uz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -178471,7 +178008,6 @@
     { "name": "goldmanpropertygroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goldtits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "golosarmenii.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gong.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gonintendo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodbody.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodlifeupdate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -178604,7 +178140,6 @@
     { "name": "happymonday.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "happymoney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "harapanrakyat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hardrockcasinolaketahoe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hardwaremarket.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hardwoodhoudini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "harianjogja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -179088,7 +178623,6 @@
     { "name": "integral-calculator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "integral-calculator.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "integralrechner.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "integrator.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "integrisaviation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "integritydetail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "integrityline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -179283,7 +178817,6 @@
     { "name": "jimpl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jinshabu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jirehlov.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jkchrome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jkws2.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jle-dns.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jm-madeira.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -179414,7 +178947,6 @@
     { "name": "kepoper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kernel-video-sharing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kerrdental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "keskkonnaamet.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ketchcdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keypublishing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keys.casa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -179523,7 +179055,6 @@
     { "name": "krx1bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ksa-lawfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ksamaps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ksbe.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kshb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kshsaa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ktateeb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -179707,7 +179238,6 @@
     { "name": "lhv.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "li.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liangfaner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lib.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liberty.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "libertylondon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "libertyreversemortgage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -179865,7 +179395,6 @@
     { "name": "lplbullets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lqsa.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ltcfeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lthcastings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lucidcam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lucidya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luckmoneymyth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -179900,7 +179429,6 @@
     { "name": "m-1framingsubsinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m3globalresearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ma-bimbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "maaamet.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maat.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "macaw.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -179923,7 +179451,6 @@
     { "name": "maga888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magazine.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magdahavas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "magento-ecommerce.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magentodevelopment.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magentrix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magesypro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -180105,7 +179632,6 @@
     { "name": "medias-presse.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mediatrust.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medic808.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "medicalert.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medicareadvantage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medicaremarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medicine-pills-health.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -180241,7 +179767,6 @@
     { "name": "minuterice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minutoseguros.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miomiojoyeria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mirakl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mirasee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miroslavholec.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mirrormonster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -180293,7 +179818,6 @@
     { "name": "modebest.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moderaterna.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moderngentlemen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "modernizr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modoo.loan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modusgames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modvigilonlinerx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -180367,7 +179891,6 @@
     { "name": "mourassiloun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mouseflow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "movie-download.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "movie-fast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "movies4us.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "movieswood.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mozen.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -180402,7 +179925,6 @@
     { "name": "mu.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muj-sejf.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "multiasistencia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "multicoin.capital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "multigo.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "multilingualpress.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "multimedialy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -180613,8 +180135,6 @@
     { "name": "neumeier.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nevi.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "new-pornvideos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "newcasinos-au.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "newcasinos-ca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newchapter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newdecortrends.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newenglandtek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -180692,7 +180212,6 @@
     { "name": "nmugroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nn-com.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nnss.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "no-grey-area.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "noah-shop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "noahs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "noamweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -180734,7 +180253,6 @@
     { "name": "novline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "novocarrobr.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "novrazbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nowe-kasyna.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nowzad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nplindia.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nprb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -180860,7 +180378,6 @@
     { "name": "oneapi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oneblinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onechicagocenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "onedetermination.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onediversified.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onefamily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onepeloton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -181391,7 +180908,6 @@
     { "name": "porplemontage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "porsche356registry.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "portail-familles.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "portalultautv.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "porterbuddy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "portingkit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "portmeirion.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -181463,7 +180979,6 @@
     { "name": "pro-c.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pro.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proacousticsusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "proarbor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "probablyrational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "probrewer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "processexcellencenetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -181499,7 +181014,6 @@
     { "name": "propertyrate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "propmark.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proscore-vr2006-1plc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "prosperi.academy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prostore.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proteces.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "protected-forms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -181716,7 +181230,6 @@
     { "name": "recordproduction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "recruitcrm.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "recruiting.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "recycle-plant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "recyclebc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "recyklace-prochazka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "redbirdrants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -181780,7 +181293,6 @@
     { "name": "register.com.np", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "registryfinder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reichelt.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "reivernet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reklama-crimea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rekono.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "relatedgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -182413,7 +181925,6 @@
     { "name": "smiledoctors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smileeye.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smiletimegh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "smiley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smittybilt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smmpaketleri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smmworldbooster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -182443,7 +181954,6 @@
     { "name": "soelt.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soff.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soft3arbi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "softcom.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "softhints.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "softlay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "softline.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -182645,7 +182155,6 @@
     { "name": "stopitparimatch.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stopitstavki.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stopklamstwom.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stoplight.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "storck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "storistalker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "storiyaan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -182728,7 +182237,6 @@
     { "name": "surgatekno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "surpasshosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "surreysportspark.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "survival-mastery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "susdomicilios.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "suse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sushikiosk.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -183345,7 +182853,6 @@
     { "name": "twistpedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twistysnetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twoseven.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "twosigmaventures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tx.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "txtpower.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -183377,7 +182884,6 @@
     { "name": "uitvaartverzekeringwijzer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uiuiui.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ujam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ujober.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ukcdn.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ukdevilz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ukosystudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -183558,7 +183064,6 @@
     { "name": "veros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "versanthealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vertex-academy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vertip.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "verve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "very-good.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "veryfi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -183709,7 +183214,6 @@
     { "name": "vtliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vtsmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vtsnetworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vtwonen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vtwonenendesignbeurs.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vuitimig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vulkan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -183985,7 +183489,6 @@
     { "name": "wowa.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wowchemy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wpa.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wpbrigade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wpmafias.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wptv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wrallp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184091,7 +183594,6 @@
     { "name": "yespornplease.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yfcampus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yhclinic.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yieldguild.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ymeye.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yoga-erde.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yomeat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184124,7 +183626,6 @@
     { "name": "yuki.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yuksinau.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yulsn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yumblekids.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yuumari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yxhlz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "z-epub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184338,7 +183839,6 @@
     { "name": "adsolutionsmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "advaith.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "advocatechannel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "adzapier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aegisolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aerofarms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184403,10 +183903,8 @@
     { "name": "alliancebank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allianceblock.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allianzdirect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alliiertenmuseum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allmendenetz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alloldpics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "allquakes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allsurplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "almayoreo.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "almicroinstruments.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184439,7 +183937,6 @@
     { "name": "angie-webdesign.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "animal-paris.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "animonda.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "anishnayak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ankaraarabakiralama.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ankaracikma.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ankaracikmaparca.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184520,9 +184017,7 @@
     { "name": "asiantube.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asklocals.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asklyrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aspenpharma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aspi.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aspiresys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asri.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "assignments4u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "assistanceinparadise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184555,7 +184050,6 @@
     { "name": "avensure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aviorair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avispl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "awrostamani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "axislinx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ayovaksindinkeskdi.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ayruu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184565,7 +184059,6 @@
     { "name": "azino888.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azmi.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aztecahome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "azvirtualschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b2holding.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "babindo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "backlinkers.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184714,7 +184207,6 @@
     { "name": "blockinx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bloggingocean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bloggingqna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "blogheist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blogke.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blossombeautytreatments.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blsgermanyvisa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184794,7 +184286,6 @@
     { "name": "buy-invertor.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buypersonalproxy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buyprosoma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "buysewingparts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buytadalafiltabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buzzframe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bwigroup.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184808,7 +184299,6 @@
     { "name": "cablefreetv.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cadenceluxpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cadipajual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cafe-hamlet.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cafead.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caknowledge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "calculator-app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184938,7 +184428,6 @@
     { "name": "cityseeker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cityspin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "classeturista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cld.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cleared.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clhg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clickhelp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -184974,7 +184463,6 @@
     { "name": "codelist.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "codigosddd.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coffee-like.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "coffee-webstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coiffure-website.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coinpedia.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coinplay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -185105,7 +184593,6 @@
     { "name": "dannon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "danone.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "darajambili.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "darioush.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "darkxxxtube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "darmsr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dartagnan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -185487,7 +184974,6 @@
     { "name": "fiber.mk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fiddle.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fidelityhomestead.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fiff.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fiilacurent.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "filantropikum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "file.ac", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -185587,7 +185073,6 @@
     { "name": "fruitsfromchile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fswriting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fsxxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ftapi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fueko.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fulisex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fullhouseresorts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -185658,7 +185143,6 @@
     { "name": "getflip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getintopcr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getlaminas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "getmimo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getriebeservice-gse.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getyourguide.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getyourguide.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -185683,7 +185167,6 @@
     { "name": "glbins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "global-wire.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "globalimmigrationvisa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "globaz.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gloria-home.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glsauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gm5.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -185977,7 +185460,6 @@
     { "name": "is-rocket.science", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isacybersecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isbagla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "iskra.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isosat.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ispfaq.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "istekparcam.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -186274,7 +185756,6 @@
     { "name": "lodestarss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loekvormgeving.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loesje.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "loftvapor.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "logarkomx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loginsecure.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "logopiksel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -186363,7 +185844,6 @@
     { "name": "mass-analytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "massmutualascend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "massolutions.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mastodon.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mastodon.desi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mastodon.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mastodon.pizza", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -186482,7 +185962,6 @@
     { "name": "milomedia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mind-drama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mindan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "minersonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ministeriodeeducacion.gob.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minorice.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mintea.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -186532,7 +186011,6 @@
     { "name": "moonsalutations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moosic.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mopoclub.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mor.estate", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mosquito-sklep.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "motability.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mothersalwaysright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -186925,7 +186403,6 @@
     { "name": "podcreative.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "podologyclinic.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pokerstarslearn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "polarispool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "poltavawave.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "polyglot.com.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ponsoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -186994,7 +186471,6 @@
     { "name": "proserialkey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prospectsinternational.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prosperoarts.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "proudehomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proudtoserveagain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proxy-bay.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prozhedownload.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -187873,7 +187349,6 @@
     { "name": "vivianshultsart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vkcombo.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vkfaces.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vkg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vkst-field-trials.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vlccrussia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vlci-doupe.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -187929,7 +187404,6 @@
     { "name": "walterswholesale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "warriorofmars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "warspot.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "watc.wa.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "watchpeopledie.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wathory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wave.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -187975,7 +187449,6 @@
     { "name": "wikitechsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wildwnc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wilhelmina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wiltshirefarmfoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "windice1.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "windstreamhosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "windsurfercrs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -188072,7 +187545,6 @@
     { "name": "zataz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zauberer-bauchredner.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zdcs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zdz.katowice.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zenon.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zenon.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zerodensity.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -188357,10 +187829,8 @@
     { "name": "br-hq.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "braun-russia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "breathing-underwater.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "brighterservices.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brilliancesecuritymagazine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brilliant.plumbing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "brn.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brokenbuild.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brookskolb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brushscene.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -188400,7 +187870,6 @@
     { "name": "ceatheneum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cegpalota.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "celphy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cementplas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "certasenergy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cetak.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cfar.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -188485,7 +187954,6 @@
     { "name": "creativevietnam.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "creerunblog.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crestataustin.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "crianma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "criticalmetalscorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crm-gestion-relation-client.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crucial.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -188549,7 +188017,6 @@
     { "name": "devries.frl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dewijkpraktijk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dfwork.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dh26a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dh75975.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dhoffmanmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diapuls.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -188639,7 +188106,6 @@
     { "name": "emploi-international.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "employment-solutions.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "empowered-decision.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "emta.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "endcottagevets.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enet.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "engagementlettercpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -188687,7 +188153,6 @@
     { "name": "fasteatlive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fauteuil-bebe.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fcporto.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fdx-insurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feecotec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "femboy.clothing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fes.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -189146,7 +188611,6 @@
     { "name": "luis.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luis.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lukaszwojcik.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lupakode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lusometeo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lyrae.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m-enterprise.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -189205,7 +188669,6 @@
     { "name": "mazenitude.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mb-amenagements.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mb-t.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mbarbadun.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mc-sin.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mc2informatique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcfreedom.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -189296,7 +188759,6 @@
     { "name": "msbdocs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "msftcnsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mtf.party", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "multymaq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mumszab.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muratbekgi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "murmures.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -189387,7 +188849,6 @@
     { "name": "octav-avocats.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oharas.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ohmygeekettes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ohrenbergpasta.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oi-wiki.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oirnoir.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "okegugel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -189653,7 +189114,6 @@
     { "name": "scsprotect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seamac.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sean.scot", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sebgar.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seccodeid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "secured.vote", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "securetalks.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -189764,7 +189224,6 @@
     { "name": "sweetbasilscafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sweetsinner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "switchbacksystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sylcon.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "szerelmes-sms.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "t-moon.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ta-maison.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -189816,7 +189275,6 @@
     { "name": "themovingchoice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "themprojects.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theoasis.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "theranch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theshesuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thesimplehelp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thetruthabouthemp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -189864,7 +189322,6 @@
     { "name": "trustarts.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "truthre.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "truyendichz.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tucsonpcrepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tulup.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tur17.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -189884,7 +189341,6 @@
     { "name": "ucretleri.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "udtonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ugis.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "uglychews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uisd.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ukforum.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ukfreelegaladvice.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -189915,7 +189371,6 @@
     { "name": "userpizza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "utusan.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uvesco.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vaccinatieplanner.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vacuumsupplystore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vague-normande.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vaildcrack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -190085,7 +189540,6 @@
     { "name": "alezinhababykids.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aliahmadi.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alphageek.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alvarezbruned.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alyusr.com.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "am-yu.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amagroup.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -190198,7 +189652,6 @@
     { "name": "cocinerosmxporelmundo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coggle.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cogolloelegante.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cohu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "colazxk.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "colombiansuppliers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "combidarlehen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -190322,11 +189775,9 @@
     { "name": "furtodo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fusionvr.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "futacockinside.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fuzzspencer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "g0nz0.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gabelli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gablesvets.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gaku-nkc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "galton.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "galtonbrands.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "galtonbrands.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -190371,7 +189822,6 @@
     { "name": "gule.loan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gustaw.net.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gwinteriors.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hakatemia.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "halcom.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "halukaka.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hanacademy.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -190399,7 +189849,6 @@
     { "name": "hotel-leda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hoteldel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "housesinportugal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hr-tech.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hrcigroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "huibrotladen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hummingbird.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -190553,7 +190002,6 @@
     { "name": "minilu.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minweb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mira.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mirijiceramica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mizon.com.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mmasportsscienceindia.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mob-tok-shop.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -190759,7 +190207,6 @@
     { "name": "s9h.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sageseeds.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sainama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sanalsergi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sanayigazetesi.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "santacruzgalapagoscruise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "santosmanjares.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -190801,9 +190248,7 @@
     { "name": "slideproducts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "slushat-tekst-pesni.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smart-broker.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "smartbookings.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smartlook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "smartwheelz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smitsdesigncenter.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smpn10kotagorontalo.sch.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smudge.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -190872,7 +190317,6 @@
     { "name": "timelettings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "timochan.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "timothyyip.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tinydogllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tinylotta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tklm.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tln.lib.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -191983,7 +191427,6 @@
     { "name": "dominicinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domino.com.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domotics101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dongbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dontwastethewood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doridev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dotker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -192278,7 +191721,6 @@
     { "name": "friotemp.com.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frontmeedia.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fruitdiva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fudsend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "furniturestrends.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "futunk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "futunk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -192308,7 +191750,6 @@
     { "name": "gildapearl.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gilsanchez2009.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "github.partners", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gk-software.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "globeprotocol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gloria-mundi.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gluglu.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -192655,7 +192096,6 @@
     { "name": "moviemadness.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mrshish.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mtboutiques.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "muffins.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mulder.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mundosat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myabakus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -192675,7 +192115,6 @@
     { "name": "nasacxhacxha.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nationaljobservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nativitychurchnj.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "naturalremediesnewyork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naturebar.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naturlife.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naturlife.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -192921,7 +192360,6 @@
     { "name": "s6n.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "safensoundstoragegroton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "safleo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "saisecure.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salesforceliveagent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saleskeyonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salonboothuren.amsterdam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -192933,7 +192371,6 @@
     { "name": "sante.akita.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sassyporkchop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sbcbatangas.edu.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sbeech.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scdn.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scentiche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schachingerfilm.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -193062,7 +192499,6 @@
     { "name": "tachikoma.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tackleundies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tagsweekly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "takethatfile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tamracapital.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tanknology.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taraiid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -193172,7 +192608,6 @@
     { "name": "uprawnienia-1kv.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uwdigitaleboekhouder.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valleysupply.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vanish.industries", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vanwa.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vatlieuhay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vccload.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -193280,7 +192715,6 @@
     { "name": "xn--mes55iczlylk.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--t8qu4voqikh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xnop.yt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xpremium.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xuexi.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xxxvv3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xxxvv8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -193314,6 +192748,1717 @@
     { "name": "zenit505.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zenseal.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zgmining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "00ffkkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "059958.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "06se.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0x.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0x27.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "10218.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "10218b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "10218c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "10218d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "10218e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "10218f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "118400.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11fffkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11fffrr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1337.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "13cloudmike.duckdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "167clan.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1x.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "22fffnn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "253325.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "267326.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "280.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "283228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "283928.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "285928.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "287328.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "287628.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "289728.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2corazones.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2vnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "33132.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "33ffhhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "33ffuuu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "356338b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "35mm.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "370337.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "371037.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "371137.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "375337.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "376937.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "377837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "378537.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "378837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "379437.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "379637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "379737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "379937.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "398039.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu007.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu126.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu27.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu28.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu37.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu505.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu626.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu727.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu836.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3vensen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "44fffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "44ffxxx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "44ffyyy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "483329.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "486662.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "55fffbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "55ffooo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "55ffzzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "562656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "562956.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "563398.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "563699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "568756.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "593398.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5am.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "639063.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "658565.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "659265.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66ffeee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66fffbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66ffkkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "673395.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "682368.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "732273.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "732473.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "733673.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "735973.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "736373.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "736573.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "739373.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "739673.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "739973.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "756975.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "758375.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "759375.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "759675.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "762media.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "766788.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "771176.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77fffoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77ffnnn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77ffttt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "783346.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "792379.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "7gr.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "823582.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "825382.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "826282.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "826382.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "829882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "872291.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "873394.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88ffkkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9118.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "91181.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "91186.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "911dispatcheredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "912191.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "912791.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "912891.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "913291.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "913391.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "913691.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "915991.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "917991.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918991.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "920392.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "921792.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "924892.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "924992.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "926792.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "927092.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "927892.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "928492.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "928592.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "929892.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "931593.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "937693.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "937893.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "939493.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "943359.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "973325.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9882258.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9883358.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9884458.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9990058.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9991158.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9992258.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9995558.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aapipower.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abolitionist-movement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abortopr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "absolutepondcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abtherapy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abumount.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acachau.synology.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acaltair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acefront.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aceofheartsgiftbaskets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ack.tax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "actionsecuritycameras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "activlux.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adaselin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "addiction-counselors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adeptplumbingandgas.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adiguezel-bau-gmbh.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "admin-wp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "admin-wp.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adsb.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advancedaquaticservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advinans.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advinans.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advocaatzoeken.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aedus-design.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aether.industries", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "affibody.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "afslankstudiovelserbroek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agenciacoder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agenziaweb3w.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agorism.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ai.moda", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aimoda.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aine.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlapse.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ajatelier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akamaiseo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akasmedikal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ako-world.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alankatona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "algo-invest.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "algorithms.guide", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aliakpoyraz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allabouthtml.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allaccountingcareers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alnoorintl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alpenschmarrn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alpensternderl.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alpha-associates.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alphakites.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alpinedental.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "althi.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amazing-maids.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ambulanzaprivata.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ametinsurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amianto.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amiciperibambini.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "analfistula.com.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anarchy.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anarhist.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anarhist.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anchorbvfs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andesoftconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andrian.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anetofwellness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "angablade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "animatedtimes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antinatalism.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antinatalists.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aofusa.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aorhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apartamentnawydmie.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apassodarte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apoderus.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apostillelondon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apple-droid.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appleii-box.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appointible.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appy.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aprendadesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apsprofessions.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apsreform.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apsreview.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aquila.earth", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arab2cam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "archiweb.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "areawidepainting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "areins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "areinshospitality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arganaddict.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "argosproject.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arhivpalanka.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ariensco.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arienscompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arienscompanydealer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ariensconordiccenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arienscorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ariensmuseum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ariensnordiccenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ariensparts.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arienssnotek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ariensstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aristra.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aristra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aristra.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "armadilloscubatx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artesaniafenix.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artformcollective.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artteacheredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aserver.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ashucg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asmgroup.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "assetinvesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "astucas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "astur.school", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asuro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atelier20.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atlan.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atlasbus.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atlasdev.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "attendhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "attic-design.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atwey.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aubcon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aupadenis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aussiebum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "automechanicschooledu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoofficina.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoparts-russia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "auversum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "axisunderwriting.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "axolotagencia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b4ifund.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babia.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babuccu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babymall.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bajajplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "balanceadosmendoza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ballmusikband.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "balticroofing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankwork.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "banyan-advantech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baroqueworksstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bartoliconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "basisvaardigheden.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "basketcase.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "batistasbakery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bayliss.aero", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bayliss.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bayliss.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bcuniversity.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bdrmedia.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beadsy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beatachoroszynska.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "become-a-bounty-hunter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "becomeaparalegal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "behealthoncologia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "behealthpr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benderssportsandspirits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benia.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "berkeleypolitical.review", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "berlin-starlight-orchestra.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "berriabot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestinahwatukee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestmasterofscienceinnursing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestmastersinpsychology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestnursingdegree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestnursingmasters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestpsychologydegrees.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betsys.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bhagyaveer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bi4sb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biblicaudio.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biblicom.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biblinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bieresamanger.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biljettmonster.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bimatoprostrx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bimtvi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "binkert-treuhand.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitehazard.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitkub-int.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjgwyj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjorknet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blackbyrne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blackfeather.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blazeeria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bloggervent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bloomingskills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bluemoose.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blutopia.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bm-pc.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bmr.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boardlinks.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bocusedormauritius.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bonaparte.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boomerangwater.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boomshine.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "borderpatroledu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bouijoux.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bountyhunteredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bouwma.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "br.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bramblerealestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brambleski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brandname.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brasrede.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bratkartoffelking.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "breml.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bridgetmcauliffe.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bristol.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "broilerku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "broomcastle.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brpmanuals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bryceml.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bsnedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btool.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buetzer.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bultdatabasen.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "burger.fitness", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "business-institute.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "businessstudent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "byte.surf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "c10.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "c19hcq.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "c19ivermectin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cafeshervas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cakesoverseas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calibratedinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "campsiteguru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canastasderegalointernacionales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cancunvacationexperts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canhotrungtam.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canhtuaone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canmypet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canondrivers-support.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cantoo.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cap21-lrc.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "care4homecare.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carrozzeria.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cas-ebbers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caseform.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casepariurionline.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cashconverters.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cashconverters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cashconverters.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "castelli-media.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ceaunulbunicii.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cejky.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centrallondonaesthetics.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centrepresseaveyron.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centrodemediacionconcepcion.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cernko.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "certusquartz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cestasdepresente.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cevrimicidiyet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cfchiropractic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cfdtrading.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cfst.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chesslovin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chicagopressurewashingservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chocolate.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chrisbrowntherapies.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "christianministryedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciaagentedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cialisworld.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciallo.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cienciasbiomedicas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cigarren-colleg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cinnamonsnail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cisi.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cistoaracnoide.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "citycarremovals.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cizz.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ckprofessionalbookkeeping.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clarksmeathouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "claytonkendall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clickseek.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "closingthegap.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudbees.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clubcompetition.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cluin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cn2euportugal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cocaine.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "codereduction.promo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coffee-break.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comelibro.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "commonecon.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "communications-major.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "communitydriving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "computer-forensics-recruiter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comunidadvegetariana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "concordance.bible", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "controlaudits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coralenergy.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coralpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corbettparadise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corbuloacademyofmilitaryscience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "correctionalofficer.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "correctionalofficeredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corrupt-republicans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cortizocampillo.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cosmeagardens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cosmictourist.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "courageoushumanity.click", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "courtreporteredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "covenco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "covermusik-band.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cozinharaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creativematters.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "credityes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crimesceneinvestigatoredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "criminaljusticeprogramsonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cristalid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crobeauty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crocheteursdefrance.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crown-building.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crunchconsulting.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crunchtax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cryptominerxhq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cryptoscope.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cs2.ac.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cs2.org.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cs2.pub", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cs2.ren", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "csghomedesignbuild.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ctrgc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cubeinstallations.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "customer2you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberfla.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cybersecuritydegreeguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cybersecurityeducationguides.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cybersecurityguide.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberwarhq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyprusivfcentre.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cysecure.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d9and10sports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dagallemaal.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daili.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dakartmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "damades.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danaclips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danburyfishfarms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danielroelsontwerp.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datagovernancetool.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dauenhauer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dbmnet.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dc.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dealcoupons.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "debt-consolidation-reviews.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "decentrala.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "decubex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deedixservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deesse-gaia.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "defencejobs.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "degens.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "degreesonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deineagentur.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dekorasyonu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "delartouducocon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demshoesdoh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demuske.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dentalcareersedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dentdelion-plugin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "designsbyscott.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desktopcentral.ath.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "detectiveedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "detska-boticka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dibo-ambasador.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "die-testleser.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dietherapie.tirol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diewerkstattcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digipassos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digipeak.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digitalbeachbrasil.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "disostruzioni.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "djmania.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dme.web.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dnpprogramstudies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dob46.mazowsze.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doblejewel.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doclub.uz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doctaforum-test.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doctorofnursingpracticednp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dogtoetreads.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainedemanville.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doublespeak.chat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "douglassimons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dpinse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drakia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dreamyoungs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drinkablegifts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drjaisejoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drugenforcementedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drupalfr.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drwoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dt-privacyportal-ui.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtnx.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dynamicini.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dzuka.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-guestbooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-patchesandcrests.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-petition-petitions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-virtus.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eaglenusa.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "earlychildhoodteacher.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eatimad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eberharter-steine.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eckerl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecodena.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecoresina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edenredbenefits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edgemasterspaint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edjo.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edubase.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "education-colleges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "efamilycare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "efektfoto.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eitbtaldea.eus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ekonomival.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "electrobraid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eletrati.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elicom-online.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elkovplus.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elodees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elog.tokyo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eltec.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emaksuper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emeklifinans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emergencymanagementedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emgadvisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emiliaperkkola.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emoji-meaning.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "empatify.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "endean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "englishteacheredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enoahinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enterprisesupercenter.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enviro-clear.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enviroli.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "epic-semiconductors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "errror.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "esideshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eslteacheredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "esnlpr.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eso3.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "espen.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "espoonkumi.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "espriler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "essaychat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "essaycoupons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "essentiapura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "etarskaikozmetickaulja.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "etdcampus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eugenesia.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eugenics.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euroasia-tm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evalcom.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evar2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evetdermisin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exactverify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exalthost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exerph.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exousiamg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expertembeleza.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eylulsohbet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fabricio.eti.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fainlogistics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "falconieri.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fapplejuice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fareuntrasloco.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "farodegracia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fbiagentedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fcomputer.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "featurous.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "federallawenforcement.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "federalsignal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fedistatus.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fediver.city", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fediver.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fediver.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fedivercity.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feisworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fencebutlers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ferrikomm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fertippt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ffc-gerlingen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ffddd55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ffeee33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ffeee99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fffaa11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fffbb33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fffbb77.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fffcc44.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ffipss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fh-chn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fhglobal-zh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fhglobal-zhs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fhjtglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "figbytes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filippodanesi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "financeforafrica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "financialhq.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "financialplannerworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "finetoo-underwear-indonesia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fire-science-schools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firetrunk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fitnessfoodguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fitnesstotal.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fixfd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flacsoandes.edu.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flamoes.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "floristavirtual.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowers2moscow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowerstoukraine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowerstver.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foi.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forensicpsychologyedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forensicpsychologyonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "formue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fotrosgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "framadventure.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "francescocozza.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frankdufaux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frenger.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frenger.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "friedbergdirectfx.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frikitrucos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fromageriedepeisey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ftfgroup.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuhui-zhs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuhuicorporate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fulup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "funandlearning.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "functori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "funerariaalarcon.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuse.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "futunk.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "futuristicjobs.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fxcm-arabic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fxcm-chn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fxcmapps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galabands.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galamusik-band.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galamusikband.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galinkltd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gallatinhousecleaning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gamersctrl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gamersflix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gamewarden.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gamewardenedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaonvokasangi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gardenstatecakes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gazeta-n1.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gbkom.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gdb.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gebiert.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genesys-uk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genoplot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gentas.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geofox.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geschenkkoerbeversand.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "getduds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "getspaces.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giftbaskets.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giftbasketsoverseas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gigarange.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "girlsgetpied.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "githubuniverse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giti.com.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gitvibe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glennwilson.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "globalfuhui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gluware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glz.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goalac.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goetteesbarbershop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gofusing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "golfeinated.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodchoiceflowers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gouwdata.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graduatewriter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grahambaggett.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graticule.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gratisliste.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gravelylawn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gravelymower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greatamericaneu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greatamericaneurope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greatamericanuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greve-behrens.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grigoraslaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "group-galore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "groupekabowd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "growth.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gruenhagenlaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grupoeitb.eus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gshoes.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gsilva.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gskm.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guillembosch.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guinel-johnson.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gun-room.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gustavopalitos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h0stb3rry.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hackdra.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haegele.consulting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "halatik.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "halifaxsailingclub.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "halkoyu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hamgamweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanishbagga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanmandalu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanmandao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanmandaohang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanmangu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanmanlou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanmanshijie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanmanxia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanmofu.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanshow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hardcore-toys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hashbl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hatinyhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hatsnet.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hatsthings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hautemontagne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hcelite.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hclsw.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hclsw.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hclsw.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hdaccess.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "health-ecore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "healthcareadministrationedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "healthcaresystemcareersedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "healthful.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heatgeek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hedonistai.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "helpinghandspartners.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "helpingupromo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "henradplumbing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herbarex.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hermetas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heroinaaustral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heureetka.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hfa3.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hhank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "higilimpmaringa.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hillenbrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "himnosycanticos.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hipkneeortho.com.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hipstermamaproductions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hirmankala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hnojik.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hobby4geek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "holuxe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "homelandsecurityedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "homesconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hors.coffee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "horsgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hospitaldelaconcepcion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotpatch.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "housesittingparaguay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howtutu.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hriveralaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "human-dev.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "humanize.security", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "humanshiftpaper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huynhviet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hvacschool.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyperpop.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hypocretins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hzz.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iamtam.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "icastgo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ichuck.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "idvchile.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iesegconseil.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "igarchitects.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "igniteenergy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "igorshishkin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "igorshishkin.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ihr-finanzcockpit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "illusionsix.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilpuntosano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imatraelekter.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imfblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imigrant.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "increso.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indigenous.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infernumware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infinitesync.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "informatico.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inlomax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inmueblescaribe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insaneair.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insertnext.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inspireplanner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "institutoliderar.edu.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "integrityfirstloans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intercom-language.training", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "interkulturban.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "international-business-world.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internationalrelationsedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intracellulartherapies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "invisionary.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ipcim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iprpetitiondenied.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "isitdaytime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "islatortuga.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "isolation-exterieure-thermique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "israelflorist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "isrib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "istanbulweb.gen.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itpviisoara.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itscalculator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itsumleo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ivanartiles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ivfausland.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iwate-shien-r5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jakehamblin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jakpost.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jancosales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jasasewaspg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jasperhugo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jberlife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jeremiebt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jey-line.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jgeverest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiri-vincour.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jjunglefruit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joannekemarchal.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jobscan.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jobsconnected.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "johnabraham.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "johnnyofans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "johnthenerd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joi.onl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jomla.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jonipuhakka.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joomag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jordanpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joseventos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jppc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "junksupply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "justfencingcheshire.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "justifyloans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "justinswagerman.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "justwannalearn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jyrkimaatta.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jysecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "k-s-edition.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kanabun.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kanduit.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kastuvas-tau.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kat.tf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katherineandkegan.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keirna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kelyon.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kelyon.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ketamine.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "key.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kim-coiffure.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinas.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingdirectionaldrilling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinnerfisch.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinter.media", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kisspeptin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kladson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "klassenfahrt-tirol.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "klaus-pforte.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "klausfischer.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "klauspforte.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "knizhniy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koc.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kondventa.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "korona-m.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kosupayoi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kruchefssensors.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kruchsensorsdev.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "krugson.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ksst.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kukla.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kukla.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuralreklam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "l-ink.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lab24.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laba.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lachaussettedebrasparts.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ladepeche.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ladybugjunction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lak.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lancertactical.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laoying.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laplace.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "larche.org.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "larryandprisca.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lasttootinaws.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lasvegastrainingcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lavadodesalascdmx.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lawenforcementedu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lawyeredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lazismuprovgorontalo.or.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lbio.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "learnoutlive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "learnwithcorne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leconnecteur-biarritz.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leecountync.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "legacyfarmstx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "legislationupdateservice.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lentesbrasil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lescouturesdisa.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lesmills-redirect-test.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lesschwab-privacyportal-ui.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lesschwabdatagovernancetool.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "letscahoot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "letvikar.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "levelx.team", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "levlagom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liana.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liberalartsedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lichtopia.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lightpod.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "likecrabwalkslowly.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lillaparken.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lilola.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lindependant.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lindung.pp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linncfs.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linxtter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "litemere.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lixis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liying-sub.buzz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "llinck.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lnxy.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "local-shop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locketurf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locustvalleyvet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loginvovchyk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "logowik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longbeachroleplay.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "losseo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loteriasdominicana.com.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "louisiananursery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lpc.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lrq.icu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lschimanski.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ltn.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lumencasalinghi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lumine.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lunaluna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luojan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lysethcreation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "m-nasiri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "m3rck.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mac-iphone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "machineseeker.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magnetoai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mahatmarice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mailjet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mainserver.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "makeupartistedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "malecki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mamanzaris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marcdietschi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "march-consulting.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marcovery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "margotdesign.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mariealber.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marketingcareeredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "markt8asten.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "martapratsmakeup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "martinhal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maryannhaircpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maryleemacdonald.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "massages-du-monde-charente.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "massagetherapylicense.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masters-education.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masters-in-special-education.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mastersinesl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mastersinlibraryscience.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masterunblock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mastodutch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mastodutch.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mathteacheredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mattslack.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mbakustik.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mbanogmat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "measurementsolutionsinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "medicalassistantschools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "medicalbillingcodingworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "medkliniks.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megadimensao.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megamarket-russia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megasunsunglasses.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meine-lebensenergie-staerken.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mensajesdecumpleanos.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mentalhealthcounselorlicense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "merabsurviladze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mercureiptv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "merenbach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meritcb.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meritsol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mescaline.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mescaline.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mestache.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metabound.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meteopievedicampo.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meyrawinkel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mezio.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mft-license.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mhadegree.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "michalmlozniak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "micharts.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "microloan.pk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "midam.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "midi-olympique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "midilibre.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mightygadget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mikado-rybak.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "military-veteran.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "millhousen.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mini-zoo.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minigolf-oase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mira.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mirekng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mitchell.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mixom.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miyazakian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mkjoyeria.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mmrepair.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobility-services.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "modemguides.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mondial.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monetenfuchs.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "montala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moservice.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mossplants.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mostbetr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "motorsport-passion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mountaindiscovery.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "movimentoterra.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mpadegree.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mphprogramslist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "msgtrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mundodaprogramacao.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "muqqabla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myappworx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myfxcm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mymartinhalresidences.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mysexpedition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mystrix-esports.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nadirsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nafilia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naidoc.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nailartstudio.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nakada-shika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "namclear.com.na", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nammont.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nangwizard.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "napolict.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naruchnie-chasi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nastyapetrovaflorist.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nationalmower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "navasoft.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nci-eg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nck64.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "negozimoda.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nekos.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nelipak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nely.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netig.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neurochip.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neverland.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newmex.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsdesk.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsquare.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nexiopaydev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nft.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ngecezt.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ngmx.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nhk.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niaa.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nickserv.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicolashervaud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nipponkousei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nivaad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niveau-klatsch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niveau-texter.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nixpare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nnet.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nnn.tf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "no-n.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "no-nat.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nogmat.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nogre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nomadphile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nomo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "northbranch-md.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "notgerman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nothingbundtcakes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novumclinic.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nrpyrenees.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nsfw.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nsteck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nsv.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nukegeyobo.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nurseslabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nursing-school-degrees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nw-risk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "o-ta-su-ke.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "obpr.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "occupationaltherapylicense.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ocean-sun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "odesigning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "odo.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ofbdc.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "officewarrior.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ohokbd.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "olcayirmak.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "omnits.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "on-wert.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onemoonmedia.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onkfaktor.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinembapage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinemedicalassistantprograms.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinemphdegree.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinepsychologydegrees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinespielcasino.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onoweb.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onul.works", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "openendpoint.tools", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opensrc.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opioids.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opticianedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optimumvikingsatcom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "osservatorionessuno.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "osservatorionessuno.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "otipax.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ovationhand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "owdex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "owefkwef8lkj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "owlexa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oxide.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oxytocin.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oya.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paardekoopergroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pacificbags.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "packwire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "page.lgbt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "panierscadeauxinternationaux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pantas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "panthercitysand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pantryjars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parequity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parishoftheholycross.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pariu.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkersweeper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkinggaragecleaningchicago.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkrangeredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkweiher.koeln", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parolededieu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parquettisti.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "partymusikband.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "patrogers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paulfc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pavanotti.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paverhandys.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paycore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "payctest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "payeasy.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paynexpay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "penguindominatrix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peninsula360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peregrinus.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perforlabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "personaltraineredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pescans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peteacheredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peteschmidt.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petitbleu.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peyote.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phagyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phonevibrator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phorcys.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phparena.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phrenology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "physicaltherapistassistantedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "physicianassistantedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "picsnmore.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pirate-proxy.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pixelstouch.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pizzachefs.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pizzarts.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "planetairsports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plastoplex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "platinumjubilee.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "player701.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "playreal.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plintusof.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plusgrandevilledefrance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pmoe-software.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "po.ne", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "podrozwmilczeniu.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polatsemih.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polkom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "poloniainfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pombas.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "poolvilla-margarita.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "popravilam.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "popravilam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "potadvisor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "potterish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powerling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powerwithpeople.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pradeepagrawal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "preflighthomeinspections.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "premiumshop24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "preschoolteacher.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "presta-div-airs.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prettybrowndancers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prettysimplemom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "priceactionhelp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primariu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primarycareconnect.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primeexecutiveoffices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primo.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "printdrivers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "privacy.repair", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "privacyguides.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "privateinvestigatoredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "probationofficeredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "projectforgive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "projectsegfau.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "projectvault.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pronikoho.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prosurf.com.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "provide-vr2005-1plc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "proxaccess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "proxy-bay.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "proyectofreestyle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psychische-systeme.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psychologist-license.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psychologydegreeguide.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "publichealthcareeredu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "publichealthonline.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "publicmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "publictechsupport.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pvgvethospital.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pwss.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pzmetallbau.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qm8838.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qrcode.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qrplanet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quantability.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quanti.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rad.plus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radiadoressoares.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radioiman.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radiolodz.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rafalkukla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "railgun.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "randombig.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rapid-care.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rarehi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rassistem.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ratunek.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rccgstrongtowerng.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rch-us.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reachout2.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reckord-bau.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reckord.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rededecuidadores.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redhead.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redstarwholesale.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "referendumcouncil.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "relawan24jam-magetan.pp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "remembervets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "remo.health", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "remonttikauppa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "remontuks.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "removerz.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renderstack.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rendezvous-cafe.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rent.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rentandgosestriere.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reodar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reroboto.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "respiratorytherapistlicense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "retro-comics.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "retroterminal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rexuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rightship.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rigidrobotics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rincat.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rippling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rishteykaro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rivago.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rivian.software", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rland.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rmitobacco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rml-liege.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rmrcapitalinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rntomsn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rntomsnedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "robertdunn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "robertodivirgilio.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "robinmurez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rockchiprescue.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "romadiluna.band", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rosangar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rosedenellandudno.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rosettapeters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rotarykardzhali.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rowsbuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "royalmedicaltrans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "royoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rsg-ltd.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rubiogafsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rusnum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rusnum.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "russianflora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "russianflora.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rust.yokohama", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rxphoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rybak-opt.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rybak-russia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ryder.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rydercragie.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rydercragie.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ryderstatus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "s.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "s2n.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sabanco.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sagefitness.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saimedia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sainthelenaparish.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saiputra.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "salmo-rybak.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "salunganogroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samanhatami.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sammich.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samsepi0l.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samsung-easydrivers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samy.rip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sand-bleibt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanrafaelvigo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sante-actu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sarto.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "satowa-network.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saturnus.consulting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sbm.org.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scalinx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schinkelplatz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "school-counselor.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "school-psychologists.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schoolshow.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schoonheidssalon-annelies-velserbroek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schwartinsky24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sciotoarts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scpower.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seavision-latam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seavision-lixis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "secure-graphic.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "securityguard-license.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "segurosbantrab.com.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sempreupdate.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "senres.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seomanager.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serenaweb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serializacion.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "servpress.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seucurioso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sf-kurzgeschichten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sfdchub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shamesofhungary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shamil.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shawnetv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sheeru.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ship-safely.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shishkin.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shooiq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sibi.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sidewalkcleaningchicago.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "silex.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simonewebdesign.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simpleavenue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simpleprivacy.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simplesummerreading.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simrail.express", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simsmotorshop.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "singleton-factory.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sirram.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sitedynamix.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skaala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skillmamba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skybrary.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slaytec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slyarts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slycegateway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slycereporting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smallchanges.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartmail.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartshousekeeper.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smiilliin.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snlianshang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sns-beta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sns-dev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "socialmediadisruption.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "socialworkdegrees.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sohanman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sokaksepeti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solechuva.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solidgroundchiro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soliver-group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sound-gardens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soundar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sourcehut.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "southgatesystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "special-education-degree.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spetsialist-po-zakupkam.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sphaeristerium.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sportcompactwarehouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spribe.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spurstark.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spyra.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srto.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stage-bluejeans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stage-privacyportal-ui.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stage-ui.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stamant.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "standardwohnungsbaukredit.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "standardwohnungsbaukredit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "starengineeringinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "starrealtypm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "startzz.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "startzz.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stay4all.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stea-web.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stella-it.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stephenplustwik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "steuerheld-werden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sthreemarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stiekemverliefdopjou.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stiftungleostrauss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stilfoto.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stimulants.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stjohnbjc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stockspy.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "story.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "strati.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "strikeone.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "strokesurvivor.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "studio1213.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sturdybusiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "subway.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "succulenty.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sumterhousecleaning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "super-60.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "super60.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superpaczka24.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "surreycyclingclub.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sweetcoraline.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swissaquashop.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "syetiket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sylviaharke.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "syncsci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tag-insights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tajeercarrent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "takase.buzz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "takumikougyou.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "talengo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tanomimaster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tanuki.army", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tardishomelab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taxesreclaimed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taxmonster.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taylorfrancis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tdk-ventures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teamariens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "technikoma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "technikoma.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "technikplanet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techno-utopia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techramer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techvaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tecob.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tectas.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teedinsiam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teleassistance-telealarme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "temogroup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teran.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teran.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teran.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teraren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "territoriesredress.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "terroinsect.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "test-privacyportal-ui.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "testdatagovernancetool.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teveblad.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thebedfordcitizen.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thecompliancepeople.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thefairlanetable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thelancergroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "themusicgalaxy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thenobullshit.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thepokerpeople.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thepyrographytool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinkittech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinwildmercury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thomasrichter.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thowzzy.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianle.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ticketrestaurant.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timoschlingmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timsys.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tinobeth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tirgar.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tirtalawoffice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiwariproduction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tjxcanada.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tklist.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tnt-21.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tobiichi3227.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toledohydraulic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tomasa.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tommybrown.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topjeepreviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topmba.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topoptics.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toppstugansundbyberg.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "totuus.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toulouscope.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tradebuilders.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transvault.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trapichelaesperanza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trastornolimite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "treeliss.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trendibit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ttshapn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tudonoticiadigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tugafm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuleap.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tumpicon.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turkserial.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turnkeycybersecurityandprivacysolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tvfamilie.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ukmerges-vaikyste.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultrasoundtechnicianschools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unikrn.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uniqopter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unix.family", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unixery.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "untrading.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "usabynumbers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ussnoorinayatkhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "utilitarianism.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valach.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "validvent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vancubers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "varianteespiritual.gal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verasrvmobiledetail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verified.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vesseldove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veterinarianedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vetuni.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vev.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "victorc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vigiles.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vilawatt.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "villasupport.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vimbowen.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vincecima.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vincour.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vinothek-northeim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "virga.pp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "virtuaal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vitalpazar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voice.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vsgd.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vwp.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waggybytes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waldpflegeverein.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wansfordcosmetic.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "washbasin5763.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waveletscreative.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wayneforeman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webastra.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webizer.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weirdork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weirdorks.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wfigueiredo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wh0.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whapn.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whatittakes.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wheretotravel.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wholesalewarehouses.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whypowerbrush.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wigger.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wikicuida.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wildlifeforafrica.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wilshirelawfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "windoorsolutions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "windows789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wisemans.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wisereducacao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wisr.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wo-meninbalance.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wohnungsbaukredit.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "woodhullfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wormss9.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wouterpetri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wozsun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wpckraft.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wpexpert.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wrdf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wreckeroo.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wushka.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wuw.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wyriverton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaozonglin.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiurenwang.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xmessy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn----otbabmp3ae.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--7dvy22i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--mbius-jua.band", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--naade-dta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpews.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xuan-hao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xzib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaballe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapper.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yarmarka-megamarket.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaroslavia.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yayginegitim.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yesmsp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yfh.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yodelmobile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yops.info.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yorcar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourdailylocal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourdata.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourmaki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youwebcams.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yukigroup.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yusufipek.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zealar.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zerodoubtclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zeronedefi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhaohanman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuoyuelicai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zimhosiery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoo-tver.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zooll.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zovoscitvfu.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ztctarrin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zugspitz-region-gmbh.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zukunftswege.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zypernreisen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zyphorq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     // END OF 1-YEAR BULK HSTS ENTRIES
 
     // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/pdf/pdfium/pdfium_page_unittest.cc b/pdf/pdfium/pdfium_page_unittest.cc
index 53fd3f4..1397167a 100644
--- a/pdf/pdfium/pdfium_page_unittest.cc
+++ b/pdf/pdfium/pdfium_page_unittest.cc
@@ -913,9 +913,9 @@
       {6, 2, {46, 1399}},  // Super tall
   };
 
-#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)
+#if defined(ARCH_CPU_ARM64)
   std::string file_name =
-      GetParam() ? "variable_page_sizes_mac_arm64" : "variable_page_sizes";
+      GetParam() ? "variable_page_sizes_arm64" : "variable_page_sizes";
 #else
   std::string file_name = "variable_page_sizes";
 #endif
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.0.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.0.png
similarity index 100%
rename from pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.0.png
rename to pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.0.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.1.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.1.png
similarity index 100%
rename from pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.1.png
rename to pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.1.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.2.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.2.png
similarity index 100%
rename from pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.2.png
rename to pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.2.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.3.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.3.png
similarity index 100%
rename from pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.3.png
rename to pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.3.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.4.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.4.png
similarity index 100%
rename from pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.4.png
rename to pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.4.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.5.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.5.png
similarity index 100%
rename from pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.5.png
rename to pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.5.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.6.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.6.png
similarity index 100%
rename from pdf/test/data/thumbnail/1.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.6.png
rename to pdf/test/data/thumbnail/1.0x/variable_page_sizes_arm64_expected_skia.pdf.6.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.0.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.0.png
similarity index 100%
rename from pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.0.png
rename to pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.0.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.1.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.1.png
similarity index 100%
rename from pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.1.png
rename to pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.1.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.2.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.2.png
similarity index 100%
rename from pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.2.png
rename to pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.2.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.3.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.3.png
similarity index 100%
rename from pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.3.png
rename to pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.3.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.4.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.4.png
similarity index 100%
rename from pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.4.png
rename to pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.4.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.5.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.5.png
similarity index 100%
rename from pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.5.png
rename to pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.5.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.6.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.6.png
similarity index 100%
rename from pdf/test/data/thumbnail/2.0x/variable_page_sizes_mac_arm64_expected_skia.pdf.6.png
rename to pdf/test/data/thumbnail/2.0x/variable_page_sizes_arm64_expected_skia.pdf.6.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/README.md b/pdf/test/data/thumbnail/README.md
index 4301375da..15e230e 100644
--- a/pdf/test/data/thumbnail/README.md
+++ b/pdf/test/data/thumbnail/README.md
@@ -12,7 +12,7 @@
 device to pixel ratio of 2.0.
 
 Also some PNG file names contain extra renderer type and device information.
-For example, the file "variable_page_sizes_mac_arm64_expected_skia.pdf.3.png"
+For example, the file "variable_page_sizes_arm64_expected_skia.pdf.3.png"
 is generated with Skia renderer on a macOS device with ARM64 CPU. If the
 renderer type and the device information are not included, by default the PNG
 files are generated with AGG renderer using a device with non-ARM64 CPU.
diff --git a/services/network/cookie_settings.cc b/services/network/cookie_settings.cc
index d83a4bd..d5299ee 100644
--- a/services/network/cookie_settings.cc
+++ b/services/network/cookie_settings.cc
@@ -17,6 +17,7 @@
 #include "net/base/features.h"
 #include "net/base/net_errors.h"
 #include "net/base/network_delegate.h"
+#include "net/base/schemeful_site.h"
 #include "net/cookies/canonical_cookie.h"
 #include "net/cookies/cookie_inclusion_status.h"
 #include "net/cookies/cookie_setting_override.h"
@@ -352,9 +353,12 @@
 bool CookieSettings::IsAllowedByStorageAccessGrant(
     const GURL& url,
     const GURL& first_party_url) const {
-  if (url::IsSameOriginWith(url, first_party_url)) {
-    // This must be an A(B(A)) case (or similar). The Storage Access API allows
-    // access in such cases.
+  // The Storage Access API allows access in A(B(A)) case (or similar). Do the
+  // same-origin check first for performance reasons.
+  const url::Origin origin = url::Origin::Create(url);
+  const url::Origin first_party_origin = url::Origin::Create(first_party_url);
+  if (origin.IsSameOriginWith(first_party_origin) ||
+      net::SchemefulSite(origin) == net::SchemefulSite(first_party_origin)) {
     return true;
   }
   const ContentSettingPatternSource* match =
diff --git a/services/network/cookie_settings_unittest.cc b/services/network/cookie_settings_unittest.cc
index 19944daa..714af2d 100644
--- a/services/network/cookie_settings_unittest.cc
+++ b/services/network/cookie_settings_unittest.cc
@@ -972,28 +972,27 @@
 }
 
 TEST_P(CookieSettingsTest,
-       AnnotateAndMoveUserBlockedCookies_SameOriginEmbed_ThirdPartyContext) {
+       AnnotateAndMoveUserBlockedCookies_SameSiteEmbed_ThirdPartyContext) {
   CookieSettings settings;
   settings.set_block_third_party_cookies(true);
 
   net::CookieAccessResultList maybe_included_cookies = {
-      {*MakeCanonicalCookie("cookie", kURL), {}}};
+      {*MakeCanonicalCookie("cookie", kDomainURL), {}}};
   net::CookieAccessResultList excluded_cookies = {
-      {*MakeCanonicalCookie("excluded_other", kURL),
-       // The ExclusionReason below is irrelevant, as long as there is
-       // one.
+      {*MakeCanonicalCookie("excluded_other", kDomainURL),
+       // The ExclusionReason below is irrelevant, as long as there is one.
        net::CookieAccessResult(net::CookieInclusionStatus(
            net::CookieInclusionStatus::ExclusionReason::EXCLUDE_SECURE_ONLY))}};
-  url::Origin origin = url::Origin::Create(GURL(kURL));
+  url::Origin origin = url::Origin::Create(GURL(kDomainURL));
 
   const bool expected_any_allowed =
       IsForceAllowThirdPartyCookies() || IsStorageAccessGrantEligible();
 
-  // Note that `url` matches the `top_frame_origin`. This is a third-party
-  // context for the purposes of third-party-cookie-blocking, even though the
-  // request URL and the top-frame URL are same-origin with each other.
+  // Note that the site of `url` matches the site of `top_frame_origin`. This is
+  // a third-party context for the purposes of third-party-cookie-blocking, even
+  // though the request URL and the top-frame URL are same-site with each other.
   EXPECT_EQ(settings.AnnotateAndMoveUserBlockedCookies(
-                GURL(kURL), net::SiteForCookies(), &origin,
+                GURL(kSubDomainURL), net::SiteForCookies(), &origin,
                 net::FirstPartySetMetadata(net::SamePartyContext(),
                                            /*frame_entry=*/nullptr,
                                            /*top_frame_entry=*/nullptr),
diff --git a/services/network/local_network_access_checker.cc b/services/network/local_network_access_checker.cc
index a920c20e..dd6b266 100644
--- a/services/network/local_network_access_checker.cc
+++ b/services/network/local_network_access_checker.cc
@@ -110,6 +110,17 @@
   mojom::IPAddressSpace resource_address_space =
       TransportInfoToIPAddressSpace(transport_info);
 
+  // If we are connecting to a local IP endpoint over HTTP without a target IP
+  // address space, record whether we could have successfully inferred the
+  // target IP address space from the request URL.
+  if (resource_address_space == mojom::IPAddressSpace::kLocal &&
+      is_request_url_scheme_http_ &&
+      target_address_space_ == mojom::IPAddressSpace::kUnknown) {
+    base::UmaHistogramBoolean(
+        "Security.PrivateNetworkAccess.PrivateIpInferrable",
+        request_url_local_ip_.has_value());
+  }
+
   auto result = CheckInternal(resource_address_space);
 
   base::UmaHistogramEnumeration("Security.PrivateNetworkAccess.CheckResult",
@@ -120,16 +131,6 @@
         "Security.PrivateNetworkAccess.CachedResourceCheckResult", result);
   }
 
-  // If we are connecting to a local IP endpoint over HTTP, and have failed
-  // the check, record whether we could have avoided the failure by inferring
-  // the target IP address space from the request URL.
-  if (resource_address_space == mojom::IPAddressSpace::kLocal &&
-      is_request_url_scheme_http_ && result == Result::kBlockedByPolicyBlock) {
-    base::UmaHistogramBoolean(
-        "Security.PrivateNetworkAccess.PrivateIpInferrable",
-        request_url_local_ip_.has_value());
-  }
-
   response_address_space_ = resource_address_space;
   return result;
 }
diff --git a/services/network/local_network_access_checker_unittest.cc b/services/network/local_network_access_checker_unittest.cc
index 0a9a1f1..e497efa 100644
--- a/services/network/local_network_access_checker_unittest.cc
+++ b/services/network/local_network_access_checker_unittest.cc
@@ -739,11 +739,11 @@
 }
 
 TEST(LocalNetworkAccessCheckerTest,
-     RecordsLocalIpInferrableHistogramWrongPolicy) {
+     RecordsLocalIpInferrableHistogramPolicyAllow) {
   mojom::ClientSecurityState client_security_state;
   client_security_state.ip_address_space = mojom::IPAddressSpace::kPublic;
   client_security_state.local_network_request_policy =
-      mojom::LocalNetworkRequestPolicy::kPreflightWarn;
+      mojom::LocalNetworkRequestPolicy::kAllow;
 
   base::HistogramTester histogram_tester;
 
@@ -754,8 +754,8 @@
 
   checker.Check(DirectTransport(LocalEndpoint()));
 
-  histogram_tester.ExpectTotalCount(
-      "Security.PrivateNetworkAccess.PrivateIpInferrable", 0);
+  histogram_tester.ExpectUniqueSample(
+      "Security.PrivateNetworkAccess.PrivateIpInferrable", true, 1);
 }
 
 TEST(LocalNetworkAccessCheckerTest,
@@ -774,8 +774,8 @@
 
   checker.Check(DirectTransport(LocalEndpoint()));
 
-  histogram_tester.ExpectTotalCount(
-      "Security.PrivateNetworkAccess.PrivateIpInferrable", 0);
+  histogram_tester.ExpectUniqueSample(
+      "Security.PrivateNetworkAccess.PrivateIpInferrable", true, 1);
 }
 
 TEST(LocalNetworkAccessCheckerTest, RecordsLocalIpInferrableHistogramTrue) {
diff --git a/services/network/public/mojom/trust_token_access_observer.mojom b/services/network/public/mojom/trust_token_access_observer.mojom
index 30c776cf..82e04af 100644
--- a/services/network/public/mojom/trust_token_access_observer.mojom
+++ b/services/network/public/mojom/trust_token_access_observer.mojom
@@ -5,9 +5,46 @@
 module network.mojom;
 
 import "sandbox/policy/mojom/context.mojom";
+import "services/network/public/mojom/trust_tokens.mojom";
 import "url/mojom/origin.mojom";
 
-struct TrustTokenAccessDetails {
+union TrustTokenAccessDetails {
+  TrustTokenIssuanceDetails issuance;
+  TrustTokenRedemptionDetails redemption;
+  TrustTokenSigningDetails signing;
+};
+
+struct TrustTokenIssuanceDetails {
+  // This is the origin that is triggering a Trust Token access. If the access
+  // is triggered from a resource request, `origin` is the origin of the
+  // top-level frame of the initial request; if they're being triggered by a
+  // script, it's the origin of the window or service worker.
+  url.mojom.Origin origin;
+
+  // This is the origin of the issuer being used by this Trust Token operation
+  // if applicable.
+  url.mojom.Origin? issuer;
+
+  // Whether the Trust Token operation was blocked.
+  bool blocked = false;
+};
+
+struct TrustTokenRedemptionDetails {
+  // This is the origin that is triggering a Trust Token access. If the access
+  // is triggered from a resource request, `origin` is the origin of the
+  // top-level frame of the initial request; if they're being triggered by a
+  // script, it's the origin of the window or service worker.
+  url.mojom.Origin origin;
+
+  // This is the origin of the issuer being used by this Trust Token operation
+  // if applicable.
+  url.mojom.Origin? issuer;
+
+  // Whether the Trust Token operation was blocked.
+  bool blocked = false;
+};
+
+struct TrustTokenSigningDetails {
   // This is the origin that is triggering a Trust Token access. If the access
   // is triggered from a resource request, `origin` is the origin of the
   // request; if they're being triggered by a script, it's the origin of the
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index 1320507f..bd09094 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -976,9 +976,28 @@
     bool token_operation_unauthorized =
         status_or_helper.status() ==
         mojom::TrustTokenOperationStatus::kUnauthorized;
-    trust_token_observer_->OnTrustTokensAccessed(
-        mojom::TrustTokenAccessDetails::New(top_frame_origin,
-                                            token_operation_unauthorized));
+    switch (operation) {
+      case mojom::TrustTokenOperationType::kIssuance:
+        trust_token_observer_->OnTrustTokensAccessed(
+            mojom::TrustTokenAccessDetails::NewIssuance(
+                mojom::TrustTokenIssuanceDetails::New(
+                    top_frame_origin, url::Origin::Create(url_request_->url()),
+                    token_operation_unauthorized)));
+        break;
+      case mojom::TrustTokenOperationType::kRedemption:
+        trust_token_observer_->OnTrustTokensAccessed(
+            mojom::TrustTokenAccessDetails::NewRedemption(
+                mojom::TrustTokenRedemptionDetails::New(
+                    top_frame_origin, url::Origin::Create(url_request_->url()),
+                    token_operation_unauthorized)));
+        break;
+      case mojom::TrustTokenOperationType::kSigning:
+        trust_token_observer_->OnTrustTokensAccessed(
+            mojom::TrustTokenAccessDetails::NewSigning(
+                mojom::TrustTokenSigningDetails::New(
+                    top_frame_origin, token_operation_unauthorized)));
+        break;
+    }
   }
 
   if (!status_or_helper.ok()) {
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index 052817b..5d03e99 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -3902,10 +3902,32 @@
   ~MockTrustTokenObserver() override = default;
 
   struct TrustTokenDetails {
-    explicit TrustTokenDetails(const mojom::TrustTokenAccessDetailsPtr& details)
-        : origin(details->origin), blocked(details->blocked) {}
+    explicit TrustTokenDetails(
+        const mojom::TrustTokenAccessDetailsPtr& details) {
+      switch (details->which()) {
+        case mojom::TrustTokenAccessDetails::Tag::kIssuance:
+          type = mojom::TrustTokenOperationType::kIssuance;
+          origin = details->get_issuance()->origin;
+          issuer = details->get_issuance()->issuer;
+          blocked = details->get_issuance()->blocked;
+          break;
+        case mojom::TrustTokenAccessDetails::Tag::kRedemption:
+          type = mojom::TrustTokenOperationType::kRedemption;
+          origin = details->get_redemption()->origin;
+          issuer = details->get_redemption()->issuer;
+          blocked = details->get_redemption()->blocked;
+          break;
+        case mojom::TrustTokenAccessDetails::Tag::kSigning:
+          type = mojom::TrustTokenOperationType::kSigning;
+          origin = details->get_signing()->origin;
+          blocked = details->get_signing()->blocked;
+          break;
+      }
+    }
 
     url::Origin origin;
+    mojom::TrustTokenOperationType type;
+    absl::optional<url::Origin> issuer;
     bool blocked;
   };
 
@@ -3950,11 +3972,13 @@
   mojo::ReceiverSet<mojom::TrustTokenAccessObserver> receivers_;
 };
 
-MATCHER_P2(MatchesTrustTokenDetails, origin, blocked, "") {
+MATCHER_P3(MatchesTrustTokenDetails, origin, issuer, blocked, "") {
   return testing::ExplainMatchResult(
       testing::AllOf(
           testing::Field(&MockTrustTokenObserver::TrustTokenDetails::origin,
                          origin),
+          testing::Field(&MockTrustTokenObserver::TrustTokenDetails::issuer,
+                         issuer),
           testing::Field(&MockTrustTokenObserver::TrustTokenDetails::blocked,
                          blocked)),
       arg, result_listener);
@@ -6143,9 +6167,10 @@
   EXPECT_FALSE(client()->response_head()->headers->raw_headers().empty());
 
   trust_token_observer.WaitForTrustTokens(1u);
-  EXPECT_THAT(trust_token_observer.observed_tokens(),
-              testing::ElementsAre(
-                  MatchesTrustTokenDetails(test_server()->GetOrigin(), false)));
+  EXPECT_THAT(
+      trust_token_observer.observed_tokens(),
+      testing::ElementsAre(MatchesTrustTokenDetails(
+          test_server()->GetOrigin(), test_server()->GetOrigin(), false)));
 }
 
 // A request with an associated Trust Tokens operation whose Begin step returns
@@ -6195,9 +6220,10 @@
   EXPECT_FALSE(client()->response_body().is_valid());
 
   trust_token_observer.WaitForTrustTokens(1u);
-  EXPECT_THAT(trust_token_observer.observed_tokens(),
-              testing::ElementsAre(
-                  MatchesTrustTokenDetails(test_server()->GetOrigin(), false)));
+  EXPECT_THAT(
+      trust_token_observer.observed_tokens(),
+      testing::ElementsAre(MatchesTrustTokenDetails(
+          test_server()->GetOrigin(), test_server()->GetOrigin(), false)));
 }
 
 TEST_P(URLLoaderSyncOrAsyncTrustTokenOperationTest,
@@ -6289,9 +6315,10 @@
   EXPECT_FALSE(client()->response_body().is_valid());
 
   trust_token_observer.WaitForTrustTokens(1u);
-  EXPECT_THAT(trust_token_observer.observed_tokens(),
-              testing::ElementsAre(
-                  MatchesTrustTokenDetails(test_server()->GetOrigin(), false)));
+  EXPECT_THAT(
+      trust_token_observer.observed_tokens(),
+      testing::ElementsAre(MatchesTrustTokenDetails(
+          test_server()->GetOrigin(), test_server()->GetOrigin(), false)));
 }
 
 // When a request's associated Trust Tokens operation's Begin step succeeds but
@@ -6333,9 +6360,10 @@
             mojom::TrustTokenOperationStatus::kBadResponse);
 
   trust_token_observer.WaitForTrustTokens(1u);
-  EXPECT_THAT(trust_token_observer.observed_tokens(),
-              testing::ElementsAre(
-                  MatchesTrustTokenDetails(test_server()->GetOrigin(), false)));
+  EXPECT_THAT(
+      trust_token_observer.observed_tokens(),
+      testing::ElementsAre(MatchesTrustTokenDetails(
+          test_server()->GetOrigin(), test_server()->GetOrigin(), false)));
 }
 
 // When URLLoader receives a  request parameterized to perform a Trust Tokens
@@ -6378,9 +6406,10 @@
             mojom::TrustTokenOperationStatus::kInternalError);
 
   trust_token_observer.WaitForTrustTokens(1u);
-  EXPECT_THAT(trust_token_observer.observed_tokens(),
-              testing::ElementsAre(
-                  MatchesTrustTokenDetails(test_server()->GetOrigin(), false)));
+  EXPECT_THAT(
+      trust_token_observer.observed_tokens(),
+      testing::ElementsAre(MatchesTrustTokenDetails(
+          test_server()->GetOrigin(), test_server()->GetOrigin(), false)));
 }
 
 // When URLLoader receives a request that is blocked by policy, the request
@@ -6421,9 +6450,10 @@
             mojom::TrustTokenOperationStatus::kUnauthorized);
 
   trust_token_observer.WaitForTrustTokens(1u);
-  EXPECT_THAT(trust_token_observer.observed_tokens(),
-              testing::ElementsAre(
-                  MatchesTrustTokenDetails(test_server()->GetOrigin(), true)));
+  EXPECT_THAT(
+      trust_token_observer.observed_tokens(),
+      testing::ElementsAre(MatchesTrustTokenDetails(
+          test_server()->GetOrigin(), test_server()->GetOrigin(), true)));
 }
 
 TEST_F(URLLoaderTest, HandlesTriggerAttestationRequest) {
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index 5395793..c83b0cc 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -1854,7 +1854,7 @@
       {
         "args": [],
         "cros_board": "dedede",
-        "cros_img": "dedede-release/R113-15389.0.0",
+        "cros_img": "dedede-release/R113-15390.0.0",
         "name": "lacros_all_tast_tests DEDEDE_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -1918,7 +1918,7 @@
       {
         "args": [],
         "cros_board": "eve",
-        "cros_img": "eve-release/R113-15389.0.0",
+        "cros_img": "eve-release/R113-15390.0.0",
         "name": "lacros_all_tast_tests EVE_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -2017,7 +2017,7 @@
       {
         "args": [],
         "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R113-15389.0.0",
+        "cros_img": "jacuzzi-release/R113-15390.0.0",
         "name": "lacros_all_tast_tests JACUZZI_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -2116,7 +2116,7 @@
       {
         "args": [],
         "cros_board": "herobrine",
-        "cros_img": "herobrine-release/R113-15389.0.0",
+        "cros_img": "herobrine-release/R113-15390.0.0",
         "name": "lacros_all_tast_tests HEROBRINE_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 132a7f1b..d273bcef 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -5886,9 +5886,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -5900,8 +5900,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -6057,9 +6057,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -6071,8 +6071,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -6209,9 +6209,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -6223,8 +6223,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json
index ed31d69..ca27f1c9 100644
--- a/testing/buildbot/chromium.coverage.json
+++ b/testing/buildbot/chromium.coverage.json
@@ -24831,7 +24831,8 @@
               "os": "Ubuntu-18.04"
             }
           ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 16
         },
         "test": "browser_tests",
         "test_id_prefix": "ninja://chrome/test:browser_tests/"
@@ -25630,9 +25631,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -25644,8 +25645,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -25801,9 +25802,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -25815,8 +25816,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -25953,9 +25954,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -25967,8 +25968,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 5097593..1a5d8fe 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -8141,6 +8141,218 @@
           "14c18",
           "--xctest"
         ],
+        "isolate_name": "gl_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "gl_unittests iPad Pro (12.9-inch) (3rd generation) 16.2",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "arm64",
+              "os": "Mac-12"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_14c18",
+              "path": "Xcode.app"
+            },
+            {
+              "name": "runtime_ios_16_2",
+              "path": "Runtime-ios-16.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://ui/gl:gl_unittests/",
+        "variant_id": "iPad Pro (12.9-inch) (3rd generation) 16.2"
+      },
+      {
+        "args": [
+          "--single-process-tests",
+          "--platform",
+          "iPhone X",
+          "--version",
+          "16.2",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}",
+          "--xcode-build-version",
+          "14c18",
+          "--xctest"
+        ],
+        "isolate_name": "gl_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "gl_unittests iPhone X 16.2",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "arm64",
+              "os": "Mac-12"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_14c18",
+              "path": "Xcode.app"
+            },
+            {
+              "name": "runtime_ios_16_2",
+              "path": "Runtime-ios-16.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://ui/gl:gl_unittests/",
+        "variant_id": "iPhone X 16.2"
+      },
+      {
+        "args": [
+          "--single-process-tests",
+          "--platform",
+          "iPad Pro (12.9-inch) (3rd generation)",
+          "--version",
+          "16.2",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}",
+          "--xcode-build-version",
+          "14c18",
+          "--xctest"
+        ],
+        "isolate_name": "gpu_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "gpu_unittests iPad Pro (12.9-inch) (3rd generation) 16.2",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "arm64",
+              "os": "Mac-12"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_14c18",
+              "path": "Xcode.app"
+            },
+            {
+              "name": "runtime_ios_16_2",
+              "path": "Runtime-ios-16.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://gpu:gpu_unittests/",
+        "variant_id": "iPad Pro (12.9-inch) (3rd generation) 16.2"
+      },
+      {
+        "args": [
+          "--single-process-tests",
+          "--platform",
+          "iPhone X",
+          "--version",
+          "16.2",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}",
+          "--xcode-build-version",
+          "14c18",
+          "--xctest"
+        ],
+        "isolate_name": "gpu_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "gpu_unittests iPhone X 16.2",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "arm64",
+              "os": "Mac-12"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_14c18",
+              "path": "Xcode.app"
+            },
+            {
+              "name": "runtime_ios_16_2",
+              "path": "Runtime-ios-16.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://gpu:gpu_unittests/",
+        "variant_id": "iPhone X 16.2"
+      },
+      {
+        "args": [
+          "--single-process-tests",
+          "--platform",
+          "iPad Pro (12.9-inch) (3rd generation)",
+          "--version",
+          "16.2",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}",
+          "--xcode-build-version",
+          "14c18",
+          "--xctest"
+        ],
         "isolate_name": "media_unittests",
         "merge": {
           "args": [],
@@ -49962,9 +50174,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -49975,8 +50187,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -50133,9 +50345,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -50146,8 +50358,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -50285,9 +50497,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -50298,8 +50510,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -51805,9 +52017,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -51818,8 +52030,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -51976,9 +52188,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -51989,8 +52201,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -52128,9 +52340,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -52141,8 +52353,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -52896,9 +53108,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -52909,8 +53121,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -60780,7 +60992,8 @@
               "os": "Windows-10-19045"
             }
           ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
         },
         "test": "browser_tests",
         "test_id_prefix": "ninja://chrome/test:browser_tests/"
@@ -64177,7 +64390,8 @@
             }
           ],
           "expiration": 43200,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
         },
         "test": "browser_tests",
         "test_id_prefix": "ninja://chrome/test:browser_tests/"
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index a98864c..4553576c 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -18414,12 +18414,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -18431,8 +18431,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -18605,12 +18605,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -18622,8 +18622,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
@@ -18772,12 +18772,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 113.0.5666.0",
+        "description": "Run with ash-chrome version 113.0.5667.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -18789,8 +18789,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5666.0",
-              "revision": "version:113.0.5666.0"
+              "location": "lacros_version_skew_tests_v113.0.5667.0",
+              "revision": "version:113.0.5667.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index c793f47..cfc8be3 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -427,7 +427,8 @@
               "os": "Windows-10-19045"
             }
           ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
         },
         "test": "browser_tests",
         "test_id_prefix": "ninja://chrome/test:browser_tests/"
diff --git a/testing/buildbot/internal.chrome.fyi.json b/testing/buildbot/internal.chrome.fyi.json
index c876c16..1e741c3 100644
--- a/testing/buildbot/internal.chrome.fyi.json
+++ b/testing/buildbot/internal.chrome.fyi.json
@@ -454,7 +454,8 @@
           ],
           "expiration": 64800,
           "hard_timeout": 43200,
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
         },
         "test": "browser_tests",
         "test_id_prefix": "ninja://chrome/test:browser_tests/"
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json
index 92795f5..9bc680a5 100644
--- a/testing/buildbot/internal.chromeos.fyi.json
+++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1164,7 +1164,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R113-15389.0.0",
+        "cros_img": "octopus-release/R113-15390.0.0",
         "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1212,7 +1212,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R113-15389.0.0",
+        "cros_img": "octopus-release/R113-15390.0.0",
         "name": "ozone_unittests OCTOPUS_RELEASE_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1263,7 +1263,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R113-15389.0.0",
+        "cros_img": "hana-release/R113-15390.0.0",
         "name": "lacros_all_tast_tests HANA_RELEASE_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1311,7 +1311,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R113-15389.0.0",
+        "cros_img": "strongbad-release/R113-15390.0.0",
         "name": "lacros_all_tast_tests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1359,7 +1359,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R113-15389.0.0",
+        "cros_img": "hana-release/R113-15390.0.0",
         "name": "ozone_unittests HANA_RELEASE_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1403,7 +1403,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R113-15389.0.0",
+        "cros_img": "strongbad-release/R113-15390.0.0",
         "name": "ozone_unittests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1447,7 +1447,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R113-15389.0.0",
+        "cros_img": "hana-release/R113-15390.0.0",
         "name": "viz_unittests HANA_RELEASE_LKGM",
         "swarming": {},
         "test": "viz_unittests",
@@ -1491,7 +1491,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R113-15389.0.0",
+        "cros_img": "strongbad-release/R113-15390.0.0",
         "name": "viz_unittests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "test": "viz_unittests",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 3b68989..78f001da 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -3998,6 +3998,16 @@
           '--single-process-tests',
         ],
       },
+      'gl_unittests': {
+        'args': [
+          '--single-process-tests',
+        ],
+      },
+      'gpu_unittests': {
+        'args': [
+          '--single-process-tests',
+        ],
+      },
       'media_unittests': {
         'args': [
           '--single-process-tests',
@@ -4146,6 +4156,9 @@
     'js_code_coverage_browser_tests' : {
       'js_code_coverage_browser_tests': {
         'args': [],
+        'swarming': {
+          'shards': 16,
+        },
         'test': 'browser_tests',
       }
     },
@@ -4797,6 +4810,9 @@
           '--test-launcher-filter-file=../../testing/buildbot/filters/pixel_tests.filter',
           '--test-launcher-jobs=1',
         ],
+        'swarming': {
+          'shards': 3,
+        },
         'test': 'browser_tests',
         'mixins': [
           'skia_gold_test',
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 6e4ee09..b3163cb 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -22,16 +22,16 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5666.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5667.0/test_ash_chrome',
     ],
-    'description': 'Run with ash-chrome version 113.0.5666.0',
+    'description': 'Run with ash-chrome version 113.0.5667.0',
     'identifier': 'Lacros version skew testing ash canary',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v113.0.5666.0',
-          'revision': 'version:113.0.5666.0',
+          'location': 'lacros_version_skew_tests_v113.0.5667.0',
+          'revision': 'version:113.0.5667.0',
         },
       ],
     },
@@ -456,7 +456,7 @@
     'skylab': {
       'cros_board': 'dedede',
       'cros_chrome_version': '113.0.5650.0',
-      'cros_img': 'dedede-release/R113-15389.0.0',
+      'cros_img': 'dedede-release/R113-15390.0.0',
     },
     'enabled': True,
     'identifier': 'DEDEDE_RELEASE_LKGM',
@@ -492,7 +492,7 @@
     'skylab': {
       'cros_board': 'eve',
       'cros_chrome_version': '113.0.5650.0',
-      'cros_img': 'eve-release/R113-15389.0.0',
+      'cros_img': 'eve-release/R113-15390.0.0',
     },
     'enabled': True,
     'identifier': 'EVE_RELEASE_LKGM',
@@ -538,7 +538,7 @@
     'skylab': {
       'cros_board': 'hana',
       'cros_chrome_version': '113.0.5650.0',
-      'cros_img': 'hana-release/R113-15389.0.0',
+      'cros_img': 'hana-release/R113-15390.0.0',
     },
     'enabled': True,
     'identifier': 'HANA_RELEASE_LKGM',
@@ -574,7 +574,7 @@
     'skylab': {
       'cros_board': 'herobrine',
       'cros_chrome_version': '113.0.5650.0',
-      'cros_img': 'herobrine-release/R113-15389.0.0',
+      'cros_img': 'herobrine-release/R113-15390.0.0',
     },
     'enabled': True,
     'identifier': 'HEROBRINE_RELEASE_LKGM',
@@ -583,7 +583,7 @@
     'skylab': {
       'cros_board': 'jacuzzi',
       'cros_chrome_version': '113.0.5650.0',
-      'cros_img': 'jacuzzi-release/R113-15389.0.0',
+      'cros_img': 'jacuzzi-release/R113-15390.0.0',
     },
     'enabled': True,
     'identifier': 'JACUZZI_RELEASE_LKGM',
@@ -673,7 +673,7 @@
     'skylab': {
       'cros_board': 'octopus',
       'cros_chrome_version': '113.0.5650.0',
-      'cros_img': 'octopus-release/R113-15389.0.0',
+      'cros_img': 'octopus-release/R113-15390.0.0',
     },
     'enabled': True,
     'identifier': 'OCTOPUS_RELEASE_LKGM',
@@ -709,7 +709,7 @@
     'skylab': {
       'cros_board': 'strongbad',
       'cros_chrome_version': '113.0.5650.0',
-      'cros_img': 'strongbad-release/R113-15389.0.0',
+      'cros_img': 'strongbad-release/R113-15390.0.0',
     },
     'enabled': True,
     'identifier': 'STRONGBAD_RELEASE_LKGM',
diff --git a/testing/scripts/run_isolated_script_test.py b/testing/scripts/run_isolated_script_test.py
index e83e1c18..82cdd5e 100755
--- a/testing/scripts/run_isolated_script_test.py
+++ b/testing/scripts/run_isolated_script_test.py
@@ -61,8 +61,10 @@
   def __init__(self):
     super().__init__()
     # Arguments that are ignored, but added here because it's easier to ignore
-    # them to to update bot configs to not pass them.
+    # them than to update bot configs to not pass them.
     common.add_emulator_args(self._parser)
+    self._parser.add_argument(
+        '--use-persistent-shell', action='store_true', help='Unused')
 
 
 class IsolatedScriptTestAdapter(common.BaseIsolatedScriptArgsAdapter):
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 1c075b9..39c5bc00 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3184,6 +3184,21 @@
             ]
         }
     ],
+    "CrOSBluetoothFlossCoredump": [
+        {
+            "platforms": [
+                "chromeos"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "BluetoothFlossCoredump"
+                    ]
+                }
+            ]
+        }
+    ],
     "CrOSBluetoothLLPrivacy": [
         {
             "platforms": [
@@ -6944,6 +6959,27 @@
             ]
         }
     ],
+    "InstallAmbientBadgeEngagement": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled_Message_Engagement_5",
+                    "params": {
+                        "minimal_engagement": "5"
+                    },
+                    "enable_features": [
+                        "AmbientBadgeSiteEngagement"
+                    ],
+                    "disable_features": [
+                        "AmbientBadgeSuppressFirstVisit"
+                    ]
+                }
+            ]
+        }
+    ],
     "InstallAndroidUnwindDfm": [
         {
             "platforms": [
@@ -7140,7 +7176,7 @@
             ]
         }
     ],
-    "KeepToolbarTexture": [
+    "KeepAndroidTintedResources": [
         {
             "platforms": [
                 "android"
@@ -7149,7 +7185,7 @@
                 {
                     "name": "Enabled",
                     "enable_features": [
-                        "KeepToolbarTexture"
+                        "KeepAndroidTintedResources"
                     ]
                 }
             ]
@@ -13595,26 +13631,6 @@
             ]
         }
     ],
-    "VisualFeaturesInReusePings": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "chromeos_lacros",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "VisualFeaturesInReusePings"
-                    ]
-                }
-            ]
-        }
-    ],
     "Vp9kSVCHWDecoding": [
         {
             "platforms": [
@@ -13837,26 +13853,6 @@
             ]
         }
     ],
-    "WebProtectReportOnlyUI": [
-        {
-            "platforms": [
-                "chromeos",
-                "chromeos_lacros",
-                "fuchsia",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "ConnectorsScanningReportOnlyUI"
-                    ]
-                }
-            ]
-        }
-    ],
     "WebProtectUrlFiltering": [
         {
             "platforms": [
diff --git a/third_party/.gitignore b/third_party/.gitignore
index 81a57c70..99375ca 100644
--- a/third_party/.gitignore
+++ b/third_party/.gitignore
@@ -160,6 +160,7 @@
 /libavif/src
 /libc++-static/libc++.a
 /libdrm/src
+/libei/src
 /libgav1/src
 /libgifcodec
 /libipp/libipp
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
index 4d5d7a3..e9e2846e 100644
--- a/third_party/android_deps/BUILD.gn
+++ b/third_party/android_deps/BUILD.gn
@@ -2361,24 +2361,6 @@
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-  java_prebuilt("net_sf_kxml_kxml2_java") {
-    jar_path = "libs/net_sf_kxml_kxml2/kxml2-2.3.0.jar"
-    output_name = "net_sf_kxml_kxml2"
-    supports_android = true
-
-    # To remove visibility constraint, add this dependency to
-    # //third_party/android_deps/build.gradle.
-    visibility = [
-      ":*",
-      "//third_party/androidx:*",
-    ]
-    testonly = true
-
-    # Target needs to exclude *xmlpull* files as already included in Android SDK.
-    jar_excluded_patterns = [ "*xmlpull*" ]
-  }
-
-  # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_bouncycastle_bcprov_jdk15on_java") {
     jar_path = "libs/org_bouncycastle_bcprov_jdk15on/bcprov-jdk15on-1.68.jar"
     output_name = "org_bouncycastle_bcprov_jdk15on"
diff --git a/third_party/android_deps/additional_readme_paths.json b/third_party/android_deps/additional_readme_paths.json
index bdf60591..5cc9ca7 100644
--- a/third_party/android_deps/additional_readme_paths.json
+++ b/third_party/android_deps/additional_readme_paths.json
@@ -125,7 +125,6 @@
     "libs/net_bytebuddy_byte_buddy_agent",
     "libs/net_bytebuddy_byte_buddy_android",
     "libs/net_ltgt_gradle_incap_incap",
-    "libs/net_sf_kxml_kxml2",
     "libs/org_bouncycastle_bcprov_jdk15on",
     "libs/org_ccil_cowan_tagsoup_tagsoup",
     "libs/org_checkerframework_checker_compat_qual",
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy
index a0e27c5..655b39483 100644
--- a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy
+++ b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy
@@ -26,14 +26,6 @@
     static final Map<String, PropertyOverride> PROPERTY_OVERRIDES = [
         androidx_multidex_multidex: new PropertyOverride(
             url: 'https://maven.google.com/androidx/multidex/multidex/2.0.0/multidex-2.0.0.aar'),
-        com_android_tools_desugar_jdk_libs: new PropertyOverride(
-            licenseUrl: 'https://raw.githubusercontent.com/google/desugar_jdk_libs/master/LICENSE',
-            licenseName: 'GNU General Public License, version 2, with the Classpath Exception',
-            generateTarget: false),
-        com_android_tools_desugar_jdk_libs_configuration: new PropertyOverride(
-            licensePath: 'licenses/desugar_jdk_libs_configuration.txt',
-            licenseName: 'BSD 3-Clause',
-            generateTarget: false),
         com_github_kevinstern_software_and_algorithms: new PropertyOverride(
             licenseUrl: 'https://raw.githubusercontent.com/KevinStern/software-and-algorithms/master/LICENSE',
             licenseName: 'MIT License'),
@@ -145,10 +137,6 @@
             url: 'https://github.com/protocolbuffers/protobuf/blob/master/java/lite.md',
             licenseUrl: 'https://raw.githubusercontent.com/protocolbuffers/protobuf/master/LICENSE',
             licenseName: 'BSD'),
-        com_google_protobuf_protobuf_lite: new PropertyOverride(
-            url: 'https://github.com/protocolbuffers/protobuf/blob/master/java/lite.md',
-            licenseUrl: 'https://raw.githubusercontent.com/protocolbuffers/protobuf/master/LICENSE',
-            licenseName: 'BSD'),
         javax_annotation_javax_annotation_api: new PropertyOverride(
             isShipped: false,  // Annotations are stripped by R8.
             licenseName: 'CDDLv1.1',
@@ -169,9 +157,6 @@
             url: 'https://github.com/raphw/byte-buddy',
             licenseUrl: 'https://raw.githubusercontent.com/raphw/byte-buddy/master/LICENSE',
             licenseName: 'Apache 2.0'),
-        net_sf_kxml_kxml2: new PropertyOverride(
-            licenseUrl: 'https://raw.githubusercontent.com/stefanhaustein/kxml2/master/license.txt',
-            licenseName: 'MIT'),
         org_checkerframework_checker_compat_qual: new PropertyOverride(
             licenseUrl: 'https://raw.githubusercontent.com/typetools/checker-framework/master/LICENSE.txt',
             licenseName: 'GPL v2 with the classpath exception'),
diff --git a/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/3pp.pb b/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/3pp.pb
deleted file mode 100644
index d743b51b..0000000
--- a/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/3pp.pb
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2021 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-
-create {
-  source {
-    script { name: "fetch.py" }
-  }
-}
-
-upload {
-  pkg_prefix: "chromium/third_party/android_deps/libs"
-  universal: true
-}
diff --git a/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py b/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py
deleted file mode 100755
index 13a251b..0000000
--- a/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env python3
-# Copyright 2021 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This is generated, do not edit. Update BuildConfigGenerator.groovy and
-# 3ppFetch.template instead.
-
-import argparse
-import json
-import os
-import re
-import urllib.request
-
-_REPO_URL = 'https://repo.maven.apache.org/maven2'
-_GROUP_NAME = 'net/sf/kxml'
-_MODULE_NAME = 'kxml2'
-_FILE_EXT = 'jar'
-_OVERRIDE_LATEST = None
-_PATCH_VERSION = 'cr1'
-
-
-def do_latest():
-    if _OVERRIDE_LATEST is not None:
-        print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}')
-        return
-    maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
-        _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
-        'utf-8')
-    # Do not parse xml with the python included parser since it is susceptible
-    # to maliciously crafted xmls. Only use regular expression parsing to be
-    # safe. RE should be enough to handle what we need to extract.
-    match = re.search('<latest>([^<]+)</latest>', metadata)
-    if match:
-        latest = match.group(1)
-    else:
-        # if no latest info was found just hope the versions are sorted and the
-        # last one is the latest (as is commonly the case).
-        latest = re.findall('<version>([^<]+)</version>', metadata)[-1]
-    print(latest + f'.{_PATCH_VERSION}')
-
-
-def get_download_url(version):
-    # Remove the patch version when getting the download url
-    version_no_patch, patch = version.rsplit('.', 1)
-    if patch.startswith('cr'):
-        version = version_no_patch
-    file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME,
-                                                    _MODULE_NAME, version,
-                                                    _FILE_EXT)
-    file_name = file_url.rsplit('/', 1)[-1]
-
-    partial_manifest = {
-        'url': [file_url],
-        'name': [file_name],
-        'ext': '.' + _FILE_EXT,
-    }
-    print(json.dumps(partial_manifest))
-
-
-def main():
-    ap = argparse.ArgumentParser()
-    sub = ap.add_subparsers()
-
-    latest = sub.add_parser('latest')
-    latest.set_defaults(func=lambda _opts: do_latest())
-
-    download = sub.add_parser('get_url')
-    download.set_defaults(
-        func=lambda _opts: get_download_url(os.environ['_3PP_VERSION']))
-
-    opts = ap.parse_args()
-    opts.func(opts)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/third_party/android_deps/libs/net_sf_kxml_kxml2/LICENSE b/third_party/android_deps/libs/net_sf_kxml_kxml2/LICENSE
deleted file mode 100644
index 089de5c..0000000
--- a/third_party/android_deps/libs/net_sf_kxml_kxml2/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
-
-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, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The  above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE. 
- 
\ No newline at end of file
diff --git a/third_party/android_deps/libs/net_sf_kxml_kxml2/OWNERS b/third_party/android_deps/libs/net_sf_kxml_kxml2/OWNERS
deleted file mode 100644
index aea47a05..0000000
--- a/third_party/android_deps/libs/net_sf_kxml_kxml2/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/net_sf_kxml_kxml2/README.chromium b/third_party/android_deps/libs/net_sf_kxml_kxml2/README.chromium
deleted file mode 100644
index 75eaaab..0000000
--- a/third_party/android_deps/libs/net_sf_kxml_kxml2/README.chromium
+++ /dev/null
@@ -1,14 +0,0 @@
-Name: kXML 2 is a small XML pull parser based on the common XML pull API
-Short Name: kxml2
-URL: http://kxml.sourceforge.net/
-Version: 2.3.0
-License: MIT
-License File: NOT_SHIPPED
-CPEPrefix: unknown
-Security Critical: no
-
-Description:
-kXML is a small XML pull parser, specially designed for constrained environments such as Applets, Personal Java or MIDP devices. In contrast to kXML 1, kXML 2 is based on the common XML pull API.
-
-Local Modifications:
-No modifications.
diff --git a/third_party/android_deps/libs/net_sf_kxml_kxml2/cipd.yaml b/third_party/android_deps/libs/net_sf_kxml_kxml2/cipd.yaml
deleted file mode 100644
index 6926f880..0000000
--- a/third_party/android_deps/libs/net_sf_kxml_kxml2/cipd.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@2.3.0.cr1
-package: chromium/third_party/android_deps/libs/net_sf_kxml_kxml2
-description: "kXML 2 is a small XML pull parser based on the common XML pull API"
-data:
-- file: kxml2-2.3.0.jar
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index 21a5a3e2..f0a53cf 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -10904,9 +10904,10 @@
       string prerenderingUrl
       PreloadingStatus status
 
-  # Send a list of sources for all preloading attempts.
+  # Send a list of sources for all preloading attempts in a document.
   event preloadingAttemptSourcesUpdated
     parameters
+      Network.LoaderId loaderId
       array of PreloadingAttemptSource preloadingAttemptSources
 
 # This domain allows interacting with the FedCM dialog.
diff --git a/third_party/blink/public/mojom/shared_storage/shared_storage.mojom b/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
index 77153ca..452cfee1 100644
--- a/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
+++ b/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
@@ -52,9 +52,14 @@
   // SharedStorageRunOperationMethodOptions.data using v8::ValueSerializer.
   // There's no need to sanitize `serialized_data` at the browser process as the
   // data will be only consumed in an environment (i.e. the worklet) in control
-  // by the same origin. The only error reported is if the API is disabled;
-  // other errors are suppressed and reported as success.
-  RunOperationOnWorklet(string name, array<uint8> serialized_data)
+  // by the same origin. `keep_alive_after_operation` indicates whether or not
+  // the worklet should be kept alive after this operation finishes. The only
+  // errors reported are if the API is disabled or if the worklet has expired
+  // because the context previously initiated either a `run()` or `selectURL()`
+  // call without including the option `keepAlive: true`; other errors are
+  // suppressed and reported as success.
+  RunOperationOnWorklet(string name, array<uint8> serialized_data,
+                        bool keep_alive_after_operation)
       => (bool success,
           string error_message);
 
@@ -67,11 +72,13 @@
   // SharedStorageRunOperationMethodOptions.data using v8::ValueSerializer.
   // There's no need to sanitize `serialized_data` at the browser process as the
   // data will be only consumed in an environment (i.e. the worklet) in control
-  // by the same origin.
+  // by the same origin. `keep_alive_after_operation` indicates whether or not
+  // the worklet should be kept alive after this operation finishes.
   RunURLSelectionOperationOnWorklet(string name,
                                     array<SharedStorageUrlWithMetadata>
                                       urls_with_metadata,
-                                    array<uint8> serialized_data)
+                                    array<uint8> serialized_data,
+                                    bool keep_alive_after_operation)
     => (bool success, string error_message, FencedFrameConfig? config);
 
   // Handle sharedStorage.set(): set `key`’s entry to `value`. If
diff --git a/third_party/blink/renderer/core/accessibility/ax_object_cache.h b/third_party/blink/renderer/core/accessibility/ax_object_cache.h
index dab83fb9..ada944f 100644
--- a/third_party/blink/renderer/core/accessibility/ax_object_cache.h
+++ b/third_party/blink/renderer/core/accessibility/ax_object_cache.h
@@ -218,6 +218,8 @@
                                    base::TimeDelta timeout,
                                    ui::AXTreeUpdate*) = 0;
 
+  virtual void MarkDocumentDirty() = 0;
+
   virtual void MarkElementDirty(const Node*) = 0;
 
   virtual void MarkAllImageAXObjectsDirty() = 0;
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 764c893..9f6212d 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -3124,6 +3124,8 @@
   DCHECK(IsMainThread());
   DCHECK_EQ(&AXObjectCacheOwner(), this);
 
+  DCHECK_EQ(ax_contexts_.size(), 0U);
+
   // Clear the cache member variable before calling delete because attempts
   // are made to access it during destruction.
   if (ax_object_cache_) {
@@ -3132,19 +3134,6 @@
     DCHECK_NE(g_ax_object_cache_count, 0u);
     g_ax_object_cache_count--;
   }
-
-  // If there's at least one AXContext in scope and there's still a LayoutView
-  // around, recreate an empty AXObjectCache.
-  //
-  // TODO(dmazzoni): right now ClearAXObjectCache() is being used as a way
-  // to invalidate / reset the AXObjectCache while keeping it around. We
-  // should rewrite that as a method on AXObjectCache rather than destroying
-  // and recreating it here.
-  if (ax_contexts_.size() > 0 && GetLayoutView()) {
-    ax_object_cache_ =
-        AXObjectCache::Create(*this, ComputeAXModeFromAXContexts(ax_contexts_));
-    g_ax_object_cache_count++;
-  }
 }
 
 AXObjectCache* Document::ExistingAXObjectCache() const {
@@ -3162,6 +3151,12 @@
   return cache_owner.ax_object_cache_.Get();
 }
 
+void Document::RefreshAccessibilityTree() const {
+  if (AXObjectCache* cache = ExistingAXObjectCache()) {
+    cache->MarkDocumentDirty();
+  }
+}
+
 CanvasFontCache* Document::GetCanvasFontCache() {
   if (!canvas_font_cache_)
     canvas_font_cache_ = MakeGarbageCollected<CanvasFontCache>(*this);
@@ -6322,32 +6317,13 @@
     return promise;
   }
 
-  if (GetExecutionContext()->GetSecurityOrigin()->IsSameOriginWith(
+  if (GetExecutionContext()->GetSecurityOrigin()->IsSameSiteWith(
           &*TopFrameOrigin())) {
     FireRequestStorageAccessHistogram(
         RequestStorageResult::APPROVED_PRIMARY_FRAME);
 
-    // If this frame is same-origin with the outermost frame we no longer need
+    // If this frame is same-site with the outermost frame we no longer need
     // to make a request and can resolve the promise.
-
-    // Deviation from spec: we set the has_storage_access bool here, so that
-    // downstream cookie accesses will know that this frame opted into storage
-    // access. This knowledge is necessary since Chromium considers the entire
-    // frame hierarchy when deciding if a context is first-party or third-party;
-    // rather than just considering the current frame and top frame.
-    //
-    // As a concrete example, consider an A(B(A)) embedding context. The inner A
-    // iframe is same-origin with the top-level A document. However, because
-    // Chromium's block-third-party-cookies behavior considers the whole frame
-    // hierarchy, block-third-party-cookies would still prevent the inner A
-    // iframe from accessing its cookies, even though document.hasStorageAccess
-    // and document.requestStorageAccess are written (in the spec) with early
-    // returns to imply that access should be granted in such a same-origin
-    // scenario. If we set the has_storage_access bool here, and modify
-    // consumers of the storage-access permission such that they do not require
-    // an explicit permission for contexts in which the frame and the top-level
-    // frame are same-origin, then the "actual" cookie access will match the
-    // "implied" cookie access in the spec.
     dom_window_->SetHasStorageAccess();
 
     resolver->Resolve();
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 169e3d4..add70f5 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -756,7 +756,10 @@
   // AXContexts are deleted, the AXObjectCache will be removed.
   AXObjectCache* ExistingAXObjectCache() const;
   Document& AXObjectCacheOwner() const;
-  void ClearAXObjectCache();
+  // If there is an accessibility tree, recompute it and re-serialize it all.
+  // This method is useful when something that potentially affects most of the
+  // page occurs, such as an inertness change or a fullscreen toggle.
+  void RefreshAccessibilityTree() const;
 
   // to get visually ordered hebrew and arabic pages right
   bool VisuallyOrdered() const { return visually_ordered_; }
@@ -1997,6 +2000,7 @@
   void RemoveAXContext(AXContext*);
   // Called when the AXMode of an existing AXContext changes.
   void AXContextModeChanged();
+  void ClearAXObjectCache();
 
   bool IsDocumentFragment() const =
       delete;  // This will catch anyone doing an unnecessary check.
diff --git a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc
index 78a97cc..1796e59 100644
--- a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc
+++ b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.h"
 
+#include "base/debug/crash_logging.h"
 #include "base/time/time.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_idle_request_options.h"
@@ -268,12 +269,19 @@
   } else if (state_ == State::kColdModeRequested) {
     state_ = State::kInColdModeInvocation;
     cold_mode_requester_->Invoke(deadline);
-    if (cold_mode_requester_->FullyCheckedCurrentRootEditable())
+    if (cold_mode_requester_->FullyCheckedCurrentRootEditable()) {
       state_ = State::kInactive;
-    else
+    } else {
       SetNeedsColdModeInvocation();
+    }
   } else {
-    NOTREACHED();
+    // TODO(crbug.com/1424540): The other states are unexpected but reached in
+    // real world. We work around it and dump debugging information.
+    static auto* state_data = base::debug::AllocateCrashKeyString(
+        "spellchecker-state-on-invocation", base::debug::CrashKeySize::Size32);
+    base::debug::SetCrashKeyString(state_data, GetStateAsString());
+    NOTREACHED() << GetStateAsString();
+    Deactivate();
   }
 }
 
@@ -329,4 +337,18 @@
   cold_mode_requester_->RemoveFromFullyChecked(element);
 }
 
+const char* IdleSpellCheckController::GetStateAsString() const {
+  static const char* const kTexts[] = {
+#define V(state) #state,
+      FOR_EACH_IDLE_SPELL_CHECK_CONTROLLER_STATE(V)
+#undef V
+  };
+
+  unsigned index = static_cast<unsigned>(state_);
+  if (index < std::size(kTexts)) {
+    return kTexts[index];
+  }
+  return "Invalid";
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.h b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.h
index 9fc5dc8..86b57b65 100644
--- a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.h
+++ b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.h
@@ -73,6 +73,11 @@
   void Trace(Visitor*) const override;
 
  private:
+  friend class Internals;
+
+  // For testing and debugging only.
+  const char* GetStateAsString() const;
+
   class IdleCallback;
 
   LocalDOMWindow& GetWindow() const;
diff --git a/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller_test.cc b/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller_test.cc
index f49b6a21..8c553ee 100644
--- a/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller_test.cc
+++ b/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller_test.cc
@@ -84,8 +84,7 @@
 }
 
 // Flaky on Android: http://crbug.com/1104700
-// Failing on iOS: https://crbug.com/1411478
-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
+#if BUILDFLAG(IS_ANDROID)
 #define MAYBE_ApplyTextSuggestion DISABLED_ApplyTextSuggestion
 #else
 #define MAYBE_ApplyTextSuggestion ApplyTextSuggestion
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index a010de6..296fd54e 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -1031,11 +1031,10 @@
   }
 
   // Nodes all over the accessibility tree can change inertness which means they
-  // must be added or removed from the tree. The most foolproof way is to clear
-  // the entire tree and rebuild it, though a more clever way is probably
-  // possible.
-  if (Document* document = GetDocument())
-    document->ClearAXObjectCache();
+  // must be added or removed from the tree.
+  if (GetDocument()) {
+    GetDocument()->RefreshAccessibilityTree();
+  }
 }
 
 void LocalFrame::SetInheritedEffectiveTouchAction(TouchAction touch_action) {
@@ -1578,8 +1577,9 @@
 }
 
 void LocalFrame::PortalStateChanged() {
-  if (Document* document = GetDocument())
-    document->ClearAXObjectCache();
+  if (GetDocument()) {
+    GetDocument()->RefreshAccessibilityTree();
+  }
 
   if (IsOutermostMainFrame()) {
     intersection_state_.occlusion_state =
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index 3c85cbe..004bac1 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -3275,11 +3275,18 @@
 }
 
 bool WebFrameWidgetImpl::HandleCurrentKeyboardEvent() {
-  bool did_execute_command = false;
+  if (edit_commands_.empty()) {
+    return false;
+  }
   WebLocalFrame* frame = FocusedWebLocalFrameInWidget();
   if (!frame)
     frame = local_root_;
-  for (const auto& command : edit_commands_) {
+  bool did_execute_command = false;
+  // Executing an edit command can run JS and we can end up reassigning
+  // `edit_commands_` so move it to a stack variable before iterating on it.
+  Vector<mojom::blink::EditCommandPtr> edit_commands =
+      std::move(edit_commands_);
+  for (const auto& command : edit_commands) {
     // In gtk and cocoa, it's possible to bind multiple edit commands to one
     // key (but it's the exception). Once one edit command is not executed, it
     // seems safest to not execute the rest.
diff --git a/third_party/blink/renderer/core/fullscreen/fullscreen.cc b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
index 829bb46f..f0bc66f 100644
--- a/third_party/blink/renderer/core/fullscreen/fullscreen.cc
+++ b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
@@ -118,8 +118,8 @@
 
   // Any element not contained by the fullscreen element is inert (see
   // |Node::IsInert()|), so changing the fullscreen element will typically
-  // change the inertness of most elements. Clear the entire cache.
-  document.ClearAXObjectCache();
+  // change the inertness of most elements. Reserialize the entire document.
+  document.RefreshAccessibilityTree();
 
   if (LocalFrame* frame = document.GetFrame()) {
     // TODO(foolip): Synchronize hover state changes with animation frames.
diff --git a/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.idl b/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.idl
index 753ef686..df32977 100644
--- a/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.idl
+++ b/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.idl
@@ -10,7 +10,6 @@
     [CEReactions, RuntimeEnabled=FencedFramesAPIChanges, MeasureAs=FencedFrameConfigAttribute] attribute FencedFrameConfig? config;
     [CEReactions, Reflect] attribute DOMString width;
     [CEReactions, Reflect] attribute DOMString height;
-    [CEReactions, Reflect, ReflectOnly=("default", "opaque-ads"), ReflectMissing="default", ReflectInvalid="default"] attribute DOMString mode;
     [CallWith=ScriptState] static boolean canLoadOpaqueURL();
     // Feature Policy
     [CEReactions, Reflect, RuntimeEnabled=FencedFramesAPIChanges] attribute DOMString allow;
diff --git a/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element_test.cc b/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element_test.cc
index c0399cf1..d7586e6 100644
--- a/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element_test.cc
+++ b/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element_test.cc
@@ -189,8 +189,6 @@
   Document& doc = GetDocument();
 
   auto* fenced_frame = MakeGarbageCollected<HTMLFencedFrameElement>(doc);
-  fenced_frame->setAttribute(html_names::kModeAttr, String("default"),
-                             ASSERT_NO_EXCEPTION);
   fenced_frame->setAttribute(
       html_names::kSrcAttr, String("http://example.com/"), ASSERT_NO_EXCEPTION);
   doc.body()->AppendChild(fenced_frame);
@@ -215,8 +213,6 @@
   Document& doc = GetDocument();
 
   auto* fenced_frame_opaque = MakeGarbageCollected<HTMLFencedFrameElement>(doc);
-  fenced_frame_opaque->setAttribute(html_names::kModeAttr, String("opaque-ads"),
-                                    ASSERT_NO_EXCEPTION);
   doc.body()->AppendChild(fenced_frame_opaque);
 
   // The fenced frame was not navigated to any page. Manually tell it that it
diff --git a/third_party/blink/renderer/core/html/forms/image_input_type.cc b/third_party/blink/renderer/core/html/forms/image_input_type.cc
index 51a2518..1666f64a 100644
--- a/third_party/blink/renderer/core/html/forms/image_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/image_input_type.cc
@@ -130,8 +130,10 @@
 }
 
 void ImageInputType::SrcAttributeChanged() {
-  if (!GetElement().GetLayoutObject())
+  if (!GetElement().GetLayoutObject() &&
+      !RuntimeEnabledFeatures::LoadInputImageWithoutObjectEnabled()) {
     return;
+  }
   GetElement().EnsureImageLoader().UpdateFromElement(
       ImageLoader::kUpdateIgnorePreviousError);
 }
diff --git a/third_party/blink/renderer/core/html/html_attribute_names.json5 b/third_party/blink/renderer/core/html/html_attribute_names.json5
index eb16043..ca28e7b 100644
--- a/third_party/blink/renderer/core/html/html_attribute_names.json5
+++ b/third_party/blink/renderer/core/html/html_attribute_names.json5
@@ -141,7 +141,6 @@
     "method",
     "min",
     "minlength",
-    "mode",
     "multiple",
     "muted",
     "name",
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.cc b/third_party/blink/renderer/core/html/html_dialog_element.cc
index e1c14129..84d6b4e 100644
--- a/third_party/blink/renderer/core/html/html_dialog_element.cc
+++ b/third_party/blink/renderer/core/html/html_dialog_element.cc
@@ -26,7 +26,6 @@
 #include "third_party/blink/renderer/core/html/html_dialog_element.h"
 
 #include "third_party/blink/renderer/bindings/core/v8/v8_focus_options.h"
-#include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 #include "third_party/blink/renderer/core/css/style_change_reason.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
@@ -136,7 +135,7 @@
   // tree can change inertness which means they must be added or removed from
   // the tree. The most foolproof way is to clear the entire tree and rebuild
   // it, though a more clever way is probably possible.
-  document.ClearAXObjectCache();
+  document.RefreshAccessibilityTree();
 }
 
 HTMLDialogElement::HTMLDialogElement(Document& document)
@@ -282,9 +281,7 @@
 
   SetIsModal(true);
 
-  // Throw away the AX cache first, so the subsequent steps don't have a chance
-  // of queuing up AX events on objects that would be invalidated when the cache
-  // is thrown away.
+  // Refresh the AX cache first, because most of it is changing.
   InertSubtreesChanged(document, old_modal_dialog);
   document.UpdateStyleAndLayout(DocumentUpdateReason::kJavaScript);
 
diff --git a/third_party/blink/renderer/core/html/keywords.json5 b/third_party/blink/renderer/core/html/keywords.json5
index 46b2577..14efc63 100644
--- a/third_party/blink/renderer/core/html/keywords.json5
+++ b/third_party/blink/renderer/core/html/keywords.json5
@@ -105,11 +105,6 @@
     "auto",
     "manual",
 
-    // mode attribute
-    // https://github.com/WICG/fenced-frame
-    "default",
-    "opaque-ads",
-
     // shadowrootmode attribute
     // https://github.com/whatwg/html/pull/5465
     "open",
diff --git a/third_party/blink/renderer/core/inspector/inspector_preload_agent.cc b/third_party/blink/renderer/core/inspector/inspector_preload_agent.cc
index b59c545..5c91e35d 100644
--- a/third_party/blink/renderer/core/inspector/inspector_preload_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_preload_agent.cc
@@ -210,12 +210,8 @@
         BuildProtocolPreloadingAttemptSource(it.key, *(it.value), document));
   }
 
-  // TODO(crbug.com/1384419): This will currently only notify the frontend of
-  // preloading attempt sources for a single document. We should either
-  // explicitly add specify a loaderId as part of the event, or include (and
-  // resend) any attempts we have previously seen from other documents in this
-  // target.
   GetFrontend()->preloadingAttemptSourcesUpdated(
+      IdentifiersFactory::LoaderId(document.Loader()),
       std::move(preloading_attempt_sources));
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/table/layout_ng_table_column.cc b/third_party/blink/renderer/core/layout/ng/table/layout_ng_table_column.cc
index 8422b6a..b3822e5b 100644
--- a/third_party/blink/renderer/core/layout/ng/table/layout_ng_table_column.cc
+++ b/third_party/blink/renderer/core/layout/ng/table/layout_ng_table_column.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/layout/ng/table/layout_ng_table_column.h"
 
 #include "third_party/blink/renderer/core/html/html_table_col_element.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
 #include "third_party/blink/renderer/core/layout/ng/table/layout_ng_table.h"
 #include "third_party/blink/renderer/core/layout/ng/table/ng_table_borders.h"
 #include "third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_types.h"
@@ -129,10 +130,131 @@
   }
 }
 
-// TODO(crbug.com/1371882): Table columns should have physical fragments,
-// and this function should refer to the fragment sizes.
 LayoutSize LayoutNGTableColumn::Size() const {
-  return frame_size_;
+  NOT_DESTROYED();
+  if (!RuntimeEnabledFeatures::LayoutNGNoCopyBackEnabled()) {
+    return frame_size_;
+  }
+
+  auto* table = Table();
+  DCHECK(table);
+  if (table->PhysicalFragmentCount() == 0) {
+    return LayoutSize();
+  }
+
+  WritingDirectionMode direction = StyleRef().GetWritingDirection();
+
+  LogicalSize size;
+  bool found_geometries = false;
+
+  for (auto& fragment : table->PhysicalFragments()) {
+    if (!found_geometries && fragment.TableColumnGeometries()) {
+      // If there was a table relayout, and this column box doesn't have a
+      // corresponding column in the table anymore, the column_idx_ will not
+      // have been updated. Therefore if it is greater or equal to the number of
+      // table column geometries, or if the geometry at that index doesn't point
+      // to this layout box, we return early.
+      if (column_idx_ >= fragment.TableColumnGeometries()->size()) {
+        return LayoutSize();
+      }
+      const auto& geometry = (*fragment.TableColumnGeometries())[column_idx_];
+      if (geometry.node.GetLayoutBox() != this) {
+        return LayoutSize();
+      }
+
+      found_geometries = true;
+      size.inline_size = geometry.inline_size;
+      size.block_size -=
+          table->StyleRef().TableBorderSpacing().block_size * 2 +
+          fragment.Padding().ConvertToLogical(direction).BlockSum() +
+          fragment.Borders().ConvertToLogical(direction).BlockSum();
+    }
+
+    size.block_size += fragment.TableGridRect().size.block_size;
+  }
+
+  return ToPhysicalSize(size, table->StyleRef().GetWritingMode())
+      .ToLayoutSize();
+}
+
+LayoutPoint LayoutNGTableColumn::Location() const {
+  NOT_DESTROYED();
+  if (!RuntimeEnabledFeatures::LayoutNGNoCopyBackEnabled()) {
+    return frame_location_;
+  }
+
+  auto* table = Table();
+  DCHECK(table);
+  if (table->PhysicalFragmentCount() == 0) {
+    return LayoutPoint();
+  }
+
+  WritingDirectionMode direction = StyleRef().GetWritingDirection();
+  LayoutNGTableColumn* parent_colgroup = nullptr;
+  if (IsColumn()) {
+    parent_colgroup = DynamicTo<LayoutNGTableColumn>(Parent());
+    DCHECK(!parent_colgroup || parent_colgroup->IsColumnGroup());
+  }
+
+  LogicalOffset offset;
+  LogicalSize size;
+  LayoutUnit parent_colgroup_inline_size;
+  bool found_geometries = false;
+
+  for (auto& fragment : table->PhysicalFragments()) {
+    if (!found_geometries && fragment.TableColumnGeometries()) {
+      // If there was a table relayout, and this column box doesn't have a
+      // corresponding column in the table anymore, the column_idx_ will not
+      // have been updated. Therefore if it is greater or equal to the number of
+      // table column geometries, or if the geometry at that index doesn't point
+      // to this layout box, we return early.
+      if (column_idx_ >= fragment.TableColumnGeometries()->size()) {
+        return LayoutPoint();
+      }
+      const auto& geometry = (*fragment.TableColumnGeometries())[column_idx_];
+      if (geometry.node.GetLayoutBox() != this) {
+        return LayoutPoint();
+      }
+
+      found_geometries = true;
+      offset.inline_offset = geometry.inline_offset;
+      if (parent_colgroup) {
+        const auto& parent_geometry =
+            (*fragment.TableColumnGeometries())[parent_colgroup->column_idx_];
+        offset.inline_offset -= parent_geometry.inline_offset;
+        parent_colgroup_inline_size = parent_geometry.inline_size;
+      }
+      size.inline_size = geometry.inline_size;
+
+      NGBoxStrut fragment_bp =
+          (fragment.Padding() + fragment.Borders()).ConvertToLogical(direction);
+      LogicalSize table_border_spacing = table->StyleRef().TableBorderSpacing();
+      size.block_size -=
+          table_border_spacing.block_size * 2 + fragment_bp.BlockSum();
+      if (!parent_colgroup) {
+        offset.inline_offset +=
+            fragment_bp.inline_start + table_border_spacing.inline_size;
+        offset.block_offset += fragment_bp.block_start +
+                               table_border_spacing.block_size +
+                               fragment.TableGridRect().offset.block_offset;
+      }
+    }
+
+    size.block_size += fragment.TableGridRect().size.block_size;
+  }
+
+  PhysicalSize outer_size;
+  if (!parent_colgroup) {
+    outer_size = PhysicalSize(table->Size());
+  } else {
+    DCHECK_EQ(parent_colgroup->StyleRef().GetWritingDirection(), direction);
+    outer_size = ToPhysicalSize(
+        LogicalSize(parent_colgroup_inline_size, size.block_size),
+        direction.GetWritingMode());
+  }
+  PhysicalSize inner_size = ToPhysicalSize(size, direction.GetWritingMode());
+  return offset.ConvertToPhysical(direction, outer_size, inner_size)
+      .ToLayoutPoint();
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/table/layout_ng_table_column.h b/third_party/blink/renderer/core/layout/ng/table/layout_ng_table_column.h
index 9d58fc3..1377def 100644
--- a/third_party/blink/renderer/core/layout/ng/table/layout_ng_table_column.h
+++ b/third_party/blink/renderer/core/layout/ng/table/layout_ng_table_column.h
@@ -41,6 +41,8 @@
 
   LayoutSize Size() const override;
 
+  LayoutPoint Location() const override;
+
   // LayoutObject methods start.
 
   const char* GetName() const override {
@@ -70,6 +72,11 @@
     return false;
   }
 
+  void SetColumnIndex(wtf_size_t column_idx) {
+    NOT_DESTROYED();
+    column_idx_ = column_idx;
+  }
+
  protected:
   // Required by LayoutBox, but not used.
   MinMaxSizes ComputeIntrinsicLogicalWidths() const override {
@@ -110,6 +117,7 @@
  private:
   unsigned span_ = 1;
   LayoutObjectChildList children_;
+  wtf_size_t column_idx_;
 };
 
 // wtf/casting.h helper.
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc
index d644099..9b167a8 100644
--- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc
@@ -370,10 +370,16 @@
     LayoutUnit column_inline_size = column_locations[end_column_index].offset +
                                     column_locations[end_column_index].size -
                                     column_locations[start_column_index].offset;
-    col.GetLayoutBox()->SetLogicalWidth(column_inline_size);
-    // Table column block-size is only set when at the last table box fragment.
-    if (table_column_block_size != kIndefiniteSize)
-      col.GetLayoutBox()->SetLogicalHeight(table_column_block_size);
+
+    if (!RuntimeEnabledFeatures::LayoutNGNoCopyBackEnabled()) {
+      col.GetLayoutBox()->SetLogicalWidth(column_inline_size);
+      // Table column block-size is only set when at the last table box
+      // fragment.
+      if (table_column_block_size != kIndefiniteSize) {
+        col.GetLayoutBox()->SetLogicalHeight(table_column_block_size);
+      }
+    }
+
     column_geometries.emplace_back(start_column_index, span,
                                    column_locations[start_column_index].offset -
                                        column_locations[0].offset,
@@ -393,10 +399,16 @@
     LayoutUnit colgroup_size = column_locations[last_column_index].offset +
                                column_locations[last_column_index].size -
                                column_locations[start_column_index].offset;
-    colgroup.GetLayoutBox()->SetLogicalWidth(colgroup_size);
-    // Table column block-size is only set when at the last table box fragment.
-    if (table_column_block_size != kIndefiniteSize)
-      colgroup.GetLayoutBox()->SetLogicalHeight(table_column_block_size);
+
+    if (!RuntimeEnabledFeatures::LayoutNGNoCopyBackEnabled()) {
+      colgroup.GetLayoutBox()->SetLogicalWidth(colgroup_size);
+      // Table column block-size is only set when at the last table box
+      // fragment.
+      if (table_column_block_size != kIndefiniteSize) {
+        colgroup.GetLayoutBox()->SetLogicalHeight(table_column_block_size);
+      }
+    }
+
     column_geometries.emplace_back(start_column_index, span,
                                    column_locations[start_column_index].offset -
                                        column_locations[0].offset,
@@ -430,6 +442,15 @@
                   return b.start_column >= a.start_column;
                 }
               });
+
+    if (RuntimeEnabledFeatures::LayoutNGNoCopyBackEnabled()) {
+      wtf_size_t column_idx = 0;
+      for (const auto& col : column_geometries) {
+        To<LayoutNGTableColumn>(col.node.GetLayoutBox())
+            ->SetColumnIndex(column_idx);
+        column_idx++;
+      }
+    }
   }
 
   ColumnGeometriesBuilder(const Vector<NGTableColumnLocation>& column_locations,
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc
index 8bf1c7a1..264ca3a 100644
--- a/third_party/blink/renderer/core/page/page.cc
+++ b/third_party/blink/renderer/core/page/page.cc
@@ -713,12 +713,10 @@
       }
       break;
     case ChangeType::kAccessibilityState:
-      if (!MainFrame() || !MainFrame()->IsLocalFrame())
+      if (!MainFrame() || !MainFrame()->IsLocalFrame()) {
         break;
-      DeprecatedLocalMainFrame()
-          ->GetDocument()
-          ->AXObjectCacheOwner()
-          .ClearAXObjectCache();
+      }
+      DeprecatedLocalMainFrame()->GetDocument()->RefreshAccessibilityTree();
       break;
     case ChangeType::kViewportStyle: {
       auto* main_local_frame = DynamicTo<LocalFrame>(MainFrame());
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc
index 456dc77..c40b83e8 100644
--- a/third_party/blink/renderer/core/testing/internals.cc
+++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -2095,12 +2095,6 @@
 
 String Internals::idleTimeSpellCheckerState(Document* document,
                                             ExceptionState& exception_state) {
-  static const char* const kTexts[] = {
-#define V(state) #state,
-      FOR_EACH_IDLE_SPELL_CHECK_CONTROLLER_STATE(V)
-#undef V
-  };
-
   if (!document || !document->GetFrame()) {
     exception_state.ThrowDOMException(
         DOMExceptionCode::kInvalidAccessError,
@@ -2108,14 +2102,10 @@
     return String();
   }
 
-  IdleSpellCheckController::State state = document->GetFrame()
-                                              ->GetSpellChecker()
-                                              .GetIdleSpellCheckController()
-                                              .GetState();
-  auto* const* const it = std::begin(kTexts) + static_cast<size_t>(state);
-  DCHECK_GE(it, std::begin(kTexts)) << "Unknown state value";
-  DCHECK_LT(it, std::end(kTexts)) << "Unknown state value";
-  return *it;
+  return document->GetFrame()
+      ->GetSpellChecker()
+      .GetIdleSpellCheckController()
+      .GetStateAsString();
 }
 
 void Internals::runIdleTimeSpellChecker(Document* document,
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index d65f6ae..f968f8c4 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -3667,6 +3667,21 @@
   DeferTreeUpdateInternal(std::move(callback), obj);
 }
 
+// This method is useful when something that potentially affects most of the
+// page occurs, such as an inertness change or a fullscreen toggle.
+// This keeps the existing nodes, but recomputes all of their properties and
+// reserializes everything.
+void AXObjectCacheImpl::MarkDocumentDirty() {
+  if (AXObject* root = SafeGet(document_)) {
+    // Assume all nodes in the tree need to recompute their properties.
+    ++modification_count_;
+    // Tell the serializer that everything will need to be serialized.
+    MarkAXSubtreeDirty(root);
+    // Send the serialization at the next available opportunity.
+    ScheduleAXUpdate();
+  }
+}
+
 void AXObjectCacheImpl::MarkElementDirty(const Node* element) {
   // Warning, if no AXObject exists for element, nothing is marked dirty.
   MarkAXObjectDirty(Get(element));
@@ -3767,8 +3782,7 @@
     return;
 
   active_aria_modal_dialog_ = new_active_aria_modal;
-  modification_count_++;
-  MarkAXSubtreeDirty(Root());
+  MarkDocumentDirty();
 }
 
 AXObject* AXObjectCacheImpl::AncestorAriaModalDialog(Node* node) {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
index 88dc5aa..281d720 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -510,6 +510,7 @@
   static constexpr int kDataTableHeuristicMinRows = 20;
 
   void UpdateAXForAllDocuments() override;
+  void MarkDocumentDirty() override;
   void MarkElementDirty(const Node*) override;
 
  protected:
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
index b7dea931..5a741016 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -45,6 +45,10 @@
 
 namespace blink {
 
+BASE_FEATURE(kCanvasOverdrawOptimization,
+             "CanvasOverdrawOptimization",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 const char BaseRenderingContext2D::kDefaultFont[] = "10px sans-serif";
 const char BaseRenderingContext2D::kInheritDirectionString[] = "inherit";
 const char BaseRenderingContext2D::kRtlDirectionString[] = "rtl";
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h
index 0c9a69e..b62e40d 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h
@@ -30,6 +30,8 @@
 
 namespace blink {
 
+MODULES_EXPORT BASE_DECLARE_FEATURE(kCanvasOverdrawOptimization);
+
 class CanvasColorCache;
 class CanvasImageSource;
 class Color;
@@ -692,6 +694,10 @@
     const cc::PaintFlags* flags,
     CanvasRenderingContext2DState::ImageType image_type,
     BaseRenderingContext2D::OverdrawOp overdraw_op) {
+  if (UNLIKELY(!base::FeatureList::IsEnabled(kCanvasOverdrawOptimization))) {
+    return;
+  }
+
   // Note on performance: because this method is inlined, all conditional
   // branches on arguments that are static at the call site can be optimized-out
   // by the compiler.
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
index 916b1743..934385c 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
@@ -478,6 +478,14 @@
   VerifyExpectations();
 }
 
+TEST_P(CanvasRenderingContext2DOverdrawTest, DisableOverdrawOptimization) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndDisableFeature(kCanvasOverdrawOptimization);
+  ExpectNoOverdraw();
+  Context2D()->clearRect(0, 0, 10, 10);
+  VerifyExpectations();
+}
+
 TEST_P(CanvasRenderingContext2DOverdrawTest, ClearRect_ExactCoverage) {
   ExpectOverdraw({
       BaseRenderingContext2D::OverdrawOp::kTotal,
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
index 54d7142..3f72eac 100644
--- a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
+++ b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
@@ -535,9 +535,12 @@
     resolve_to_config = false;
   }
 
+  bool keep_alive = options->keepAlive();
+
   GetSharedStorageDocumentService(execution_context)
       ->RunURLSelectionOperationOnWorklet(
           name, std::move(converted_urls), std::move(serialized_data),
+          keep_alive,
           WTF::BindOnce(
               [](ScriptPromiseResolver* resolver, SharedStorage* shared_storage,
                  base::TimeTicks start_time, bool resolve_to_config,
@@ -613,9 +616,11 @@
     return promise;
   }
 
+  bool keep_alive = options->keepAlive();
+
   GetSharedStorageDocumentService(execution_context)
       ->RunOperationOnWorklet(
-          name, std::move(serialized_data),
+          name, std::move(serialized_data), keep_alive,
           WTF::BindOnce(&OnVoidOperationFinished, WrapPersistent(resolver),
                         WrapPersistent(this),
                         blink::SharedStorageVoidOperation::kRun, start_time));
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage_run_operation_method_options.idl b/third_party/blink/renderer/modules/shared_storage/shared_storage_run_operation_method_options.idl
index 0098bdf..ded0c99 100644
--- a/third_party/blink/renderer/modules/shared_storage/shared_storage_run_operation_method_options.idl
+++ b/third_party/blink/renderer/modules/shared_storage/shared_storage_run_operation_method_options.idl
@@ -1,4 +1,5 @@
 dictionary SharedStorageRunOperationMethodOptions {
   object data;
   boolean resolveToConfig = false;
+  boolean keepAlive = false;
 };
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame.cc b/third_party/blink/renderer/modules/webcodecs/video_frame.cc
index d53931a..f97a886 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_frame.cc
+++ b/third_party/blink/renderer/modules/webcodecs/video_frame.cc
@@ -354,9 +354,6 @@
   if (!(mappable || texturable))
     return absl::nullopt;
 
-  const size_t num_planes =
-      mappable ? frame.layout().num_planes() : frame.NumTextures();
-
   // The |frame|.BitDepth() restriction is to avoid treating a P016LE frame as a
   // low-bit depth frame.
   if (!mappable && frame.RequiresExternalSampler() && frame.BitDepth() == 8u) {
@@ -379,10 +376,19 @@
       return absl::nullopt;
   }
 
-  // Make sure layout() is as expected before committing to being able to read
-  // back pixels.
-  if (num_planes != media::VideoFrame::NumPlanes(frame.format()))
+  if (mappable) {
+    DCHECK_EQ(frame.layout().num_planes(),
+              media::VideoFrame::NumPlanes(frame.format()));
+    return frame.format();
+  }
+
+  // For legacy shared image formats, readback only works when planes and
+  // textures are 1:1.
+  if (frame.shared_image_format_type() ==
+          media::SharedImageFormatType::kLegacy &&
+      frame.NumTextures() != media::VideoFrame::NumPlanes(frame.format())) {
     return absl::nullopt;
+  }
 
   return frame.format();
 }
diff --git a/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc b/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
index 14d4b9d..ae4a61f 100644
--- a/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
+++ b/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
@@ -232,9 +232,6 @@
 
   // TODO(https://crbug.com/1425390: Assign FontCache::font_manager_ in the
   // ctor.
-  //
-  // TODO(https://crbug.com/1425389: Remove
-  // SkTypeface_Factory::FromFamilyNameAndFontStyle().
   auto font_manager = font_manager_ ? font_manager_ : SkFontMgr::RefDefault();
   return sk_sp<SkTypeface>(font_manager->matchFamilyStyle(
       name.empty() ? nullptr : name.c_str(), font_description.SkiaFontStyle()));
diff --git a/third_party/blink/renderer/platform/fonts/skia/sktypeface_factory.cc b/third_party/blink/renderer/platform/fonts/skia/sktypeface_factory.cc
index 5f22dd9..7ef353f 100644
--- a/third_party/blink/renderer/platform/fonts/skia/sktypeface_factory.cc
+++ b/third_party/blink/renderer/platform/fonts/skia/sktypeface_factory.cc
@@ -41,17 +41,4 @@
 #endif
 }
 
-// static
-sk_sp<SkTypeface> SkTypeface_Factory::FromFamilyNameAndFontStyle(
-    const std::string& family_name,
-    const SkFontStyle& font_style) {
-#if !BUILDFLAG(IS_MAC)
-  auto fm(SkFontMgr::RefDefault());
-  return fm->legacyMakeTypeface(family_name.c_str(), font_style);
-#else
-  NOTREACHED();
-  return nullptr;
-#endif
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/skia/sktypeface_factory.h b/third_party/blink/renderer/platform/fonts/skia/sktypeface_factory.h
index f76d070..cd1f496a 100644
--- a/third_party/blink/renderer/platform/fonts/skia/sktypeface_factory.h
+++ b/third_party/blink/renderer/platform/fonts/skia/sktypeface_factory.h
@@ -23,9 +23,6 @@
                                                                 int ttc_index);
   static sk_sp<SkTypeface> FromFilenameAndTtcIndex(const std::string& filename,
                                                    int ttc_index);
-  static sk_sp<SkTypeface> FromFamilyNameAndFontStyle(
-      const std::string& family_name,
-      const SkFontStyle& font_style);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 756efce..73d9152a 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2022,6 +2022,14 @@
       base_feature: "none",
     },
     {
+      // A feature to load <input type=image> images even if there is no layout object.
+      // This aligns with <img> behavior, but for safety can be disabled with this
+      // flag.
+      name: "LoadInputImageWithoutObject",
+      status: "stable",
+      base_feature: "LoadInputImageWithoutObject",
+    },
+    {
       name: "LongAnimationFrameTiming",
       status: "experimental"
     },
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
index 97eb12f..9a27021 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
@@ -259,7 +259,7 @@
     bool frozen,
     PageSchedulerImpl::NotificationPolicy notification_policy) {
   // Only pages owned by web views can be frozen.
-  DCHECK(IsOrdinary());
+  DCHECK(!frozen || IsOrdinary());
 
   do_freeze_page_callback_.Cancel();
   if (is_frozen_ == frozen)
@@ -804,7 +804,7 @@
 bool PageSchedulerImpl::ShouldFreezePage() const {
   if (!base::FeatureList::IsEnabled(blink::features::kStopInBackground))
     return false;
-  return IsBackgrounded();
+  return IsOrdinary() && IsBackgrounded();
 }
 
 void PageSchedulerImpl::DoFreezePage() {
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py
index 36dcf01..561186f 100644
--- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py
+++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py
@@ -90,7 +90,7 @@
                                  dest='resultDB',
                                  action='store_false',
                                  default=True,
-                                 help='Do not Fetch results from resultDB.'),
+                                 help=optparse.SUPPRESS_HELP),
             self.no_optimize_option,
             self.dry_run_option,
             self.results_directory_option,
@@ -127,6 +127,10 @@
         self._tool = tool
         self._dry_run = options.dry_run
         self._resultdb_fetcher = options.resultDB
+        if not self._resultdb_fetcher:
+            _log.warning('`--no-resultDB` is unsupported and will be '
+                         'removed soon (crbug.com/1406660).')
+            self._tool.user.prompt('Press enter to acknowledge: ')
         self.git_cl = self.git_cl or GitCL(tool)
         # '--dry-run' implies '--no-trigger-jobs'.
         options.trigger_jobs = options.trigger_jobs and not self._dry_run
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py
index f0d03e1..8f037c5 100644
--- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py
+++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py
@@ -283,7 +283,7 @@
             'builders': [],
             'patchset': None,
             'flag_specific': None,
-            'resultDB': None
+            'resultDB': True,
         }
         options.update(kwargs)
         return optparse.Values(options)
@@ -694,7 +694,8 @@
                 step_name='not_site_per_process_blink_web_tests (with patch)'))
 
         exit_code = self.command.execute(
-            self.command_options(builders=['MOCK Try Linux Multiple Steps']),
+            self.command_options(builders=['MOCK Try Linux Multiple Steps'],
+                                 resultDB=False),
             ['one/text-fail.html', 'one/does-not-exist.html'], self.tool)
         self.assertEqual(exit_code, 0)
         baseline_set = TestBaselineSet(self.tool.builders)
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index 30b4bad..5c7a06d9 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -1103,9 +1103,6 @@
 external/wpt/css/css-animations/animationstart-and-animationend-events-manual.html [ Skip ]
 external/wpt/css/css-counter-styles/counter-style-at-rule/speak-as-manual.html [ Skip ]
 external/wpt/css/css-text/text-transform/text-transform-copy-paste-001-manual.html [ Skip ]
-# Sheriff added this line to skip newly added test.
-# TODO(https://crbug.com/1423788): Move this to appropriate file or remove this comment.
-crbug.com/1423788 external/wpt/css/css-transitions/all-with-discrete.tentative.html [ Skip ]
 external/wpt/css/css-transitions/transition-delay-000-manual.html [ Skip ]
 external/wpt/css/css-transitions/transition-delay-002-manual.html [ Skip ]
 external/wpt/css/css-transitions/transition-delay-003-manual.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index db3fb08..f9ed5cb 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2904,7 +2904,6 @@
 crbug.com/626703 virtual/plz-dedicated-worker/external/wpt/service-workers/service-worker/navigation-timing-extended.https.html [ Failure ]
 crbug.com/626703 external/wpt/preload/preload-resource-match.https.html [ Failure ]
 crbug.com/1359555 external/wpt/speculation-rules/prerender/workers.html [ Failure Timeout ]
-crbug.com/626703 [ Win ] external/wpt/speculation-rules/prerender/restriction-presentation-request.https.html [ Failure ]
 crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
@@ -4691,8 +4690,6 @@
 # Temporarily disabled to unblock https://crrev.com/c/2979697
 crbug.com/1222114 http/tests/devtools/console/console-dir.js [ Failure Pass ]
 
-crbug.com/1247844 external/wpt/css/css-contain/content-visibility/content-visibility-input-image.html [ Crash Failure Pass Timeout ]
-
 # Expected to fail with SuppressDifferentOriginSubframeJSDialogs feature disabled, tested in VirtualTestSuite
 crbug.com/1065085 external/wpt/html/webappapis/user-prompts/cannot-show-simple-dialogs/confirm-different-origin-frame.sub.html [ Failure ]
 crbug.com/1065085 external/wpt/html/webappapis/user-prompts/cannot-show-simple-dialogs/prompt-different-origin-frame.sub.html [ Failure ]
@@ -6597,6 +6594,9 @@
 # parsing (which generates the warnings) happens twice, once for fast-path and once for existing path.
 crbug.com/1407201 fast/css/pseudo-in-range-invalid-value.html [ Failure Pass ]
 
+# TODO(crbug.com/1051821): temporarily disabled to allow WebRTC roll
+crbug.com/1051821 external/wpt/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html [ Failure Pass ]
+
 # Sheriff 2023-01-05
 # fast/dom/Element/scrollTop-scrollLeft-body.html previously also linked with crbug.com/1249176
 crbug.com/1361956 [ Debug Mac12 ] fast/dom/Element/scrollTop-scrollLeft-body.html [ Failure Pass Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index cebd1f7..d5ad8ac4 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1258,6 +1258,7 @@
     "prefix": "fledge",
     "platforms": ["Linux", "Mac", "Win"],
     "bases": [
+      "external/wpt/fledge",
       "http/tests/inspector-protocol/target/auto-attach-auction-worklet.js",
       "http/tests/inspector-protocol/target/target-auction-worklet.js",
       "http/tests/inspector-protocol/timeline/auction-worklet.js",
@@ -1268,7 +1269,7 @@
     "args": [
       "--enable-features=InterestGroupStorage,AdInterestGroupAPI,Fledge,PrivacySandboxAdsAPIsOverride,FencedFrames:implementation_type/mparch"
     ],
-    "expires": "Jul 1, 2023"
+    "expires": "Dec 1, 2023"
   },
   {
     "prefix": "automatic-lazy-frame-loading",
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/table/table-parts-offsets-vertical-lr.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-break/table/table-parts-offsets-vertical-lr.tentative.html
new file mode 100644
index 0000000..bdac1f4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/table/table-parts-offsets-vertical-lr.tentative.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#box-splitting">
+<link rel="help" href="https://www.w3.org/TR/cssom-view/#extensions-to-the-htmlelement-interface">
+<div
+  style="column-width:200px; column-gap: 0; column-fill:auto; width:70px; height:600px; background:yellow; writing-mode: vertical-lr;">
+  <div id="table" style="display:table; border-spacing:7px; border:2px solid; padding:1px;">
+    <div id="colgroup" style="display:table-column-group;">
+      <div id="col" style="display:table-column;"></div>
+      <div id="col2" style="display:table-column;"></div>
+    </div>
+    <div id="colgroup2" style="display:table-column-group;">
+      <div id="col3" style="display:table-column;"></div>
+    </div>
+    <div id="rowgroup" style="display:table-row-group;">
+      <div id="row" style="display:table-row;">
+        <div id="cell" style="display:table-cell;">
+          <div id="content" style="width:100px; height:50px; background:blue;"></div>
+        </div>
+        <div id="cell2" style="display:table-cell;">
+          <div id="content2" style="width:100px; height:50px; background:blue;"></div>
+        </div>
+        <div id="cell3" style="display:table-cell;">
+          <div id="content3" style="width:100px; height:50px; background:blue;"></div>
+        </div>
+      </div>
+      <div id="row2" style="display:table-row;">
+        <div id="cell4" style="display:table-cell;">
+          <div id="content4" style="width:50px; height: 50px; background: blue;"></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  test(() => {
+    assert_equals(table.offsetTop, 8, "offsetTop");
+    assert_equals(table.offsetLeft, 8, "offsetLeft");
+    assert_equals(table.offsetWidth, 177, "offsetWidth");
+    assert_equals(table.offsetHeight, 184, "offsetHeight");
+  }, "table");
+  test(() => {
+    assert_equals(colgroup.offsetTop, 18, "offsetTop");
+    assert_equals(colgroup.offsetLeft, 18, "offsetLeft");
+    assert_equals(colgroup.offsetWidth, 157, "offsetWidth");
+    assert_equals(colgroup.offsetHeight, 107, "offsetHeight");
+  }, "colgroup");
+  test(() => {
+    assert_equals(col.offsetTop, 18, "offsetTop");
+    assert_equals(col.offsetLeft, 18, "offsetLeft");
+    assert_equals(col.offsetWidth, 157, "offsetWidth");
+    assert_equals(col.offsetHeight, 50, "offsetHeight");
+  }, "col");
+  test(() => {
+    assert_equals(col2.offsetTop, 75, "offsetTop");
+    assert_equals(col2.offsetLeft, 18, "offsetLeft");
+    assert_equals(col2.offsetWidth, 157, "offsetWidth");
+    assert_equals(col2.offsetHeight, 50, "offsetHeight");
+  }, "col2");
+  test(() => {
+    assert_equals(colgroup2.offsetTop, 132, "offsetTop");
+    assert_equals(colgroup2.offsetLeft, 18, "offsetLeft");
+    assert_equals(colgroup2.offsetWidth, 157, "offsetWidth");
+    assert_equals(colgroup2.offsetHeight, 50, "offsetHeight");
+  }, "colgroup2");
+  test(() => {
+    assert_equals(col3.offsetTop, 132, "offsetTop");
+    assert_equals(col3.offsetLeft, 18, "offsetLeft");
+    assert_equals(col3.offsetWidth, 157, "offsetWidth");
+    assert_equals(col3.offsetHeight, 50, "offsetHeight");
+  }, "col3");
+  test(() => {
+    assert_equals(rowgroup.offsetTop, 18, "offsetTop");
+    assert_equals(rowgroup.offsetLeft, 18, "offsetLeft");
+    assert_equals(rowgroup.offsetWidth, 157, "offsetWidth");
+    assert_equals(rowgroup.offsetHeight, 164, "offsetHeight");
+  }, "rowgroup");
+  test(() => {
+    assert_equals(row.offsetTop, 18, "offsetTop");
+    assert_equals(row.offsetLeft, 18, "offsetLeft");
+    assert_equals(row.offsetWidth, 100, "offsetWidth");
+    assert_equals(row.offsetHeight, 164, "offsetHeight");
+  }, "row");
+  test(() => {
+    assert_equals(cell.offsetTop, 18, "offsetTop");
+    assert_equals(cell.offsetLeft, 18, "offsetLeft");
+    assert_equals(cell.offsetWidth, 100, "offsetWidth");
+    assert_equals(cell.offsetHeight, 50, "offsetHeight");
+  }, "cell");
+  test(() => {
+    assert_equals(content.offsetTop, 18, "offsetTop");
+    assert_equals(content.offsetLeft, 18, "offsetLeft");
+    assert_equals(content.offsetWidth, 100, "offsetWidth");
+    assert_equals(content.offsetHeight, 50, "offsetHeight");
+  }, "content");
+  test(() => {
+    assert_equals(cell2.offsetTop, 75, "offsetTop");
+    assert_equals(cell2.offsetLeft, 18, "offsetLeft");
+    assert_equals(cell2.offsetWidth, 100, "offsetWidth");
+    assert_equals(cell2.offsetHeight, 50, "offsetHeight");
+  }, "cell2");
+  test(() => {
+    assert_equals(content2.offsetTop, 75, "offsetTop");
+    assert_equals(content2.offsetLeft, 18, "offsetLeft");
+    assert_equals(content2.offsetWidth, 100, "offsetWidth");
+    assert_equals(content2.offsetHeight, 50, "offsetHeight");
+  }, "content2");
+  test(() => {
+    assert_equals(cell3.offsetTop, 132, "offsetTop");
+    assert_equals(cell3.offsetLeft, 18, "offsetLeft");
+    assert_equals(cell3.offsetWidth, 100, "offsetWidth");
+    assert_equals(cell3.offsetHeight, 50, "offsetHeight");
+  }, "cell3");
+  test(() => {
+    assert_equals(content3.offsetTop, 132, "offsetTop");
+    assert_equals(content3.offsetLeft, 18, "offsetLeft");
+    assert_equals(content3.offsetWidth, 100, "offsetWidth");
+    assert_equals(content3.offsetHeight, 50, "offsetHeight");
+  }, "content3");
+  test(() => {
+    assert_equals(row2.offsetTop, 218, "offsetTop");
+    assert_equals(row2.offsetLeft, 55, "offsetLeft");
+    assert_equals(row2.offsetWidth, 50, "offsetWidth");
+    assert_equals(row2.offsetHeight, 164, "offsetHeight");
+  }, "row2");
+  test(() => {
+    assert_equals(cell4.offsetTop, 218, "offsetTop");
+    assert_equals(cell4.offsetLeft, 55, "offsetLeft");
+    assert_equals(cell4.offsetWidth, 50, "offsetWidth");
+    assert_equals(cell4.offsetHeight, 50, "offsetHeight");
+  }, "cell4");
+  test(() => {
+    assert_equals(content4.offsetTop, 218, "offsetTop");
+    assert_equals(content4.offsetLeft, 55, "offsetLeft");
+    assert_equals(content4.offsetWidth, 50, "offsetWidth");
+    assert_equals(content4.offsetHeight, 50, "offsetHeight");
+  }, "content4");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html
new file mode 100644
index 0000000..9d4a472
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#box-splitting">
+<link rel="help" href="https://www.w3.org/TR/cssom-view/#extensions-to-the-htmlelement-interface">
+<div
+  style="column-width:200px; column-gap: 0; column-fill:auto; width:70px; height:600px; background:yellow; writing-mode: vertical-rl;">
+  <div id="table" style="display:table; border-spacing:7px; border:2px solid; padding:1px;">
+    <div id="colgroup" style="display:table-column-group;">
+      <div id="col" style="display:table-column;"></div>
+      <div id="col2" style="display:table-column;"></div>
+    </div>
+    <div id="colgroup2" style="display:table-column-group;">
+      <div id="col3" style="display:table-column;"></div>
+    </div>
+    <div id="rowgroup" style="display:table-row-group;">
+      <div id="row" style="display:table-row;">
+        <div id="cell" style="display:table-cell;">
+          <div id="content" style="width:100px; height:50px; background:blue;"></div>
+        </div>
+        <div id="cell2" style="display:table-cell;">
+          <div id="content2" style="width:100px; height:50px; background:blue;"></div>
+        </div>
+        <div id="cell3" style="display:table-cell;">
+          <div id="content3" style="width:100px; height:50px; background:blue;"></div>
+        </div>
+      </div>
+      <div id="row2" style="display:table-row;">
+        <div id="cell4" style="display:table-cell;">
+          <div id="content4" style="width:50px; height: 50px; background: blue;"></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  test(() => {
+    assert_equals(table.offsetTop, 408, "offsetTop");
+    assert_equals(table.offsetLeft, 41, "offsetLeft");
+    assert_equals(table.offsetWidth, 177, "offsetWidth");
+    assert_equals(table.offsetHeight, 184, "offsetHeight");
+  }, "table");
+  test(() => {
+    assert_equals(colgroup.offsetTop, 418, "offsetTop");
+    assert_equals(colgroup.offsetLeft, 51, "offsetLeft");
+    assert_equals(colgroup.offsetWidth, 157, "offsetWidth");
+    assert_equals(colgroup.offsetHeight, 107, "offsetHeight");
+  }, "colgroup");
+  test(() => {
+    assert_equals(col.offsetTop, 418, "offsetTop");
+    assert_equals(col.offsetLeft, 51, "offsetLeft");
+    assert_equals(col.offsetWidth, 157, "offsetWidth");
+    assert_equals(col.offsetHeight, 50, "offsetHeight");
+  }, "col");
+  test(() => {
+    assert_equals(col2.offsetTop, 475, "offsetTop");
+    assert_equals(col2.offsetLeft, 51, "offsetLeft");
+    assert_equals(col2.offsetWidth, 157, "offsetWidth");
+    assert_equals(col2.offsetHeight, 50, "offsetHeight");
+  }, "col2");
+  test(() => {
+    assert_equals(colgroup2.offsetTop, 532, "offsetTop");
+    assert_equals(colgroup2.offsetLeft, 51, "offsetLeft");
+    assert_equals(colgroup2.offsetWidth, 157, "offsetWidth");
+    assert_equals(colgroup2.offsetHeight, 50, "offsetHeight");
+  }, "colgroup2");
+  test(() => {
+    assert_equals(col3.offsetTop, 532, "offsetTop");
+    assert_equals(col3.offsetLeft, 51, "offsetLeft");
+    assert_equals(col3.offsetWidth, 157, "offsetWidth");
+    assert_equals(col3.offsetHeight, 50, "offsetHeight");
+  }, "col3");
+  test(() => {
+    assert_equals(rowgroup.offsetTop, 418, "offsetTop");
+    assert_equals(rowgroup.offsetLeft, 51, "offsetLeft");
+    assert_equals(rowgroup.offsetWidth, 157, "offsetWidth");
+    assert_equals(rowgroup.offsetHeight, 164, "offsetHeight");
+  }, "rowgroup");
+  test(() => {
+    assert_equals(row.offsetTop, 218, "offsetTop");
+    assert_equals(row.offsetLeft, 38, "offsetLeft");
+    assert_equals(row.offsetWidth, 100, "offsetWidth");
+    assert_equals(row.offsetHeight, 164, "offsetHeight");
+  }, "row");
+  test(() => {
+    assert_equals(cell.offsetTop, 218, "offsetTop");
+    assert_equals(cell.offsetLeft, 38, "offsetLeft");
+    assert_equals(cell.offsetWidth, 100, "offsetWidth");
+    assert_equals(cell.offsetHeight, 50, "offsetHeight");
+  }, "cell");
+  test(() => {
+    assert_equals(content.offsetTop, 218, "offsetTop");
+    assert_equals(content.offsetLeft, 38, "offsetLeft");
+    assert_equals(content.offsetWidth, 100, "offsetWidth");
+    assert_equals(content.offsetHeight, 50, "offsetHeight");
+  }, "content");
+  test(() => {
+    assert_equals(cell2.offsetTop, 275, "offsetTop");
+    assert_equals(cell2.offsetLeft, 38, "offsetLeft");
+    assert_equals(cell2.offsetWidth, 100, "offsetWidth");
+    assert_equals(cell2.offsetHeight, 50, "offsetHeight");
+  }, "cell2");
+  test(() => {
+    assert_equals(content2.offsetTop, 275, "offsetTop");
+    assert_equals(content2.offsetLeft, 38, "offsetLeft");
+    assert_equals(content2.offsetWidth, 100, "offsetWidth");
+    assert_equals(content2.offsetHeight, 50, "offsetHeight");
+  }, "content2");
+  test(() => {
+    assert_equals(cell3.offsetTop, 332, "offsetTop");
+    assert_equals(cell3.offsetLeft, 38, "offsetLeft");
+    assert_equals(cell3.offsetWidth, 100, "offsetWidth");
+    assert_equals(cell3.offsetHeight, 50, "offsetHeight");
+  }, "cell3");
+  test(() => {
+    assert_equals(content3.offsetTop, 332, "offsetTop");
+    assert_equals(content3.offsetLeft, 38, "offsetLeft");
+    assert_equals(content3.offsetWidth, 100, "offsetWidth");
+    assert_equals(content3.offsetHeight, 50, "offsetHeight");
+  }, "content3");
+  test(() => {
+    assert_equals(row2.offsetTop, 418, "offsetTop");
+    assert_equals(row2.offsetLeft, 51, "offsetLeft");
+    assert_equals(row2.offsetWidth, 50, "offsetWidth");
+    assert_equals(row2.offsetHeight, 164, "offsetHeight");
+  }, "row2");
+  test(() => {
+    assert_equals(cell4.offsetTop, 418, "offsetTop");
+    assert_equals(cell4.offsetLeft, 51, "offsetLeft");
+    assert_equals(cell4.offsetWidth, 50, "offsetWidth");
+    assert_equals(cell4.offsetHeight, 50, "offsetHeight");
+  }, "cell4");
+  test(() => {
+    assert_equals(content4.offsetTop, 418, "offsetTop");
+    assert_equals(content4.offsetLeft, 51, "offsetLeft");
+    assert_equals(content4.offsetWidth, 50, "offsetWidth");
+    assert_equals(content4.offsetHeight, 50, "offsetHeight");
+  }, "content4");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/table/table-parts-offsets.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-break/table/table-parts-offsets.tentative.html
new file mode 100644
index 0000000..265d761
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/table/table-parts-offsets.tentative.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#box-splitting">
+<link rel="help" href="https://www.w3.org/TR/cssom-view/#extensions-to-the-htmlelement-interface">
+<div style="column-width:200px; column-gap: 0; column-fill:auto; height:70px; width:600px; background:yellow;">
+  <div id="table" style="display:table; border-spacing:7px; border:2px solid; padding:1px;">
+    <div id="colgroup" style="display:table-column-group;">
+      <div id="col" style="display:table-column;"></div>
+      <div id="col2" style="display:table-column;"></div>
+    </div>
+    <div id="colgroup2" style="display:table-column-group;">
+      <div id="col3" style="display:table-column;"></div>
+    </div>
+    <div id="rowgroup" style="display:table-row-group;">
+      <div id="row" style="display:table-row;">
+        <div id="cell" style="display:table-cell;">
+          <div id="content" style="width:50px; height:100px; background:blue;"></div>
+        </div>
+        <div id="cell2" style="display:table-cell;">
+          <div id="content2" style="width:50px; height:100px; background:blue;"></div>
+        </div>
+        <div id="cell3" style="display:table-cell;">
+          <div id="content3" style="width:50px; height:100px; background:blue;"></div>
+        </div>
+      </div>
+      <div id="row2" style="display:table-row;">
+        <div id="cell4" style="display:table-cell;">
+          <div id="content4" style="width:50px; height: 50px; background: blue;"></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  test(() => {
+    assert_equals(table.offsetTop, 8, "offsetTop");
+    assert_equals(table.offsetLeft, 8, "offsetLeft");
+    assert_equals(table.offsetWidth, 184, "offsetWidth");
+    assert_equals(table.offsetHeight, 177, "offsetHeight");
+  }, "table");
+  test(() => {
+    assert_equals(colgroup.offsetTop, 18, "offsetTop");
+    assert_equals(colgroup.offsetLeft, 18, "offsetLeft");
+    assert_equals(colgroup.offsetWidth, 107, "offsetWidth");
+    assert_equals(colgroup.offsetHeight, 157, "offsetHeight");
+  }, "colgroup");
+  test(() => {
+    assert_equals(col.offsetTop, 18, "offsetTop");
+    assert_equals(col.offsetLeft, 18, "offsetLeft");
+    assert_equals(col.offsetWidth, 50, "offsetWidth");
+    assert_equals(col.offsetHeight, 157, "offsetHeight");
+  }, "col");
+  test(() => {
+    assert_equals(col2.offsetTop, 18, "offsetTop");
+    assert_equals(col2.offsetLeft, 75, "offsetLeft");
+    assert_equals(col2.offsetWidth, 50, "offsetWidth");
+    assert_equals(col2.offsetHeight, 157, "offsetHeight");
+  }, "col2");
+  test(() => {
+    assert_equals(colgroup2.offsetTop, 18, "offsetTop");
+    assert_equals(colgroup2.offsetLeft, 132, "offsetLeft");
+    assert_equals(colgroup2.offsetWidth, 50, "offsetWidth");
+    assert_equals(colgroup2.offsetHeight, 157, "offsetHeight");
+  }, "colgroup2");
+  test(() => {
+    assert_equals(col3.offsetTop, 18, "offsetTop");
+    assert_equals(col3.offsetLeft, 132, "offsetLeft");
+    assert_equals(col3.offsetWidth, 50, "offsetWidth");
+    assert_equals(col3.offsetHeight, 157, "offsetHeight");
+  }, "col3");
+  test(() => {
+    assert_equals(rowgroup.offsetTop, 18, "offsetTop");
+    assert_equals(rowgroup.offsetLeft, 18, "offsetLeft");
+    assert_equals(rowgroup.offsetWidth, 164, "offsetWidth");
+    assert_equals(rowgroup.offsetHeight, 157, "offsetHeight");
+  }, "rowgroup");
+  test(() => {
+    assert_equals(row.offsetTop, 18, "offsetTop");
+    assert_equals(row.offsetLeft, 18, "offsetLeft");
+    assert_equals(row.offsetWidth, 164, "offsetWidth");
+    assert_equals(row.offsetHeight, 100, "offsetHeight");
+  }, "row");
+  test(() => {
+    assert_equals(cell.offsetTop, 18, "offsetTop");
+    assert_equals(cell.offsetLeft, 18, "offsetLeft");
+    assert_equals(cell.offsetWidth, 50, "offsetWidth");
+    assert_equals(cell.offsetHeight, 100, "offsetHeight");
+  }, "cell");
+  test(() => {
+    assert_equals(content.offsetTop, 18, "offsetTop");
+    assert_equals(content.offsetLeft, 18, "offsetLeft");
+    assert_equals(content.offsetWidth, 50, "offsetWidth");
+    assert_equals(content.offsetHeight, 100, "offsetHeight");
+  }, "content");
+  test(() => {
+    assert_equals(cell2.offsetTop, 18, "offsetTop");
+    assert_equals(cell2.offsetLeft, 75, "offsetLeft");
+    assert_equals(cell2.offsetWidth, 50, "offsetWidth");
+    assert_equals(cell2.offsetHeight, 100, "offsetHeight");
+  }, "cell2");
+  test(() => {
+    assert_equals(content2.offsetTop, 18, "offsetTop");
+    assert_equals(content2.offsetLeft, 75, "offsetLeft");
+    assert_equals(content2.offsetWidth, 50, "offsetWidth");
+    assert_equals(content2.offsetHeight, 100, "offsetHeight");
+  }, "content2");
+  test(() => {
+    assert_equals(cell3.offsetTop, 18, "offsetTop");
+    assert_equals(cell3.offsetLeft, 132, "offsetLeft");
+    assert_equals(cell3.offsetWidth, 50, "offsetWidth");
+    assert_equals(cell3.offsetHeight, 100, "offsetHeight");
+  }, "cell3");
+  test(() => {
+    assert_equals(content3.offsetTop, 18, "offsetTop");
+    assert_equals(content3.offsetLeft, 132, "offsetLeft");
+    assert_equals(content3.offsetWidth, 50, "offsetWidth");
+    assert_equals(content3.offsetHeight, 100, "offsetHeight");
+  }, "content3");
+  test(() => {
+    assert_equals(row2.offsetTop, 55, "offsetTop");
+    assert_equals(row2.offsetLeft, 218, "offsetLeft");
+    assert_equals(row2.offsetWidth, 164, "offsetWidth");
+    assert_equals(row2.offsetHeight, 50, "offsetHeight");
+  }, "row2");
+  test(() => {
+    assert_equals(cell4.offsetTop, 55, "offsetTop");
+    assert_equals(cell4.offsetLeft, 218, "offsetLeft");
+    assert_equals(cell4.offsetWidth, 50, "offsetWidth");
+    assert_equals(cell4.offsetHeight, 50, "offsetHeight");
+  }, "cell4");
+  test(() => {
+    assert_equals(content4.offsetTop, 55, "offsetTop");
+    assert_equals(content4.offsetLeft, 218, "offsetLeft");
+    assert_equals(content4.offsetWidth, 50, "offsetWidth");
+    assert_equals(content4.offsetHeight, 50, "offsetHeight");
+  }, "content4");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transitions/all-with-discrete.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-transitions/all-with-discrete.tentative.html
index f12c14e..a048bc7 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-transitions/all-with-discrete.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-transitions/all-with-discrete.tentative.html
@@ -3,6 +3,7 @@
 <link rel=help href="https://github.com/w3c/csswg-drafts/issues/4441">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/css/css-animations/support/testcommon.js"></script>
 
 <div id=target1 class=target>hello</div>
 <div id=target2 class=target>hello</div>
@@ -32,9 +33,9 @@
   target1.addEventListener('transitionstart', () => {
     transitionstartFired = true;
   });
-  await new Promise(resolve => requestAnimationFrame(resolve));
+  await waitForAnimationFrames(2);
   target1.classList.add('animated');
-  await new Promise(resolve => requestAnimationFrame(resolve));
+  await waitForAnimationFrames(1);
   assert_true(transitionstartFired);
 }, 'all with an explicit discrete property should animate.');
 
@@ -43,9 +44,9 @@
   target2.addEventListener('transitionstart', () => {
     transitionstartFired = true;
   });
-  await new Promise(resolve => requestAnimationFrame(resolve));
+  await waitForAnimationFrames(2);
   target2.classList.add('animated');
-  await new Promise(resolve => requestAnimationFrame(resolve));
+  await waitForAnimationFrames(1);
   assert_false(transitionstartFired);
 }, 'all without an explicit discrete property should not animate.');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transitions/all-with-discrete.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-transitions/all-with-discrete.tentative.html.ini
deleted file mode 100644
index 30ee9a0e..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-transitions/all-with-discrete.tentative.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[all-with-discrete.tentative.html]
-  [all with an explicit discrete property should animate.]
-    expected:
-      if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL
-      if product == "chrome": FAIL
-      [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/TODO b/third_party/blink/web_tests/external/wpt/fledge/tentative/TODO
new file mode 100644
index 0000000..839d286
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/TODO
@@ -0,0 +1,33 @@
+Need tests for (likely not a complete list):
+
+* directFromSellerSignals.
+* All generateBid() and scoreAd() input parameters.
+* All interest group fields (passed to auction, have effect on auction).
+    Validation when joining/leaving interest group is covered.
+* Updates.
+* All auctionConfig parameters (including invalid auctionConfigs, and ones
+    with no buyers).
+* Interest group expiration.
+* Multiple buyers.
+* Multiple interest group with same owner.
+* Multiple origin auctions (buyer != publisher != seller).
+* Multiple frame tests (including join IG policy, run auction policy,
+    loading URNs in fencedframes in other frames, loading component
+    ad URNs in fenced frames of other frames, etc)
+* adAuctionConfig passed to reportResult().
+* trusted bidding / scoring signals.
+* Component ads.
+* Component auctions.
+* In reporting methods, browserSignals fields: dataVersion, topLevelSeller,
+    componentSeller, modifiedBid, adCost, madeHighestScoringOtherBid
+    (with interest group from another origin).
+* Loading ads in iframes.
+* In fencedframes window.fence.setReportEventDataForAutomaticBeacons()
+* Calling leaveAdInterestGroup() in the frame of a winning ad (and one
+    of its component ads)
+* Network errors / timeouts.
+
+If possible:
+* Aggregate reporting.
+* Join/leave permission delegation via .well-known files.
+* k-anonymity.
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window-expected.txt
new file mode 100644
index 0000000..d9d7247
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window-expected.txt
@@ -0,0 +1,87 @@
+This is a testharness.js-based test.
+Found 83 tests; 0 PASS, 83 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":null} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"name":"default name"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"owner":null,"name":"default name"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"owner":"http://web-platform.test:8444","name":"default name"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"owner":"wss://web-platform.test:8444","name":"default name"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"owner":"www.web-platform.test","name":"default name"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"owner":"https://web-platform.test:8444"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":""}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priority":1}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priority":0}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priority":-1.5}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":null}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":1}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":{"a":"apple"}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":{}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":{"a":1}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":{"a":1,"b":-4.5,"a.b":0}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":null}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":1}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":{"a":"apple"}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":{}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":{"a":1}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":{"a":1,"b":-4.5,"a.b":0}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","enableBiddingSignalsPrioritization":true}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","enableBiddingSignalsPrioritization":false}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingLogicUrl":null}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingLogicUrl":"https://www.web-platform.test/foo.js"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingLogicUrl":"data:text/javascript,Foo"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingLogicUrl":"https://web-platform.test:8444/foo.js"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingLogicUrl":"relative/path"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingWasmHelperUrl":null}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingWasmHelperUrl":"https://www.web-platform.test/foo.js"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingWasmHelperUrl":"data:application/wasm,Foo"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingWasmHelperUrl":"https://web-platform.test:8444/foo.js"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingWasmHelperUrl":"relative/path"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","dailyUpdateUrl":null}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","dailyUpdateUrl":"https://www.web-platform.test/foo.js"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","dailyUpdateUrl":"data:application/wasm,Foo"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","dailyUpdateUrl":"https://web-platform.test:8444/foo.js"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","dailyUpdateUrl":"relative/path"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","executionMode":"compatibility"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","executionMode":"groupByOrigin"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","executionMode":"unknownValuesAreValid"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsUrl":null}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsUrl":"https://www.web-platform.test/foo.js"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsUrl":"data:application/json,{}"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsUrl":"https://web-platform.test:8444/foo.js"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsUrl":"relative/path"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsKeys":null}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsKeys":{}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsKeys":[]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsKeys":["a",4,"Foo"]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","userBiddingSignals":null}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","userBiddingSignals":"foo"}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","userBiddingSignals":15}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","userBiddingSignals":[5,"foo",[-6.4,{"a":"b"}]]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","userBiddingSignals":{"a":[5,"foo",{"b":-6.4}]}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":null}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":5}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":{}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{"1":[2,3],"metadata":[{"a":"b"},"c"]}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{"renderUrl":"https://somewhere.test/"}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{"renderUrl":"https://somewhere.test/"},{"renderUrl":"https://somewhere-else.test/"}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{"renderUrl":"https://somewhere.test/","metadata":null}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{"renderUrl":"https://somewhere.test/","metadata":null,"someOtherField":"foo"}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":null}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":5}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":{}}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{"1":[2,3],"metadata":[{"a":"b"},"c"]}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{"renderUrl":"https://somewhere.test/"}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{"renderUrl":"https://somewhere.test/"},{"renderUrl":"https://elsewhere.test/"}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{"renderUrl":"https://somewhere.test/","metadata":null}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{"renderUrl":"https://somewhere.test/","metadata":null,"someOtherField":"foo"}]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","extra":false,"fields":{"do":"not"},"matter":"at","all":[3,4,5]}} promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Join same interest group overwrites old matching group. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Leaving interest group actually leaves interest group. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Leave an interest group that was never joined. promise_test: Unhandled rejection with value: object "TypeError: navigator.leaveAdInterestGroup is not a function"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js
new file mode 100644
index 0000000..e967d926
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js
@@ -0,0 +1,542 @@
+// META: script=/resources/testdriver.js
+// META: script=/common/utils.js
+// META: script=resources/fledge-util.js
+
+// These tests are focused on joinAdInterestGroup() and leaveAdInterestGroup().
+// Most join tests do not run auctions, but instead only check the result of
+// the returned promise, since testing that interest groups are actually
+// joined, and that each interestGroup field behaves as intended, are covered
+// by other tests.
+
+// Minimal fields needed for a valid interest group. Used in most test cases.
+const BASE_INTEREST_GROUP = {
+  owner: window.location.origin,
+  name: 'default name',
+}
+
+// Each test case attempts to join and then leave an interest group, checking
+// if any exceptions are thrown from either operation.
+const SIMPLE_JOIN_LEAVE_TEST_CASES = [
+  { expectJoinSucces: false,
+    expectLeaveSucces: false,
+    interestGroup: null
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: false,
+    interestGroup: {}
+  },
+
+  // Basic success test case.
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: BASE_INTEREST_GROUP
+  },
+
+  // "owner" tests
+  { expectJoinSucces: false,
+    expectLeaveSucces: false,
+    interestGroup: { name: 'default name' }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: false,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     owner: null}
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: false,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     owner: window.location.origin.replace('https', 'http')}
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: false,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     owner: window.location.origin.replace('https', 'wss')}
+  },
+  // Cross-origin joins and leaves are not allowed without .well-known
+  // permissions.
+  { expectJoinSucces: false,
+    expectLeaveSucces: false,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     owner: '{{hosts[][www]}}' }
+  },
+
+  // "name" tests
+  { expectJoinSucces: false,
+    expectLeaveSucces: false,
+    interestGroup: { owner: window.location.origin }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     name: ''}
+  },
+
+  // "priority" tests
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     priority: 1}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     priority: 0}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     priority: -1.5}
+  },
+
+  // "priorityVector" tests
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     priorityVector: null}
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     priorityVector: 1}
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     priorityVector: {a: 'apple'}}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     priorityVector: {}}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     priorityVector: {a: 1}}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     priorityVector: {'a': 1, 'b': -4.5, 'a.b': 0}}
+  },
+
+  // "prioritySignalsOverrides" tests
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     prioritySignalsOverrides: null}
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     prioritySignalsOverrides: 1}
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     prioritySignalsOverrides: {a: 'apple'}}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     prioritySignalsOverrides: {}}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     prioritySignalsOverrides: {a: 1}}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     prioritySignalsOverrides: {'a': 1, 'b': -4.5, 'a.b': 0}}
+  },
+
+  // "enableBiddingSignalsPrioritization" tests
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     enableBiddingSignalsPrioritization: true}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     enableBiddingSignalsPrioritization: false}
+  },
+
+  // "biddingLogicUrl" tests
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     biddingLogicUrl: null }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     biddingLogicUrl: 'https://{{hosts[][www]}}/foo.js' }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     biddingLogicUrl: 'data:text/javascript,Foo' }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     biddingLogicUrl: `${window.location.origin}/foo.js`}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     biddingLogicUrl: 'relative/path' }
+  },
+
+  // "biddingWasmHelperUrl" tests
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     biddingWasmHelperUrl: null }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     biddingWasmHelperUrl: 'https://{{hosts[][www]}}/foo.js' }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     biddingWasmHelperUrl: 'data:application/wasm,Foo' }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     biddingWasmHelperUrl: `${window.location.origin}/foo.js`}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     biddingWasmHelperUrl: 'relative/path' }
+  },
+
+  // "dailyUpdateUrl" tests
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     dailyUpdateUrl: null }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     dailyUpdateUrl: 'https://{{hosts[][www]}}/foo.js' }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     dailyUpdateUrl: 'data:application/wasm,Foo' }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     dailyUpdateUrl: `${window.location.origin}/foo.js`}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     dailyUpdateUrl: 'relative/path' }
+  },
+
+  // "executionMode" tests
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     executionMode: 'compatibility' }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     executionMode: 'groupByOrigin' }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     executionMode: 'unknownValuesAreValid' }
+  },
+
+  // "trustedBiddingSignalsUrl" tests
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     trustedBiddingSignalsUrl: null }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     trustedBiddingSignalsUrl: 'https://{{hosts[][www]}}/foo.js' }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     trustedBiddingSignalsUrl: 'data:application/json,{}' }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     trustedBiddingSignalsUrl: `${window.location.origin}/foo.js`}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     trustedBiddingSignalsUrl: 'relative/path' }
+  },
+
+  // "trustedBiddingSignalsKeys" tests
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     trustedBiddingSignalsKeys: null }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     trustedBiddingSignalsKeys: {}}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     trustedBiddingSignalsKeys: []}
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     trustedBiddingSignalsKeys: ['a', 4, 'Foo']}
+  },
+
+  // "userBiddingSignals" tests
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     userBiddingSignals: null }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     userBiddingSignals: 'foo' }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     userBiddingSignals: 15 }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     userBiddingSignals: [5, 'foo', [-6.4, {a: 'b'}]] }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     userBiddingSignals: {a: [5, 'foo', {b: -6.4}] }}
+  },
+
+  // "ads" tests
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     ads: null }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     ads: 5 }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     ads: {} }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     ads: [] }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     ads: [{}] }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     ads: [{metadata: [{a:'b'}, 'c'], 1:[2,3]}] }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     ads: [{renderUrl: 'https://somewhere.test/'}] }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     ads: [{renderUrl: 'https://somewhere.test/'},
+                           {renderUrl: 'https://somewhere-else.test/'}] }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     ads: [{renderUrl: 'https://somewhere.test/',
+                            metadata: null}] }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     ads: [{renderUrl: 'https://somewhere.test/',
+                            metadata: null,
+                            someOtherField: 'foo'}] }
+  },
+
+  // "adComponents" tests
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     adComponents: null }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     adComponents: 5 }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     adComponents: {} }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     adComponents: [] }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     adComponents: [{}] }
+  },
+  { expectJoinSucces: false,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     adComponents: [{metadata: [{a:'b'}, 'c'], 1:[2,3]}] }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     adComponents: [{renderUrl: 'https://somewhere.test/'}] }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     adComponents: [{renderUrl: 'https://somewhere.test/'},
+                                    {renderUrl: 'https://elsewhere.test/'}] }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     adComponents: [{renderUrl: 'https://somewhere.test/',
+                                     metadata: null}] }
+  },
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     adComponents: [{renderUrl: 'https://somewhere.test/',
+                                     metadata: null,
+                                     someOtherField: 'foo'}] }
+  },
+
+  // Miscellaneous tests.
+  { expectJoinSucces: true,
+    expectLeaveSucces: true,
+    interestGroup: { ...BASE_INTEREST_GROUP,
+                     extra: false,
+                     fields: {do:'not'},
+                     matter: 'at',
+                     all: [3,4,5] }
+  },
+];
+
+for (testCase of SIMPLE_JOIN_LEAVE_TEST_CASES) {
+  promise_test((async (testCase) => {
+    const INTEREST_GROUP_LIFETIME_SECS = 1;
+
+    let join_promise = navigator.joinAdInterestGroup(testCase.interestGroup,
+                                                     INTEREST_GROUP_LIFETIME_SECS);
+    assert_true(join_promise instanceof Promise, "join should return a promise");
+    if (testCase.expectJoinSucces) {
+      assert_equals(await join_promise, undefined);
+    } else {
+      let joinExceptionThrown = false;
+      try {
+        await join_promise;
+      } catch (e) {
+        joinExceptionThrown = true;
+      }
+      assert_true(joinExceptionThrown, 'Exception not thrown on join.');
+    }
+
+    let leave_promise = navigator.leaveAdInterestGroup(testCase.interestGroup,
+                                                       INTEREST_GROUP_LIFETIME_SECS);
+    assert_true(leave_promise instanceof Promise, "leave should return a promise");
+    if (testCase.expectLeaveSucces) {
+      assert_equals(await leave_promise, undefined);
+    } else {
+      let leaveExceptionThrown = false;
+      try {
+        await leave_promise;
+      } catch (e) {
+        leaveExceptionThrown = true;
+      }
+      assert_true(leaveExceptionThrown, 'Exception not thrown on leave.');
+    }
+  }).bind(undefined, testCase), 'Join and leave interest group: ' + JSON.stringify(testCase));
+}
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+
+  // Joining an interest group without a bidding script and run an auction.
+  // There should be no winner.
+  await joinInterestGroup(test, uuid, { biddingLogicUrl: null });
+  assert_equals(null, await runBasicFledgeAuction(test, uuid),
+                'Auction unexpectedly had a winner');
+
+  // Joining an interest group with a bidding script and the same owner/name as
+  // the previously joined interest group, and re-run the auction. There should
+  // be a winner this time.
+  await joinInterestGroup(test, uuid);
+  let url = await runBasicFledgeAuction(test, uuid);
+  assert_true('string' === typeof url,
+              'Wrong value type returned from auction: ' + typeof url);
+
+  // Re-join the first interest group, and re-run the auction. The interest
+  // group should be overwritten again, and there should be no winner.
+  await joinInterestGroup(test, uuid, { biddingLogicUrl: null });
+  assert_equals(null, await runBasicFledgeAuction(test, uuid),
+                'Auction unexpectedly had a winner');
+}, 'Join same interest group overwrites old matching group.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+
+  // Join an interest group, run an auction to make sure it was joined.
+  await joinInterestGroup(test, uuid);
+  let url = await runBasicFledgeAuction(test, uuid);
+  assert_true('string' === typeof url,
+              'Wrong value type returned from auction: ' + typeof url);
+
+  // Leave the interest group, re-run the auction. There should be no winner.
+  await leaveInterestGroup();
+  assert_equals(null, await runBasicFledgeAuction(test, uuid),
+                'Auction unexpectedly had a winner');
+}, 'Leaving interest group actually leaves interest group.');
+
+promise_test(async test => {
+  // This should not throw.
+  await leaveInterestGroup({ name: 'Never join group' });
+}, 'Leave an interest group that was never joined.');
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/no-winner.https.sub.window-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/no-winner.https.sub.window-expected.txt
new file mode 100644
index 0000000..07b58b7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/no-winner.https.sub.window-expected.txt
@@ -0,0 +1,39 @@
+This is a testharness.js-based test.
+FAIL Bidding logic script: error=http-error promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: error=no-content-type promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: error=wrong-content-type promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: error=bad-allow-fledge promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: error=fledge-not-allowed promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: error=no-allow-fledge promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: error=no-body promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: error=no-generateBid promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=throw 1; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=This does not compile promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=while(1); promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=return 5; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=return "Foo"; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=return interestGroup.ads[0].renderUrl; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=return {bid: 1, render: "https://not-in-ads-array.test/"}; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=return {bid: 1}; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=return {render: interestGroup.ads[0].renderUrl}; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=return {bid:0, render: interestGroup.ads[0].renderUrl}; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidding logic script: generateBid=return {bid:-1, render: interestGroup.ads[0].renderUrl}; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: error=http-error promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: error=no-content-type promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: error=wrong-content-type promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: error=bad-allow-fledge promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: error=fledge-not-allowed promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: error=no-allow-fledge promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: error=no-body promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: error=no-scoreAd promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: scoreAd=throw 1; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: scoreAd=This does not compile promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: scoreAd=while(1); promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: scoreAd=return "Foo"; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: scoreAd=return {desirability: "Foo"}; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: scoreAd=return 0; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: scoreAd=return -1; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: scoreAd=return {desirability: 0}; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Decision logic script: scoreAd=return {desirability: -1}; promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/no-winner.https.sub.window.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/no-winner.https.sub.window.js
new file mode 100644
index 0000000..4d24b573
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/no-winner.https.sub.window.js
@@ -0,0 +1,76 @@
+// META: script=/resources/testdriver.js
+// META: script=/common/utils.js
+// META: script=resources/fledge-util.js
+
+// The tests in this file focus on simple auctions (one bidder, one seller, one
+// origin, one frame) which have no winning bid, either due to errors or due to
+// there being no bids, except where tests fit better with another set of tests.
+
+// Errors common to bidding and decision logic scripts. These atrings will be
+// appended to script URLs to make the python scripts that generate bidding
+// logic and decision logic scripts with errors.
+const COMMON_SCRIPT_ERRORS = [
+  'error=http-error',
+  'error=no-content-type',
+  'error=wrong-content-type',
+  'error=bad-allow-fledge',
+  'error=fledge-not-allowed',
+  'error=no-allow-fledge',
+  'error=no-body',
+];
+
+const BIDDING_LOGIC_SCRIPT_ERRORS = [
+  ...COMMON_SCRIPT_ERRORS,
+  'error=no-generateBid',
+  'generateBid=throw 1;',
+  'generateBid=This does not compile',
+  // Default timeout test. Doesn't check how long timing out takes.
+  'generateBid=while(1);',
+  // Bad return values:
+  'generateBid=return 5;',
+  'generateBid=return "Foo";',
+  'generateBid=return interestGroup.ads[0].renderUrl;',
+  'generateBid=return {bid: 1, render: "https://not-in-ads-array.test/"};',
+  'generateBid=return {bid: 1};',
+  'generateBid=return {render: interestGroup.ads[0].renderUrl};',
+  // These are not bidding rather than errors.
+  'generateBid=return {bid:0, render: interestGroup.ads[0].renderUrl};',
+  'generateBid=return {bid:-1, render: interestGroup.ads[0].renderUrl};',
+];
+
+const DECISION_LOGIC_SCRIPT_ERRORS = [
+  ...COMMON_SCRIPT_ERRORS,
+  'error=no-scoreAd',
+  'scoreAd=throw 1;',
+  'scoreAd=This does not compile',
+  // Default timeout test. Doesn't check how long timing out takes.
+  'scoreAd=while(1);',
+  // Bad return values:
+  'scoreAd=return "Foo";',
+  'scoreAd=return {desirability: "Foo"};',
+  // These are rejecting the bid rather than errors.
+  'scoreAd=return 0;',
+  'scoreAd=return -1;',
+  'scoreAd=return {desirability: 0};',
+  'scoreAd=return {desirability: -1};',
+];
+
+for (error of BIDDING_LOGIC_SCRIPT_ERRORS) {
+  promise_test((async (error, test) => {
+    let biddingLogicUrl = `${BASE_URL}resources/bidding-logic.sub.py?${error}`;
+    await runBasicFledgeTestExpectingNoWinner(
+      test,
+      {interestGroupOverrides: {biddingLogicUrl: biddingLogicUrl}}
+    );
+  }).bind(undefined, error), `Bidding logic script: ${error}`);
+}
+
+for (error of DECISION_LOGIC_SCRIPT_ERRORS) {
+  promise_test((async (error, test) => {
+    let decisionLogicUrl =
+        `${BASE_URL}resources/decision-logic.sub.py?${error}`;
+    await runBasicFledgeTestExpectingNoWinner(
+      test, {auctionConfigOverrides: {decisionLogicUrl: decisionLogicUrl}}
+    );
+  }).bind(undefined, error), `Decision logic script: ${error}`);
+}
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/reporting-arguments.https.sub.window-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/reporting-arguments.https.sub.window-expected.txt
new file mode 100644
index 0000000..ff7c8c4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/reporting-arguments.https.sub.window-expected.txt
@@ -0,0 +1,23 @@
+This is a testharness.js-based test.
+FAIL Seller passes number to bidder. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Seller passes string to bidder. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Seller passes array to bidder. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Seller passes object to bidder. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.topWindowHostname test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.seller test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.topLevelSeller and browserSignals.componentSeller test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.renderUrl test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.bid test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.desirability test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.topLevelSellerSignals test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.dataVersion test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.modifiedBid test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.highestScoringOtherBid with no other interest groups test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.highestScoringOtherBid with other groups that do not bid. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.highestScoringOtherBid with other bids. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.interestGroupName test. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.madeHighestScoringOtherBid with no other bids. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.madeHighestScoringOtherBid with group that did not bid. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL browserSignals.madeHighestScoringOtherBid with other bid. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/reporting-arguments.https.sub.window.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/reporting-arguments.https.sub.window.js
new file mode 100644
index 0000000..69b7d2f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/reporting-arguments.https.sub.window.js
@@ -0,0 +1,289 @@
+// META: script=/resources/testdriver.js
+// META: script=/common/utils.js
+// META: script=resources/fledge-util.js
+// META: timeout=long
+
+// Simplified version of reportTest() for validating arguments to reporting
+// methods. Only takes expressions to check in reporting methods. "uuid" is
+// optional, and one is generated if not passed one.
+async function runReportArgumentValidationTest(
+    test, reportResultSuccessCondition, reportWinSuccessCondition, uuid) {
+  if (!uuid)
+    uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      reportResultSuccessCondition,
+      `sendReportTo('${createSellerReportUrl(uuid)}');`,
+      // reportWin:
+      reportWinSuccessCondition,
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      [createSellerReportUrl(uuid), createBidderReportUrl(uuid)]
+  );
+}
+
+/////////////////////////////////////////////////////////////////////
+// reportResult() to reportWin() message passing tests
+/////////////////////////////////////////////////////////////////////
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      `sendReportTo('${createSellerReportUrl(uuid)}');
+      return 45;`,
+      // reportWin:
+      'sellerSignals === 45',
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      // expectedReportUrls:
+      [createSellerReportUrl(uuid), createBidderReportUrl(uuid)]
+  );
+}, 'Seller passes number to bidder.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      `sendReportTo('${createSellerReportUrl(uuid)}');
+      return 'foo';`,
+      // reportWin:
+      'sellerSignals === "foo"',
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      // expectedReportUrls:
+      [createSellerReportUrl(uuid), createBidderReportUrl(uuid)]
+  );
+}, 'Seller passes string to bidder.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      `sendReportTo('${createSellerReportUrl(uuid)}');
+      return [3, 1, 2];`,
+      // reportWin:
+      'JSON.stringify(sellerSignals) === "[3,1,2]"',
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      // expectedReportUrls:
+      [createSellerReportUrl(uuid), createBidderReportUrl(uuid)]
+  );
+}, 'Seller passes array to bidder.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      `sendReportTo('${createSellerReportUrl(uuid)}');
+      return {a: 4, b:['c', null, {}]};`,
+      // reportWin:
+      `JSON.stringify(sellerSignals) === '{"a":4,"b":["c",null,{}]}'`,
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      // expectedReportUrls:
+      [createSellerReportUrl(uuid), createBidderReportUrl(uuid)]
+  );
+}, 'Seller passes object to bidder.');
+
+/////////////////////////////////////////////////////////////////////
+// reportResult() / reportWin() browserSignals tests.
+/////////////////////////////////////////////////////////////////////
+
+promise_test(async test => {
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.topWindowHostname === "${window.location.hostname}"`,
+    // reportWinSuccessCondition:
+    `browserSignals.topWindowHostname === "${window.location.hostname}"`
+  );
+}, 'browserSignals.topWindowHostname test.');
+
+promise_test(async test => {
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.seller === undefined`,
+    // reportWinSuccessCondition:
+    `browserSignals.seller === "${window.location.origin}"`
+  );
+}, 'browserSignals.seller test.');
+
+promise_test(async test => {
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.topLevelSeller === undefined &&
+     browserSignals.componentSeller === undefined`,
+    // reportWinSuccessCondition:
+    `browserSignals.topLevelSeller === undefined &&
+     browserSignals.componentSeller === undefined`
+  );
+}, 'browserSignals.topLevelSeller and browserSignals.componentSeller test.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.renderUrl === "${createRenderUrl(uuid)}"`,
+    // reportWinSuccessCondition:
+    `browserSignals.renderUrl === "${createRenderUrl(uuid)}"`,
+    uuid
+  );
+}, 'browserSignals.renderUrl test.');
+
+promise_test(async test => {
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.bid === 9`,
+    // reportWinSuccessCondition:
+    `browserSignals.bid === 9`
+  );
+}, 'browserSignals.bid test.');
+
+promise_test(async test => {
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.desirability === 18`,
+    // reportWinSuccessCondition:
+    `browserSignals.desirability === undefined`
+  );
+}, 'browserSignals.desirability test.');
+
+promise_test(async test => {
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.topLevelSellerSignals === undefined`,
+    // reportWinSuccessCondition:
+    `browserSignals.topLevelSellerSignals === undefined`
+  );
+}, 'browserSignals.topLevelSellerSignals test.');
+
+promise_test(async test => {
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.dataVersion === undefined`,
+    // reportWinSuccessCondition:
+    `browserSignals.dataVersion === undefined`
+  );
+}, 'browserSignals.dataVersion test.');
+
+promise_test(async test => {
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.modifiedBid === undefined`,
+    // reportWinSuccessCondition:
+    `browserSignals.modifiedBid === undefined`
+  );
+}, 'browserSignals.modifiedBid test.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.highestScoringOtherBid === 0`,
+    // reportWinSuccessCondition:
+    `browserSignals.highestScoringOtherBid === 0`,
+    uuid
+  );
+}, 'browserSignals.highestScoringOtherBid with no other interest groups test.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await joinInterestGroup(test, uuid,
+                          { biddingLogicUrl: createBiddingScriptUrl({bid: -2}),
+                            name: 'other interest group 1' });
+  await joinInterestGroup(test, uuid,
+                          { biddingLogicUrl: createBiddingScriptUrl({bid: -1}),
+                            name: 'other interest group 2' });
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.highestScoringOtherBid === 0`,
+    // reportWinSuccessCondition:
+    `browserSignals.highestScoringOtherBid === 0`,
+    uuid
+  );
+}, 'browserSignals.highestScoringOtherBid with other groups that do not bid.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await joinInterestGroup(test, uuid,
+                          { biddingLogicUrl: createBiddingScriptUrl({bid: 2}),
+                            name: 'other interest group 1' });
+  await joinInterestGroup(test, uuid,
+                          { biddingLogicUrl: createBiddingScriptUrl({bid: 5}),
+                            name: 'other interest group 2' });
+  await joinInterestGroup(test, uuid,
+                          { biddingLogicUrl: createBiddingScriptUrl({bid: 2}),
+                            name: 'other interest group 3' });
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.highestScoringOtherBid === 5`,
+    // reportWinSuccessCondition:
+    `browserSignals.highestScoringOtherBid === 5`,
+    uuid
+  );
+}, 'browserSignals.highestScoringOtherBid with other bids.');
+
+promise_test(async test => {
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.interestGroupName === undefined`,
+    // reportWinSuccessCondition:
+    `browserSignals.interestGroupName === "default name"`
+  );
+}, 'browserSignals.interestGroupName test.');
+
+promise_test(async test => {
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.madeHighestScoringOtherBid === undefined`,
+    // reportWinSuccessCondition:
+    `browserSignals.madeHighestScoringOtherBid === false`
+  );
+}, 'browserSignals.madeHighestScoringOtherBid with no other bids.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await joinInterestGroup(test, uuid,
+                          { biddingLogicUrl: createBiddingScriptUrl({bid: -1}),
+                            name: 'other interest group 2' });
+  await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.madeHighestScoringOtherBid === undefined`,
+    // reportWinSuccessCondition:
+    `browserSignals.madeHighestScoringOtherBid === false`
+  );
+}, 'browserSignals.madeHighestScoringOtherBid with group that did not bid.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await joinInterestGroup(test, uuid,
+    { biddingLogicUrl: createBiddingScriptUrl({bid: 1}),
+      name: 'other interest group 2' });
+await runReportArgumentValidationTest(
+    test,
+    // reportResultSuccessCondition:
+    `browserSignals.madeHighestScoringOtherBid === undefined`,
+    // reportWinSuccessCondition:
+    `browserSignals.madeHighestScoringOtherBid === true`,
+    uuid
+  );
+}, 'browserSignals.madeHighestScoringOtherBid with other bid.');
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/bidding-logic.sub.py b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/bidding-logic.sub.py
new file mode 100644
index 0000000..dfc4d86
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/bidding-logic.sub.py
@@ -0,0 +1,50 @@
+# General bidding logic script. Depending on query parameters, it can
+# simulate a variety of network errors, and its generateBid() and
+# reportWin() functions can have arbitrary Javascript code injected
+# in them. generateBid() will by default return a bid of 9 for the
+# first ad.
+def main(request, response):
+    error = request.GET.first(b"error", None)
+
+    if error == b"http-error":
+        response.status = (404, b"OK")
+    else:
+        response.status = (200, b"OK")
+
+    if error == b"wrong-content-type":
+        response.headers.set(b"Content-Type", b"application/json")
+    elif error != b"no-content-type":
+        response.headers.set(b"Content-Type", b"application/javascript")
+
+    if error == b"bad-allow-fledge":
+        response.headers.set(b"X-Allow-FLEDGE", b"sometimes")
+    elif error == b"fledge-not-allowed":
+        response.headers.set(b"X-Allow-FLEDGE", b"false")
+    elif error != b"no-allow-fledge":
+        response.headers.set(b"X-Allow-FLEDGE", b"true")
+
+    body = b''
+    if error == b"no-body":
+        return body
+    if error != b"no-generateBid":
+        body += b"""
+            function generateBid(interestGroup, auctionSignals, perBuyerSignals,
+                                trustedBiddingSignals, browserSignals,
+                                directFromSellerSignals) {
+              {{GET[generateBid]}};
+              return {
+                'bid': 9,
+                'render': interestGroup.ads[0].renderUrl
+              };
+            }"""
+    bid = request.GET.first(b"bid", None)
+    if bid != None:
+      body = body.replace(b"9", bid)
+    if error != b"no-reportWin":
+        body += b"""
+            function reportWin(auctionSignals, perBuyerSignals, sellerSignals,
+                              browserSignals, directFromSellerSignals) {
+              {{GET[reportWin]}};
+            }"""
+    return body
+
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/decision-logic.sub.py b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/decision-logic.sub.py
new file mode 100644
index 0000000..8d5303a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/decision-logic.sub.py
@@ -0,0 +1,47 @@
+# General decision logic script. Depending on query parameters, it can
+# simulate a variety of network errors, and its scoreAd() and
+# reportResult() functions can have arbitrary Javascript code injected
+# in them. scoreAd() will by default return a desirability score of
+# twice the bid for each ad, as long as the ad URL ends with the uuid.
+def main(request, response):
+    error = request.GET.first(b"error", None)
+
+    if error == b"http-error":
+        response.status = (404, b"OK")
+    else:
+        response.status = (200, b"OK")
+
+    if error == b"wrong-content-type":
+        response.headers.set(b"Content-Type", b"application/json")
+    elif error != b"no-content-type":
+        response.headers.set(b"Content-Type", b"application/javascript")
+
+    if error == b"bad-allow-fledge":
+        response.headers.set(b"X-Allow-FLEDGE", b"sometimes")
+    elif error == b"fledge-not-allowed":
+        response.headers.set(b"X-Allow-FLEDGE", b"false")
+    elif error != b"no-allow-fledge":
+        response.headers.set(b"X-Allow-FLEDGE", b"true")
+
+    body = b''
+    if error == b"no-body":
+        return body
+    if error != b"no-scoreAd":
+        body += b"""
+            function scoreAd(adMetadata, bid, auctionConfig, trustedScoringSignals,
+                            browserSignals) {
+              // Don't bid on interest group with the wrong uuid. This is to prevent
+              // left over interest groups from other tests from affecting auction
+              // results.
+              if (!browserSignals.renderUrl.endsWith('{{GET[uuid]}}'))
+                return 0;
+
+              {{GET[scoreAd]}};
+              return {desirability: 2 * bid, allowComponentAuction: true};
+            }"""
+    if error != b"no-reportResult":
+        body += b"""
+            function reportResult(auctionConfig, browserSignals, directFromSellerSignals) {
+              {{GET[reportResult]}};
+            }"""
+    return body
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fenced_frame.sub.html b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fenced_frame.sub.html
new file mode 100644
index 0000000..eaca3f49f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fenced_frame.sub.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<html>
+<body>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fenced_frame.sub.html.headers b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fenced_frame.sub.html.headers
new file mode 100644
index 0000000..bc74b58
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fenced_frame.sub.html.headers
@@ -0,0 +1,2 @@
+Content-Type: text/html
+Supports-Loading-Mode: fenced-frame
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fledge-util.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fledge-util.js
new file mode 100644
index 0000000..9f95a59e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fledge-util.js
@@ -0,0 +1,275 @@
+const FULL_URL = window.location.href;
+const BASE_URL = FULL_URL.substring(0, FULL_URL.lastIndexOf('/') + 1);
+const BASE_PATH = (new URL(BASE_URL)).pathname;
+
+const DEFAULT_INTEREST_GROUP_NAME = 'default name';
+
+// Creates a URL that will be sent to the URL request tracker script.
+// `uuid` is used to identify the stash shard to use.
+// `dispatch` affects what the tracker script does.
+// `id` can be used to uniquely identify tracked requests. It has no effect
+//     on behavior of the script; it only serves to make the URL unique.
+function createTrackerUrl(origin, uuid, dispatch, id = null) {
+  let url = new URL(`${origin}${BASE_PATH}resources/request_tracker.py`);
+  url.searchParams.append('uuid', uuid);
+  url.searchParams.append('dispatch', dispatch);
+  if (id)
+    url.searchParams.append('id', id);
+  return url.toString();
+}
+
+// Create tracked bidder/seller URLs. The only difference is the prefix added
+// to the `id` passed to createTrackerUrl. The optional `id` field allows
+// multiple bidder/seller report URLs to be distinguishable from each other.
+function createBidderReportUrl(uuid, id = '1') {
+  return createTrackerUrl(window.location.origin, uuid, `track_get`,
+                          `bidder_report_${id}`);
+}
+function createSellerReportUrl(uuid, id = '1') {
+  return createTrackerUrl(window.location.origin, uuid, `track_get`,
+                          `seller_report_${id}`);
+}
+
+// Generates a UUID and registers a cleanup method with the test fixture to
+// request a URL from the request tracking script that clears all data
+// associated with the generated uuid when requested.
+function generateUuid(test) {
+  let uuid = token();
+  test.add_cleanup(async () => {
+    let cleanupUrl = createTrackerUrl(window.location.origin, uuid, 'clean_up');
+    let response = await fetch(cleanupUrl, {credentials: 'omit', mode: 'cors'});
+    assert_equals(await response.text(), 'cleanup complete',
+                  `Sever state cleanup failed`);
+  });
+  return uuid;
+}
+
+// Repeatedly requests "request_list" URL until exactly the URLs listed
+// in "expectedRequests" have been observed by the request tracker script (in
+// any order, since report URLs are not guaranteed to be sent in any order).
+//
+// If any other strings are received from the tracking script, or the tracker
+// script reports an error, fails the test.
+async function waitForObservedRequests(uuid, expectedRequests) {
+  let trackedRequestsUrl = createTrackerUrl(window.location.origin, uuid,
+                                            'request_list');
+  // Sort array for easier comparison, since order doesn't matter.
+  expectedRequests.sort();
+  while (true) {
+    let response = await fetch(trackedRequestsUrl,
+                               {credentials: 'omit', mode: 'cors'});
+    let trackerData = await response.json();
+
+    // Fail on fetch error.
+    if (trackerData.error) {
+      throw trackedRequestsUrl + ' fetch failed:' +
+          JSON.stringify(trackerData);
+    }
+
+    // Fail on errors reported by the tracker script.
+    if (trackerData.errors.length > 0) {
+      throw 'Errors reported by request_tracker.py:' +
+          JSON.stringify(trackerData.errors);
+    }
+
+    // If expected number of requests have been observed, compare with list of
+    // all expected requests and exit.
+    let trackedRequests = trackerData.trackedRequests;
+    if (trackedRequests.length == expectedRequests.length) {
+      assert_array_equals(trackedRequests.sort(), expectedRequests);
+      break;
+    }
+
+    // If fewer than total number of expected requests have been observed,
+    // compare what's been received so far, to have a greater chance to fail
+    // rather than hang on error.
+    for (const trackedRequest of trackedRequests) {
+      assert_in_array(trackedRequest, expectedRequests);
+    }
+  }
+}
+
+// Creates a bidding script with the provided code in the method bodies. The
+// bidding script's generateBid() method will return a bid of 9 for the first
+// ad, after the passed in code in the "generateBid" input argument has been
+// run, unless it returns something or throws.
+//
+// The default reportWin() method is empty.
+function createBiddingScriptUrl(params = {}) {
+  let url = new URL(`${BASE_URL}resources/bidding-logic.sub.py`);
+  if (params.generateBid)
+    url.searchParams.append('generateBid', params.generateBid);
+  if (params.reportWin)
+    url.searchParams.append('reportWin', params.reportWin);
+  if (params.error)
+    url.searchParams.append('error', params.error);
+  if (params.bid)
+    url.searchParams.append('bid', params.bid);
+  return url.toString();
+}
+
+// Creates a decision script with the provided code in the method bodies. The
+// decision script's scoreAd() method will reject ads with renderUrls that
+// don't ends with "uuid", and will return a score equal to the bid, after the
+// passed in code in the "scoreAd" input argument has been run, unless it
+// returns something or throws.
+//
+// The default reportResult() method is empty.
+function createDecisionScriptUrl(uuid, params = {}) {
+  let url = new URL(`${BASE_URL}resources/decision-logic.sub.py`);
+  url.searchParams.append('uuid', uuid);
+  if (params.scoreAd)
+    url.searchParams.append('scoreAd', params.scoreAd);
+  if (params.reportResult)
+    url.searchParams.append('reportResult', params.reportResult);
+  if (params.error)
+    url.searchParams.append('error', params.error);
+  return url.toString();
+}
+
+// Creates a renderUrl for an ad that runs the passed in "script". "uuid" has
+// no effect, beyond making the URL distinct between tests, and being verified
+// by the decision logic script before accepting a bid.
+function createRenderUrl(uuid) {
+  let url = new URL(`${BASE_URL}resources/fenced_frame.sub.html`);
+  url.searchParams.append('uuid', uuid);
+  return url.toString();
+}
+
+// Joins an interest group that, by default, is owned by the current frame's
+// origin, is named DEFAULT_INTEREST_GROUP_NAME, has a bidding script that
+// issues a bid of 9 with a renderUrl of "https://not.checked.test/${uuid}",
+// and sends a report to createBidderReportUrl(uuid) if it wins. Waits for the
+// join command to complete. Adds cleanup command to `test` to leave the
+// interest group when the test completes.
+//
+// `interestGroupOverrides` may be used to override fields in the joined
+// interest group.
+async function joinInterestGroup(test, uuid, interestGroupOverrides = {}) {
+  const INTEREST_GROUP_LIFETIME_SECS = 60;
+
+  let interestGroup = {
+    owner: window.location.origin,
+    name: DEFAULT_INTEREST_GROUP_NAME,
+    biddingLogicUrl: createBiddingScriptUrl(
+        { reportWin: `sendReportTo('${createBidderReportUrl(uuid)}');` }),
+    ads: [{renderUrl: createRenderUrl(uuid)}],
+    ...interestGroupOverrides
+  };
+
+  await navigator.joinAdInterestGroup(interestGroup,
+                                      INTEREST_GROUP_LIFETIME_SECS);
+  test.add_cleanup(
+      async () => {await navigator.leaveAdInterestGroup(interestGroup)});
+}
+
+// Similar to joinInterestGroup, but leaves the interest group instead.
+// Generally does not need to be called manually when using
+// "joinInterestGroup()".
+async function leaveInterestGroup(interestGroupOverrides = {}) {
+  let interestGroup = {
+    owner: window.location.origin,
+    name: DEFAULT_INTEREST_GROUP_NAME,
+    ...interestGroupOverrides
+  };
+
+  await navigator.leaveAdInterestGroup(interestGroup);
+}
+
+// Runs a FLEDGE auction and returns the result. By default, the seller is the
+// current frame's origin, and the only buyer is as well. The seller script
+// rejects bids for URLs that don't contain "uuid" (to avoid running into issues
+// with any interest groups from other tests), and reportResult() sends a report
+// to createSellerReportUrl(uuid).
+//
+// `auctionConfigOverrides` may be used to override fields in the auction
+// configuration.
+async function runBasicFledgeAuction(test, uuid, auctionConfigOverrides = {}) {
+  let auctionConfig = {
+    seller: window.location.origin,
+    decisionLogicUrl: createDecisionScriptUrl(
+        uuid,
+        { reportResult: `sendReportTo('${createSellerReportUrl(uuid)}');` }),
+    interestGroupBuyers: [window.location.origin],
+    ...auctionConfigOverrides
+  };
+  return await navigator.runAdAuction(auctionConfig);
+}
+
+// Calls runBasicFledgeAuction(), expecting the auction to have a winner.
+// Creates a fenced frame that will be destroyed on completion of "test", and
+// navigates it to the URN URL returned by the auction. Does not wait for the
+// fenced frame to finish loading, since there's no API that can do that.
+async function runBasicFledgeAuctionAndNavigate(test, uuid,
+                                                auctionConfigOverrides = {}) {
+  let url = await runBasicFledgeAuction(test, uuid, auctionConfigOverrides);
+  assert_equals(typeof url, 'string',
+                `Wrong value type returned from auction: ${typeof url}`);
+
+  let fencedFrame = document.createElement('fencedframe');
+  fencedFrame.mode = 'opaque-ads';
+  fencedFrame.src = url;
+  document.body.appendChild(fencedFrame);
+  test.add_cleanup(() => { document.body.removeChild(fencedFrame); });
+}
+
+// Joins an interest group and runs an auction, expecting no winner to be
+// returned. "testConfig" can optionally modify the interest group or
+// auctionConfig.
+async function runBasicFledgeTestExpectingNoWinner(test, testConfig = {}) {
+  const uuid = generateUuid(test);
+  await joinInterestGroup(test, uuid, testConfig.interestGroupOverrides);
+  let result = await runBasicFledgeAuction(
+      test, uuid, testConfig.auctionConfigOverrides);
+  assert_equals(result, null, 'Auction unexpectedly had a winner');
+}
+
+// Test helper for report phase of auctions that lets the caller specify the
+// body of reportResult() and reportWin(). Passing in null will cause there
+// to be no reportResult() or reportWin() method.
+//
+// If the "SuccessCondition" fields are non-null and evaluate to false in
+// the corresponding reporting method, the report is sent to an error URL.
+// Otherwise, the corresponding 'reportResult' / 'reportWin' values are run.
+//
+// Requesting error report URLs causes waitForObservedRequests() to throw
+// rather than hang.
+async function runReportTest(test, uuid, reportResultSuccessCondition,
+                             reportResult, reportWinSuccessCondition, reportWin,
+                             expectedReportUrls) {
+  if (reportResultSuccessCondition) {
+    reportResult = `if (!(${reportResultSuccessCondition})) {
+                      sendReportTo('${createSellerReportUrl(uuid, 'error')}');
+                      return false;
+                    }
+                    ${reportResult}`;
+  }
+  let decisionScriptUrlParams = {};
+  if (reportResult !== null)
+    decisionScriptUrlParams.reportResult = reportResult;
+  else
+    decisionScriptUrlParams.error = 'no-reportResult';
+
+  if (reportWinSuccessCondition) {
+    reportWin = `if (!(${reportWinSuccessCondition})) {
+                   sendReportTo('${createSellerReportUrl(uuid, 'error')}');
+                   return false;
+                 }
+                 ${reportWin}`;
+  }
+  let biddingScriptUrlParams = {};
+  if (reportWin !== null)
+    biddingScriptUrlParams.reportWin = reportWin;
+  else
+    biddingScriptUrlParams.error = 'no-reportWin';
+
+  let interestGroupOverrides =
+      { biddingLogicUrl: createBiddingScriptUrl(biddingScriptUrlParams) };
+
+  await joinInterestGroup(test, uuid, interestGroupOverrides);
+  await runBasicFledgeAuctionAndNavigate(
+      test, uuid,
+      { decisionLogicUrl: createDecisionScriptUrl(
+                              uuid, decisionScriptUrlParams) });
+  await waitForObservedRequests(uuid, expectedReportUrls);
+}
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/request_tracker.py b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/request_tracker.py
new file mode 100644
index 0000000..5fedd72
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/request_tracker.py
@@ -0,0 +1,78 @@
+import mimetypes
+import os
+import json
+import wptserve.stash
+
+from wptserve.utils import isomorphic_decode, isomorphic_encode
+
+# Test server that tracks requests it has previously seen, keyed by a token.
+#
+# All requests have a "dispatch" field indicating what to do, and a "uuid"
+# field which should be unique for each test, to avoid tests that fail to
+# clean up after themselves, or that are running concurrently, from interfering
+# with other tests.
+#
+# Each uuid has a stash entry with a dictionary with two entries:
+#     "trackedRequests" is a list of all observed requested URLs with a
+#         dispatch of "track_get".
+#     "errors" is a list of an errors that occurred.
+#
+# A dispatch of "request_list" will return the "trackedRequests" dictionary
+# associated with the in uuid, as a JSON string.
+#
+# A dispatch of "clean_up" will delete all information associated with the uuid.
+def main(request, response):
+    # Don't cache responses, since tests expect duplicate requests to always
+    # reach the server.
+    response.headers.set(b"Cache-Control", b"no-store")
+
+    dispatch = request.GET.first(b"dispatch", None)
+    uuid = request.GET.first(b"uuid", None)
+
+    if not uuid or not dispatch:
+        return simple_response(request, response, 404, b"Not found",
+                               b"Invalid query parameters")
+
+    stash = request.server.stash
+    with stash.lock:
+        # Take ownership of stashed entry, if any. This removes the entry of the
+        # stash.
+        server_state = stash.take(uuid) or {"trackedRequests": [], "errors": []}
+
+        # Clear the entire stash. No work to do, since stash entry was already
+        # removed.
+        if dispatch == b"clean_up":
+            return simple_response(request, response, 200, b"OK",
+                                   b"cleanup complete")
+
+        # Return the list of entries in the stash. Need to add data back to the
+        # stash first.
+        if dispatch == b"request_list":
+            stash.put(uuid, server_state)
+            return simple_response(request, response, 200, b"OK",
+                                   json.dumps(server_state))
+
+        # Tracks a request that's expected to be a GET.
+        if dispatch == b"track_get":
+            if request.method != "GET":
+                server_state["errors"].append(
+                    request.url + " has wrong method: " + request.method)
+            else:
+                server_state["trackedRequests"].append(request.url)
+
+            stash.put(uuid, server_state)
+            return simple_response(request, response, 200, b"OK", b"")
+
+        # Report unrecognized dispatch line.
+        server_state["errors"].append(
+            request.url + " request with unknown dispatch value received: " +
+            dispatch.decode("utf-8"))
+        stash.put(uuid, server_state)
+        return simple_response(request, response, 404, b"Not Found",
+                               b"Unrecognized dispatch parameter: " + dispatch)
+
+def simple_response(request, response, status_code, status_message, body,
+                    content_type=b"text/plain"):
+    response.status = (status_code, status_message)
+    response.headers.set(b"Content-Type", content_type)
+    return body
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/send-report-to.https.sub.window-expected.txt b/third_party/blink/web_tests/external/wpt/fledge/tentative/send-report-to.https.sub.window-expected.txt
new file mode 100644
index 0000000..843c347
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/send-report-to.https.sub.window-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+FAIL Both send reports, seller passes nothing to bidder. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Only seller sends a report promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Only seller sends a report, bidder throws an exception promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Only seller sends a report, bidder has no reportWin() method promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Only bidder sends a report promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Only bidder sends a report, seller passes a message to bidder promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Only bidder sends a report, seller throws an exception promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Only bidder sends a report, seller has no reportResult() method promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Seller calls sendReportTo() twice, which throws an exception. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+FAIL Bidder calls sendReportTo() twice, which throws an exception. promise_test: Unhandled rejection with value: object "TypeError: navigator.joinAdInterestGroup is not a function"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/send-report-to.https.sub.window.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/send-report-to.https.sub.window.js
new file mode 100644
index 0000000..bb0e7873a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/send-report-to.https.sub.window.js
@@ -0,0 +1,161 @@
+// META: script=/resources/testdriver.js
+// META: script=/common/utils.js
+// META: script=resources/fledge-util.js
+// META: timeout=long
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      `sendReportTo('${createSellerReportUrl(uuid)}');`,
+      // reportWin:
+      'sellerSignals === null',
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      [createSellerReportUrl(uuid), createBidderReportUrl(uuid)]
+  );
+}, 'Both send reports, seller passes nothing to bidder.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      `sendReportTo('${createSellerReportUrl(uuid)}');`,
+      // reportWin:
+      null,
+      '',
+      // expectedReportUrls:
+      [createSellerReportUrl(uuid)]
+  );
+}, 'Only seller sends a report');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      `sendReportTo('${createSellerReportUrl(uuid)}');`,
+      // reportWin:
+      null,
+      'throw new Error("Very serious exception")',
+      // expectedReportUrls:
+      [createSellerReportUrl(uuid)]
+  );
+}, 'Only seller sends a report, bidder throws an exception');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      `sendReportTo('${createSellerReportUrl(uuid)}');`,
+      // reportWin:
+      null,
+      null,
+      // expectedReportUrls:
+      [createSellerReportUrl(uuid)]
+  );
+}, 'Only seller sends a report, bidder has no reportWin() method');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      '',
+      // reportWin:
+      'sellerSignals === null',
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      // expectedReportUrls:
+      [createBidderReportUrl(uuid)]
+  );
+}, 'Only bidder sends a report');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      'return "foo";',
+      // reportWin:
+      'sellerSignals === "foo"',
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      // expectedReportUrls:
+      [createBidderReportUrl(uuid)]
+  );
+}, 'Only bidder sends a report, seller passes a message to bidder');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      'throw new Error("Very serious exception")',
+      // reportWin:
+      'sellerSignals === null',
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      // expectedReportUrls:
+      [createBidderReportUrl(uuid)]
+  );
+}, 'Only bidder sends a report, seller throws an exception');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      null,
+      // reportWin:
+      'sellerSignals === null',
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      // expectedReportUrls:
+      [createBidderReportUrl(uuid)]
+  );
+}, 'Only bidder sends a report, seller has no reportResult() method');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      `sendReportTo('${createSellerReportUrl(uuid)}');
+       sendReportTo('${createSellerReportUrl(uuid)}');
+       return 5;`,
+      // reportWin:
+      'sellerSignals === null',
+      `sendReportTo('${createBidderReportUrl(uuid)}');`,
+      // expectedReportUrls:
+      [createBidderReportUrl(uuid)]
+  );
+}, 'Seller calls sendReportTo() twice, which throws an exception.');
+
+promise_test(async test => {
+  const uuid = generateUuid(test);
+  await runReportTest(
+      test, uuid,
+      // reportResult:
+      null,
+      `sendReportTo('${createSellerReportUrl(uuid)}');`,
+      // reportWin:
+      null,
+      `sendReportTo('${createBidderReportUrl(uuid)}');
+       sendReportTo('${createBidderReportUrl(uuid)}');`,
+      // expectedReportUrls:
+      [createSellerReportUrl(uuid)]
+  );
+  // Seller reports may be sent before bidder reports, since reportWin()
+  // takes output from reportResult() as input. Wait to make sure the
+  // bidder report URL really is not being requested.
+  await new Promise(resolve => test.step_timeout(resolve, 200));
+  await waitForObservedRequests(uuid, [createSellerReportUrl(uuid)]);
+}, 'Bidder calls sendReportTo() twice, which throws an exception.');
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/presentation-request.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/presentation-request.html
index 62829556..18475a3 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/presentation-request.html
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/resources/presentation-request.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="utils.js"></script>
 <script>
 
 assert_true(document.prerendering);
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-presentation-request.https-expected.txt b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-presentation-request.https-expected.txt
deleted file mode 100644
index 8b13789..0000000
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/restriction-presentation-request.https-expected.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-permission.sub.https.window.js b/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-permission.sub.https.window.js
index 8279406..f0aadf48 100644
--- a/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-permission.sub.https.window.js
+++ b/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-permission.sub.https.window.js
@@ -4,16 +4,17 @@
 'use strict';
 
 (async function() {
-  // This is cross-domain from the current document.
+  // These are cross-domain from the current document.
   const wwwAlt = "https://{{hosts[alt][www]}}:{{ports[https][0]}}";
+  const www1Alt = "https://{{hosts[alt][www1]}}:{{ports[https][0]}}";
+  const responder_html = "/storage-access-api/resources/script-with-cookie-header.py?script=embedded_responder.js";
 
   if (window === window.top) {
     // Test the interaction between two (same-origin) iframes.
     promise_test(async (t) => {
-      const responder_html = `${wwwAlt}/storage-access-api/resources/script-with-cookie-header.py?script=embedded_responder.js`;
       const [frame1, frame2] = await Promise.all([
-        CreateFrame(responder_html),
-        CreateFrame(responder_html),
+        CreateFrame(wwwAlt + responder_html),
+        CreateFrame(wwwAlt + responder_html),
       ]);
 
       t.add_cleanup(async () => {
@@ -27,6 +28,24 @@
       assert_equals(state, "granted");
     }, "Permissions grants are observable across same-origin iframes");
 
+    // Test the interaction between two cross-origin but same-site iframes.
+    promise_test(async (t) => {
+      const [frame1, frame2] = await Promise.all([
+        CreateFrame(wwwAlt + responder_html),
+        CreateFrame(www1Alt + responder_html),
+      ]);
+
+      t.add_cleanup(async () => {
+        await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'prompt']);
+      });
+
+      const observed = ObservePermissionChange(frame2);
+      await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'granted']);
+
+      const state = await observed;
+      assert_equals(state, "granted");
+    }, "Permissions grants are observable across same-site iframes");
+
     promise_test(async (t) => {
       // Finally run the simple tests below in a separate cross-origin iframe.
       await RunTestsInIFrame('https://{{domains[www]}}:{{ports[https][0]}}/storage-access-api/resources/permissions-iframe.https.html');
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/preload/preloading-attempt-sources-updated.js b/third_party/blink/web_tests/http/tests/inspector-protocol/preload/preloading-attempt-sources-updated.js
index a6021c33..71251a2 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/preload/preloading-attempt-sources-updated.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/preload/preloading-attempt-sources-updated.js
@@ -13,19 +13,42 @@
     return a.key.targetHint < b.key.targetHint ? -1: 1;
   }
 
+  function formatLoaderId(loaderId, validLoaderIds) {
+    const index = validLoaderIds.indexOf(loaderId);
+    return index === -1 ? `<invalid-loader>` : `<loader-${index + 1}>`;
+  }
+
+  async function formatPreloadingAttemptSourcesUpdatedEventParams(
+      dp, params, validRuleSetIds, validNodeIds, validLoaderIds) {
+    if (validLoaderIds) {
+      params.loaderId = formatLoaderId(params.loaderId, validLoaderIds);
+    }
+    params.preloadingAttemptSources = await formatPreloadingAttemptSources(
+      dp, params.preloadingAttemptSources, validRuleSetIds, validNodeIds,validLoaderIds);
+    return params;
+  }
+
   // Formats |preloadingAttemptSources| for logging by doing the following:
   // 1) Sorts the attempts based on the preloading attempt key (see
   //    compareAttempts above).
-  // 2) Converts raw ruleSetIds into stable identifiers after verifying that
+  // 2) Converts raw loaderIds into stable identifiers after verifying that
+  //    that they are in |validLoaderIds| (if |validLoaderIds| is defined and
+  //    not empty).
+  // 3) Converts raw ruleSetIds into stable identifiers after verifying that
   //    they are in |validRuleSetIds|.
-  // 3) Does the same with nodeIds and |validNodeIds|.
-  // 4) Sorts ruleSetIds and nodeIds (after transforming them).
+  // 4) Does the same with nodeIds and |validNodeIds|.
+  // 5) Sorts ruleSetIds and nodeIds (after transforming them).
   async function formatPreloadingAttemptSources(dp,
                                                 preloadingAttemptSources,
                                                 validRuleSetIds,
-                                                validNodeIds) {
+                                                validNodeIds,
+                                                validLoaderIds) {
     preloadingAttemptSources.sort(compareAttempts);
     for (const attempt of preloadingAttemptSources) {
+      if (validLoaderIds) {
+        attempt.key.loaderId = formatLoaderId(attempt.key.loaderId, validLoaderIds);
+      }
+
       attempt.ruleSetIds = attempt.ruleSetIds.map(ruleSetId => {
         const index = validRuleSetIds.indexOf(ruleSetId);
         return index === -1 ? "<invalid-rule-set>" : `<rule-set-${index + 1}>`;
@@ -264,11 +287,98 @@
                    ["ruleSetIds", "nodeIds", "loaderId"]);
   }
 
+  async function loaderId() {
+    const { dp, session, page } = await testRunner.startBlank(
+      `Tests that Preload.preloadingAttemptSourcesUpdated uses the correct loaderId.`);
+    await dp.Preload.enable();
+
+    await page.loadHTML(`
+      <html>
+        <head>
+        </head>
+        <body>
+            <iframe></iframe>
+        </body>
+      </html>
+    `);
+
+    const frameTree = (await dp.Page.getFrameTree()).result.frameTree;
+    const mainFrameLoaderId = frameTree.frame.loaderId;
+    const iframeLoaderId = frameTree.childFrames[0].frame.loaderId;
+    const knownLoaderIds = [mainFrameLoaderId, iframeLoaderId];
+    const knownRuleSetIds = [];
+
+    session.evaluate(() => {
+      const script = document.createElement('script');
+      script.type = 'speculationrules';
+      script.innerText = JSON.stringify({
+        "prefetch": [{
+          "source": "list",
+          "urls": ["/next.html"]
+        }]
+      });
+      document.head.appendChild(script);
+    });
+
+    const [preloadingAttemptSourcesUpdated1, ruleSet1] = await Promise.all([
+      dp.Preload.oncePreloadingAttemptSourcesUpdated(),
+      dp.Preload.onceRuleSetUpdated()
+    ]);
+    knownRuleSetIds.push(ruleSet1.params.ruleSet.id);
+    testRunner.log(
+      await formatPreloadingAttemptSourcesUpdatedEventParams(
+        dp, preloadingAttemptSourcesUpdated1.params, knownRuleSetIds, [], knownLoaderIds),
+      "preloadingAttemptSourcesUpdated: ",
+      []);
+
+    session.evaluate(() => {
+      const iframeDoc = document.querySelector('iframe').contentDocument;
+      const script = iframeDoc.createElement('script');
+      script.type = 'speculationrules';
+      script.innerText = JSON.stringify({
+        "prefetch": [{
+          "source": "list",
+          "urls": ["/prev.html"]
+        }]
+      });
+      iframeDoc.head.appendChild(script);
+    });
+
+    const [preloadingAttemptSourcesUpdated2, ruleSet2] = await Promise.all([
+      dp.Preload.oncePreloadingAttemptSourcesUpdated(),
+      dp.Preload.onceRuleSetUpdated()
+    ]);
+    knownRuleSetIds.push(ruleSet2.params.ruleSet.id);
+    testRunner.log(
+      await formatPreloadingAttemptSourcesUpdatedEventParams(
+        dp, preloadingAttemptSourcesUpdated2.params, knownRuleSetIds, [], knownLoaderIds),
+      "preloadingAttemptSourcesUpdated: ",
+      []);
+
+    session.evaluate(() => {
+      const iframeDoc = document.querySelector('iframe').contentDocument;
+      const script = iframeDoc.querySelector('script');
+      script.remove();
+    });
+
+    const [preloadingAttemptSourcesUpdated3, _] = await Promise.all([
+      dp.Preload.oncePreloadingAttemptSourcesUpdated(),
+      dp.Preload.onceRuleSetRemoved()
+    ]);
+    ({params} = preloadingAttemptSourcesUpdated3);
+    testRunner.log(
+      await formatPreloadingAttemptSourcesUpdatedEventParams(
+        dp, preloadingAttemptSourcesUpdated3.params, knownRuleSetIds, [], knownLoaderIds),
+      "preloadingAttemptSourcesUpdated: ",
+      []);
+  }
+
   testRunner.runTestSuite([
     basicTest,
     multipleRuleSetsWithDuplicates,
     documentRules,
     duplicateRuleSets,
     dynamicUpdate,
+    loaderId
   ]);
 });
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/storage/shared-storage.js b/third_party/blink/web_tests/http/tests/inspector-protocol/storage/shared-storage.js
index 1f876257..a7a99f83 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/storage/shared-storage.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/storage/shared-storage.js
@@ -63,7 +63,7 @@
 
   // Generates 10 events.
   await session.evaluateAsync(`
-        sharedStorage.run("test-operation");
+        sharedStorage.run("test-operation", {keepAlive: true});
   `);
 
   // We wait before calling into the worklet again in order to ensure that
@@ -76,7 +76,8 @@
   await session.evaluateAsync(`
         sharedStorage.selectURL(
           "test-url-selection-operation",
-          [{url: "https://google.com/"}, {url: "https://chromium.org/"}]);
+          [{url: "https://google.com/"}, {url: "https://chromium.org/"}],
+          {keepAlive: true});
   `);
 
   // We wait before calling into the worklet again in order to ensure that
diff --git a/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window-expected.txt b/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window-expected.txt
new file mode 100644
index 0000000..7fef584f
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window-expected.txt
@@ -0,0 +1,86 @@
+This is a testharness.js-based test.
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":null}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"name":"default name"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"owner":null,"name":"default name"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"owner":"http://web-platform.test:8444","name":"default name"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"owner":"wss://web-platform.test:8444","name":"default name"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"owner":"www.web-platform.test","name":"default name"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":false,"interestGroup":{"owner":"https://web-platform.test:8444"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":""}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priority":1}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priority":0}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priority":-1.5}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":null}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":1}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":{"a":"apple"}}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":{}}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":{"a":1}}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","priorityVector":{"a":1,"b":-4.5,"a.b":0}}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":null}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":1}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":{"a":"apple"}}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":{}}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":{"a":1}}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","prioritySignalsOverrides":{"a":1,"b":-4.5,"a.b":0}}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","enableBiddingSignalsPrioritization":true}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","enableBiddingSignalsPrioritization":false}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingLogicUrl":null}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingLogicUrl":"https://www.web-platform.test/foo.js"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingLogicUrl":"data:text/javascript,Foo"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingLogicUrl":"https://web-platform.test:8444/foo.js"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingLogicUrl":"relative/path"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingWasmHelperUrl":null}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingWasmHelperUrl":"https://www.web-platform.test/foo.js"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingWasmHelperUrl":"data:application/wasm,Foo"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingWasmHelperUrl":"https://web-platform.test:8444/foo.js"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","biddingWasmHelperUrl":"relative/path"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","dailyUpdateUrl":null}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","dailyUpdateUrl":"https://www.web-platform.test/foo.js"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","dailyUpdateUrl":"data:application/wasm,Foo"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","dailyUpdateUrl":"https://web-platform.test:8444/foo.js"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","dailyUpdateUrl":"relative/path"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","executionMode":"compatibility"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","executionMode":"groupByOrigin"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","executionMode":"unknownValuesAreValid"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsUrl":null}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsUrl":"https://www.web-platform.test/foo.js"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsUrl":"data:application/json,{}"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsUrl":"https://web-platform.test:8444/foo.js"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsUrl":"relative/path"}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsKeys":null}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsKeys":{}}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsKeys":[]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","trustedBiddingSignalsKeys":["a",4,"Foo"]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","userBiddingSignals":null}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","userBiddingSignals":"foo"}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","userBiddingSignals":15}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","userBiddingSignals":[5,"foo",[-6.4,{"a":"b"}]]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","userBiddingSignals":{"a":[5,"foo",{"b":-6.4}]}}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":null}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":5}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":{}}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[]}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{}]}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{"1":[2,3],"metadata":[{"a":"b"},"c"]}]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{"renderUrl":"https://somewhere.test/"}]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{"renderUrl":"https://somewhere.test/"},{"renderUrl":"https://somewhere-else.test/"}]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{"renderUrl":"https://somewhere.test/","metadata":null}]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","ads":[{"renderUrl":"https://somewhere.test/","metadata":null,"someOtherField":"foo"}]}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":null}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":5}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":{}}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[]}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{}]}}
+PASS Join and leave interest group: {"expectJoinSucces":false,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{"1":[2,3],"metadata":[{"a":"b"},"c"]}]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{"renderUrl":"https://somewhere.test/"}]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{"renderUrl":"https://somewhere.test/"},{"renderUrl":"https://elsewhere.test/"}]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{"renderUrl":"https://somewhere.test/","metadata":null}]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","adComponents":[{"renderUrl":"https://somewhere.test/","metadata":null,"someOtherField":"foo"}]}}
+PASS Join and leave interest group: {"expectJoinSucces":true,"expectLeaveSucces":true,"interestGroup":{"owner":"https://web-platform.test:8444","name":"default name","extra":false,"fields":{"do":"not"},"matter":"at","all":[3,4,5]}}
+PASS Join same interest group overwrites old matching group.
+PASS Leaving interest group actually leaves interest group.
+PASS Leave an interest group that was never joined.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/no-winner.https.sub.window-expected.txt b/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/no-winner.https.sub.window-expected.txt
new file mode 100644
index 0000000..9729c5a7
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/no-winner.https.sub.window-expected.txt
@@ -0,0 +1,39 @@
+This is a testharness.js-based test.
+PASS Bidding logic script: error=http-error
+PASS Bidding logic script: error=no-content-type
+PASS Bidding logic script: error=wrong-content-type
+PASS Bidding logic script: error=bad-allow-fledge
+PASS Bidding logic script: error=fledge-not-allowed
+PASS Bidding logic script: error=no-allow-fledge
+PASS Bidding logic script: error=no-body
+PASS Bidding logic script: error=no-generateBid
+PASS Bidding logic script: generateBid=throw 1;
+PASS Bidding logic script: generateBid=This does not compile
+PASS Bidding logic script: generateBid=while(1);
+PASS Bidding logic script: generateBid=return 5;
+PASS Bidding logic script: generateBid=return "Foo";
+PASS Bidding logic script: generateBid=return interestGroup.ads[0].renderUrl;
+PASS Bidding logic script: generateBid=return {bid: 1, render: "https://not-in-ads-array.test/"};
+PASS Bidding logic script: generateBid=return {bid: 1};
+PASS Bidding logic script: generateBid=return {render: interestGroup.ads[0].renderUrl};
+PASS Bidding logic script: generateBid=return {bid:0, render: interestGroup.ads[0].renderUrl};
+PASS Bidding logic script: generateBid=return {bid:-1, render: interestGroup.ads[0].renderUrl};
+PASS Decision logic script: error=http-error
+PASS Decision logic script: error=no-content-type
+PASS Decision logic script: error=wrong-content-type
+PASS Decision logic script: error=bad-allow-fledge
+PASS Decision logic script: error=fledge-not-allowed
+PASS Decision logic script: error=no-allow-fledge
+PASS Decision logic script: error=no-body
+PASS Decision logic script: error=no-scoreAd
+PASS Decision logic script: scoreAd=throw 1;
+PASS Decision logic script: scoreAd=This does not compile
+PASS Decision logic script: scoreAd=while(1);
+PASS Decision logic script: scoreAd=return "Foo";
+PASS Decision logic script: scoreAd=return {desirability: "Foo"};
+PASS Decision logic script: scoreAd=return 0;
+PASS Decision logic script: scoreAd=return -1;
+PASS Decision logic script: scoreAd=return {desirability: 0};
+PASS Decision logic script: scoreAd=return {desirability: -1};
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/reporting-arguments.https.sub.window-expected.txt b/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/reporting-arguments.https.sub.window-expected.txt
new file mode 100644
index 0000000..4ae940e
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/reporting-arguments.https.sub.window-expected.txt
@@ -0,0 +1,23 @@
+This is a testharness.js-based test.
+PASS Seller passes number to bidder.
+PASS Seller passes string to bidder.
+PASS Seller passes array to bidder.
+PASS Seller passes object to bidder.
+PASS browserSignals.topWindowHostname test.
+PASS browserSignals.seller test.
+PASS browserSignals.topLevelSeller and browserSignals.componentSeller test.
+PASS browserSignals.renderUrl test.
+PASS browserSignals.bid test.
+PASS browserSignals.desirability test.
+PASS browserSignals.topLevelSellerSignals test.
+PASS browserSignals.dataVersion test.
+PASS browserSignals.modifiedBid test.
+PASS browserSignals.highestScoringOtherBid with no other interest groups test.
+PASS browserSignals.highestScoringOtherBid with other groups that do not bid.
+PASS browserSignals.highestScoringOtherBid with other bids.
+PASS browserSignals.interestGroupName test.
+PASS browserSignals.madeHighestScoringOtherBid with no other bids.
+PASS browserSignals.madeHighestScoringOtherBid with group that did not bid.
+PASS browserSignals.madeHighestScoringOtherBid with other bid.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/send-report-to.https.sub.window-expected.txt b/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/send-report-to.https.sub.window-expected.txt
new file mode 100644
index 0000000..3dd9468
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/fledge/external/wpt/fledge/tentative/send-report-to.https.sub.window-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS Both send reports, seller passes nothing to bidder.
+PASS Only seller sends a report
+PASS Only seller sends a report, bidder throws an exception
+PASS Only seller sends a report, bidder has no reportWin() method
+PASS Only bidder sends a report
+PASS Only bidder sends a report, seller passes a message to bidder
+PASS Only bidder sends a report, seller throws an exception
+PASS Only bidder sends a report, seller has no reportResult() method
+PASS Seller calls sendReportTo() twice, which throws an exception.
+PASS Bidder calls sendReportTo() twice, which throws an exception.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/preload-devtools/http/tests/inspector-protocol/preload/preloading-attempt-sources-updated-expected.txt b/third_party/blink/web_tests/virtual/preload-devtools/http/tests/inspector-protocol/preload/preloading-attempt-sources-updated-expected.txt
index cbd29a7..e6b41cba 100644
--- a/third_party/blink/web_tests/virtual/preload-devtools/http/tests/inspector-protocol/preload/preloading-attempt-sources-updated-expected.txt
+++ b/third_party/blink/web_tests/virtual/preload-devtools/http/tests/inspector-protocol/preload/preloading-attempt-sources-updated-expected.txt
@@ -215,3 +215,45 @@
     }
 ]
 
+Running test: loaderId
+Tests that Preload.preloadingAttemptSourcesUpdated uses the correct loaderId.
+preloadingAttemptSourcesUpdated: {
+    loaderId : <loader-1>
+    preloadingAttemptSources : [
+        [0] : {
+            key : {
+                action : Prefetch
+                loaderId : <loader-1>
+                url : http://127.0.0.1:8000/next.html
+            }
+            nodeIds : [
+            ]
+            ruleSetIds : [
+                [0] : <rule-set-1>
+            ]
+        }
+    ]
+}
+preloadingAttemptSourcesUpdated: {
+    loaderId : <loader-2>
+    preloadingAttemptSources : [
+        [0] : {
+            key : {
+                action : Prefetch
+                loaderId : <loader-2>
+                url : http://127.0.0.1:8000/prev.html
+            }
+            nodeIds : [
+            ]
+            ruleSetIds : [
+                [0] : <rule-set-2>
+            ]
+        }
+    ]
+}
+preloadingAttemptSourcesUpdated: {
+    loaderId : <loader-2>
+    preloadingAttemptSources : [
+    ]
+}
+
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/change-src-attribute-after-config-installation-does-not-trigger-navigation.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/change-src-attribute-after-config-installation-does-not-trigger-navigation.https.html
index 460b343f..7ad73d3 100644
--- a/third_party/blink/web_tests/wpt_internal/fenced_frame/change-src-attribute-after-config-installation-does-not-trigger-navigation.https.html
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/change-src-attribute-after-config-installation-does-not-trigger-navigation.https.html
@@ -28,8 +28,6 @@
   fenced_frame.config = config;
   document.body.append(fenced_frame);
 
-  assert_equals(fenced_frame.mode, "default");
-
   // Installing a config to the fenced frame triggers navigation.
   const load_expected = "fenced frame loaded";
   const load_actual = await nextValueFromServer(fenced_frame_loaded_key);
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/config-installation-triggers-navigation-of-navigated-fenced-frame.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/config-installation-triggers-navigation-of-navigated-fenced-frame.https.html
index a34a004..f0d042a 100644
--- a/third_party/blink/web_tests/wpt_internal/fenced_frame/config-installation-triggers-navigation-of-navigated-fenced-frame.https.html
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/config-installation-triggers-navigation-of-navigated-fenced-frame.https.html
@@ -17,7 +17,6 @@
   // Create a fenced frame.
   const fenced_frame = document.createElement('fencedframe');
   document.body.append(fenced_frame);
-  assert_equals(fenced_frame.mode, "default");
 
   // Specify the fenced frame's src attribute to an url.
   const url = generateURL('resources/fenced-frame-loaded.html',
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/config-installation-triggers-navigation.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/config-installation-triggers-navigation.https.html
index 6da0a383..6a7238d 100644
--- a/third_party/blink/web_tests/wpt_internal/fenced_frame/config-installation-triggers-navigation.https.html
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/config-installation-triggers-navigation.https.html
@@ -22,8 +22,6 @@
   fenced_frame.config = config;
   document.body.append(fenced_frame);
 
-  assert_equals(fenced_frame.mode, "default");
-
   // Installing an inner config to the fenced frame triggers navigation.
   const load_expected = "fenced frame loaded";
   const load_actual = await nextValueFromServer(fenced_frame_loaded_key);
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/config-with-empty-url-installation-unloads-navigated-fenced-frame.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/config-with-empty-url-installation-unloads-navigated-fenced-frame.https.html
index e055c58..b48f423 100644
--- a/third_party/blink/web_tests/wpt_internal/fenced_frame/config-with-empty-url-installation-unloads-navigated-fenced-frame.https.html
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/config-with-empty-url-installation-unloads-navigated-fenced-frame.https.html
@@ -16,7 +16,6 @@
   // Create a fenced frame and install a config constructed with an empty url.
   const fenced_frame = document.createElement('fencedframe');
   document.body.append(fenced_frame);
-  assert_equals(fenced_frame.mode, "default");
 
   // Specify the fenced frame's src attribute to an url.
   const url = generateURL('resources/fenced-frame-loaded.html',
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js
index 4e437dac..af81e28 100644
--- a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js
@@ -32,9 +32,11 @@
     // gracefully fail rather than bring the whole test down.
   }
   return await sharedStorage.selectURL(
-      "test-url-selection-operation", [{url: href}],
-      {data: {'mockResult': 0}, resolveToConfig: resolve_to_config}
-  );
+      'test-url-selection-operation', [{url: href}], {
+        data: {'mockResult': 0},
+        resolveToConfig: resolve_to_config,
+        keepAlive: true
+      });
 }
 
 // Similar to generateURL, but creates
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/combined-setters-and-operations.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage/combined-setters-and-operations.https.html
index d85a932..64272491 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage/combined-setters-and-operations.https.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/combined-setters-and-operations.https.html
@@ -18,7 +18,7 @@
 
     await sharedStorage.set('key0-set-from-document', 'value0');
     await addModuleOnce("resources/verify-storage-entries-module.js");
-    await sharedStorage.run("set-key0-operation");
+    await sharedStorage.run("set-key0-operation", {keepAlive: true});
 
     let select_url_result = await sharedStorage.selectURL(
         "verify-storage-entries-url-selection-operation",
@@ -28,7 +28,7 @@
           reportingMetadata:
             {'mouse interaction': "resources/frame1.html",
             'click': "resources/frame2.html"}}],
-        {resolveToConfig: resolve_to_config});
+        {resolveToConfig: resolve_to_config, keepAlive: resolve_to_config});
 
     assert_true(validateSelectURLResult(select_url_result, resolve_to_config));
     attachFencedFrame(select_url_result, 'opaque-ads');
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/embedder-context.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage/embedder-context.https.html
index 2d8ae50..1d155e7 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage/embedder-context.https.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/embedder-context.https.html
@@ -31,7 +31,8 @@
     "verify-key-value", [{url: url0}, {url: url1}],
     {data: {'expectedKey': ancestorKey,
             'expectedValue': 'here is some context'},
-     resolveToConfig: true});
+     resolveToConfig: true,
+     keepAlive: true});
   assert_true(validateSelectURLResult(fencedFrameConfig1, true));
 
   attachFencedFrame(fencedFrameConfig1, 'opaque-ads');
@@ -57,7 +58,8 @@
   let fencedFrameConfig1 = await sharedStorage.selectURL(
     "verify-key-value", [{url: url0}, {url: url1}],
     {data: {'expectedKey': ancestorKey, 'expectedValue': 'undefined'},
-     resolveToConfig: true});
+     resolveToConfig: true,
+     keepAlive: true});
   assert_true(validateSelectURLResult(fencedFrameConfig1, true));
 
   attachFencedFrame(fencedFrameConfig1, 'opaque-ads');
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation-keep-alive.html b/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation-keep-alive.html
new file mode 100644
index 0000000..72125aa5
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation-keep-alive.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/utils.js"></script>
+
+<body>
+<script>
+'use strict';
+
+promise_test(async () => {
+  await addModuleOnce("resources/simple-module.js");
+  await sharedStorage.run("operation1", {keepAlive: true});
+  return sharedStorage.run("operation1", {keepAlive: true});
+}, 'run() twice with keepAlive: true');
+
+promise_test(async () => {
+  await addModuleOnce("resources/simple-module.js");
+  await sharedStorage.run("operation1", {keepAlive: true});
+  await sharedStorage.run("operation1", {keepAlive: false});
+  try {
+    await sharedStorage.run("operation1");
+  } catch (e) {
+    assert_equals(e.name, 'OperationError');
+    assert_equals(e.message, 'The sharedStorage worklet cannot execute' +
+                             ' further operations because the previous' +
+                             ' operation did not include the option' +
+                             ' \'keepAlive: true\'.');
+    return;
+  }
+  assert_unreached("did not reject");
+}, 'run() with keepAlive: true, then keepAlive: false, then error');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation.html b/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation.html
index f244877..b4c718529 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation.html
@@ -7,12 +7,13 @@
 'use strict';
 
 promise_test(() => {
-  return sharedStorage.run("operation1");
+  return sharedStorage.run("operation1", {keepAlive: true});
 }, 'run()');
 
 promise_test(() => {
   return sharedStorage.run("operation1",
-    {data: {'custom-key': 'custom-value'}});
+                           {data: {'custom-key': 'custom-value'},
+                            keepAlive: true});
 }, 'run() with custom data');
 
 promise_test(async t => {
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html
index 360f5ed..1c654de 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html
@@ -12,7 +12,7 @@
       sharedStorage.selectURL(
           "test-url-selection-operation",
           [{url: "resources/frame0.html"}],
-          {resolveToConfig: resolve_to_config}));
+          {resolveToConfig: resolve_to_config, keepAlive: true}));
   }, 'selectURL() without addModule, ' +
      'selectURL() resolves to ' + (resolve_to_config ? 'config' : 'urn:uuid'));
 
@@ -22,7 +22,7 @@
             "test-url-selection-operation",
             [{url: "1"}, {url: "2"}, {url: "3"}, {url: "4"}, {url: "5"},
              {url: "6"}, {url: "7"}, {url: "8"}, {url: "9"}],
-            {resolveToConfig: resolve_to_config});
+            {resolveToConfig: resolve_to_config, keepAlive: true});
     } catch (e) {
       assert_equals(e.name, 'DataError');
       assert_equals(e.message, 'Length of the \"urls\" parameter is not valid.');
@@ -37,7 +37,7 @@
         await sharedStorage.selectURL(
           "test-url-selection-operation",
           [],
-          {resolveToConfig: resolve_to_config});
+          {resolveToConfig: resolve_to_config, keepAlive: true});
     } catch (e) {
       assert_equals(e.name, 'DataError');
       assert_equals(e.message, 'Length of the \"urls\" parameter is not valid.');
@@ -55,7 +55,7 @@
                     'click': "https://google.com"
                 }
             }],
-            {resolveToConfig: resolve_to_config});
+            {resolveToConfig: resolve_to_config, keepAlive: true});
     } catch (e) {
       assert_equals(e.name, 'TypeError');
         assert_equals(true, e.message.startsWith(
@@ -76,7 +76,7 @@
             "test-url-selection-operation", [{
                 url: "https://#"
             }],
-            {resolveToConfig: resolve_to_config});
+            {resolveToConfig: resolve_to_config, keepAlive: true});
     } catch (e) {
       assert_equals(e.name, 'DataError');
         assert_equals(e.message,
@@ -96,7 +96,7 @@
                     'click': "https://#"
                 }
             }],
-            {resolveToConfig: resolve_to_config});
+            {resolveToConfig: resolve_to_config, keepAlive: true});
     } catch (e) {
       assert_equals(e.name, 'DataError');
         assert_equals(e.message,
@@ -117,7 +117,7 @@
                     'click': "http://google.com"
                 }
             }],
-            {resolveToConfig: resolve_to_config});
+            {resolveToConfig: resolve_to_config, keepAlive: true});
     } catch (e) {
       assert_equals(e.name, 'DataError');
         assert_equals(e.message, 'The metadata for the url at index 0 has an ' +
@@ -135,7 +135,7 @@
                 url: "resources/frame0.html",
                 reportingMetadata: {}
             }],
-            {resolveToConfig: resolve_to_config});
+            {resolveToConfig: resolve_to_config, keepAlive: true});
     } catch (e) {
       assert_equals(e.name, 'DataError');
         assert_equals(e.message, 'selectURL could not get reportingMetadata ' +
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation.https.html
index 8753e04..41d1e96 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation.https.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation.https.html
@@ -19,7 +19,8 @@
 
     let select_url_result0 = await sharedStorage.selectURL(
         "test-url-selection-operation", [{url: url0}, {url: url1}],
-        {data: {'mockResult': 0}, resolveToConfig: resolve_to_config});
+        {data: {'mockResult': 0}, resolveToConfig: resolve_to_config,
+         keepAlive: true});
     assert_true(validateSelectURLResult(select_url_result0, resolve_to_config));
     attachFencedFrame(select_url_result0, 'opaque-ads');
     const result0 = await nextValueFromServer(ancestor_key);
@@ -27,7 +28,8 @@
 
     let select_url_result1 = await sharedStorage.selectURL(
         "test-url-selection-operation", [{url: url0}, {url: url1}],
-        {data: {'mockResult': 1}, resolveToConfig: resolve_to_config});
+        {data: {'mockResult': 1}, resolveToConfig: resolve_to_config,
+         keepAlive: true});
     assert_true(validateSelectURLResult(select_url_result1, resolve_to_config));
     attachFencedFrame(select_url_result1, 'opaque-ads');
     const result1 = await nextValueFromServer(ancestor_key);
@@ -35,7 +37,8 @@
 
     let select_url_result2 = await sharedStorage.selectURL(
         "test-url-selection-operation", [{url: url0}, {url: url1}],
-        {data: {'mockResult': -1}, resolveToConfig: resolve_to_config});
+        {data: {'mockResult': -1}, resolveToConfig: resolve_to_config,
+         keepAlive: true});
     assert_true(validateSelectURLResult(select_url_result2, resolve_to_config));
     attachFencedFrame(select_url_result2, 'opaque-ads');
     const result2 = await nextValueFromServer(ancestor_key);
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/select-url-keep-alive.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage/select-url-keep-alive.https.html
new file mode 100644
index 0000000..c7ff0aa84
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/select-url-keep-alive.https.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/utils.js"></script>
+<script src="/common/utils.js"></script>
+<script src="../fenced_frame/resources/utils.js"></script>
+
+<body>
+<script>
+'use strict';
+
+promise_test(async () => {
+  const ancestor_key = token();
+  let url0 = generateURL("resources/frame0.html", [ancestor_key]);
+  let url1 = generateURL("resources/frame1.html", [ancestor_key]);
+
+  await addModuleOnce("resources/simple-module.js");
+
+  let select_url_result0 = await sharedStorage.selectURL(
+      "test-url-selection-operation", [{url: url0}, {url: url1}],
+      {data: {'mockResult': 0}, resolveToConfig: true, keepAlive: true});
+  assert_true(validateSelectURLResult(select_url_result0, true));
+  attachFencedFrame(select_url_result0, 'opaque-ads');
+  const result0 = await nextValueFromServer(ancestor_key);
+  assert_equals(result0, "frame0_loaded");
+
+  let select_url_result1 = await sharedStorage.selectURL(
+      "test-url-selection-operation", [{url: url0}, {url: url1}],
+      {data: {'mockResult': 1}, resolveToConfig: true, keepAlive: false});
+  assert_true(validateSelectURLResult(select_url_result1, true));
+  attachFencedFrame(select_url_result1, 'opaque-ads');
+  const result1 = await nextValueFromServer(ancestor_key);
+  assert_equals(result1, "frame1_loaded");
+
+  try {
+    let select_url_result2 = await sharedStorage.selectURL(
+      "test-url-selection-operation", [{url: url0}, {url: url1}],
+      {data: {'mockResult': 0}, resolveToConfig: true});
+  } catch (e) {
+    assert_equals(e.name, 'OperationError');
+    assert_equals(e.message, 'The sharedStorage worklet cannot execute' +
+                             ' further operations because the previous' +
+                             ' operation did not include the option' +
+                             ' \'keepAlive: true\'.');
+    return;
+  }
+  assert_unreached("did not reject");
+}, 'selectURL() with keepAlive: true, then keepAlive: false, then error');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/select-url-report-event.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage/select-url-report-event.https.html
index bae432416..3e119ac1 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage/select-url-report-event.https.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/select-url-report-event.https.html
@@ -45,7 +45,8 @@
                     'mouse interaction': "resources/receiver1.html"
                 }
             }, {url: url1}
-        ], {data: {'mockResult': 0}, resolveToConfig: resolve_to_config});
+        ], {data: {'mockResult': 0}, resolveToConfig: resolve_to_config,
+            keepAlive: resolve_to_config});
     assert_true(validateSelectURLResult(select_url_result, resolve_to_config));
     attachFencedFrame(select_url_result, 'opaque-ads');
     const result0 = await nextValueFromServer(ancestor_key);
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/verify-get-undefined.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage/verify-get-undefined.https.html
index de4df47..222f472 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage/verify-get-undefined.https.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/verify-get-undefined.https.html
@@ -25,7 +25,8 @@
           reportingMetadata:
             {'mouse interaction': "resources/frame1.html",
             'click': "resources/frame2.html"}}],
-        {resolveToConfig: resolve_to_config});
+        {resolveToConfig: resolve_to_config,
+         keepAlive: resolve_to_config});
 
     assert_true(validateSelectURLResult(select_url_result, resolve_to_config));
     attachFencedFrame(select_url_result, 'opaque-ads');
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage_reportevent_limit/report-event-limit-with-nested.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage_reportevent_limit/report-event-limit-with-nested.https.html
index 9c70fa06..4427b890 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage_reportevent_limit/report-event-limit-with-nested.https.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage_reportevent_limit/report-event-limit-with-nested.https.html
@@ -43,7 +43,7 @@
       let urn = await sharedStorage.selectURL(
         "test-url-selection-operation", [{url: url0}, {url: url1}, {url: url2},
                                          {url: url3}],
-        {data: {'mockResult': 0}});
+        {data: {'mockResult': 0}, keepAlive: true});
 
       // Create nested fenced frames. A report will be sent, if allowed.
       attachFencedFrame(urn, 'opaque-ads');
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage_reportevent_limit/report-event-limit.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage_reportevent_limit/report-event-limit.https.html
index 282628e..fdf50ade 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage_reportevent_limit/report-event-limit.https.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage_reportevent_limit/report-event-limit.https.html
@@ -40,7 +40,7 @@
       let urn = await sharedStorage.selectURL(
         "test-url-selection-operation", [{url: url0, reportingMetadata},
                                          {url: url1}, {url: url2}, {url: url3}],
-        {data: {'mockResult': 0}});
+        {data: {'mockResult': 0}, keepAlive: true});
 
       // Create a fenced frame. A report will be sent, if allowed.
       attachFencedFrame(urn, 'opaque-ads');
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage_selecturl_limit/resources/run-url-selection-operation-limit-inner.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage_selecturl_limit/resources/run-url-selection-operation-limit-inner.https.html
index 72d1ee9..acbf84dd 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage_selecturl_limit/resources/run-url-selection-operation-limit-inner.https.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage_selecturl_limit/resources/run-url-selection-operation-limit-inner.https.html
@@ -27,7 +27,7 @@
   for (let i = 0; i < Math.floor(bitLimit / 3); ++i) {
     let uuid = await sharedStorage.selectURL(
         "test-url-selection-operation", urls,
-        {data: {'mockResult': 1}});
+        {data: {'mockResult': 1}, keepAlive: true});
     assert_true(uuid.startsWith('urn:uuid:'));
     attachFencedFrame(uuid, 'opaque-ads');
     const result = await nextValueFromServer(innerKey);
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage_selecturl_limit/run-url-selection-operation-limit.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage_selecturl_limit/run-url-selection-operation-limit.https.html
index b94ff7a..854ea49 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage_selecturl_limit/run-url-selection-operation-limit.https.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage_selecturl_limit/run-url-selection-operation-limit.https.html
@@ -20,7 +20,7 @@
   for (let i = 0; i < 8; ++i) {
     let uuid = await sharedStorage.selectURL(
         "test-url-selection-operation", urls,
-        {data: {'mockResult': 1}});
+        {data: {'mockResult': 1}, keepAlive: true});
     assert_true(uuid.startsWith('urn:uuid:'));
     attachFencedFrame(uuid, 'opaque-ads');
     const result = await nextValueFromServer(ancestorKey);
diff --git a/third_party/libaom/README.chromium b/third_party/libaom/README.chromium
index 6e3cc25..559e820 100644
--- a/third_party/libaom/README.chromium
+++ b/third_party/libaom/README.chromium
@@ -2,8 +2,8 @@
 Short Name: libaom
 URL: https://aomedia.googlesource.com/aom/
 Version: 0
-Date: Wednesday March 08 2023
-Revision: 35410dede1a3a25d59e0704f2c139e737a6d6398
+Date: Monday March 20 2023
+Revision: 16e24831397a22504541e8ec2674e3cf219e0ac5
 CPEPrefix: cpe:/a:aomedia:aomedia:3.6.0
 License: BSD
 License File: source/libaom/LICENSE
diff --git a/third_party/libaom/source/config/config/aom_version.h b/third_party/libaom/source/config/config/aom_version.h
index 2080bec3..ed043ad 100644
--- a/third_party/libaom/source/config/config/aom_version.h
+++ b/third_party/libaom/source/config/config/aom_version.h
@@ -12,8 +12,8 @@
 #define VERSION_MAJOR 3
 #define VERSION_MINOR 6
 #define VERSION_PATCH 0
-#define VERSION_EXTRA "343-g35410dede"
+#define VERSION_EXTRA "383-g16e248313"
 #define VERSION_PACKED \
   ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH))
-#define VERSION_STRING_NOSP "3.6.0-343-g35410dede"
-#define VERSION_STRING " 3.6.0-343-g35410dede"
+#define VERSION_STRING_NOSP "3.6.0-383-g16e248313"
+#define VERSION_STRING " 3.6.0-383-g16e248313"
diff --git a/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h
index 1c310c1..cc0a2bb 100644
--- a/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h
@@ -161,7 +161,18 @@
                          int height,
                          const uint8_t* ref,
                          int ref_stride);
-#define aom_comp_avg_pred aom_comp_avg_pred_c
+void aom_comp_avg_pred_avx2(uint8_t* comp_pred,
+                            const uint8_t* pred,
+                            int width,
+                            int height,
+                            const uint8_t* ref,
+                            int ref_stride);
+RTCD_EXTERN void (*aom_comp_avg_pred)(uint8_t* comp_pred,
+                                      const uint8_t* pred,
+                                      int width,
+                                      int height,
+                                      const uint8_t* ref,
+                                      int ref_stride);
 
 void aom_comp_mask_pred_c(uint8_t* comp_pred,
                           const uint8_t* pred,
@@ -9527,6 +9538,10 @@
   if (flags & HAS_SSE4_1) {
     aom_blend_a64_vmask = aom_blend_a64_vmask_sse4_1;
   }
+  aom_comp_avg_pred = aom_comp_avg_pred_c;
+  if (flags & HAS_AVX2) {
+    aom_comp_avg_pred = aom_comp_avg_pred_avx2;
+  }
   aom_comp_mask_pred = aom_comp_mask_pred_c;
   if (flags & HAS_SSSE3) {
     aom_comp_mask_pred = aom_comp_mask_pred_ssse3;
diff --git a/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h
index ba451d7..f623201 100644
--- a/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h
@@ -161,7 +161,18 @@
                          int height,
                          const uint8_t* ref,
                          int ref_stride);
-#define aom_comp_avg_pred aom_comp_avg_pred_c
+void aom_comp_avg_pred_avx2(uint8_t* comp_pred,
+                            const uint8_t* pred,
+                            int width,
+                            int height,
+                            const uint8_t* ref,
+                            int ref_stride);
+RTCD_EXTERN void (*aom_comp_avg_pred)(uint8_t* comp_pred,
+                                      const uint8_t* pred,
+                                      int width,
+                                      int height,
+                                      const uint8_t* ref,
+                                      int ref_stride);
 
 void aom_comp_mask_pred_c(uint8_t* comp_pred,
                           const uint8_t* pred,
@@ -9563,6 +9574,10 @@
   if (flags & HAS_SSE4_1) {
     aom_blend_a64_vmask = aom_blend_a64_vmask_sse4_1;
   }
+  aom_comp_avg_pred = aom_comp_avg_pred_c;
+  if (flags & HAS_AVX2) {
+    aom_comp_avg_pred = aom_comp_avg_pred_avx2;
+  }
   aom_comp_mask_pred = aom_comp_mask_pred_c;
   if (flags & HAS_SSSE3) {
     aom_comp_mask_pred = aom_comp_mask_pred_ssse3;
diff --git a/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h
index 1c310c1..cc0a2bb 100644
--- a/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h
@@ -161,7 +161,18 @@
                          int height,
                          const uint8_t* ref,
                          int ref_stride);
-#define aom_comp_avg_pred aom_comp_avg_pred_c
+void aom_comp_avg_pred_avx2(uint8_t* comp_pred,
+                            const uint8_t* pred,
+                            int width,
+                            int height,
+                            const uint8_t* ref,
+                            int ref_stride);
+RTCD_EXTERN void (*aom_comp_avg_pred)(uint8_t* comp_pred,
+                                      const uint8_t* pred,
+                                      int width,
+                                      int height,
+                                      const uint8_t* ref,
+                                      int ref_stride);
 
 void aom_comp_mask_pred_c(uint8_t* comp_pred,
                           const uint8_t* pred,
@@ -9527,6 +9538,10 @@
   if (flags & HAS_SSE4_1) {
     aom_blend_a64_vmask = aom_blend_a64_vmask_sse4_1;
   }
+  aom_comp_avg_pred = aom_comp_avg_pred_c;
+  if (flags & HAS_AVX2) {
+    aom_comp_avg_pred = aom_comp_avg_pred_avx2;
+  }
   aom_comp_mask_pred = aom_comp_mask_pred_c;
   if (flags & HAS_SSSE3) {
     aom_comp_mask_pred = aom_comp_mask_pred_ssse3;
diff --git a/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h
index ba451d7..f623201 100644
--- a/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h
@@ -161,7 +161,18 @@
                          int height,
                          const uint8_t* ref,
                          int ref_stride);
-#define aom_comp_avg_pred aom_comp_avg_pred_c
+void aom_comp_avg_pred_avx2(uint8_t* comp_pred,
+                            const uint8_t* pred,
+                            int width,
+                            int height,
+                            const uint8_t* ref,
+                            int ref_stride);
+RTCD_EXTERN void (*aom_comp_avg_pred)(uint8_t* comp_pred,
+                                      const uint8_t* pred,
+                                      int width,
+                                      int height,
+                                      const uint8_t* ref,
+                                      int ref_stride);
 
 void aom_comp_mask_pred_c(uint8_t* comp_pred,
                           const uint8_t* pred,
@@ -9563,6 +9574,10 @@
   if (flags & HAS_SSE4_1) {
     aom_blend_a64_vmask = aom_blend_a64_vmask_sse4_1;
   }
+  aom_comp_avg_pred = aom_comp_avg_pred_c;
+  if (flags & HAS_AVX2) {
+    aom_comp_avg_pred = aom_comp_avg_pred_avx2;
+  }
   aom_comp_mask_pred = aom_comp_mask_pred_c;
   if (flags & HAS_SSSE3) {
     aom_comp_mask_pred = aom_comp_mask_pred_ssse3;
diff --git a/third_party/libei/3pp/3pp.pb b/third_party/libei/3pp/3pp.pb
new file mode 100644
index 0000000..77c7d7d
--- /dev/null
+++ b/third_party/libei/3pp/3pp.pb
@@ -0,0 +1,14 @@
+create {
+  platform_re: "linux-.*"
+  source {
+    url {
+      download_url: "https://gitlab.freedesktop.org/libinput/libei/-/archive/0.4.1/libei-0.4.1.tar.gz"
+      version: "0.4.1"
+    }
+    unpack_archive: true
+  }
+}
+
+upload {
+  pkg_prefix: "chromium/third_party"
+}
diff --git a/third_party/libei/3pp/install.sh b/third_party/libei/3pp/install.sh
new file mode 100755
index 0000000..62b6804
--- /dev/null
+++ b/third_party/libei/3pp/install.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+# Copyright 2023 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+set -euxo pipefail
+
+PREFIX="$1"
+DEPS_PREFIX="$2"
+PWD="$(pwd)"
+
+mkdir -p meson
+MESON_PATH="$PWD/meson"
+
+# libei can be only build using Meson. We need Meson only to build libei
+# so it doesn't have to be uploaded to CIPD.
+export PYTHONPATH="$MESON_PATH/lib/python3.6/site-packages"
+
+# Meson 0.62 and newer will require Python 3.7 and newer and Ubuntu 18.04 has
+# only Python 3.6
+python3 -m pip install meson==0.61.5 --prefix="$MESON_PATH"
+
+export PKG_CONFIG_PATH="$DEPS_PREFIX/lib64/pkgconfig"
+
+$MESON_PATH/bin/meson setup build . --default-library=static
+$MESON_PATH/bin/meson --buildtype=plain --prefix="$PREFIX" . build -D docs=disabled -D man=disabled
+$MESON_PATH/bin/meson compile -C build --verbose
+$MESON_PATH/bin/meson install -C build --no-rebuild
+
+# We need pkgconfig file to point to location where it's going to be deployed
+# and not where it was installed
+sed "s@$PREFIX@$DEPS_PREFIX@" -i "$PREFIX/lib64/pkgconfig/libei-0.4.1.pc"
diff --git a/third_party/libei/LICENSE b/third_party/libei/LICENSE
new file mode 100644
index 0000000..96a5fdb
--- /dev/null
+++ b/third_party/libei/LICENSE
@@ -0,0 +1,20 @@
+Copyright © 2020 Red Hat, 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, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/third_party/libei/README.chromium b/third_party/libei/README.chromium
new file mode 100644
index 0000000..f2895a9
--- /dev/null
+++ b/third_party/libei/README.chromium
@@ -0,0 +1,11 @@
+Name: libei
+URL: https://gitlab.freedesktop.org/libinput/libei
+Version: f9d691e98b515b544fb803a3c0c387621fd2d332
+License: BSD
+Security Critical: yes
+License Path: third_party/libei/LICENSE
+
+Description:
+This directory contains a copy of libei obtained from gitlab.
+
+Local Modifications: N/A
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium
index 3c93dd2..f247fda4 100644
--- a/third_party/nearby/README.chromium
+++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@
 Name: Nearby Connections Library
 Short Name: Nearby
 URL: https://github.com/google/nearby
-Version: 12156937ee28c595c6d07357edb599fc58e6e34d
+Version: 39df20d821ba6988fa3e2aa0ae42eadf4298c617
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/rust/cfg_if/v1/BUILD.gn b/third_party/rust/cfg_if/v1/BUILD.gn
index 8c4d2b08..0128b39c 100644
--- a/third_party/rust/cfg_if/v1/BUILD.gn
+++ b/third_party/rust/cfg_if/v1/BUILD.gn
@@ -21,7 +21,7 @@
   cargo_pkg_version = "1.0.0"
   cargo_pkg_authors = "Alex Crichton <alex@alexcrichton.com>"
   cargo_pkg_name = "cfg-if"
-  cargo_pkg_description = "A macro to ergonomically define an item depending on a large number of #[cfg]parameters. Structured like an if-else chain, the first matching branch is theitem that gets emitted."
+  cargo_pkg_description = "A macro to ergonomically define an item depending on a large number of #[cfg] parameters. Structured like an if-else chain, the first matching branch is the item that gets emitted."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/rust/env_logger/v0_9/BUILD.gn b/third_party/rust/env_logger/v0_9/BUILD.gn
index bea7b1ec..ecd54de5 100644
--- a/third_party/rust/env_logger/v0_9/BUILD.gn
+++ b/third_party/rust/env_logger/v0_9/BUILD.gn
@@ -21,7 +21,7 @@
   cargo_pkg_version = "0.9.0"
   cargo_pkg_authors = "The Rust Project Developers"
   cargo_pkg_name = "env_logger"
-  cargo_pkg_description = "A logging implementation for `log` which is configured via an environmentvariable."
+  cargo_pkg_description = "A logging implementation for `log` which is configured via an environment variable."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/rust/indexmap/v1/BUILD.gn b/third_party/rust/indexmap/v1/BUILD.gn
index d612387..7735a3c 100644
--- a/third_party/rust/indexmap/v1/BUILD.gn
+++ b/third_party/rust/indexmap/v1/BUILD.gn
@@ -21,7 +21,7 @@
   cargo_pkg_version = "1.8.1"
   cargo_pkg_authors = "bluss, Josh Stone <cuviper@gmail.com>"
   cargo_pkg_name = "indexmap"
-  cargo_pkg_description = "A hash table with consistent order and fast iteration.The indexmap is a hash table where the iteration order of the key-valuepairs is independent of the hash values of the keys. It has the usualhash table functionality, it preserves insertion order except afterremovals, and it allows lookup of its elements by either hash table keyor numerical index. A corresponding hash set type is also provided.This crate was initially published under the name ordermap, but it was renamed toindexmap."
+  cargo_pkg_description = "A hash table with consistent order and fast iteration.  The indexmap is a hash table where the iteration order of the key-value pairs is independent of the hash values of the keys. It has the usual hash table functionality, it preserves insertion order except after removals, and it allows lookup of its elements by either hash table key or numerical index. A corresponding hash set type is also provided.  This crate was initially published under the name ordermap, but it was renamed to indexmap."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/rust/regex/v1/BUILD.gn b/third_party/rust/regex/v1/BUILD.gn
index 5ebf3e87..5bd68ed 100644
--- a/third_party/rust/regex/v1/BUILD.gn
+++ b/third_party/rust/regex/v1/BUILD.gn
@@ -21,7 +21,7 @@
   cargo_pkg_version = "1.6.0"
   cargo_pkg_authors = "The Rust Project Developers"
   cargo_pkg_name = "regex"
-  cargo_pkg_description = "An implementation of regular expressions for Rust. This implementation usesfinite automata and guarantees linear time matching on all inputs."
+  cargo_pkg_description = "An implementation of regular expressions for Rust. This implementation uses finite automata and guarantees linear time matching on all inputs."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
@@ -67,7 +67,7 @@
   cargo_pkg_version = "1.6.0"
   cargo_pkg_authors = "The Rust Project Developers"
   cargo_pkg_name = "regex"
-  cargo_pkg_description = "An implementation of regular expressions for Rust. This implementation usesfinite automata and guarantees linear time matching on all inputs."
+  cargo_pkg_description = "An implementation of regular expressions for Rust. This implementation uses finite automata and guarantees linear time matching on all inputs."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/rust/rstest/v0_12/BUILD.gn b/third_party/rust/rstest/v0_12/BUILD.gn
index ca4831a..761f999 100644
--- a/third_party/rust/rstest/v0_12/BUILD.gn
+++ b/third_party/rust/rstest/v0_12/BUILD.gn
@@ -21,7 +21,7 @@
   cargo_pkg_version = "0.12.0"
   cargo_pkg_authors = "Michele d'Amico <michele.damico@gmail.com>"
   cargo_pkg_name = "rstest"
-  cargo_pkg_description = "Rust fixture based test framework. It use procedural macroto implement fixtures and table based tests."
+  cargo_pkg_description = "Rust fixture based test framework. It use procedural macro to implement fixtures and table based tests."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/rust/strsim/v0_10/BUILD.gn b/third_party/rust/strsim/v0_10/BUILD.gn
index 5821359..26d2af79 100644
--- a/third_party/rust/strsim/v0_10/BUILD.gn
+++ b/third_party/rust/strsim/v0_10/BUILD.gn
@@ -21,7 +21,7 @@
   cargo_pkg_version = "0.10.0"
   cargo_pkg_authors = "Danny Guo <danny@dannyguo.com>"
   cargo_pkg_name = "strsim"
-  cargo_pkg_description = "Implementations of string similarity metrics. Includes Hamming, Levenshtein,OSA, Damerau-Levenshtein, Jaro, Jaro-Winkler, and Sørensen-Dice."
+  cargo_pkg_description = "Implementations of string similarity metrics. Includes Hamming, Levenshtein, OSA, Damerau-Levenshtein, Jaro, Jaro-Winkler, and Sørensen-Dice."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/rust/toml/v0_5/BUILD.gn b/third_party/rust/toml/v0_5/BUILD.gn
index e695b8e..5c202e7 100644
--- a/third_party/rust/toml/v0_5/BUILD.gn
+++ b/third_party/rust/toml/v0_5/BUILD.gn
@@ -21,7 +21,7 @@
   cargo_pkg_version = "0.5.9"
   cargo_pkg_authors = "Alex Crichton <alex@alexcrichton.com>"
   cargo_pkg_name = "toml"
-  cargo_pkg_description = "A native Rust encoder and decoder of TOML-formatted files and streams. Providesimplementations of the standard Serialize/Deserialize traits for TOML data tofacilitate deserializing and serializing Rust structures."
+  cargo_pkg_description = "A native Rust encoder and decoder of TOML-formatted files and streams. Provides implementations of the standard Serialize/Deserialize traits for TOML data to facilitate deserializing and serializing Rust structures."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/rust/unicode_width/v0_1/BUILD.gn b/third_party/rust/unicode_width/v0_1/BUILD.gn
index d27a93c5..b299ef6 100644
--- a/third_party/rust/unicode_width/v0_1/BUILD.gn
+++ b/third_party/rust/unicode_width/v0_1/BUILD.gn
@@ -22,7 +22,7 @@
   cargo_pkg_authors =
       "kwantam <kwantam@gmail.com>, Manish Goregaokar <manishsmail@gmail.com>"
   cargo_pkg_name = "unicode-width"
-  cargo_pkg_description = "Determine displayed width of `char` and `str` typesaccording to Unicode Standard Annex #11 rules."
+  cargo_pkg_description = "Determine displayed width of `char` and `str` types according to Unicode Standard Annex #11 rules."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/rust/which/v4/BUILD.gn b/third_party/rust/which/v4/BUILD.gn
index 24806ff..8a54c2e 100644
--- a/third_party/rust/which/v4/BUILD.gn
+++ b/third_party/rust/which/v4/BUILD.gn
@@ -21,7 +21,7 @@
   cargo_pkg_version = "4.3.0"
   cargo_pkg_authors = "Harry Fei <tiziyuanfang@gmail.com>"
   cargo_pkg_name = "which"
-  cargo_pkg_description = "A Rust equivalent of Unix command 'which'. Locate installed executable in cross platforms."
+  cargo_pkg_description = "A Rust equivalent of Unix command \"which\". Locate installed executable in cross platforms."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
   library_configs += [ "//build/config/compiler:no_chromium_code" ]
   executable_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/tools/cast3p/cast_core.version b/tools/cast3p/cast_core.version
index ec3cf41..1111ead 100644
--- a/tools/cast3p/cast_core.version
+++ b/tools/cast3p/cast_core.version
@@ -1 +1 @@
-cast_20230306_0601_RC03
+cast_20230321_1054_RC00
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py
index b686912..2dc9323 100755
--- a/tools/clang/scripts/build.py
+++ b/tools/clang/scripts/build.py
@@ -8,6 +8,15 @@
 
 The expectation is that update.py downloads prebuilt binaries for everyone, and
 nobody should run this script as part of normal development.
+
+DEAR MAC USER: YOU NEED XCODE INSTALLED TO BUILD LLVM/CLANG WITH THIS SCRIPT.
+The Xcode command line tools that are installed as part of the Chromium
+development setup process are not sufficient. CMake will fail to configure, as
+the non-system Clang we use will not find any standard library headers. To use
+this build script on Mac:
+1. Download Xcode. (Visit http://go/xcode for googlers.)
+2. Install to /Applications
+3. sudo xcode-select --switch /Applications/Xcode.app
 """
 
 from __future__ import print_function
@@ -543,6 +552,14 @@
                       help='do not create or update any checkouts')
   parser.add_argument('--build-dir',
                       help='Override build directory')
+  parser.add_argument('--install-dir',
+                      help='override the install directory for the final '
+                      'compiler. If not specified, no install happens for '
+                      'the compiler.')
+  parser.add_argument('--no-tools',
+                      action='store_true',
+                      help='don\'t build any chromium tools or '
+                      'clang-extra-tools. Overrides --extra-tools.')
   parser.add_argument('--extra-tools', nargs='*', default=[],
                       help='select additional chrome tools to build')
   parser.add_argument('--use-system-cmake', action='store_true',
@@ -980,22 +997,29 @@
   if args.bolt:
     ldflags += ['-Wl,--emit-relocs', '-Wl,-znow']
 
-  default_tools = ['plugins', 'blink_gc_plugin', 'translation_unit']
-  chrome_tools = list(set(default_tools + args.extra_tools))
+  chrome_tools = []
+  if not args.no_tools:
+    default_tools = ['plugins', 'blink_gc_plugin', 'translation_unit']
+    chrome_tools = list(set(default_tools + args.extra_tools))
   if cc is not None:  base_cmake_args.append('-DCMAKE_C_COMPILER=' + cc)
   if cxx is not None: base_cmake_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
   if lld is not None: base_cmake_args.append('-DCMAKE_LINKER=' + lld)
+  final_install_dir = args.install_dir if args.install_dir else LLVM_BUILD_DIR
   cmake_args = base_cmake_args + [
       '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
       '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
       '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags),
       '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags),
       '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags),
-      '-DCMAKE_INSTALL_PREFIX=' + LLVM_BUILD_DIR,
-      '-DLLVM_EXTERNAL_PROJECTS=chrometools',
-      '-DLLVM_EXTERNAL_CHROMETOOLS_SOURCE_DIR=' +
-          os.path.join(CHROMIUM_DIR, 'tools', 'clang'),
-      '-DCHROMIUM_TOOLS=%s' % ';'.join(chrome_tools)]
+      '-DCMAKE_INSTALL_PREFIX=' + final_install_dir,
+  ]
+  if not args.no_tools:
+    cmake_args.extend([
+        '-DLLVM_EXTERNAL_PROJECTS=chrometools',
+        '-DLLVM_EXTERNAL_CHROMETOOLS_SOURCE_DIR=' +
+        os.path.join(CHROMIUM_DIR, 'tools', 'clang'),
+        '-DCHROMIUM_TOOLS=%s' % ';'.join(chrome_tools)
+    ])
   if args.pgo:
     cmake_args.append('-DLLVM_PROFDATA_FILE=' + LLVM_PROFDATA_FILE)
   if args.thinlto:
@@ -1309,6 +1333,8 @@
     RunCommand(['ninja', '-C', LLVM_BUILD_DIR, 'check-all'],
                env=env,
                msvc_arch='x64')
+  if args.install_dir:
+    RunCommand(['ninja', 'install'], msvc_arch='x64')
 
   WriteStampFile(PACKAGE_VERSION, STAMP_FILE)
   WriteStampFile(PACKAGE_VERSION, FORCE_HEAD_REVISION_FILE)
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 5dd6914..c7b57628e 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -232,16 +232,16 @@
     sys.exit(1)
 
 
-def UpdatePackage(package_name, host_os):
+def UpdatePackage(package_name, host_os, dir=LLVM_BUILD_DIR):
   stamp_file = None
   package_file = None
 
-  stamp_file = os.path.join(LLVM_BUILD_DIR, package_name + '_revision')
+  stamp_file = os.path.join(dir, package_name + '_revision')
   if package_name == 'clang':
     stamp_file = STAMP_FILE
     package_file = 'clang'
   elif package_name == 'coverage_tools':
-    stamp_file = os.path.join(LLVM_BUILD_DIR, 'cr_coverage_revision')
+    stamp_file = os.path.join(dir, 'cr_coverage_revision')
     package_file = 'llvm-code-coverage'
   elif package_name == 'objdump':
     package_file = 'llvmobjdump'
@@ -278,17 +278,17 @@
 
   # Updating the main clang package nukes the output dir. Any other packages
   # need to be updated *after* the clang package.
-  if package_name == 'clang' and os.path.exists(LLVM_BUILD_DIR):
-    RmTree(LLVM_BUILD_DIR)
+  if package_name == 'clang' and os.path.exists(dir):
+    RmTree(dir)
 
-  DownloadAndUnpackPackage(package_file, LLVM_BUILD_DIR, host_os)
+  DownloadAndUnpackPackage(package_file, dir, host_os)
 
   if package_name == 'clang' and 'mac' in target_os:
-    DownloadAndUnpackClangMacRuntime(LLVM_BUILD_DIR)
+    DownloadAndUnpackClangMacRuntime(dir)
   if package_name == 'clang' and 'win' in target_os:
     # When doing win/cross builds on other hosts, get the Windows runtime
     # libraries, and llvm-symbolizer.exe (needed in asan builds).
-    DownloadAndUnpackClangWinRuntime(LLVM_BUILD_DIR)
+    DownloadAndUnpackClangWinRuntime(dir)
 
   WriteStampFile(expected_stamp, stamp_file)
   return 0
diff --git a/tools/clang/scripts/upload_revision.py b/tools/clang/scripts/upload_revision.py
index f0761c7..8fb6a94a 100755
--- a/tools/clang/scripts/upload_revision.py
+++ b/tools/clang/scripts/upload_revision.py
@@ -52,6 +52,7 @@
 ]
 
 # Keep lines in here at <= 72 columns, else they wrap in gerrit.
+# There can be no whitespace line between or below these gerrit footers.
 COMMIT_FOOTER = \
 '''
 Bug: TODO. Remove the Tricium: line below when filling this in.
@@ -72,21 +73,19 @@
 Cq-Include-Trybots: chrome/try:iphone-device,ipad-device
 Cq-Include-Trybots: chrome/try:linux-chromeos-chrome
 Cq-Include-Trybots: chrome/try:win-chrome,win64-chrome,linux-chrome,mac-chrome
-Cq-Include-Trybots: chrome/try:linux-pgo,mac-pgo,win32-pgo,win64-pgo
-'''
+Cq-Include-Trybots: chrome/try:linux-pgo,mac-pgo,win32-pgo,win64-pgo'''
 
 RUST_BOTS = \
-'''
-Cq-Include-Trybots: luci.chromium.try:android-rust-arm32-rel
-Cq-Include-Trybots: luci.chromium.try:linux-rust-x64-dbg
-Cq-Include-Trybots: luci.chromium.try:linux-rust-x64-rel
-'''
-# TODO: Add more Rust bots as they are ready:
-# Cq-Include-Trybots: luci.chromium.try:android-rust-arm64-dbg
-# Cq-Include-Trybots: luci.chromium.try:android-rust-arm64-rel
-# Cq-Include-Trybots: luci.chromium.try:win-rust-x64-dbg
-# Cq-Include-Trybots: luci.chromium.try:win-rust-x64-rel
-# Cq-Include-Trybots: luci.chromium.try:mac-rust-x64-rel
+'''Cq-Include-Trybots: chromium/try:android-rust-arm32-rel
+Cq-Include-Trybots: chromium/try:android-rust-arm64-dbg
+Cq-Include-Trybots: chromium/try:android-rust-arm64-rel
+Cq-Include-Trybots: chromium/try:linux-rust-x64-dbg
+Cq-Include-Trybots: chromium/try:linux-rust-x64-rel'''
+
+# These do not pass yet:
+#Cq-Include-Trybots: chromium/try:mac-rust-x64-rel
+#Cq-Include-Trybots: chromium/try:win-rust-x64-dbg
+#Cq-Include-Trybots: chromium/try:win-rust-x64-rel
 
 is_win = sys.platform.startswith('win32')
 
@@ -356,7 +355,7 @@
 
   commit_message = f'{title}\n\n{body}\n{COMMIT_FOOTER}'
   if args.roll_rust:
-    commit_message += f'{RUST_BOTS}'
+    commit_message += f'\n{RUST_BOTS}'
 
   Git('add',
       CLANG_UPDATE_PY_PATH,
diff --git a/tools/crates/gnrt/config.rs b/tools/crates/gnrt/config.rs
index ea18692b..6de8a70 100644
--- a/tools/crates/gnrt/config.rs
+++ b/tools/crates/gnrt/config.rs
@@ -9,20 +9,27 @@
 
 use serde::Deserialize;
 
-/// Extra GN configuration for targets. Contains one entry for each crate with
-/// custom config.
+/// Customizes GN output for a session.
 #[derive(Clone, Debug, Deserialize)]
-pub struct ConfigFile {
-    #[serde(flatten)]
-    pub per_lib_config: BTreeMap<String, PerLibConfig>,
+pub struct BuildConfig {
+    /// Configuration that applies to all crates
+    #[serde(default, rename = "all")]
+    pub all_config: CrateConfig,
+    /// Additional configuration options for specific crates. Keyed by crate
+    /// name. Config is additive with `all_config`.
+    #[serde(rename = "crate")]
+    pub per_crate_config: BTreeMap<String, CrateConfig>,
 }
 
-#[derive(Clone, Debug, Deserialize)]
-pub struct PerLibConfig {
-    /// List of `cfg(...)` options for building this crate.
+#[derive(Clone, Debug, Default, Deserialize)]
+pub struct CrateConfig {
+    /// `cfg(...)` options for building this crate.
     #[serde(default)]
     pub cfg: Vec<String>,
-    /// List of compile-time environment variables for this crate.
+    /// Compile-time environment variables for this crate.
     #[serde(default)]
     pub env: Vec<String>,
+    /// Extra rustc flags.
+    #[serde(default)]
+    pub rustflags: Vec<String>,
 }
diff --git a/tools/crates/gnrt/gn.rs b/tools/crates/gnrt/gn.rs
index 4558e419..dd9804d 100644
--- a/tools/crates/gnrt/gn.rs
+++ b/tools/crates/gnrt/gn.rs
@@ -4,6 +4,7 @@
 
 //! GN build file generation.
 
+use crate::config;
 use crate::crates::*;
 use crate::deps;
 use crate::manifest::CargoPackage;
@@ -12,7 +13,7 @@
 
 use std::collections::HashMap;
 use std::convert::From;
-use std::fmt;
+use std::fmt::{self, Write};
 use std::path::Path;
 
 /// Describes a BUILD.gn file for a single crate epoch. Each file may have
@@ -66,6 +67,8 @@
     pub features: Vec<String>,
     pub build_root: Option<String>,
     pub build_script_outputs: Vec<String>,
+    pub rustflags: Vec<String>,
+    pub rustenv: Vec<String>,
     pub gn_variables_lib: String,
 }
 
@@ -144,18 +147,10 @@
 pub fn build_file_from_std_deps<'a, 'b, Iter: IntoIterator<Item = &'a deps::Package>>(
     deps: Iter,
     paths: &'b paths::ChromiumPaths,
-    extra_gn_for_pkg_name: &HashMap<String, String>,
+    extra_config: &'b config::BuildConfig,
 ) -> BuildFile {
-    let rules = deps
-        .into_iter()
-        .map(|dep| {
-            build_rule_from_std_dep(
-                dep,
-                paths,
-                &extra_gn_for_pkg_name.get(&dep.package_name).map(|s| s.as_str()).unwrap_or(""),
-            )
-        })
-        .collect();
+    let rules =
+        deps.into_iter().map(|dep| build_rule_from_std_dep(dep, paths, extra_config)).collect();
 
     BuildFile { rules }
 }
@@ -163,7 +158,7 @@
 pub fn build_rule_from_std_dep(
     dep: &deps::Package,
     paths: &paths::ChromiumPaths,
-    extra_gn: &str,
+    extra_config: &config::BuildConfig,
 ) -> (String, Rule) {
     let lib_target = dep.lib_target.as_ref().expect("dependency had no lib target");
     let crate_root_from_src = paths.to_gn_abs_path(&lib_target.root).unwrap();
@@ -171,6 +166,37 @@
     let cargo_pkg_authors =
         if dep.authors.is_empty() { None } else { Some(dep.authors.join(", ")) };
 
+    let crate_config = extra_config.per_crate_config.get(&dep.package_name);
+
+    // Collect the set of rustflags for this crate. This is a combination of
+    // those for the crate specifically, and any overall ones set. Additionally,
+    // the `cfg` options become flags but we have to format them here.
+    //
+    // This expression is complicated to avoid creating unnecessary clones. We
+    // only need to clone each String once, and create one new Vec with
+    // collect() at the end.
+    let rustflags = crate_config
+        .into_iter()
+        .flat_map(|c| c.cfg.iter())
+        .chain(extra_config.all_config.cfg.iter())
+        .map(|cfg| format!("--cfg={cfg}"))
+        .chain(
+            crate_config
+                .into_iter()
+                .flat_map(|c| c.rustflags.iter())
+                .chain(extra_config.all_config.rustflags.iter())
+                .cloned(),
+        )
+        .collect();
+
+    // Do the same for rustenv, which is simpler.
+    let rustenv = crate_config
+        .into_iter()
+        .flat_map(|c| c.env.iter())
+        .chain(extra_config.all_config.env.iter())
+        .cloned()
+        .collect();
+
     let mut rule = RuleConcrete {
         crate_name: None,
         epoch: None,
@@ -189,7 +215,9 @@
         features: vec![],
         build_root: None,
         build_script_outputs: vec![],
-        gn_variables_lib: extra_gn.to_string(),
+        rustflags,
+        rustenv,
+        gn_variables_lib: String::new(),
     };
 
     rule.features = dep
@@ -273,6 +301,8 @@
         features: Vec::new(),
         build_root: dep.build_script.as_ref().map(|p| to_gn_path(p.as_path())),
         build_script_outputs: build_script_outputs.get(&crate_id).cloned().unwrap_or_default(),
+        rustflags: vec![],
+        rustenv: vec![],
         gn_variables_lib: String::new(),
     };
 
@@ -431,7 +461,7 @@
     }
 }
 
-fn write_build_file<W: fmt::Write>(
+fn write_build_file<W: Write>(
     mut writer: W,
     build_file: &BuildFile,
     with_preamble: bool,
@@ -466,7 +496,7 @@
     }
 }
 
-fn write_concrete<W: fmt::Write>(
+fn write_concrete<W: Write>(
     mut writer: W,
     name: &str,
     common: &RuleCommon,
@@ -499,12 +529,18 @@
     writeln!(writer, "edition = \"{}\"", details.edition)?;
     writeln!(writer, "cargo_pkg_version = \"{}\"", details.cargo_pkg_version)?;
     if let Some(authors) = &details.cargo_pkg_authors {
-        writeln!(writer, "cargo_pkg_authors = \"{authors}\"")?;
+        write!(writer, "cargo_pkg_authors = \"")?;
+        write!(Escaper(&mut writer), "{authors}")?;
+        writeln!(writer, "\"")?;
     }
     writeln!(writer, "cargo_pkg_name = \"{}\"", details.cargo_pkg_name)?;
     if let Some(description) = &details.cargo_pkg_description {
+        // Remove the trailing newline, which unattractively comes out as a
+        // trailing space. Escaper can't do this because, as a Write
+        // implementation, it does not know where the end of input will be.
+        let description = description.trim_end();
         write!(writer, "cargo_pkg_description = \"")?;
-        write_str_escaped(&mut writer, description)?;
+        write!(Escaper(&mut writer), "{description}")?;
         writeln!(writer, "\"")?;
     }
     writeln!(writer, "library_configs -= [ \"//build/config/compiler:chromium_code\" ]")?;
@@ -539,6 +575,16 @@
         }
     }
 
+    if !details.rustenv.is_empty() {
+        write!(writer, "rustenv = ")?;
+        write_list(&mut writer, &details.rustenv)?;
+    }
+
+    if !details.rustflags.is_empty() {
+        write!(writer, "rustflags = ")?;
+        write_list(&mut writer, &details.rustflags)?;
+    }
+
     if !details.gn_variables_lib.is_empty() {
         writeln!(writer, "{}", details.gn_variables_lib)?;
     }
@@ -546,7 +592,7 @@
     writeln!(writer, "}}")
 }
 
-fn write_group<W: fmt::Write>(
+fn write_group<W: Write>(
     mut writer: W,
     name: &str,
     common: &RuleCommon,
@@ -564,7 +610,7 @@
     writeln!(writer, "}}")
 }
 
-fn write_deps<W: fmt::Write>(mut writer: W, kind: &str, mut deps: Vec<RuleDep>) -> fmt::Result {
+fn write_deps<W: Write>(mut writer: W, kind: &str, mut deps: Vec<RuleDep>) -> fmt::Result {
     // Group dependencies by platform condition via sorting.
     deps.sort();
 
@@ -600,54 +646,64 @@
     Ok(())
 }
 
-fn write_list<W: fmt::Write, T: fmt::Display, I: IntoIterator<Item = T>>(
+fn write_list<W: Write, T: fmt::Display, I: IntoIterator<Item = T>>(
     mut writer: W,
     items: I,
 ) -> fmt::Result {
     writeln!(writer, "[")?;
     for item in items.into_iter() {
-        writeln!(writer, "\"{item}\",")?;
+        write!(writer, "\"")?;
+        write!(Escaper(&mut writer), "{item}")?;
+        writeln!(writer, "\",")?;
     }
     writeln!(writer, "]")
 }
 
-fn write_set<W: fmt::Write, T: fmt::Display, U: fmt::Display, I: IntoIterator<Item = (T, U)>>(
+fn write_set<W: Write, T: fmt::Display, U: fmt::Display, I: IntoIterator<Item = (T, U)>>(
     mut writer: W,
     items: I,
 ) -> fmt::Result {
     writeln!(writer, "{{")?;
     for (left, right) in items.into_iter() {
-        writeln!(writer, "{left} = \"{right}\"")?;
+        write!(writer, "{left} = \"")?;
+        write!(Escaper(&mut writer), "{right}")?;
+        writeln!(writer, "\"")?;
     }
     writeln!(writer, "}}")
 }
 
-fn write_str_escaped<W: fmt::Write>(mut writer: W, s: &str) -> fmt::Result {
-    // This escaping isn't entirely correct; it misses some characters that
-    // should be escaped and unnecessarily changes " to '. See
-    // https://gn.googlesource.com/gn/+/main/docs/language.md#strings
-    //
-    // We keep the crates.py behavior for now to keep build file output as
-    // similar as possible.
-    //
-    // TODO(https://crbug.com/1291994): do escaping as specified in GN docs.
-    for c in s.chars() {
-        let mut buf = [0u8; 4];
-        let s = match c {
-            // Skip newlines to match crates.py behavior.
-            '\n' => continue,
-            '"' => r#"'"#,
-            c => c.encode_utf8(&mut buf),
-        };
+/// Wraps a `Write` and escapes special characters when written to. Suitable for
+/// outputting GN strings. Note that it does not escape '$', since we want to
+/// use GN "$var" syntax in some cases. Also due to an apparent bug in GN's
+/// output to Ninja files, we skip newlines.
+///
+/// See https://gn.googlesource.com/gn/+/refs/heads/main/docs/language.md#Strings
+pub struct Escaper<W>(W);
 
-        writer.write_str(s)?;
+impl<W: Write> Escaper<W> {
+    pub fn new_for_testing(writer: W) -> Self {
+        Escaper(writer)
     }
-
-    Ok(())
 }
 
-pub fn write_str_escaped_for_testing<W: fmt::Write>(writer: W, s: &str) -> fmt::Result {
-    write_str_escaped(writer, s)
+impl<W: Write> Write for Escaper<W> {
+    fn write_str(&mut self, s: &str) -> fmt::Result {
+        s.chars().try_for_each(|c| self.write_char(c))
+    }
+
+    fn write_char(&mut self, c: char) -> fmt::Result {
+        match c {
+            // Note: we don't escape '$' here because we sometimes want to use
+            // $var syntax.
+            c @ ('"' | '\\') => write!(self.0, "\\{c}"),
+            // GN strings can encode literal ASCII with "$0x<hex_code>" syntax,
+            // so we could embed newlines with "$0x0A". However, GN seems to
+            // escape these incorrectly in its Ninja output so we just replace
+            // it with a space.
+            '\n' => self.0.write_char(' '),
+            c => self.0.write_char(c),
+        }
+    }
 }
 
 /// Describes a condition for some GN declaration.
diff --git a/tools/crates/gnrt/gn_unittest.rs b/tools/crates/gnrt/gn_unittest.rs
index 51db329d..0fe1e47 100644
--- a/tools/crates/gnrt/gn_unittest.rs
+++ b/tools/crates/gnrt/gn_unittest.rs
@@ -29,7 +29,7 @@
                     cargo_pkg_authors: Some("Somebody <somebody@foo.org>".to_string()),
                     cargo_pkg_name: "foo".to_string(),
                     cargo_pkg_description: Some(
-                        "A generic framework for foo\nNewline\"".to_string(),
+                        "A generic framework for foo\nNewline\"\n".to_string(),
                     ),
                     deps: vec![RuleDep::construct_for_testing(
                         Condition::Always,
@@ -48,6 +48,12 @@
                     features: vec!["std".to_string()],
                     build_root: Some("crate/build.rs".to_string()),
                     build_script_outputs: vec!["binding.rs".to_string()],
+                    rustflags: vec![
+                        "--cfg=foo".to_string(),
+                        "--cfg=feature=\"std\"".to_string(),
+                        "-Zunstable-feature".to_string(),
+                    ],
+                    rustenv: vec!["BAR_ENV=123".to_string()],
                     gn_variables_lib: "variables = []".to_string(),
                 },
             },
@@ -74,7 +80,7 @@
 cargo_pkg_version = "1.2.3"
 cargo_pkg_authors = "Somebody <somebody@foo.org>"
 cargo_pkg_name = "foo"
-cargo_pkg_description = "A generic framework for fooNewline'"
+cargo_pkg_description = "A generic framework for foo Newline\""
 library_configs -= [ "//build/config/compiler:chromium_code" ]
 library_configs += [ "//build/config/compiler:no_chromium_code" ]
 executable_configs -= [ "//build/config/compiler:chromium_code" ]
@@ -93,6 +99,14 @@
 build_script_outputs = [
 "binding.rs",
 ]
+rustenv = [
+"BAR_ENV=123",
+]
+rustflags = [
+"--cfg=foo",
+"--cfg=feature=\"std\"",
+"-Zunstable-feature",
+]
 variables = []
 }
 "#,
@@ -124,6 +138,8 @@
                         features: vec![],
                         build_root: None,
                         build_script_outputs: vec![],
+                        rustflags: vec![],
+                        rustenv: vec![],
                         gn_variables_lib: String::new(),
                     },
                 },
@@ -224,6 +240,8 @@
                     features: vec!["std".to_string()],
                     build_root: Some("crate/build.rs".to_string()),
                     build_script_outputs: vec!["binding.rs".to_string()],
+                    rustflags: vec![],
+                    rustenv: vec![],
                     gn_variables_lib: String::new(),
                 },
             },
@@ -379,13 +397,14 @@
 #[gtest(GnTest, StringEscaping)]
 fn test() {
     fn escaped(s: &str) -> String {
+        use std::fmt::Write;
         let mut out = String::new();
-        write_str_escaped_for_testing(&mut out, s).unwrap();
+        write!(Escaper::new_for_testing(&mut out), "{s}").unwrap();
         out
     }
 
     expect_eq!("foo bar", escaped("foo bar"));
-    expect_eq!("foobar", escaped("foo\nbar"));
-    expect_eq!(r#"foo 'bar'"#, escaped(r#"foo "bar""#));
+    expect_eq!("foo bar ", escaped("foo\nbar\n"));
+    expect_eq!(r#"foo \"bar\""#, escaped(r#"foo "bar""#));
     expect_eq!("foo 'bar'", escaped("foo 'bar'"));
 }
diff --git a/tools/crates/gnrt/main.rs b/tools/crates/gnrt/main.rs
index e88189c4..fdd399fd 100644
--- a/tools/crates/gnrt/main.rs
+++ b/tools/crates/gnrt/main.rs
@@ -299,7 +299,7 @@
 fn generate_for_std(_args: &clap::ArgMatches, paths: &paths::ChromiumPaths) -> ExitCode {
     // Load config file, which applies rustenv and cfg flags to some std crates.
     let config_file_contents = std::fs::read_to_string(paths.std_config_file).unwrap();
-    let config: config::ConfigFile = toml::de::from_str(&config_file_contents).unwrap();
+    let config: config::BuildConfig = toml::de::from_str(&config_file_contents).unwrap();
 
     // Run `cargo metadata` from the std package in the Rust source tree (which
     // is a workspace).
@@ -389,38 +389,7 @@
         }
     }
 
-    // Load extra cfg flags and environment variables needed while building std
-    // crates.
-    //
-    // TODO(crbug.com/1368806):
-    // * Supply `-Zforce-unstable-if-unmarked` to all std crates, which ensures deps
-    //   of std aren't visible to consumers.
-    let mut extra_gn = HashMap::new();
-    for (lib, config) in config.per_lib_config {
-        let mut rustflags = String::new();
-        let mut rustenv = String::new();
-        if !config.cfg.is_empty() {
-            rustflags = "rustflags = [".to_string();
-            rustflags.extend(config.cfg.into_iter().map(|cfg| format!("\"--cfg={cfg}\",")));
-            rustflags.push(']');
-        }
-        if !config.env.is_empty() {
-            rustenv = "rustenv = [".to_string();
-            rustenv.extend(config.env.into_iter().map(|env| format!("\"{env}\",")));
-            rustenv.push(']');
-        }
-
-        let strs = [rustflags.as_str(), rustenv.as_str()];
-        let extra = strs.join("\n");
-
-        assert!(
-            !extra.is_empty(),
-            "if a config entry was present, we should've generated something..."
-        );
-        extra_gn.insert(lib, extra);
-    }
-
-    let build_file = gn::build_file_from_std_deps(dependencies.iter(), paths, &extra_gn);
+    let build_file = gn::build_file_from_std_deps(dependencies.iter(), paths, &config);
     write_build_file(&paths.std_build.join("BUILD.gn"), &build_file).unwrap();
 
     ExitCode::SUCCESS
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
index d635208..d544f6a3 100644
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec
@@ -251,7 +251,7 @@
     "includes": [1680],
   },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/nearby_internals/nearby_internals_resources.grd": {
-    "META": {"sizes": {"includes": [20]}},
+    "META": {"sizes": {"includes": [40]}},
     "includes": [1740],
   },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/nearby_share/nearby_share_dialog_resources.grd": {
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 611eb73..6d67148 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -21914,6 +21914,14 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
+<action name="MobileTopToolbarAddToBookmarksButton">
+  <owner>salg@google.com</owner>
+  <owner>clank-app-team@google.com</owner>
+  <description>
+    The user tapped on the top toolbar's add to bookmarks button.
+  </description>
+</action>
+
 <action name="MobileTopToolbarHomeButton">
   <obsolete>Removed as of 2020/09/09.</obsolete>
   <owner>mdjones@chromium.org</owner>
@@ -36803,6 +36811,8 @@
   <suffix name="DownloadPageScreenshot"
       label="For DownloadPageScreenshot feature."/>
   <suffix name="DownloadSettings" label="For DownloadSettings feature."/>
+  <suffix name="DownloadToolbarButton"
+      label="For Download toolbar button feature."/>
   <suffix name="EphemeralTab" label="For Ephemeral Tab."/>
   <suffix name="ExploreSitesTile" label="For Explore Sites feature."/>
   <suffix name="ExtensionsMenu" label="For Extensions menu opening."/>
@@ -36882,6 +36892,7 @@
       label="For KeyboardAccessoryPaymentFilling feature."/>
   <suffix name="KeyboardAccessoryPaymentOffer"
       label="For KeyboardAccessoryPaymentOffer feature."/>
+  <suffix name="LauncherSearchHelpUi" label="For launcher search IPH feature."/>
   <suffix name="LiveCaption" label="For LiveCaption feature."/>
   <suffix name="LongPressToolbarTip" label="For LongPressToolbar feature."/>
   <suffix name="LowUserEngagementDetector"
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 2a5cec6d..5626be86 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -4004,6 +4004,7 @@
   <int value="0" label="Launched from full apps list"/>
   <int value="1" label="Launched from a notification"/>
   <int value="2" label="Launched from recent apps in Phone Hub"/>
+  <int value="3" label="Unknown launch entrypoint."/>
 </enum>
 
 <enum name="AppsWindowType">
@@ -33051,6 +33052,7 @@
   <int value="1092" label="ScreenCaptureWithoutGestureAllowedForOrigins"/>
   <int value="1093"
       label="FileOrDirectoryPickerWithoutGestureAllowedForOrigins"/>
+  <int value="1094" label="AppLaunchAutomation"/>
 </enum>
 
 <enum name="EnterprisePoliciesSources">
@@ -44467,6 +44469,7 @@
   <int value="5" label="Crostini App"/>
   <int value="6" label="Web App"/>
   <int value="7" label="Plugin VM App"/>
+  <int value="8" label="Bruschetta App"/>
 </enum>
 
 <enum name="FileManagerTrashDirectorySetupFailedStep">
@@ -50308,6 +50311,26 @@
              result code."/>
 </enum>
 
+<enum name="HotspotDisableReason">
+  <int value="0"
+      label="kAutoDisabled: Hotspot disabled due to fixed time of no
+             connected device."/>
+  <int value="1"
+      label="kInternalError: Hotspot disabled due to internal error."/>
+  <int value="2"
+      label="kUserInitiated: Hotspot disabled due to user initiated
+             operation."/>
+  <int value="3" label="kWifiEnabled: Hotspot disabled due to WiFi enabled."/>
+  <int value="4"
+      label="kProhibitedByPolicy: Hotspot disabled due to policy restriction."/>
+  <int value="5"
+      label="kUpstreamNetworkNotAvailable: Hotspot disabled due to no
+             available upstream network."/>
+  <int value="6" label="kSuspended: Hotspot disabled due to device suspend."/>
+  <int value="7"
+      label="kRestart: Hotspot disabled due to hotspot restart process."/>
+</enum>
+
 <enum name="HotspotSetConfigResult">
   <int value="0" label="kSuccess: The operation completes successfully."/>
   <int value="1"
@@ -54136,13 +54159,14 @@
   <int value="3" label="StandardPromoDisplayHandler"/>
 </enum>
 
-<enum name="IOSPromptTabsForAndroidSwitcherState">
-  <int value="0" label="SyncDisabled"/>
-  <int value="1" label="SegmentationIncomplete"/>
-  <int value="2" label="PromptDismissed"/>
-  <int value="3" label="TabSyncDisabled"/>
-  <int value="4" label="NoActiveTabs"/>
-  <int value="5" label="Success"/>
+<enum name="IOSPromptAndroidTabsStatus">
+  <int value="0" label="Sync Disabled"/>
+  <int value="1" label="Segmentation Incomplete"/>
+  <int value="2" label="Prompt Shown and Dismissed"/>
+  <int value="3" label="Tab Sync Disabled"/>
+  <int value="4" label="No Active Tabs"/>
+  <int value="5" label="Not Android Switcher"/>
+  <int value="6" label="Success"/>
 </enum>
 
 <enum name="IOSSearchExtensionAction">
@@ -74374,6 +74398,15 @@
   <int value="5" label="Chrome process launch failed"/>
 </enum>
 
+<enum name="NotificationImageDragEndState">
+<!-- Defined in ash/system/message_center/ash_notification_drag_controller.h -->
+
+  <int value="0" label="InterruptedByNewDrag"/>
+  <int value="1" label="Cancelled"/>
+  <int value="2" label="CompletedWithDrop"/>
+  <int value="3" label="CompletedWithoutDrop"/>
+</enum>
+
 <enum name="NotificationPermissionState">
   <int value="0" label="Allowed"/>
   <int value="1" label="Denied by device policy"/>
@@ -75363,45 +75396,6 @@
   <int value="3" label="User clicked notification settings (disabled on O+)"/>
 </enum>
 
-<enum name="OfflinePagesAccessEntryPoint">
-  <int value="0" label="Other"/>
-  <int value="1" label="NTP suggestions or bookmarks"/>
-  <int value="2" label="Downloads home"/>
-  <int value="3" label="Omnibox"/>
-  <int value="4" label="CCT"/>
-  <int value="5" label="Clicking link"/>
-  <int value="6" label="Reloading page"/>
-  <int value="7" label="Clicking notification"/>
-  <int value="8" label="File URL intent"/>
-  <int value="9" label="Content URL intent"/>
-  <int value="10" label="Progress bar"/>
-  <int value="11" label="Net error page"/>
-</enum>
-
-<enum name="OfflinePagesAggregatedRequestResult">
-  <int value="0" label="Show offline page on disconnected network"/>
-  <int value="1" label="Page not found on disconnected network"/>
-  <int value="2" label="Show offline page on flaky network"/>
-  <int value="3" label="Page not found on flaky network"/>
-  <int value="4" label="Show offline page on prohibitively slow network"/>
-  <int value="5" label="Page not found on prohibitively slow network"/>
-  <int value="6" label="Page not fresh on prohibitively slow network"/>
-  <int value="7" label="Show offline page on connected network"/>
-  <int value="8" label="Page not found on connected network"/>
-  <int value="9" label="Android Tab does not have persistent ID"/>
-  <int value="10" label="No web contents"/>
-  <int value="11" label="Unknown net error, showing error page"/>
-  <int value="12" label="Redirected on disconnected network"/>
-  <int value="13" label="Redirected on flaky network"/>
-  <int value="14" label="Redirected on prohibitively slow network"/>
-  <int value="15" label="Redirected on connected network"/>
-  <int value="16" label="Digest mismatch on disconnected network"/>
-  <int value="17" label="Digest mismatch on flaky network"/>
-  <int value="18" label="Digest mismatch on prohibitively slow network"/>
-  <int value="19" label="Digest mismatch on connected network"/>
-  <int value="20" label="File not found"/>
-</enum>
-
 <enum name="OfflinePagesAutoFetchNotificationAction">
   <int value="0" label="shown">
     The notification was shown to the user (though it may have been blocked)
@@ -91606,6 +91600,12 @@
   <int value="7" label="BACKUP_NETWORK_SUCCESS"/>
 </enum>
 
+<enum name="SBClientDetectionClassifyThresholdsResult">
+  <int value="0" label="Success"/>
+  <int value="1" label="Model size was mismatched"/>
+  <int value="2" label="Model label was not found"/>
+</enum>
+
 <enum name="SBClientDetectionPreClassificationCheckFail">
   <int value="0" label="PROXY_FETCH"/>
   <int value="1" label="PRIVATE_IP"/>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 4d34c550..4c53518 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -3745,6 +3745,16 @@
   </summary>
 </histogram>
 
+<histogram name="Ash.NotificationView.ImageDrag.EndState"
+    enum="NotificationImageDragEndState" expires_after="M121">
+  <owner>andrewxu@chromium.org</owner>
+  <owner>cros-status-area-eng@google.com</owner>
+  <summary>
+    Records the notification drag end state when the notification image drag
+    ends.
+  </summary>
+</histogram>
+
 <histogram name="Ash.NotificationView.ImageDrag.Start"
     enum="NotificationCatalogName" expires_after="M121">
   <owner>andrewxu@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index 0bcf902..82b4181 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -114,6 +114,7 @@
       summary="download page for screenshot"/>
   <variant name="IPH_DownloadSettings"
       summary="accessing download settings from download home"/>
+  <variant name="IPH_DownloadToolbarButton" summary="download toolbar button"/>
   <variant name="IPH_EphemeralTab"
       summary="new label on the context menu for Ephemeral Tab"/>
   <variant name="IPH_ExploreSitesTile" summary="Explore Sites feature"/>
@@ -181,6 +182,8 @@
       summary="payments autofill suggestions"/>
   <variant name="IPH_KeyboardAccessoryPaymentOffer"
       summary="payments autofill suggestions that have an offer"/>
+  <variant name="IPH_LauncherSearchHelpUi"
+      summary="show launcher search chips in the launcher"/>
   <variant name="IPH_LiveCaption" summary="Live Caption"/>
   <variant name="IPH_LongPressToolbarTip" summary="LongPress toolbar"/>
   <variant name="IPH_MicToolbar" summary="the mic button in the toolbar"/>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
index 76a5fb7..854f657 100644
--- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -3221,12 +3221,8 @@
   <suffix name="last_n" label="Offline recent pages"/>
   <suffix name="ntp_suggestions" label="NTP suggestions offlined by the user"/>
   <suffix name="suggested_articles" label="Prefetched NTP suggestions"/>
-  <affected-histogram name="OfflinePages.AccessEntryPoint"/>
-  <affected-histogram
-      name="OfflinePages.Background.EffectiveConnectionType.OffliningStartType"/>
   <affected-histogram
       name="OfflinePages.Background.EffectiveConnectionType.SavePageLater"/>
-  <affected-histogram name="OfflinePages.Background.FinalSavePageResult"/>
   <affected-histogram name="OfflinePages.Background.LoadingErrorStatusCode"/>
   <affected-histogram name="OfflinePages.Background.OfflinerRequestStatus"/>
   <affected-histogram name="OfflinePages.Background.SavePageFromCCT"/>
@@ -3234,13 +3230,10 @@
   <affected-histogram name="OfflinePages.Background.TimeToSaved"/>
   <affected-histogram name="OfflinePages.Background.TimeToStart"/>
   <affected-histogram name="OfflinePages.Background.TimeToStart.Svelte"/>
-  <affected-histogram name="OfflinePages.ClearStoragePreRunUsage2"/>
   <affected-histogram name="OfflinePages.MhtmlLoadResult"/>
   <affected-histogram name="OfflinePages.PageAccessInterval"/>
   <affected-histogram name="OfflinePages.PageLifetime"/>
   <affected-histogram name="OfflinePages.PageSize"/>
-  <affected-histogram name="OfflinePages.PageSizeOnAccess.Offline"/>
-  <affected-histogram name="OfflinePages.PageSizeOnAccess.Online"/>
   <affected-histogram name="OfflinePages.SavePage.AddPageTime"/>
   <affected-histogram name="OfflinePages.SavePage.ComputeDigestTime"/>
   <affected-histogram name="OfflinePages.SavePage.CreateArchiveTime"/>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index 171a1d8e6..545bf69 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -126,8 +126,8 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.BringAndroidTabs.PromptTabsForAndroidSwitcherState"
-    enum="IOSPromptTabsForAndroidSwitcherState" expires_after="2024-02-28">
+<histogram name="IOS.BringAndroidTabs.PromptTabsStatus"
+    enum="IOSPromptAndroidTabsStatus" expires_after="2024-02-28">
   <owner>hiramahmood@google.com</owner>
   <owner>ginnyhuang@chromium.org</owner>
   <owner>bling-get-set-up@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml
index 559873e..f10bea374 100644
--- a/tools/metrics/histograms/metadata/network/histograms.xml
+++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -304,6 +304,16 @@
   </summary>
 </histogram>
 
+<histogram name="Network.Ash.Hotspot.Upstream.Cellular.Disabled.Reason"
+    enum="HotspotDisableReason" expires_after="2023-10-01">
+  <owner>jiajunz@google.com</owner>
+  <owner>cros-connectivity@google.com</owner>
+  <summary>
+    Measures and tracks the causes of disabled hotspot. Emitted each time the
+    hotspot becomes disabled.
+  </summary>
+</histogram>
+
 <histogram name="Network.Ash.Hotspot.Upstream.Cellular.Enabled.UpstreamStatus"
     enum="HotspotUpstreamStatus" expires_after="2023-10-01">
   <owner>jiajunz@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/offline/histograms.xml b/tools/metrics/histograms/metadata/offline/histograms.xml
index 823fb55..e3a4e49 100644
--- a/tools/metrics/histograms/metadata/offline/histograms.xml
+++ b/tools/metrics/histograms/metadata/offline/histograms.xml
@@ -161,15 +161,6 @@
   </summary>
 </histogram>
 
-<histogram name="OfflinePages.AccessEntryPoint"
-    enum="OfflinePagesAccessEntryPoint" expires_after="2021-08-29">
-  <owner>jianli@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Logs the UI location from which an offline page was launched.
-  </summary>
-</histogram>
-
 <histogram name="OfflinePages.AccessPageCount"
     enum="OfflinePagesNamespaceEnumeration" expires_after="2022-08-28">
   <owner>dimich@chromium.org</owner>
@@ -180,14 +171,6 @@
   </summary>
 </histogram>
 
-<histogram name="OfflinePages.AggregatedRequestResult2"
-    enum="OfflinePagesAggregatedRequestResult" expires_after="2021-06-25">
-  <owner>dimich@chromium.org</owner>
-  <owner>jianli@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>Result of servicing requests that may contain offline page.</summary>
-</histogram>
-
 <histogram name="OfflinePages.ArchiveManager.ArchiveDirsCreationResult2"
     enum="PlatformFileError" expires_after="2021-06-25">
   <owner>dimich@chromium.org</owner>
@@ -219,19 +202,6 @@
   </summary>
 </histogram>
 
-<histogram
-    name="OfflinePages.Background.EffectiveConnectionType.OffliningStartType"
-    enum="NQEEffectiveConnectionType" expires_after="2021-06-25">
-  <owner>petewil@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Effective connection type at the start of an offlining attempt for an
-    attempt that eventually failed.
-
-    This metric is recorded for RequestCoordinator::SavePageLater API calls.
-  </summary>
-</histogram>
-
 <histogram name="OfflinePages.Background.EffectiveConnectionType.PauseRequests"
     enum="NQEEffectiveConnectionType" expires_after="2021-06-25">
   <owner>dougarnett@chromium.org</owner>
@@ -281,15 +251,6 @@
   </summary>
 </histogram>
 
-<histogram name="OfflinePages.Background.FinalSavePageResult"
-    enum="OfflinePagesBackgroundSavePageResult" expires_after="2021-06-25">
-  <owner>chili@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Status code of background offlining requests at the final step.
-  </summary>
-</histogram>
-
 <histogram name="OfflinePages.Background.ImmediateStart.AvailableRequestCount"
     units="units" expires_after="2021-06-25">
   <owner>dougarnett@chromium.org</owner>
@@ -302,18 +263,6 @@
 </histogram>
 
 <histogram
-    name="OfflinePages.Background.ImmediateStart.AvailableRequestCount.Svelte"
-    units="units" expires_after="2021-06-25">
-  <owner>dougarnett@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Number of queued background load requests available for processing when
-    processing starts immediately (vs. scheduled). This is for svelte devices
-    (where svelte is determined by base::SysInfo::IsLowEnd()).
-  </summary>
-</histogram>
-
-<histogram
     name="OfflinePages.Background.ImmediateStart.UnavailableRequestCount"
     units="units" expires_after="2021-06-25">
   <owner>dougarnett@chromium.org</owner>
@@ -337,18 +286,6 @@
   </summary>
 </histogram>
 
-<histogram name="OfflinePages.Background.ImmediateStartStatus"
-    enum="OfflinePagesBackgroundImmediateStartStatus"
-    expires_after="2021-06-25">
-  <owner>dougarnett@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Status of attempt to immediately start offlining a page in the background
-    while application is still concurrently using the foreground. This may be
-    attempted when an web page download is initially requested or resumed.
-  </summary>
-</histogram>
-
 <histogram name="OfflinePages.Background.LoadingErrorStatusCode"
     enum="CombinedHttpResponseAndNetErrorCode" expires_after="2021-06-25">
   <owner>chili@chromium.org</owner>
@@ -393,17 +330,6 @@
   <summary>Whether the save page result came from chrome custom tabs.</summary>
 </histogram>
 
-<histogram name="OfflinePages.Background.ScheduledStart.AvailableRequestCount"
-    units="units" expires_after="2021-06-25">
-  <owner>dougarnett@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Number of queued background load requests available for processing when
-    background scheduled processing starts. This is for non-svelte devices
-    (where svelte is determined by base::SysInfo::IsLowEnd()).
-  </summary>
-</histogram>
-
 <histogram
     name="OfflinePages.Background.ScheduledStart.AvailableRequestCount.Svelte"
     units="units" expires_after="2021-06-25">
@@ -494,16 +420,6 @@
   <summary>Number of thumbnails removed by the thumbnail cleanup task.</summary>
 </histogram>
 
-<histogram name="OfflinePages.ClearStoragePreRunUsage2" units="KiB"
-    expires_after="2021-06-25">
-  <owner>carlosk@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    The total disk storage size used by all offline pages from a specific client
-    namespace.
-  </summary>
-</histogram>
-
 <histogram name="OfflinePages.ClearTemporaryPages.BatchSize" units="pages"
     expires_after="2021-06-25">
   <owner>dimich@chromium.org</owner>
@@ -534,16 +450,6 @@
   </summary>
 </histogram>
 
-<histogram name="OfflinePages.ConsistencyCheck.Legacy.DeletedHeadlessFileCount"
-    units="files" expires_after="2021-06-25">
-  <owner>dimich@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Number of files which are deleted during legacy dir clearing since they have
-    no associated DB entry and live in private directory.
-  </summary>
-</histogram>
-
 <histogram name="OfflinePages.ConsistencyCheck.Persistent.Result"
     enum="OfflinePagesSyncOperationResult" expires_after="2021-06-25">
   <owner>dimich@chromium.org</owner>
@@ -551,28 +457,6 @@
   <summary>Result of persistent page consistency check.</summary>
 </histogram>
 
-<histogram
-    name="OfflinePages.ConsistencyCheck.Temporary.PagesMissingArchiveFileCount"
-    units="pages" expires_after="2021-06-25">
-  <owner>dimich@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Number of temporary offline pages without archive file when checking
-    consistency. It will only be reported if the number is larger than 0.
-  </summary>
-</histogram>
-
-<histogram
-    name="OfflinePages.ConsistencyCheck.Temporary.PagesMissingDbEntryCount"
-    units="pages" expires_after="2021-06-25">
-  <owner>dimich@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Number of archives without database entry when checking temporary page
-    consistency. It will only be reported if the number is larger than 0.
-  </summary>
-</histogram>
-
 <histogram name="OfflinePages.ConsistencyCheck.Temporary.Result"
     enum="OfflinePagesSyncOperationResult" expires_after="2021-06-25">
   <owner>dimich@chromium.org</owner>
@@ -739,27 +623,6 @@
   <summary>Size of the saved copy of an offline page.</summary>
 </histogram>
 
-<histogram name="OfflinePages.PageSizeOnAccess.Offline" units="KiB"
-    expires_after="2021-06-25">
-  <owner>carlosk@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Records the archive size of an offline page loaded during a navigation that
-    took place while the device was considered to be offline or with poor
-    connectivity.
-  </summary>
-</histogram>
-
-<histogram name="OfflinePages.PageSizeOnAccess.Online" units="KiB"
-    expires_after="2021-06-25">
-  <owner>carlosk@chromium.org</owner>
-  <owner>offline-dev@chromium.org</owner>
-  <summary>
-    Records the archive size of an offline page loaded during a navigation that
-    took place while the device was considered to be online.
-  </summary>
-</histogram>
-
 <histogram name="OfflinePages.PrefetchEnabled" enum="BooleanEnabled"
     expires_after="2021-10-31">
   <owner>dimich@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/oobe/histograms.xml b/tools/metrics/histograms/metadata/oobe/histograms.xml
index 7b5de9d..71424b7 100644
--- a/tools/metrics/histograms/metadata/oobe/histograms.xml
+++ b/tools/metrics/histograms/metadata/oobe/histograms.xml
@@ -102,6 +102,7 @@
 
 <variants name="OOBENetworkError">
   <variant name="AuthExtTimeout"/>
+  <variant name="None"/>
   <variant name="Offline"/>
   <variant name="Portal"/>
   <variant name="Proxy"/>
@@ -275,11 +276,11 @@
     name="OOBE.ErrorScreensTime.{OOBEScreenShownBeforeNetworkError}.{OOBENetworkError}"
     units="ms" expires_after="2023-11-01">
   <owner>dkuzmin@google.com</owner>
-  <owner>cros-oac@google.com</owner>
+  <owner>cros-oobe@google.com</owner>
   <summary>
     Time spent on error screens during {OOBEScreenShownBeforeNetworkError} when
-    the last error is {OOBENetworkError} error. Recorded when user leaves error
-    screen.
+    the last error is {OOBENetworkError} error. Recorded when the host screen is
+    destroyed. Note: None error means that the ErrorScreen was finally hidden.
   </summary>
   <token key="OOBEScreenShownBeforeNetworkError"
       variants="OOBEScreenShownBeforeNetworkError"/>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index 056e088..c0736a79 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -64,6 +64,8 @@
   <variant name="SegmentationShare" summary="Segmentation: Share user"/>
   <variant name="SegmentationShoppingUser"
       summary="Segmentation: Shopping user"/>
+  <variant name="SegmentationTabletProductivityUser"
+      summary="Segmentation: Tablet Productivity user"/>
   <variant name="SegmentationVoice" summary="Segmentation: Voice user"/>
   <variant name="TextClassifier" summary="Smart text selection"/>
 </variants>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index 402501f1..c227743 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -966,7 +966,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BubbleSuppression.AccountsInStatisticsTable2"
-    units="accounts" expires_after="2023-04-23">
+    units="accounts" expires_after="2023-10-31">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1849,6 +1849,20 @@
   </summary>
 </histogram>
 
+<histogram name="PasswordManager.IsPasswordProtected" enum="Boolean"
+    expires_after="2024-03-01">
+  <owner>skrakowi@chromium.org</owner>
+  <owner>chrome-counter-abuse-alerts@google.com</owner>
+  <summary>
+    This metric reports whether a saved password is protected by Phishguard. The
+    current minimum password length for protection is 8, so this can help us
+    figure out the proportion of passwords that we are currently not protecting
+    because its length is shorter than 8 characters. This gets recorded 30
+    seconds after PasswordStore is created, which happens once per profile and
+    at most once per day.
+  </summary>
+</histogram>
+
 <histogram name="PasswordManager.IsSyncPasswordHashSaved"
     enum="IsSyncPasswordHashSaved" expires_after="2023-07-30">
   <owner>vakh@chromium.org</owner>
@@ -2981,7 +2995,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordSyncState3" enum="PasswordSyncState"
-    expires_after="2023-04-30">
+    expires_after="2023-10-31">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -3015,7 +3029,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ProvisionalSaveFailure"
-    enum="ProvisionalSaveFailure" expires_after="2023-04-30">
+    enum="ProvisionalSaveFailure" expires_after="2023-10-31">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -3373,7 +3387,7 @@
 </histogram>
 
 <histogram name="PasswordManager.SyncingAccountState3"
-    enum="PasswordManagerSyncingAccountState" expires_after="2023-04-30">
+    enum="PasswordManagerSyncingAccountState" expires_after="2023-10-31">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <owner>chrome-password-manager-metrics-alerts@google.com</owner>
@@ -3781,7 +3795,7 @@
 
 <histogram
     name="PasswordManager.{Store}BlacklistedSitesHiRes3{CustomPassphraseStatus}"
-    units="sites" expires_after="2023-05-01">
+    units="sites" expires_after="2023-11-01">
   <owner>kazinova@google.com</owner>
   <owner>mamir@chromium.org</owner>
   <owner>treib@chromium.org</owner>
@@ -4046,7 +4060,7 @@
 
 <histogram
     name="PasswordManager.{Store}{Metric3}.{PasswordType}{CustomPassphraseStatus}"
-    units="units" expires_after="2023-05-01">
+    units="units" expires_after="2023-11-01">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml
index 7874e3c..42e11612 100644
--- a/tools/metrics/histograms/metadata/sb_client/histograms.xml
+++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -639,6 +639,16 @@
   </summary>
 </histogram>
 
+<histogram name="SBClientPhishing.ClassifyThresholdsResult"
+    enum="SBClientDetectionClassifyThresholdsResult" expires_after="2024-03-17">
+  <owner>andysjlim@chromium.org</owner>
+  <owner>chrome-counter-abuse-alerts@google.com</owner>
+  <summary>
+    Records the result of classification in visual TfLite model thresholds
+    comparison on the browser side
+  </summary>
+</histogram>
+
 <histogram name="SBClientPhishing.DOMFeatureTimeout" units="units"
     expires_after="2023-08-03">
   <owner>drubery@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
index 9bf8956..83c90303 100644
--- a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
@@ -72,6 +72,7 @@
   <variant name="ResumeHeavyUser"/>
   <variant name="SearchUser"/>
   <variant name="ShoppingUser"/>
+  <variant name="TabletProductivityUser"/>
 </variants>
 
 <variants name="SegmentationModel">
@@ -93,6 +94,7 @@
   <variant name="SearchUserSegment"/>
   <variant name="Share"/>
   <variant name="ShoppingUser"/>
+  <variant name="TabletProductivityUserSegment"/>
   <variant name="Unknown"/>
   <variant name="Voice"/>
 </variants>
diff --git a/tools/rust/build_rust.py b/tools/rust/build_rust.py
index ebe3ae8a..acb199e5 100755
--- a/tools/rust/build_rust.py
+++ b/tools/rust/build_rust.py
@@ -53,15 +53,14 @@
                  'scripts'))
 
 from build import (AddCMakeToPath, AddZlibToPath, CheckoutGitRepo,
-                   GetLibXml2Dirs, LLVM_BUILD_TOOLS_DIR, RunCommand)
-from update import (CLANG_REVISION, CLANG_SUB_REVISION, DownloadAndUnpack,
-                    LLVM_BUILD_DIR, GetDefaultHostOs, RmTree, UpdatePackage)
-import build
+                   GetLibXml2Dirs, LLVM_BUILD_TOOLS_DIR, MaybeDownloadHostGcc,
+                   RunCommand)
+from update import (CHROMIUM_DIR, DownloadAndUnpack, EnsureDirExists,
+                    GetDefaultHostOs, RmTree, UpdatePackage)
 
-from update_rust import (CHROMIUM_DIR, RUST_REVISION, RUST_SUB_REVISION,
-                         RUST_TOOLCHAIN_OUT_DIR, STAGE0_JSON_SHA256,
-                         THIRD_PARTY_DIR, VERSION_STAMP_PATH,
-                         GetPackageVersionForBuild)
+from update_rust import (RUST_REVISION, RUST_TOOLCHAIN_OUT_DIR,
+                         STAGE0_JSON_SHA256, THIRD_PARTY_DIR, THIS_DIR,
+                         VERSION_STAMP_PATH, GetPackageVersionForBuild)
 
 EXCLUDED_TESTS = [
     # Temporarily disabled due to https://github.com/rust-lang/rust/issues/94322
@@ -82,6 +81,8 @@
     os.path.join('tests', 'codegen', 'vec-shrink-panik.rs'),
 ]
 
+CLANG_SCRIPTS_DIR = os.path.join(THIS_DIR, '..', 'clang', 'scripts')
+
 RUST_GIT_URL = ('https://chromium.googlesource.com/external/' +
                 'github.com/rust-lang/rust')
 
@@ -103,6 +104,15 @@
     os.path.dirname(os.path.abspath(__file__)), 'cargo-config.toml.template')
 RUST_SRC_VENDOR_DIR = os.path.join(RUST_SRC_DIR, 'vendor')
 
+RUST_HOST_LLVM_BUILD_DIR = os.path.join(CHROMIUM_DIR, 'third_party',
+                                        'rust-llvm-host-build')
+RUST_HOST_LLVM_INSTALL_DIR = os.path.join(CHROMIUM_DIR, 'third_party',
+                                          'rust-llvm-host-install')
+RUST_CROSS_TARGET_LLVM_BUILD_DIR = os.path.join(CHROMIUM_DIR, 'third_party',
+                                                'rust-llvm-target-build')
+RUST_CROSS_TARGET_LLVM_INSTALL_DIR = os.path.join(CHROMIUM_DIR, 'third_party',
+                                                  'rust-llvm-target-install')
+
 # CIPD Versions from:
 # - List all platforms
 # cipd ls infra/3pp/static_libs/openssl/
@@ -126,11 +136,25 @@
 else:
     LD_PATH_FLAG = '-L'
 
+BUILD_TARGETS = [
+    'library/proc_macro', 'library/std', 'src/tools/cargo', 'src/tools/clippy',
+    'src/tools/rustfmt'
+]
+
 # Desired tools and libraries in our Rust toolchain.
 DISTRIBUTION_ARTIFACTS = [
     'cargo', 'clippy', 'compiler/rustc', 'library/std', 'rust-analyzer',
     'rustfmt', 'src'
 ]
+DISTRIBUTION_ARTIFACTS_SKIPPED_CROSS_COMPILE = [
+    # Cargo depends on OpenSSL and we don't have a cross-compile of the
+    # library available. This means gnrt will not function on M1 macs until
+    # we fix this, or stop depending on cross-compile.
+    'cargo',
+    # When cross-compiling this fails to build terribly, as it can't even
+    # find the Rust stdlib.
+    'rust-analyzer',
+]
 
 # Which test suites to run. Any failure will fail the build.
 TEST_SUITES = [
@@ -180,30 +204,6 @@
     sys.exit(1)
 
 
-def Configure(llvm_bins_path, llvm_libs_root, link_tensorflow):
-    # Read the config.toml template file...
-    with open(RUST_CONFIG_TEMPLATE_PATH, 'r') as input:
-        template = string.Template(input.read())
-
-    def quote_string(s: str):
-        return s.replace('\\', '\\\\').replace('"', '\\"')
-
-    subs = {}
-    subs['INSTALL_DIR'] = quote_string(str(RUST_TOOLCHAIN_OUT_DIR))
-    subs['LLVM_LIB_ROOT'] = quote_string(str(llvm_libs_root))
-    subs['LLVM_BIN'] = quote_string(str(llvm_bins_path))
-    subs['PACKAGE_VERSION'] = GetPackageVersionForBuild()
-
-    if link_tensorflow:
-        subs['RUSTC_LLVM_LDFLAGS'] = '-ltf_xla_runtime'
-    else:
-        subs['RUSTC_LLVM_LDFLAGS'] = ''
-
-    # ...and apply substitutions, writing to config.toml in Rust tree.
-    with open(os.path.join(RUST_SRC_DIR, 'config.toml'), 'w') as output:
-        output.write(template.substitute(subs))
-
-
 def FetchCargo(rust_git_hash):
     '''Downloads the beta Cargo package specified for the compiler build
 
@@ -279,16 +279,19 @@
     shutil.copyfile(RUST_CARGO_CONFIG_TEMPLATE_PATH,
                     os.path.join(RUST_SRC_DIR, '.cargo', 'config.toml'))
 
+    os.chdir(CHROMIUM_DIR)
+
 
 class XPy:
     ''' Runner for x.py, Rust's build script. Holds shared state between x.py
     runs. '''
 
-    def __init__(self, llvm_bins_path, zlib_path, libxml2_dirs, build_mac_arm,
+    def __init__(self, zlib_path, libxml2_dirs, build_mac_arm,
                  gcc_toolchain_path, verbose):
         self._env = collections.defaultdict(str, os.environ)
         self._build_mac_arm = build_mac_arm
         self._verbose = verbose
+        self._llvm_bins_path = os.path.join(RUST_HOST_LLVM_INSTALL_DIR, 'bin')
 
         # We append to these flags, make sure they exist.
         ENV_FLAGS = [
@@ -310,15 +313,19 @@
         # so these must be duplicated there.
 
         if sys.platform == 'win32':
-            self._env['AR'] = os.path.join(llvm_bins_path, 'llvm-lib.exe')
-            self._env['CC'] = os.path.join(llvm_bins_path, 'clang-cl.exe')
-            self._env['CXX'] = os.path.join(llvm_bins_path, 'clang-cl.exe')
-            self._env['LD'] = os.path.join(llvm_bins_path, 'lld-link.exe')
+            self._env['AR'] = os.path.join(self._llvm_bins_path,
+                                           'llvm-lib.exe')
+            self._env['CC'] = os.path.join(self._llvm_bins_path,
+                                           'clang-cl.exe')
+            self._env['CXX'] = os.path.join(self._llvm_bins_path,
+                                            'clang-cl.exe')
+            self._env['LD'] = os.path.join(self._llvm_bins_path,
+                                           'lld-link.exe')
         else:
-            self._env['AR'] = os.path.join(llvm_bins_path, 'llvm-ar')
-            self._env['CC'] = os.path.join(llvm_bins_path, 'clang')
-            self._env['CXX'] = os.path.join(llvm_bins_path, 'clang++')
-            self._env['LD'] = os.path.join(llvm_bins_path, 'clang')
+            self._env['AR'] = os.path.join(self._llvm_bins_path, 'llvm-ar')
+            self._env['CC'] = os.path.join(self._llvm_bins_path, 'clang')
+            self._env['CXX'] = os.path.join(self._llvm_bins_path, 'clang++')
+            self._env['LD'] = os.path.join(self._llvm_bins_path, 'clang')
 
         if sys.platform == 'darwin':
             # The system/xcode compiler would find system SDK correctly, but
@@ -400,17 +407,41 @@
         # Cargo normally stores files in $HOME. Override this.
         self._env['CARGO_HOME'] = CARGO_HOME_DIR
 
+    def configure(self, build_mac_arm, x86_64_llvm_config,
+                  aarch64_llvm_config):
+        # Read the config.toml template file...
+        with open(RUST_CONFIG_TEMPLATE_PATH, 'r') as input:
+            template = string.Template(input.read())
+
+        def quote_string(s: str):
+            return s.replace('\\', '\\\\').replace('"', '\\"')
+
+        subs = {}
+        subs['INSTALL_DIR'] = quote_string(str(RUST_TOOLCHAIN_OUT_DIR))
+        subs['LLVM_BIN'] = quote_string(str(self._llvm_bins_path))
+        subs['PACKAGE_VERSION'] = GetPackageVersionForBuild()
+
+        subs["LLVM_CONFIG_WINDOWS_x86_64"] = quote_string(
+            str(x86_64_llvm_config))
+        subs["LLVM_CONFIG_APPLE_AARCH64"] = quote_string(
+            str(aarch64_llvm_config))
+        subs["LLVM_CONFIG_APPLE_X86_64"] = quote_string(
+            str(x86_64_llvm_config))
+        subs["LLVM_CONFIG_LINUX_X86_64"] = quote_string(
+            str(x86_64_llvm_config))
+
+        # ...and apply substitutions, writing to config.toml in Rust tree.
+        with open(os.path.join(RUST_SRC_DIR, 'config.toml'), 'w') as output:
+            output.write(template.substitute(subs))
+
     def run(self, sub, args):
         ''' Run x.py subcommand with specified args. '''
-        # This enables the compiler to produce Mac ARM binaries.
-        if self._build_mac_arm:
-            args.extend(['--target', 'aarch64-apple-darwin'])
-
         os.chdir(RUST_SRC_DIR)
         cmd = [sys.executable, 'x.py', sub]
         if self._verbose and self._verbose > 0:
             cmd.append('-' + self._verbose * 'v')
         RunCommand(cmd + args, msvc_arch='x64', env=self._env)
+        os.chdir(CHROMIUM_DIR)
 
 
 # Get arguments to run desired test suites, minus disabled tests.
@@ -449,6 +480,82 @@
     return main['commit']
 
 
+# Fetch or build the LLVM libraries, for the host machine and when
+# cross-compiling for the target machine.
+#
+# Returns the path to llvm-config for x86_64 and aarch64 targets.
+def BuildLLVMLibraries(skip_build, build_mac_arm, gcc_toolchain):
+    # LLVM libraries for the target machine. Usually the same as the host,
+    # unless we are cross-compiling.
+    if build_mac_arm:
+        target_llvm_build_dir = RUST_CROSS_TARGET_LLVM_BUILD_DIR
+        target_llvm_install_dir = RUST_CROSS_TARGET_LLVM_INSTALL_DIR
+    else:
+        target_llvm_build_dir = RUST_HOST_LLVM_BUILD_DIR
+        target_llvm_install_dir = RUST_HOST_LLVM_INSTALL_DIR
+
+    print(f'Building the host LLVM in {RUST_HOST_LLVM_BUILD_DIR}...')
+    build_cmd = [
+        sys.executable,
+        os.path.join(CLANG_SCRIPTS_DIR, 'build.py'),
+        '--disable-asserts',
+        # TODO(danakj): '--no-clang',
+        '--no-tools',
+        '--with-ml-inliner-model=',
+    ]
+    if sys.platform.startswith('linux'):
+        build_cmd.append('--without-android')
+        build_cmd.append('--without-fuchsia')
+    if sys.platform == 'darwin':
+        build_cmd.append('--without-fuchsia')
+    if gcc_toolchain:
+        build_cmd.extend(['--gcc-toolchain', gcc_toolchain])
+    if not skip_build:
+        RunCommand(build_cmd + [
+            '--build-dir', RUST_HOST_LLVM_BUILD_DIR, '--install-dir',
+            RUST_HOST_LLVM_INSTALL_DIR
+        ])
+
+    # Build target compiler.
+    if build_mac_arm:
+        print(f'Building the target cross-compile LLVM in '
+              f'{target_llvm_build_dir}...')
+        build_cmd.append('--build-mac-arm')
+        if not skip_build:
+            RunCommand(build_cmd + [
+                '--build-dir', target_llvm_build_dir, '--install-dir',
+                target_llvm_install_dir
+            ])
+
+        print(
+            f'Copying the target-but-native llvm-config to LLVM install dir...'
+        )
+        shutil.copy(
+            os.path.join(target_llvm_install_dir, 'bin', 'llvm-config'),
+            os.path.join(target_llvm_install_dir, 'bin', 'llvm-config.bak'))
+        shutil.copy(
+            os.path.join(target_llvm_build_dir, 'NATIVE', 'bin',
+                         'llvm-config'),
+            os.path.join(target_llvm_install_dir, 'bin', 'llvm-config'))
+
+    # Default to pointing all architectures at the host machine on the
+    # assumption we are not cross-compiling.
+    x86_64_llvm_config = os.path.join(RUST_HOST_LLVM_BUILD_DIR, 'bin',
+                                      'llvm-config')
+    aarch64_llvm_config = os.path.join(RUST_HOST_LLVM_BUILD_DIR, 'bin',
+                                       'llvm-config')
+    # Cross-compiling options follow.
+    if build_mac_arm:
+        # If we're building for aarch64 on an x86_64 machine, then we have a
+        # separate `target_llvm_install_dir` which has the aarch64 things.
+
+        # Inside a cross-compiled LLVM build, in the NATIVE directory, is an
+        # llvm-config that can run on the host machine.
+        aarch64_llvm_config = os.path.join(target_llvm_install_dir, 'bin',
+                                           'llvm-config')
+    return (x86_64_llvm_config, aarch64_llvm_config, target_llvm_install_dir)
+
+
 def main():
     parser = argparse.ArgumentParser(
         description='Build and package Rust toolchain')
@@ -471,6 +578,11 @@
     parser.add_argument('--skip-clean',
                         action='store_true',
                         help='skip x.py clean step')
+    parser.add_argument(
+        '--skip-llvm-build',
+        action='store_true',
+        help='do not build LLVM, presuming build_rust.py was '
+        'already run and the LLVM libs are thus already present.')
     parser.add_argument('--skip-test',
                         action='store_true',
                         help='skip running rustc and libstd tests')
@@ -481,17 +593,6 @@
                         action='store_true',
                         help='build the latest revision')
     parser.add_argument(
-        '--fetch-llvm-libs',
-        action='store_true',
-        help='fetch Clang/LLVM libs and extract into LLVM_BUILD_DIR. Useless '
-        'without --use-final-llvm-build-dir.')
-    parser.add_argument(
-        '--use-final-llvm-build-dir',
-        action='store_true',
-        help='use libs in LLVM_BUILD_DIR instead of LLVM_BOOTSTRAP_DIR. Useful '
-        'with --fetch-llvm-libs for local builds. When enabled, these '
-        'libraries must not use LTO.')
-    parser.add_argument(
         '--run-xpy',
         action='store_true',
         help='run x.py command in configured Rust checkout. Quits after '
@@ -507,49 +608,36 @@
         print('--build-mac-arm only valid on intel to cross-build arm')
         return 1
 
-    # A production Rust toolchain will use our final-stage LLVM build. These
-    # LLVM libs are built with LTO enabled, using the same LLVM revision from an
-    # earlier build stage as backend. The Rust toolchain we start with (the
-    # upstream beta release) however cannot process these since it uses an
-    # earlier LLVM build as its backend.
-    #
-    # The Rust toolchain can be bootstrapped using earlier native-code LLVM
-    # artifacts for its first stage, then using the final LLVM libs for further
-    # stages. We do this because the bootstrap libs don't support targeting all
-    # platforms, while the final LLVM libs do.
-    #
-    # Enable conditionally based on arguments and build host.
-    #
-    # TODO(https://crbug.com/1412187): hash out implementation issues on
-    # non-Linux and enable unconditionally (sans script argument).
-    use_lto_llvm = False
-    if not args.use_final_llvm_build_dir and sys.platform.startswith('linux'):
-        use_lto_llvm = True
-
-    # Get the LLVM root for the stage0 build. This normally comes from the LLVM
-    # bootstrap stage, but for local builds we support using LLVM_BUILD_DIR.
-    if args.use_final_llvm_build_dir:
-        llvm_bootstrap_root = LLVM_BUILD_DIR
-    else:
-        llvm_bootstrap_root = build.LLVM_BOOTSTRAP_DIR
-
-    # If we're building for Mac ARM on an x86_64 Mac, we can't use the final
-    # clang binaries as they don't have x86_64 support. Building them with that
-    # support would blow up their size a lot. So, we use the bootstrap binaries
-    # until such time as the Mac ARM builder becomes an actual Mac ARM machine.
-    if not args.build_mac_arm:
-        llvm_bins_path = os.path.join(LLVM_BUILD_DIR, 'bin')
-    else:
-        llvm_bins_path = os.path.join(build.LLVM_BOOTSTRAP_DIR, 'bin')
-
     if args.rust_force_head_revision:
         checkout_revision = GetLatestRustCommit()
     else:
         checkout_revision = RUST_REVISION
 
+    if sys.platform == 'darwin':
+        if platform.machine() == 'arm64' or args.build_mac_arm:
+            host_triple = 'aarch64-apple-darwin'
+        else:
+            host_triple = 'x86_64-apple-darwin'
+    elif sys.platform == 'win32':
+        host_triple = 'x86_64-pc-windows-msvc'
+    else:
+        host_triple = 'x86_64-unknown-linux-gnu'
+
+    args.gcc_toolchain = None
+    if sys.platform.startswith('linux'):
+        # Fetch GCC package here and pass it to build.py to avoid it doing the
+        # same again. Used for the LLVM build and for any C/C++ targets inside
+        # the Rust toolchain build.
+        MaybeDownloadHostGcc(args)
+
     if not args.skip_checkout:
         CheckoutGitRepo('Rust', RUST_GIT_URL, checkout_revision, RUST_SRC_DIR)
 
+    (x86_64_llvm_config, aarch64_llvm_config,
+     target_llvm_dir) = BuildLLVMLibraries(args.skip_llvm_build,
+                                           args.build_mac_arm,
+                                           args.gcc_toolchain)
+
     VerifyStage0JsonHash()
     if args.verify_stage0_hash:
         # The above function exits and prints the actual hash if verification
@@ -557,23 +645,6 @@
         # valid.
         return 0
 
-    if args.fetch_llvm_libs:
-        UpdatePackage('clang-libs', GetDefaultHostOs())
-
-    args.gcc_toolchain = None
-    if sys.platform.startswith('linux'):
-        # Fetch GCC package to build against same libstdc++ as Clang. This
-        # function will only download it if necessary, and it will set the
-        # `args.gcc_toolchain` if so.
-        build.MaybeDownloadHostGcc(args)
-
-    # Set up config.toml in Rust source tree to configure build for stage0.
-    # Normally, we will reconfigure later to use the production LLVM libs.
-    Configure(llvm_bins_path, llvm_bootstrap_root, link_tensorflow=False)
-
-    cargo_bin = FetchCargo(checkout_revision)
-    CargoVendor(cargo_bin)
-
     AddCMakeToPath()
 
     # Require zlib compression.
@@ -591,12 +662,19 @@
     # TODO(crbug.com/1271215): OpenSSL is somehow already present on the Windows
     # builder, but we should change to using a package from 3pp when it is
     # available.
-    if sys.platform != 'win32':
+    if sys.platform != 'win32' and not args.build_mac_arm:
         # Cargo depends on OpenSSL.
         AddOpenSSLToEnv(args.build_mac_arm)
 
-    xpy = XPy(llvm_bins_path, zlib_path, libxml2_dirs, args.build_mac_arm,
-              args.gcc_toolchain, args.verbose)
+    xpy = XPy(zlib_path, libxml2_dirs, args.build_mac_arm, args.gcc_toolchain,
+              args.verbose)
+
+    # Set up config.toml in Rust source tree.
+    xpy.configure(args.build_mac_arm, x86_64_llvm_config, aarch64_llvm_config)
+
+    if not args.skip_checkout:
+        cargo_bin = FetchCargo(checkout_revision)
+        CargoVendor(cargo_bin)
 
     if args.run_xpy:
         if rest[0] == '--':
@@ -606,62 +684,59 @@
     else:
         assert not rest
 
+    xpy_args = []
+    if args.build_mac_arm:
+        xpy_args.extend(['--host', host_triple, '--target', host_triple])
+
     if not args.skip_clean:
         print('Cleaning build artifacts...')
-        xpy.run('clean', [])
+        xpy.run('clean', xpy_args)
 
-    # Run the stage0 build separately using the bootstrap LLVM libs. This will
-    # allow further stages to process the LTO-enabled LLVM libs.
-    #
-    # On the other hand, when `use_lto_llvm` is disabled, we always use the
-    # native-code bootstrap libs.
-    #
-    # The build has already been configured above for the bootstrap stage.
-    xpy.run('build', ['--stage', '0', 'compiler/rustc'])
+    # When cross-compiling, the bootstrap does not reuse previous artifacts,
+    # so by splitting the build up into steps, we end up building the compiler
+    # multiple times. As such, when cross-compiling, we skip right to the
+    # install step, which will build what is needed.
+    if not args.build_mac_arm and not args.skip_install:
+        if not args.skip_test and not args.build_mac_arm:
+            print(f'Running stage 2 tests...')
+            xpy.run('test', ['--stage', '2'] + xpy_args + GetTestArgs())
 
-    xpy_args = []
-    # Reconfigure to use production LLVM libs. After this point we must tell
-    # x.py to keep the stage0 artifacts, even though config.toml changed.
-    #
-    # Note we must link tensorflow into rustc_llvm on Linux, since our LLVM
-    # build includes it for MLGO. Unfortunately llvm-config does not report this
-    # dependency. See https://github.com/llvm/llvm-project/issues/60751.
-    if use_lto_llvm:
-        Configure(llvm_bins_path,
-                  LLVM_BUILD_DIR,
-                  link_tensorflow=sys.platform.startswith('linux'))
-        xpy_args = ['--keep-stage', '0']
-
-    if not args.skip_test:
-        print('Running stage 2 tests...')
-        xpy.run('test', ['--stage', '2'] + xpy_args + GetTestArgs())
-
-    targets = [
-        'library/proc_macro', 'library/std', 'src/tools/cargo',
-        'src/tools/clippy', 'src/tools/rustfmt'
-    ]
-
-    # Build stage 2 compiler, tools, and libraries. This should reuse earlier
-    # stages from the test command (if run).
-    print('Building stage 2 artifacts...')
-    xpy.run('build', xpy_args + ['--stage', '2'] + targets)
+        # Build stage 2 compiler, tools, and libraries. This should reuse
+        # earlier stages from the test command (if run).
+        print('Building stage 2 artifacts...')
+        xpy.run('build', xpy_args + ['--stage', '2'] + BUILD_TARGETS)
 
     if args.skip_install:
         # Rust is fully built. We can quit.
         return 0
 
-    print(f'Installing to {RUST_TOOLCHAIN_OUT_DIR} ...')
+    print(f'Installing Rust to {RUST_TOOLCHAIN_OUT_DIR} ...')
     # Clean output directory.
     if os.path.exists(RUST_TOOLCHAIN_OUT_DIR):
-        shutil.rmtree(RUST_TOOLCHAIN_OUT_DIR)
+        RmTree(RUST_TOOLCHAIN_OUT_DIR)
 
-    xpy.run('install', xpy_args + DISTRIBUTION_ARTIFACTS)
+    artifacts = DISTRIBUTION_ARTIFACTS
+    if args.build_mac_arm:
+        for a in DISTRIBUTION_ARTIFACTS_SKIPPED_CROSS_COMPILE:
+            artifacts.remove(a)
+    xpy.run('install', xpy_args + artifacts)
 
     # Copy additional sources required for building stdlib out of
     # RUST_TOOLCHAIN_SRC_DIST_DIR.
     print(f'Copying vendored dependencies to {RUST_TOOLCHAIN_OUT_DIR} ...')
     shutil.copytree(RUST_SRC_VENDOR_DIR, RUST_TOOLCHAIN_SRC_DIST_VENDOR_DIR)
 
+    llvmlib_dir = os.path.join(RUST_TOOLCHAIN_OUT_DIR, 'lib', 'llvmlib')
+    print(f'Copying LLVM/Clang libs to {llvmlib_dir} ...')
+    if os.path.exists(llvmlib_dir):
+        RmTree(llvmlib_dir)
+    EnsureDirExists(os.path.join(llvmlib_dir, 'lib'))
+    LIB_SUFFIX = '.lib' if sys.platform == 'win32' else '.a'
+    for lib_path in os.listdir(os.path.join(target_llvm_dir, 'lib')):
+        if lib_path.endswith(LIB_SUFFIX):
+            shutil.copy(os.path.join(target_llvm_dir, 'lib', lib_path),
+                        os.path.join(llvmlib_dir, 'lib'))
+
     with open(VERSION_STAMP_PATH, 'w') as stamp:
         stamp.write(MakeVersionStamp(checkout_revision))
 
diff --git a/tools/rust/config.toml.template b/tools/rust/config.toml.template
index 98ff92d2..114de6dc 100644
--- a/tools/rust/config.toml.template
+++ b/tools/rust/config.toml.template
@@ -6,12 +6,17 @@
 changelog-seen = 2
 
 [llvm]
+# We use LLVM that we've built ourselves.
 download-ci-llvm = false
 
-# These don't affect the LLVM build (which we don't do) but rather how the
-# rustc_llvm crate is linked.
+# Linux uses libstdc++ to build LLVM, and we want to statically link it into
+# rustc. This affects how rustc links in libstdc++, not how LLVM does (which we
+# build separately ourselves).
+#
+# For Clang, we dynamically link libstdc++, and provide the shared library along
+# with the Clang binary. We could potentially do the same for Rustc in the
+# future.
 static-libstdcpp = true
-ldflags = "$RUSTC_LLVM_LDFLAGS"
 
 [rust]
 download-rustc = false
@@ -37,32 +42,36 @@
 sysconfdir = "etc"
 
 [target.x86_64-pc-windows-msvc]
-llvm-config = "$LLVM_LIB_ROOT/bin/llvm-config"
-ranlib = "$LLVM_BIN/llvm-ranlib"
+llvm-config = "$LLVM_CONFIG_WINDOWS_x86_64"
+# TODO(danakj): We don't ship this in the clang toolchain package.
+# ranlib = "$LLVM_BIN/llvm-ranlib"
 ar = "$LLVM_BIN/llvm-lib"
 cc = "$LLVM_BIN/clang-cl"
 cxx = "$LLVM_BIN/clang-cl"
 linker = "$LLVM_BIN/lld-link"
 
-[target.arm64-apple-darwin]
-llvm-config = "$LLVM_LIB_ROOT/bin/llvm-config"
-ranlib = "$LLVM_BIN/llvm-ranlib"
+[target.aarch64-apple-darwin]
+llvm-config = "$LLVM_CONFIG_APPLE_AARCH64"
+# TODO(danakj): We don't ship this in the clang toolchain package.
+# ranlib = "$LLVM_BIN/llvm-ranlib"
 ar = "$LLVM_BIN/llvm-ar"
 cc = "$LLVM_BIN/clang"
 cxx = "$LLVM_BIN/clang++"
 linker = "$LLVM_BIN/clang"
 
 [target.x86_64-apple-darwin]
-llvm-config = "$LLVM_LIB_ROOT/bin/llvm-config"
-ranlib = "$LLVM_BIN/llvm-ranlib"
+llvm-config = "$LLVM_CONFIG_APPLE_X86_64"
+# TODO(danakj): We don't ship this in the clang toolchain package.
+# ranlib = "$LLVM_BIN/llvm-ranlib"
 ar = "$LLVM_BIN/llvm-ar"
 cc = "$LLVM_BIN/clang"
 cxx = "$LLVM_BIN/clang++"
 linker = "$LLVM_BIN/clang"
 
 [target.x86_64-unknown-linux-gnu]
-llvm-config = "$LLVM_LIB_ROOT/bin/llvm-config"
-ranlib = "$LLVM_BIN/llvm-ranlib"
+llvm-config = "$LLVM_CONFIG_LINUX_X86_64"
+# TODO(danakj): We don't ship this in the clang toolchain package.
+# ranlib = "$LLVM_BIN/llvm-ranlib"
 ar = "$LLVM_BIN/llvm-ar"
 cc = "$LLVM_BIN/clang"
 cxx = "$LLVM_BIN/clang++"
diff --git a/tools/rust/update_rust.py b/tools/rust/update_rust.py
index 70d5cf7..14ab2a31 100755
--- a/tools/rust/update_rust.py
+++ b/tools/rust/update_rust.py
@@ -27,10 +27,12 @@
     os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'clang',
                  'scripts'))
 
+from update import (CHROMIUM_DIR)
+
 # These fields are written by //tools/clang/scripts/upload_revision.py, and
 # should not be changed manually.
 RUST_REVISION = 'ac4379fea9e83465d814bb05005689f49bd2141e'
-RUST_SUB_REVISION = 1
+RUST_SUB_REVISION = 2
 
 # Trunk on 2022-10-15.
 #
@@ -62,7 +64,7 @@
 # TODO(lukasza): Include CRUBIT_REVISION and CRUBIT_SUB_REVISION once we
 # include Crubit binaries in the generated package.  See also a TODO comment
 # in BuildCrubit in package_rust.py.
-FALLBACK_REVISION = 'ac4379fea9e83465d814bb05005689f49bd2141e-1-llvmorg-17-init-3874-g93a2fecc-1'
+FALLBACK_REVISION = 'ac4379fea9e83465d814bb05005689f49bd2141e-2-llvmorg-17-init-3874-g93a2fecc-2'
 
 # Hash of src/stage0.json, which itself contains the stage0 toolchain hashes.
 # We trust the Rust build system checks, but to ensure it is not tampered with
@@ -70,7 +72,6 @@
 STAGE0_JSON_SHA256 = 'b45d1f388bfe54887d5776937e05a135ec819b6d2190b8794bb87bd7072e5553'
 
 THIS_DIR = os.path.abspath(os.path.dirname(__file__))
-CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..'))
 THIRD_PARTY_DIR = os.path.join(CHROMIUM_DIR, 'third_party')
 RUST_TOOLCHAIN_OUT_DIR = os.path.join(THIRD_PARTY_DIR, 'rust-toolchain')
 VERSION_STAMP_PATH = os.path.join(RUST_TOOLCHAIN_OUT_DIR, 'VERSION')
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 9ec6172..85e40ff 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -419,4 +419,5 @@
  <item id="wallpaper_online_downloader" added_in_milestone="110" content_hash_code="00286fc5" os_list="chromeos" file_path="ash/wallpaper/wallpaper_image_downloader.cc" />
  <item id="chrome_support_tool_file_upload" added_in_milestone="113" content_hash_code="04a07122" os_list="chromeos" file_path="chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc" />
  <item id="service_worker_race_network_request" added_in_milestone="113" content_hash_code="01abb946" os_list="linux,windows,android,chromeos" file_path="content/browser/service_worker/service_worker_main_resource_loader.cc" />
+ <item id="safe_browsing_ohttp_key_fetch" added_in_milestone="113" content_hash_code="0309cb19" os_list="linux,windows,android,chromeos" file_path="components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc" />
 </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index d436a1a..4091e14 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -339,6 +339,7 @@
       <annotation id="safe_browsing_extension_telemetry"/>
       <annotation id="safe_browsing_feedback"/>
       <annotation id="safe_browsing_incident"/>
+      <annotation id="safe_browsing_ohttp_key_fetch"/>
       <annotation id="safe_browsing_v4_get_hash"/>
       <annotation id="safe_browsing_v4_update"/>
       <annotation id="safe_browsing_binary_upload_app"/>
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc
index fb5e6bf3..0220b49 100644
--- a/ui/accessibility/ax_tree.cc
+++ b/ui/accessibility/ax_tree.cc
@@ -1784,8 +1784,10 @@
     // DestroySubtree.
     AXNode* old_root = root_;
     root_ = node;
-    if (old_root && old_root != node)
+    if (old_root && old_root != node) {
+      // Example of when occurs: the contents of an iframe are replaced.
       DestroySubtree(old_root, update_state);
+    }
   }
 
   return success;
diff --git a/ui/accessibility/ax_tree_serializer.h b/ui/accessibility/ax_tree_serializer.h
index 987459b5..513f050 100644
--- a/ui/accessibility/ax_tree_serializer.h
+++ b/ui/accessibility/ax_tree_serializer.h
@@ -638,11 +638,20 @@
       DCHECK(!crash_on_error_) << "Missing client node for serialization.";
 #endif
     }
+
+    // Assume that if this is the first node, it is the new root.
+    // TODO(accessibility) Consider a more explicit mechanism for specifying the
+    // root, as this logic caused crbug.com/1421550 when a document's existing
+    // serializer was quickly destroyed and a new one created. Although the new
+    // serializer correctly identified the root, it had a new id, which could
+    // correspond to a non-root id in the browser-side accessibility cache.
     client_root_ = new ClientTreeNode();
     client_node = client_root_;
     client_node->id = id;
     client_node->parent = nullptr;
     client_id_map_[client_node->id] = client_node;
+    DCHECK(!tree_->GetParent(node)) << "A root should never have a parent, but "
+                                       "the tree source thinks there is one.";
   }
 
   DCHECK_EQ(tree_->GetId(tree_->GetRoot()), client_root_->id);
diff --git a/ui/android/javatests/src/org/chromium/ui/test/util/DisableAnimationsTestRule.java b/ui/android/javatests/src/org/chromium/ui/test/util/DisableAnimationsTestRule.java
index 92afb10..6392e49 100644
--- a/ui/android/javatests/src/org/chromium/ui/test/util/DisableAnimationsTestRule.java
+++ b/ui/android/javatests/src/org/chromium/ui/test/util/DisableAnimationsTestRule.java
@@ -21,6 +21,7 @@
 import java.lang.annotation.Target;
 import java.lang.reflect.Method;
 import java.util.Arrays;
+import java.util.List;
 
 /**
  * {@link TestRule} to disable animations for UI testing, or enable animation with new
@@ -55,6 +56,11 @@
      */
     public DisableAnimationsTestRule(boolean enableAnimation) {
         mEnableAnimation = enableAnimation;
+
+        // Set animation scales through settings through shell commands in S+.
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) return;
+
+        // Set animation scales through reflection in R-.
         try {
             Class<?> windowManagerStubClazz = Class.forName("android.view.IWindowManager$Stub");
             Method asInterface =
@@ -68,14 +74,7 @@
             IBinder windowManagerBinder = (IBinder) getService.invoke(null, "window");
             mWindowManagerObject = asInterface.invoke(null, windowManagerBinder);
         } catch (Exception e) {
-            // TODO(https://crbug.com/1225707): Always throw once this works on Android S. The above
-            // API is no longer accessible and will crash regardless of filter rules so just warn
-            // instead.
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-                Log.w(TAG, "Failed to access animation methods", e);
-            } else {
-                throw new RuntimeException("Failed to access animation methods", e);
-            }
+            throw new RuntimeException("Failed to access animation methods", e);
         }
     }
 
@@ -109,14 +108,20 @@
     }
 
     private void setAnimationScaleFactors(float scaleFactor) throws Exception {
-        // TODO(https://crbug.com/1225707): Remove once this works on Android S.
-        if (mGetAnimationScalesMethod == null || mSetAnimationScalesMethod == null
-                || mWindowManagerObject == null) {
-            return;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            // Set animation scales through settings through shell commands in S+.
+            List<String> commandToRuns =
+                    List.of("settings put global animator_duration_scale " + scaleFactor,
+                            "settings put global transition_animation_scale " + scaleFactor,
+                            "settings put global window_animation_scale " + scaleFactor);
+            for (String command : commandToRuns) {
+                Runtime.getRuntime().exec(command);
+            }
+        } else {
+            // Set animation scales through reflection in R-.
+            float[] scaleFactors = (float[]) mGetAnimationScalesMethod.invoke(mWindowManagerObject);
+            Arrays.fill(scaleFactors, scaleFactor);
+            mSetAnimationScalesMethod.invoke(mWindowManagerObject, scaleFactors);
         }
-
-        float[] scaleFactors = (float[]) mGetAnimationScalesMethod.invoke(mWindowManagerObject);
-        Arrays.fill(scaleFactors, scaleFactor);
-        mSetAnimationScalesMethod.invoke(mWindowManagerObject, scaleFactors);
     }
 }
diff --git a/ui/aura/window_targeter.cc b/ui/aura/window_targeter.cc
index c4f873c..055c4ad 100644
--- a/ui/aura/window_targeter.cc
+++ b/ui/aura/window_targeter.cc
@@ -150,46 +150,11 @@
   return nullptr;
 }
 
-bool WindowTargeter::ProcessEventIfTargetsDifferentRootWindow(
-    Window* root_window,
-    Window* target,
-    ui::Event* event) {
-  if (root_window->Contains(target))
-    return false;
-
-  // |window| is the root window, but |target| is not a descendent of
-  // |window|. So do not allow dispatching from here. Instead, dispatch the
-  // event through the WindowEventDispatcher that owns |target|.
-  Window* new_root = target->GetRootWindow();
-  DCHECK(new_root);
-  if (event->IsLocatedEvent()) {
-    // The event has been transformed to be in |target|'s coordinate system.
-    // But dispatching the event through the EventProcessor requires the event
-    // to be in the host's coordinate system. So, convert the event to be in
-    // the root's coordinate space, and then to the host's coordinate space by
-    // applying the host's transform.
-    ui::LocatedEvent* located_event = event->AsLocatedEvent();
-    located_event->ConvertLocationToTarget(target, new_root);
-    WindowTreeHost* window_tree_host = new_root->GetHost();
-    located_event->UpdateForRootTransform(
-        window_tree_host->GetRootTransform(),
-        window_tree_host->GetRootTransformForLocalEventCoordinates());
-  }
-  std::ignore = new_root->GetHost()->GetEventSink()->OnEventFromSource(event);
-  return true;
-}
-
 ui::EventTarget* WindowTargeter::FindTargetForEvent(ui::EventTarget* root,
                                                     ui::Event* event) {
   Window* window = static_cast<Window*>(root);
-  Window* target = event->IsKeyEvent()
-                       ? FindTargetForKeyEvent(window)
-                       : FindTargetForNonKeyEvent(window, event);
-  if (target && !window->parent() &&
-      ProcessEventIfTargetsDifferentRootWindow(window, target, event)) {
-    return nullptr;
-  }
-  return target;
+  return event->IsKeyEvent() ? FindTargetForKeyEvent(window)
+                             : FindTargetForNonKeyEvent(window, event);
 }
 
 ui::EventTarget* WindowTargeter::FindNextBestTarget(
@@ -251,6 +216,38 @@
   return FindTargetForLocatedEventRecursively(window, event);
 }
 
+ui::EventSink* WindowTargeter::GetNewEventSinkForEvent(
+    const ui::EventTarget* current_root,
+    ui::EventTarget* target,
+    ui::Event* in_out_event) {
+  const aura::Window* root_window = static_cast<const Window*>(current_root);
+  aura::Window* target_window = static_cast<Window*>(target);
+  if (!target_window || root_window->parent() ||
+      root_window->Contains(target_window)) {
+    // no need to re-target.
+    return nullptr;
+  }
+  // |window| is the root window, but |target| is not a descendent of
+  // |window|. So do not allow dispatching from here. Instead, dispatch the
+  // event through the WindowEventDispatcher that owns |target|.
+  Window* new_root = target_window->GetRootWindow();
+  DCHECK(new_root);
+  if (in_out_event->IsLocatedEvent()) {
+    // The event has been transformed to be in |target|'s coordinate system.
+    // But dispatching the event through the EventProcessor requires the event
+    // to be in the host's coordinate system. So, convert the event to be in
+    // the root's coordinate space, and then to the host's coordinate space by
+    // applying the host's transform.
+    ui::LocatedEvent* located_event = in_out_event->AsLocatedEvent();
+    located_event->ConvertLocationToTarget(target_window, new_root);
+    WindowTreeHost* window_tree_host = new_root->GetHost();
+    located_event->UpdateForRootTransform(
+        window_tree_host->GetRootTransform(),
+        window_tree_host->GetRootTransformForLocalEventCoordinates());
+  }
+  return new_root->GetHost()->GetEventSink();
+}
+
 bool WindowTargeter::SubtreeCanAcceptEvent(
     Window* window,
     const ui::LocatedEvent& event) const {
diff --git a/ui/aura/window_targeter.h b/ui/aura/window_targeter.h
index 7425435..052c11f 100644
--- a/ui/aura/window_targeter.h
+++ b/ui/aura/window_targeter.h
@@ -78,18 +78,14 @@
   Window* FindTargetInRootWindow(Window* root_window,
                                  const ui::LocatedEvent& event);
 
-  // If |target| is not a child of |root_window|, then converts |event| to
-  // be relative to |root_window| and dispatches the event to |root_window|.
-  // Returns false if the |target| is a child of |root_window|.
-  bool ProcessEventIfTargetsDifferentRootWindow(Window* root_window,
-                                                Window* target,
-                                                ui::Event* event);
-
   // ui::EventTargeter:
   ui::EventTarget* FindTargetForEvent(ui::EventTarget* root,
                                       ui::Event* event) override;
   ui::EventTarget* FindNextBestTarget(ui::EventTarget* previous_target,
                                       ui::Event* event) override;
+  ui::EventSink* GetNewEventSinkForEvent(const ui::EventTarget* current_root,
+                                         ui::EventTarget* target,
+                                         ui::Event* in_out_event) override;
 
   Window* FindTargetForKeyEvent(Window* root_window);
 
diff --git a/ui/chromeos/events/OWNERS b/ui/chromeos/events/OWNERS
index 1bef084..c12a275 100644
--- a/ui/chromeos/events/OWNERS
+++ b/ui/chromeos/events/OWNERS
@@ -1 +1,3 @@
 zentaro@chromium.org
+
+per-file keyboard_*=dpad@google.com
diff --git a/ui/chromeos/events/event_rewriter_chromeos.cc b/ui/chromeos/events/event_rewriter_chromeos.cc
index 1587372..659e4ada 100644
--- a/ui/chromeos/events/event_rewriter_chromeos.cc
+++ b/ui/chromeos/events/event_rewriter_chromeos.cc
@@ -244,24 +244,29 @@
   return key_code >= VKEY_F1 && key_code <= kMaxCustomTopRowLayoutFKeyCode;
 }
 
-// Gets a remapped key for |pref_name| key. For example, to find out which
-// key Ctrl is currently remapped to, call the function with
-// prefs::kLanguageRemapControlKeyTo.
+// Gets a remapped key for |pref_name| key or |modifier_key| and |device_id| if
+// per-device settings are enabled. For example, to find out which key Ctrl is
+// currently remapped to, call the function with
+// prefs::kLanguageRemapControlKeyTo, mojom::ModifierKey::kControl, and the
+// device id.
 // Note: For the Search key, call GetSearchRemappedKey().
 const ModifierRemapping* GetRemappedKey(
+    int device_id,
+    mojom::ModifierKey modifier_key,
     const std::string& pref_name,
     EventRewriterChromeOS::Delegate* delegate) {
   if (!delegate) {
     return nullptr;
   }
 
-  int value = -1;
-  if (!delegate->GetKeyboardRemappedPrefValue(pref_name, &value)) {
+  const auto remapped_modifier_key = delegate->GetKeyboardRemappedModifierValue(
+      device_id, modifier_key, pref_name);
+  if (!remapped_modifier_key) {
     return nullptr;
   }
 
   for (auto& remapping : kModifierRemappings) {
-    if (value == static_cast<int>(remapping.remap_to)) {
+    if (remapped_modifier_key.value() == remapping.remap_to) {
       return &remapping;
     }
   }
@@ -275,6 +280,7 @@
 // be remapped separately.
 const ModifierRemapping* GetSearchRemappedKey(
     EventRewriterChromeOS::Delegate* delegate,
+    int device_id,
     KeyboardCapability::DeviceType keyboard_type) {
   std::string pref_name;
   switch (keyboard_type) {
@@ -297,12 +303,14 @@
       break;
   }
 
-  return GetRemappedKey(pref_name, delegate);
+  return GetRemappedKey(device_id, mojom::ModifierKey::kMeta, pref_name,
+                        delegate);
 }
 
 bool ShouldRewriteMetaTopRowKeyComboEvents(
-    EventRewriterChromeOS::Delegate* delegate) {
-  return delegate && delegate->RewriteMetaTopRowKeyComboEvents();
+    EventRewriterChromeOS::Delegate* delegate,
+    int device_id) {
+  return delegate && delegate->RewriteMetaTopRowKeyComboEvents(device_id);
 }
 
 bool IsISOLevel5ShiftUsedByCurrentInputMethod() {
@@ -1015,11 +1023,13 @@
       if (IsISOLevel5ShiftUsedByCurrentInputMethod()) {
         if (incoming.code == DomCode::CAPS_LOCK) {
           characteristic_flag = EF_ALTGR_DOWN | EF_MOD3_DOWN;
-          remapped_key =
-              GetRemappedKey(prefs::kLanguageRemapCapsLockKeyTo, delegate_);
+          remapped_key = GetRemappedKey(
+              last_keyboard_device_id_, mojom::ModifierKey::kCapsLock,
+              prefs::kLanguageRemapCapsLockKeyTo, delegate_);
         } else {
           characteristic_flag = EF_ALTGR_DOWN;
-          remapped_key = GetSearchRemappedKey(delegate_, GetLastKeyboardType());
+          remapped_key = GetSearchRemappedKey(
+              delegate_, last_keyboard_device_id_, GetLastKeyboardType());
         }
       }
       if (remapped_key && remapped_key->result.key_code == VKEY_CAPITAL) {
@@ -1064,13 +1074,15 @@
       }
 
       characteristic_flag = EF_CAPS_LOCK_ON;
-      remapped_key =
-          GetRemappedKey(prefs::kLanguageRemapCapsLockKeyTo, delegate_);
+      remapped_key = GetRemappedKey(
+          last_keyboard_device_id_, mojom::ModifierKey::kCapsLock,
+          prefs::kLanguageRemapCapsLockKeyTo, delegate_);
       break;
     case DomCode::META_LEFT:
     case DomCode::META_RIGHT:
       characteristic_flag = EF_COMMAND_DOWN;
-      remapped_key = GetSearchRemappedKey(delegate_, GetLastKeyboardType());
+      remapped_key = GetSearchRemappedKey(delegate_, last_keyboard_device_id_,
+                                          GetLastKeyboardType());
       // Default behavior is Super key, hence don't remap the event if the pref
       // is unavailable.
       break;
@@ -1078,25 +1090,31 @@
     case DomCode::CONTROL_RIGHT:
       characteristic_flag = EF_CONTROL_DOWN;
       remapped_key =
-          GetRemappedKey(prefs::kLanguageRemapControlKeyTo, delegate_);
+          GetRemappedKey(last_keyboard_device_id_, mojom::ModifierKey::kControl,
+                         prefs::kLanguageRemapControlKeyTo, delegate_);
       break;
     case DomCode::ALT_LEFT:
     case DomCode::ALT_RIGHT:
       // ALT key
       characteristic_flag = EF_ALT_DOWN;
-      remapped_key = GetRemappedKey(prefs::kLanguageRemapAltKeyTo, delegate_);
+      remapped_key =
+          GetRemappedKey(last_keyboard_device_id_, mojom::ModifierKey::kAlt,
+                         prefs::kLanguageRemapAltKeyTo, delegate_);
       break;
     case DomCode::ESCAPE:
       remapped_key =
-          GetRemappedKey(prefs::kLanguageRemapEscapeKeyTo, delegate_);
+          GetRemappedKey(last_keyboard_device_id_, mojom::ModifierKey::kEscape,
+                         prefs::kLanguageRemapEscapeKeyTo, delegate_);
       break;
     case DomCode::BACKSPACE:
-      remapped_key =
-          GetRemappedKey(prefs::kLanguageRemapBackspaceKeyTo, delegate_);
+      remapped_key = GetRemappedKey(
+          last_keyboard_device_id_, mojom::ModifierKey::kBackspace,
+          prefs::kLanguageRemapBackspaceKeyTo, delegate_);
       break;
     case DomCode::LAUNCH_ASSISTANT:
-      remapped_key =
-          GetRemappedKey(prefs::kLanguageRemapAssistantKeyTo, delegate_);
+      remapped_key = GetRemappedKey(
+          last_keyboard_device_id_, mojom::ModifierKey::kAssistant,
+          prefs::kLanguageRemapAssistantKeyTo, delegate_);
       break;
     default:
       break;
@@ -1233,7 +1251,8 @@
     }
     switch (kModifierRemappings[i].flag) {
       case EF_COMMAND_DOWN:
-        remapped_key = GetSearchRemappedKey(delegate_, GetLastKeyboardType());
+        remapped_key = GetSearchRemappedKey(delegate_, last_keyboard_device_id_,
+                                            GetLastKeyboardType());
         break;
       case EF_MOD3_DOWN:
         // If EF_MOD3_DOWN is used by the current input method, leave it alone;
@@ -1257,8 +1276,9 @@
         break;
     }
     if (!remapped_key && kModifierRemappings[i].pref_name) {
-      remapped_key =
-          GetRemappedKey(kModifierRemappings[i].pref_name, delegate_);
+      remapped_key = GetRemappedKey(
+          last_keyboard_device_id_, kModifierRemappings[i].remap_to,
+          kModifierRemappings[i].pref_name, delegate_);
     }
     if (remapped_key) {
       unmodified_flags &= ~kModifierRemappings[i].flag;
@@ -1854,8 +1874,9 @@
   }
 
   const bool search_is_pressed = (state->flags & EF_COMMAND_DOWN) != 0;
-  const bool flip_remapping =
-      ShouldRewriteMetaTopRowKeyComboEvents(delegate_) && search_is_pressed;
+  const bool flip_remapping = ShouldRewriteMetaTopRowKeyComboEvents(
+                                  delegate_, last_keyboard_device_id_) &&
+                              search_is_pressed;
   if (layout ==
       KeyboardCapability::KeyboardTopRowLayout::kKbdTopRowLayoutCustom) {
     if (RewriteTopRowKeysForCustomLayout(key_event.source_device_id(),
@@ -2263,8 +2284,9 @@
     return true;
   }
 
-  const bool flip_remapping =
-      ShouldRewriteMetaTopRowKeyComboEvents(delegate_) && search_is_pressed;
+  const bool flip_remapping = ShouldRewriteMetaTopRowKeyComboEvents(
+                                  delegate_, last_keyboard_device_id_) &&
+                              search_is_pressed;
 
   const auto& scan_code_map_iter = top_row_scan_code_map_.find(device_id);
   if (scan_code_map_iter == top_row_scan_code_map_.end()) {
@@ -2396,8 +2418,9 @@
       {{EF_NONE, VKEY_PRIVACY_SCREEN_TOGGLE},
        {EF_NONE, DomCode::F12, DomKey::F12, VKEY_F12}},
   };
-  const bool flip_remapping =
-      ShouldRewriteMetaTopRowKeyComboEvents(delegate_) && search_is_pressed;
+  const bool flip_remapping = ShouldRewriteMetaTopRowKeyComboEvents(
+                                  delegate_, last_keyboard_device_id_) &&
+                              search_is_pressed;
   MutableKeyState incoming_with_command_removed_if_neccessary = *state;
   if (flip_remapping) {
     incoming_with_command_removed_if_neccessary.flags &= ~EF_COMMAND_DOWN;
diff --git a/ui/chromeos/events/event_rewriter_chromeos.h b/ui/chromeos/events/event_rewriter_chromeos.h
index d7318480..c4ab49c 100644
--- a/ui/chromeos/events/event_rewriter_chromeos.h
+++ b/ui/chromeos/events/event_rewriter_chromeos.h
@@ -88,16 +88,23 @@
 
     // Returns whether or not Meta + Top Row Keys should be rewritten. Should
     // return correctly with respect to the values set in
-    // |SuppressMetaTopRowKeyRewrites|.
-    virtual bool RewriteMetaTopRowKeyComboEvents() const = 0;
+    // |SuppressMetaTopRowKeyRewrites|. If per-device settings are enabled, it
+    // should instead return the correct setting for the given `device_id`.
+    virtual bool RewriteMetaTopRowKeyComboEvents(int device_id) const = 0;
 
     // Set whether or not Meta + Top Row Keys key events should be rewritten.
     virtual void SuppressMetaTopRowKeyComboRewrites(bool should_suppress) = 0;
 
-    // Returns true if get keyboard remapped preference value successfully and
-    // the value will be stored in |value|.
-    virtual bool GetKeyboardRemappedPrefValue(const std::string& pref_name,
-                                              int* value) const = 0;
+    // If per-device settings is disabled, returns the remapped modifier value
+    // from prefs by looking up the given |pref_name|. If per-device settings is
+    // enabled, returns the remapped modifier value for |device_id| and
+    // |modifier_key|.
+    // TODO(dpad): Remove |pref_name| once fully transitioned to per-device
+    // settings.
+    virtual absl::optional<mojom::ModifierKey> GetKeyboardRemappedModifierValue(
+        int device_id,
+        mojom::ModifierKey modifier_key,
+        const std::string& pref_name) const = 0;
 
     // Returns true if the target would prefer to receive raw
     // function keys instead of having them rewritten into back, forward,
diff --git a/ui/events/event_processor.cc b/ui/events/event_processor.cc
index a4f25f2..4215dcbd 100644
--- a/ui/events/event_processor.cc
+++ b/ui/events/event_processor.cc
@@ -47,39 +47,55 @@
         target = targeter->FindTargetForEvent(root, event_to_dispatch);
     }
     DCHECK(targeter);
-
     // FindTargetForEvent may dispatch event, which may delete the event
-    // processor.
+    // processor or targeter.
+    // TODO(crbug.com/1345952): Remove these returns and change this to DCHECK.
     if (!weak_this) {
       details.dispatcher_destroyed = true;
       return details;
     }
+    if (!weak_targeter) {
+      return details;
+    }
 
-    while (target) {
-      details = DispatchEvent(target, event_to_dispatch);
+    auto* new_event_sink =
+        targeter->GetNewEventSinkForEvent(root, target, event_to_dispatch);
 
-      if (!dispatch_original_event) {
-        if (event_to_dispatch->stopped_propagation())
-          event->StopPropagation();
-        else if (event_to_dispatch->handled())
-          event->SetHandled();
-      }
-
-      if (details.dispatcher_destroyed)
-        return details;
-
+    if (new_event_sink) {
+      std::ignore = new_event_sink->OnEventFromSource(event_to_dispatch);
       if (!weak_this) {
         details.dispatcher_destroyed = true;
         return details;
       }
+    } else {
+      while (target) {
+        details = DispatchEvent(target, event_to_dispatch);
 
-      if (details.target_destroyed || event->handled() || !target ||
-          !weak_targeter) {
-        break;
+        if (!dispatch_original_event) {
+          if (event_to_dispatch->stopped_propagation()) {
+            event->StopPropagation();
+          } else if (event_to_dispatch->handled()) {
+            event->SetHandled();
+          }
+        }
+
+        if (details.dispatcher_destroyed) {
+          return details;
+        }
+
+        if (!weak_this) {
+          details.dispatcher_destroyed = true;
+          return details;
+        }
+
+        if (details.target_destroyed || event->handled() || !target ||
+            !weak_targeter) {
+          break;
+        }
+
+        DCHECK(targeter);
+        target = targeter->FindNextBestTarget(target, event_to_dispatch);
       }
-
-      DCHECK(targeter);
-      target = targeter->FindNextBestTarget(target, event_to_dispatch);
     }
   }
   OnEventProcessingFinished(event);
diff --git a/ui/events/event_targeter.cc b/ui/events/event_targeter.cc
index 63254c9..daaed43 100644
--- a/ui/events/event_targeter.cc
+++ b/ui/events/event_targeter.cc
@@ -10,4 +10,11 @@
 
 EventTargeter::~EventTargeter() = default;
 
+EventSink* EventTargeter::GetNewEventSinkForEvent(
+    const EventTarget* current_root,
+    EventTarget* target,
+    Event* in_out_event) {
+  return nullptr;
+}
+
 }  // namespace ui
diff --git a/ui/events/event_targeter.h b/ui/events/event_targeter.h
index 185bc145..b2e6210 100644
--- a/ui/events/event_targeter.h
+++ b/ui/events/event_targeter.h
@@ -11,6 +11,7 @@
 namespace ui {
 
 class Event;
+class EventSink;
 class EventTarget;
 
 class EVENTS_EXPORT EventTargeter {
@@ -36,6 +37,14 @@
   virtual EventTarget* FindNextBestTarget(EventTarget* previous_target,
                                           Event* event) = 0;
 
+  // Returns new event sink if the `in_out_event` should be dispatched to a
+  // different sink. The event will be updated so that it can be dispatched to
+  // the new sink correctly. Returns `nullptr` if the event do not have to be
+  // redirected.
+  virtual EventSink* GetNewEventSinkForEvent(const EventTarget* current_root,
+                                             EventTarget* target,
+                                             Event* in_out_event);
+
  private:
   friend class EventProcessor;
 
diff --git a/ui/file_manager/file_manager/BUILD.gn b/ui/file_manager/file_manager/BUILD.gn
index 2d25ed14..434bd25 100644
--- a/ui/file_manager/file_manager/BUILD.gn
+++ b/ui/file_manager/file_manager/BUILD.gn
@@ -43,6 +43,7 @@
     "foreground/css/file_manager.css",
     "foreground/css/file_manager_gm3.css",
     "foreground/css/file_types.css",
+    "foreground/css/file_types_gm3.css",
     "foreground/css/list.css",
     "foreground/css/menu.css",
     "foreground/css/table.css",
diff --git a/ui/file_manager/file_manager/containers/search_container.ts b/ui/file_manager/file_manager/containers/search_container.ts
index 5291927..40d150f 100644
--- a/ui/file_manager/file_manager/containers/search_container.ts
+++ b/ui/file_manager/file_manager/containers/search_container.ts
@@ -280,20 +280,26 @@
     if (!keys) {
       return '';
     }
-    if (keys.length > 1) {
-      return str('SEARCH_RESULTS_MULTIPLE_SELECTION');
+    const pathSet = new Set();
+    for (const dirKey of keys) {
+      const entry = state.allEntries[dirKey!]?.entry;
+      if (!entry) {
+        continue;
+      }
+      // TODO(b:274559834): Improve efficiency of these computations.
+      const parts: PathComponent[] =
+          PathComponent.computeComponentsFromEntry(entry, this.volumeManager_);
+      // Drop the file name; keep the folders only.
+      pathSet.add(parts.slice(0, -1).map(p => p.name).join('/'));
     }
-    const fileData = state.allEntries[keys[0]!];
-    if (!fileData) {
+    if (pathSet.size === 0) {
       return '';
     }
-    const entry = fileData.entry;
-    if (!entry) {
-      return '';
+    if (pathSet.size === 1) {
+      return pathSet.values().next().value;
     }
-    const parts: PathComponent[] =
-        PathComponent.computeComponentsFromEntry(entry, this.volumeManager_);
-    return parts.map(p => p.name).join('/');
+
+    return str('SEARCH_RESULTS_MULTIPLE_SELECTION');
   }
 
   /**
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css b/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css
index 8a88138..0471ac9f 100644
--- a/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css
+++ b/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css
@@ -93,7 +93,7 @@
 .dialog-navigation-list-contents {
   display: flex;
   flex: 1 1 auto;
-  margin-top: 8px;
+  margin-inline-start: 16px;
   position: relative;
 }
 
@@ -113,6 +113,7 @@
   overflow-y: hidden;
 }
 
+/* Can be removed after new directory replacement. -- BEGIN */
 #directory-tree .tree-item[section-start]::before {
   border-bottom: 1px solid var(--cros-separator-color);
   content: '';
@@ -124,67 +125,38 @@
 #directory-tree .tree-row {
   cursor: pointer;
   height: auto;
-  padding: 4px 0;
+  padding: 4px; /* To cater 8px top/bottom padding and outline. */
 }
 
 #directory-tree .tree-row > .file-row {
   align-items: center;
-  border: 2px solid transparent;
   border-inline-start-width: 0 !important;
-  border-radius: 0 20px 20px 0;
+  border-radius: 20px;
   box-sizing: border-box;
-  color: var(--cros-text-color-primary);
+  color: var(--cros-sys-on_surface);
   display: flex;
-  height: 32px;
-  margin-inline-end: 6px;
-}
-
-html[dir='rtl'] #directory-tree .tree-row > .file-row {
-  border-radius: 20px 0 0 20px;
-}
-
-#directory-tree .tree-row > .expand-icon {
-  flex: none;
-  height: 36px;
-  left: 3px;
-  margin: -12px -2px;
-  right: 3px;
-  top: 0;
-  width: 36px;
+  height: 40px;
 }
 
 #directory-tree .tree-row > .file-row > .expand-icon {
   box-sizing: border-box;
   flex: none;
-  height: 32px;
-  padding: 6px;
-  width: 32px;
-}
-
-#directory-tree .tree-row > .item-icon {
-  flex: none;
-  height: 16px;
-  width: 16px;
+  height: 20px;
+  margin-inline-start: 8px;
+  width: 20px;
 }
 
 #directory-tree .tree-row > .file-row > .item-icon {
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-icon-color-primary);
+  background-color: currentColor;
   background-image: none;
   flex: none;
   height: 20px;
-  left: -4px;
   position: relative;
-  right: -4px;
   width: 20px;
 }
 
-#directory-tree .tree-item:not([disabled])
-  .tree-row[active] > .file-row > .item-icon:not([style*='background-image']) {
-  background-color: var(--cros-icon-color-selection);
-}
-
 #directory-tree .tree-row > .file-row > .item-icon[style*='background-image'] {
   background-color: transparent;
   background-position: center;
@@ -192,20 +164,11 @@
   background-size: 16px 16px;
 }
 
-#directory-tree .tree-row > .label {
-  display: block;
-  flex: auto;
-  font-weight: 500;
-  margin: 0 6px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
 #directory-tree .tree-row > .file-row > .label {
   display: block;
   flex: auto;
   font-weight: 500;
-  margin: 0 12px;
+  margin-inline-start: 8px;
   overflow: hidden;
   text-overflow: ellipsis;
 }
@@ -215,11 +178,6 @@
   font-weight: 500;
 }
 
-#directory-tree .tree-row > .rename-placeholder {
-  display: block;
-  margin: 0 6px;
-}
-
 #directory-tree .tree-row .rename-placeholder > input {
   width: 100%;
 }
@@ -228,36 +186,34 @@
   display: none;
 }
 
-#directory-tree [renaming] > .tree-row > .label,
 #directory-tree [renaming] > .tree-row > .file-row > .label {
   display: none;
 }
 
-#directory-tree .tree-row > input {
-  display: none;
-  margin: 0 6px;
-  overflow: hidden;
-}
-
 #directory-tree .tree-row > .file-row > input {
   display: none;
-  margin: 0 10px;
+  height: 20px;
+  margin-inline: 8px 12px;
   overflow: hidden;
 }
 
-#directory-tree [renaming] > .tree-row > input,
+#directory-tree .tree-item:not([disabled])
+    .tree-row[active] > .file-row > input {
+  outline: 2px solid var(--cros-sys-inverse_primary);
+}
+
 #directory-tree [renaming] > .tree-row > .file-row > input {
   display: block;
 }
 
 html:not(.col-resize) #directory-tree .tree-item:not([disabled]) >
     .tree-row:not([active]):not([selected]):hover > .file-row {
-  background-color: var(--cros-ripple-color);
+  background-color: var(--cros-sys-hover_on_subtle);
 }
 
 html.pointer-active #directory-tree .tree-item:not([disabled]) >
     .tree-row:not([active]):not([selected]) > .file-row:active {
-  background-color: var(--cros-ripple-color);
+  background-color: var(--cros-sys-hover_on_subtle);
 }
 
 html.pointer-active #directory-tree
@@ -270,37 +226,33 @@
 }
 
 html.drag-drop-active #directory-tree .tree-item.denies > .tree-row > .file-row {
-  background-color: var(--cros-highlight-color-error);
+  background-color: var(--cros-sys-error_container);
+  color: var(--cros-sys-on_error_container);
 }
 
 html.drag-drop-active #directory-tree .tree-item.accepts > .tree-row > .file-row {
-  background-color: var(--cros-ripple-color);
+  background-color: var(--cros-sys-hover_on_prominent);
+}
+
+html.drag-drop-active #directory-tree
+    .tree-item.accepts > .tree-row[active] > .file-row {
+  background-color: var(--cros-sys-primary);
 }
 
 html.focus-outline-visible #directory-tree:focus .tree-row[selected] > .file-row {
-  border: 2px solid var(--cros-focus-ring-color);
+  outline: 2px solid var(--cros-sys-focus_ring);
+  outline-offset: 2px;
 }
 
 #directory-tree .tree-item:not([disabled]) .tree-row[active] > .file-row {
-  background-color: var(--cros-highlight-color);
-  color: var(--cros-text-color-selection);
+  background-color: var(--cros-sys-primary);
+  color: var(--cros-sys-on_primary);
 }
 
-#directory-tree .tree-item[disabled] > .tree-row {
+#directory-tree .tree-item[disabled] > .tree-row > .file-row {
   cursor: default;
 }
 
-#directory-tree .tree-row > .align-right-icon {
-  --iron-icon-height: 16px;
-  --iron-icon-width: 16px;
-  border-style: none;
-  flex: none;
-  height: 40px;
-  position: relative;
-  width: 40px;
-  z-index: 1;
-}
-
 #directory-tree .tree-row > .file-row > .align-right-icon {
   --iron-icon-height: 20px;
   --iron-icon-width: 20px;
@@ -316,61 +268,48 @@
   z-index: 1;
 }
 
-#directory-tree .tree-row > .external-link-icon iron-icon {
-  padding: 12px;
-}
 
 #directory-tree .tree-row > .file-row > .external-link-icon iron-icon {
   padding: 6px;
 }
 
-#directory-tree .tree-row > .root-eject {
-  --text-color: currentColor;
-  min-width: 40px;
-  padding: 12px;
-}
-
 #directory-tree .tree-row > .file-row > .root-eject {
   --text-color: currentColor;
-  --hover-bg-color: var(--cros-ripple-color);
+  --hover-bg-color: var(--cros-sys-hover_on_subtle);
   min-width: 32px;
   padding: 0;
 }
 
-html.col-resize #directory-tree .tree-row > .root-eject:hover {
-  --hover-bg-color: none;
+#directory-tree .tree-row[active] > .file-row > .root-eject {
+  --hover-bg-color: var(--cros-sys-hover_on_prominent);
 }
 
 html.col-resize #directory-tree .tree-row > .file-row > .root-eject:hover {
   --hover-bg-color: none;
 }
 
-#directory-tree .tree-row > .root-eject:focus {
-  outline: 1px auto var(--cros-focus-ring-color);
-}
-
 #directory-tree .tree-row > .file-row > .root-eject:focus {
-  border: 1px solid var(--cros-focus-ring-color);
+  border: 1px solid var(--cros-sys-focus_ring);
 }
 
-#directory-tree .tree-row > .root-eject:active {
-  border-radius: 20px;
-  outline-width: 0;
+#directory-tree .tree-row[active] > .file-row > .root-eject:focus {
+  border: 1px solid var(--cros-sys-inverse_primary);
 }
 
 #directory-tree .tree-row > .file-row > .root-eject:active {
-  --ink-color: var(--cros-ripple-color);
+  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
   border-width: 0;
 }
 
-#directory-tree .root-item[disabled] {
-  opacity: 0.5;
-  pointer-events: none;
+#directory-tree .tree-row[active] > .file-row > .root-eject:active {
+  --ink-color: var(--cros-sys-ripple_neutral_on_prominent);
 }
+/* Can be removed after new directory replacement. -- END */
 
+/* Splitter. */
 .jelly-splitter {
   --xf-splitter-tracker-offset: 16px;
-  z-index: 500;  /* Must be below the contextmenu (600). */
+  --xf-splitter-z-index: 500;  /* Must be below the contextmenu (600). */
 }
 
 html.pointer-active .jelly-splitter:not(.splitter-active):hover {
@@ -1246,7 +1185,7 @@
 
 body.files-ng grid .grid-title {
   box-sizing: border-box;
-  color: var(--cros-text-color-secondary);
+  color: var(--cros-sys-on_surface);
   font-family: 'Roboto Medium';
   padding-inline-start: 16px;
   padding-top: 20px;
@@ -1286,6 +1225,7 @@
 
 #list-container.thumbnail-view .inline-status {
   align-items: center;
+  color: var(--cros-sys-secondary);
   justify-content: center;
   position: absolute;
   right: 4px;
@@ -1305,13 +1245,34 @@
 }
 
 #list-container.thumbnail-view li.pinned .inline-status xf-icon[type=offline] {
-  --xf-icon-color: var(--cros-icon-color-secondary);
+  --xf-icon-color: currentColor;
+}
+
+#list-container.thumbnail-view .thumbnail-grid:focus
+    .thumbnail-item[selected] .inline-status,
+#list-container.thumbnail-view .thumbnail-grid:focus
+    .thumbnail-item[lead] .inline-status {
+  color: var(--cros-sys-on_secondary_container);
+}
+
+#list-container.thumbnail-view .thumbnail-grid
+    .thumbnail-item[selected] .inline-status,
+#list-container.thumbnail-view .thumbnail-grid
+    .thumbnail-item[lead] .inline-status {
+  color: var(--cros-sys-on_surface);
+}
+
+body.check-select #list-container.thumbnail-view .thumbnail-grid:focus
+    .thumbnail-item[selected] .inline-status,
+body.check-select #list-container.thumbnail-view .thumbnail-grid:focus
+    .thumbnail-item[selected] .inline-status {
+  color: var(--cros-sys-on_primary_container);
 }
 
 /* Only display outlines for entries with thumbnails. */
 #list-container.thumbnail-view li:has(.thumbnail) .inline-status .progress,
 #list-container.thumbnail-view li.pinned:has(.thumbnail) .inline-status xf-icon[type=offline] {
-  --xf-icon-color-outline: var(--cros-bg-color);
+  --xf-icon-color-outline: var(--cros-sys-app_base);
 }
 
 html:not(.pointer-active) body[type='full-page'] .thumbnail-frame > .img-container,
@@ -1348,7 +1309,7 @@
 /* Styles specific for the grid view. */
 
 .thumbnail-grid .thumbnail-item {
-  background-color: inherit;
+  background-color: var(--cros-sys-app_base);
   border-radius: 12px;
   height: 160px;
   margin-inline-start: 16px;
@@ -1373,7 +1334,6 @@
 }
 
 grid .thumbnail-bottom .detail-icon {
-  color: var(--cros-icon-color-secondary);
   height: 48px;
   padding-inline-end: 6px;
   padding-inline-start: 6px;
@@ -1398,7 +1358,6 @@
 
 .thumbnail-grid .img-container > .thumbnail {
   -webkit-user-drag: none;
-  background-color: var(--cros-highlight-color-hover);
   background-position: center;
   background-repeat: no-repeat;
   height: 100%;
@@ -1408,7 +1367,7 @@
 }
 
 .thumbnail-grid .thumbnail-bottom {
-  color: var(--cros-text-color-primary);
+  color: var(--cros-sys-on_surface);
   height: 48px;
 }
 
@@ -1418,7 +1377,7 @@
     .thumbnail-bottom,
 .thumbnail-grid .thumbnail-item[lead].directory
     .thumbnail-bottom {
-  background-color: var(--cros-highlight-color-hover);
+  background-color: var(--cros-sys-surface_variant);
 }
 
 .thumbnail-grid:focus .thumbnail-item[selected] .thumbnail-bottom,
@@ -1427,7 +1386,8 @@
     .thumbnail-bottom,
 .thumbnail-grid:focus .thumbnail-item[lead].directory
     .thumbnail-bottom {
-  background-color: var(--cros-highlight-color);
+  background-color: var(--cros-sys-secondary_container);
+  color: var(--cros-sys-on_secondary_container);
 }
 
 body.check-select .thumbnail-grid:focus .thumbnail-item[selected]
@@ -1438,7 +1398,8 @@
     .thumbnail-item[selected].directory .thumbnail-bottom,
 body.check-select .thumbnail-grid:focus .thumbnail-item[lead].directory
     .thumbnail-bottom {
-  color: var(--cros-text-color-selection);
+  background-color: var(--cros-sys-primary_container);
+  color: var(--cros-sys-on_primary_container);
 }
 
 body.check-select #list-container .thumbnail-grid:focus
@@ -1447,8 +1408,8 @@
     .thumbnail-item[lead]:not([selected]) {
   /* 2px border: 1px via box-shadow + 1px via border, to accommodate
      the difference between regular border 1px and selected border 2px.*/
-  border-color: var(--cros-focus-ring-color);
-  box-shadow: 0 0 0 1px var(--cros-focus-ring-color);
+  border-color: var(--cros-sys-focus_ring);
+  box-shadow: 0 0 0 1px var(--cros-sys-focus_ring);
 }
 
 body.check-select #list-container .thumbnail-grid
@@ -1457,8 +1418,8 @@
     .thumbnail-item[lead]:not([selected]) {
   /* 2px border: 1px via box-shadow + 1px via border, to accommodate
      the difference between regular border 1px and selected border 2px.*/
-  border-color: var(--cros-focus-ring-color-inactive);
-  box-shadow: 0 0 0 1px var(--cros-focus-ring-color-inactive);
+  border-color: var(--cros-sys-on_surface_variant);
+  box-shadow: 0 0 0 1px var(--cros-sys-on_surface_variant);
 }
 
 .thumbnail-grid > .spacer.folder-spacer {
@@ -1531,14 +1492,13 @@
 body.files-ng #list-container list > li:active,
 body.files-ng #list-container list > li.accepts,
 body.files-ng #list-container list > li[lead] {
-  background-color: var(--cros-highlight-color-hover);
-  border-radius: 2px;
+  background-color: var(--cros-sys-surface_variant);
 }
 
 body.files-ng #list-container list:focus > li[selected],
 body.files-ng #list-container list:focus > li.accepts[selected],
 body.files-ng #list-container list:focus > li[lead] {
-  background-color: var(--cros-highlight-color);
+  background-color: var(--cros-sys-secondary_container);
 }
 
 body.files-ng #default-tasks-list:focus > li[selected],
@@ -1566,17 +1526,6 @@
   right: unset;
 }
 
-/* selector "li[lead]:not([selected])" is for the row just gets unselected */
-body.check-select #list-container list > li[lead]:not([selected]),
-#list-container list > li[lead]:not([selected]) {
-  background-color: var(--cros-highlight-color-hover);
-}
-
-body.check-select #list-container list:focus > li[lead]:not([selected]),
-#list-container list > li[lead]:not([selected]):focus {
-  background-color: var(--cros-highlight-color);
-}
-
 #list-container li {
   border: 1px solid transparent;
 }
@@ -1601,12 +1550,22 @@
  * e.g. with mouse: click/select/unselect
  *      with keyboard: Ctrl + ArrowUp/ArrowDown to move
  */
-body.files-ng.check-select #list-container list:focus > li[lead] {
-  border: 1px solid var(--cros-focus-ring-color);
+body.check-select #list-container list:focus > li[lead],
+body.check-select #list-container list:focus > li[selected] {
+  background-color: var(--cros-sys-primary_container);
 }
 
-body.files-ng.check-select #list-container list > li[lead] {
-  border: 1px solid var(--cros-focus-ring-color-inactive);
+body.check-select #list-container list:focus > li[lead] {
+  border: 1px solid var(--cros-sys-focus_ring);
+}
+
+body.check-select #list-container list > li[lead],
+body.check-select #list-container list > li[selected] {
+  background-color: var(--cros-sys-surface_variant);
+}
+
+body.check-select #list-container list > li[lead] {
+  border: 1px solid var(--cros-sys-on_surface_variant);
 }
 
 #list-container grid > .accepts {
@@ -1645,24 +1604,19 @@
 }
 
 input.rename:focus,
-#directory-tree .tree-row .rename-placeholder > input:focus,
 #directory-tree .tree-row > .file-row .rename-placeholder > input:focus,
-#directory-tree .tree-row > input:focus,
 #directory-tree .tree-row > .file-row > input:focus {
-  background-color: var(--cros-bg-color);
+  background-color: var(--cros-sys-app_base);
   border: none;
   border-radius: 2px;
-  caret-color: var(--cros-textfield-cursor-color-focus);
-  color: var(--cros-text-color-primary);
-  outline: 2px solid var(--cros-focus-ring-color);
+  color: var(--cros-sys-on_surface);
+  outline: 2px solid var(--cros-sys-focus_ring);
 }
 
 input.rename::selection,
-#directory-tree .tree-row .rename-placeholder > input::selection,
 #directory-tree .tree-row > .file-row .rename-placeholder > input::selection,
-#directory-tree .tree-row > input::selection,
 #directory-tree .tree-row > .file-row > input::selection {
-  background-color: var(--cros-text-highlight-color);
+  background-color: var(--cros-sys-highlight_text);
 }
 
 input.rename {
@@ -1680,7 +1634,7 @@
 }
 
 body.files-ng #list-container input.rename {
-  margin-inline-end: 4px;
+  margin-inline-end: 12px;
 }
 
 li[renaming=''] .filename-label {
@@ -1729,7 +1683,7 @@
 .table-header {
   border-bottom: 1px solid var(--cros-separator-color);
   box-sizing: border-box;
-  color: var(--cros-text-color-secondary);
+  color: var(--cros-sys-on_surface);
   flex: none;
   font-family: 'Roboto Medium';
   /* The desired height plus the border bottom. */
@@ -1754,18 +1708,10 @@
   padding: 0 10px;
 }
 
-.table-row-cell {
-  color: var(--cros-text-color-secondary);
-}
-
 .table-row-cell > .detail-name {
   display: flex;
 }
 
-.table-row-cell > .detail-name {
-  color: var(--cros-text-color-primary);
-}
-
 .table-row-cell {
   align-items: center;
 }
@@ -1789,7 +1735,6 @@
   -webkit-mask-repeat: no-repeat;
   -webkit-mask-size: 16px 16px;
   background-color: currentColor;
-  color: var(--cros-icon-color-primary);
   height: 24px;
   margin-inline-end: 14px;
   margin-inline-start: auto;
@@ -1798,23 +1743,19 @@
 }
 
 #list-container list li .detail-icon {
-  color: var(--cros-icon-color-primary);
-  height: 40px;
-  margin-inline-end: 12px;
-  margin-inline-start: 8px;
-  width: 40px;
+  height: 48px;
+  margin-inline-end: 20px;
+  margin-inline-start: 20px;
+  width: 24px;
 }
 
 #list-container li .detail-checkmark {
   background-position: center;
   background-repeat: no-repeat;
-  color: var(--cros-icon-color-selection);
-  height: 28px;
   isolation: isolate;
   opacity: 0;
   position: absolute;
   transition: opacity 220ms ease;
-  width: 28px;
 }
 
 body.check-select #list-container li[selected] .detail-checkmark {
@@ -1822,9 +1763,7 @@
 }
 
 #list-container list li .detail-thumbnail {
-  height: 28px;
   overflow: hidden;
-  width: 28px;
 }
 
 #list-container list li .detail-thumbnail > .thumbnail {
@@ -1880,15 +1819,15 @@
 
 /* Dimmed items */
 
-body[type='folder'] .file,
-body[type='upload-folder'] .file,
-.dialog-container[connection='OFFLINE'] .dim-offline,
-body[block-hosted-docs] .file.dim-hosted,
-body[block-encrypted] .file.dim-encrypted,
-.thumbnail-grid [disabled],
-#detail-table [disabled],
-#directory-tree .tree-item[disabled] > .tree-row {
-  opacity: var(--cros-disabled-opacity);
+body[type='folder'] .file > *,
+body[type='upload-folder'] .file > *,
+.dialog-container[connection='OFFLINE'] .dim-offline > *,
+body[block-hosted-docs] .file.dim-hosted > *,
+body[block-encrypted] .file.dim-encrypted > *,
+.thumbnail-grid [disabled] > *,
+#detail-table [disabled] > *,
+#directory-tree .tree-item[disabled] > .tree-row > .file-row  {
+  opacity: 0.38; /* TODO: no token for this right now. */
 }
 
 /* Invisible container for elements representing files while dragging. */
@@ -2029,17 +1968,17 @@
 }
 
 .table-header-label .sort-icon {
-  --cr-icon-button-fill-color: var(--cros-icon-color-secondary);
+  --cr-icon-button-fill-color: var(--cros-sys-on_surface);
   --cr-icon-button-icon-size: 16px;
-  --cr-icon-button-focus-outline-color: var(--cros-focus-ring-color);
-  --cr-icon-button-hover-background-color: var(--cros-ripple-color);
+  --cr-icon-button-focus-outline-color: var(--cros-sys-focus_ring);
+  --cr-icon-button-hover-background-color: var(--cros-sys-hover_on_subtle);
   --cr-icon-button-size: 32px;
   border-radius: 50%;
   cursor: default;
 }
 
 .table-header-label .sort-icon:active {
-  background: var(--cros-icon-button-pressed-color);
+  background: var(--cros-sys-pressed_on_subtle);
 }
 
 html:not(.pointer-active) .table-header-label .sort-icon:hover,
@@ -2069,6 +2008,7 @@
 }
 
 #list-container li.table-row {
+  background-color: var(--cros-sys-app_base);
   box-sizing: border-box;
   height: 48px;
   line-height: 20px;
@@ -2082,18 +2022,39 @@
 #list-container list li .detail-thumbnail > .thumbnail {
   border-radius: 50%;
   height: 24px;
-  margin-inline-start: 8px;
-  margin-top: 4px;
   width: 24px;
 }
 
 .table-row-cell > * {
-  color: var(--cros-text-color-secondary);
+  color: var(--cros-sys-on_surface);
   padding: 0;
   padding-inline-start: 32px;
   padding-top: 0 !important;
 }
 
+.table-row-cell .dlp-managed-icon,
+.table-row-cell .inline-status {
+  color: var(--cros-sys-secondary);
+}
+
+list:focus li[selected] .table-row-cell > * {
+  color: var(--cros-sys-on_secondary_container);
+}
+
+list:focus li[selected] .table-row-cell .dlp-managed-icon,
+    list:focus li[selected] .table-row-cell .inline-status {
+  color: var(--cros-sys-on_secondary_container);
+}
+
+.check-select list:focus li[selected] .table-row-cell > * {
+  color: var(--cros-sys-on_primary_container);
+}
+
+.check-select list:focus li[selected] .table-row-cell .dlp-managed-icon,
+    .check-select list:focus li[selected] .table-row-cell .inline-status {
+  color: var(--cros-sys-on_primary_container);
+}
+
 .table-row-cell > .dateholder {
   display: flex;
 }
@@ -2131,7 +2092,7 @@
 }
 
 .table-header-splitter .splitter-icon:active {
-  background: var(--cros-icon-button-pressed-color);
+  background: var(--cros-sys-pressed_on_subtle);
 }
 
 html:not(.pointer-active) .table-header-splitter .splitter-icon:hover {
@@ -2148,24 +2109,18 @@
   padding-inline-start: 32px;
 }
 
-.check-select list:focus li[selected] .table-row-cell > * {
-  color: var(--cros-text-color-selection);
-}
-
 .table-row-cell:first-child > * {
   padding-inline-start: 0;
 }
 
 .table-row-cell .filename-label {
-  color: var(--cros-text-color-primary);
   flex-grow: 1;
   margin-inline-end: 8px;
   padding-top: 0;
 }
 
-.check-select list:focus li[selected] .table-row-cell
-.filename-label {
-  color: var(--cros-text-color-selection);
+.check-select li[selected] .filename-label {
+  font-weight: 500;
 }
 
 body.files-ng #list-container li .detail-checkmark {
@@ -2174,25 +2129,25 @@
   -webkit-mask-repeat: no-repeat;
   background-color: currentColor;
   background-image: none;
-  height: 40px;
-  width: 40px;
+  height: 20px;
+  width: 20px;
 }
 
-body.files-ng grid li .detail-checkmark {
-  width: 32px !important;
+list li .detail-checkmark {
+  margin-inline-start: 2px;
+}
+
+grid li .detail-checkmark {
+  margin-inline-start: 6px;
+  margin-top: 14px;
 }
 
 body.files-ng #list-container :focus li .detail-checkmark {
-  color: var(--cros-icon-color-selection);
+  color: var(--cros-sys-on_primary_container);
 }
 
 body.files-ng #list-container li .detail-checkmark {
-  color: var(--cros-icon-color-secondary);
-}
-
-body.files-ng #list-container li .detail-thumbnail {
-  height: 32px;
-  width: 32px;
+  color: var(--cros-sys-on_surface);
 }
 
 #list-container .list .inline-status,
@@ -2216,7 +2171,7 @@
 }
 
 #list-container .list li.pinned .inline-status xf-icon[type=offline] {
-  --xf-icon-color: var(--cros-icon-color-secondary);
+  --xf-icon-color: currentColor;
 }
 
 #new-folder-button {
diff --git a/ui/file_manager/file_manager/foreground/css/file_types_gm3.css b/ui/file_manager/file_manager/foreground/css/file_types_gm3.css
new file mode 100644
index 0000000..a5fac18
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/css/file_types_gm3.css
@@ -0,0 +1,468 @@
+/* Copyright 2023 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* TODO(crbug.com/992819): unify root-type-icon and volume-type-icon into one
+ type if possible, called file-type-icon or entry-type-icon say, since there
+ is no real need for the root/volume icon distinction for the directory tree
+ noting that file-type-icon is also used in lists and menus ;) */
+
+ /* We are mixing background-image and -webkit-mask-image here for different
+  SVGs.
+   * For Microsoft office icons SVGs (e.g. word/ppt/excel), we need to use
+   background-image to keep the original color.
+   * For other icon SVGs , we need to use -webkit-mask-image together with
+   background-color to customize the color.
+   * By default -webkit-mask-image is used because the default SVG is
+   filetype_generic.svg. In order to use background-image to override,
+   we need to reset both -webkit-mask-image and background-color. */
+
+/* Small icons for file types, used in lists and menus. */
+[file-type-icon] {
+  -webkit-mask-image: url(../images/filetype/filetype_generic.svg);
+  -webkit-mask-position: center;
+  -webkit-mask-repeat: no-repeat;
+  background-color: currentColor;
+  background-position: center;
+  background-repeat: no-repeat;
+  background-size: 20px 20px;
+}
+
+[file-type-icon='archive'] {
+  -webkit-mask-image: url(../images/filetype/filetype_archive.svg);
+}
+
+[file-type-icon='audio'] {
+  -webkit-mask-image: url(../images/filetype/filetype_audio.svg);
+}
+
+[file-type-icon='excel'] {
+  -webkit-mask-image: none;
+  background-color: transparent;
+  background-image: url(../images/filetype/filetype_excel.svg);
+}
+
+[file-type-icon='folder'] {
+  -webkit-mask-image: url(../images/filetype/filetype_folder.svg);
+}
+
+
+/* File type icon's background-image/mask-image needs to be reset to none:
+ *  * For [selected], checkmark icon will be displayed.
+ *  * For .has-thumbnail, thumbnail background image will be set.
+ */
+body.check-select #list-container li[selected] [file-type-icon],
+#list-container li [file-type-icon].has-thumbnail {
+  -webkit-mask-image: none;
+  background: none;
+}
+
+.computers-root[file-type-icon='folder'] {
+  -webkit-mask-image: url(../images/volumes/computer.svg);
+}
+
+.external-media-root[file-type-icon='folder'] {
+  -webkit-mask-image: url(../images/volumes/usb.svg);
+}
+
+.shared[file-type-icon='folder'] {
+  -webkit-mask-image: url(../images/filetype/filetype_folder_shared.svg);
+}
+
+.team-drive-root[file-type-icon='folder'] {
+  -webkit-mask-image: url(../images/volumes/hard_drive.svg);
+}
+
+/* .tree-row > .file-row icon for files-ng.  */
+.tree-row > .file-row > [file-type-icon='folder'] {
+  -webkit-mask-image: url(../images/filetype/filetype_folder.svg);
+}
+
+.tree-row > .file-row > .shared[file-type-icon='folder'] {
+  -webkit-mask-image: url(../images/filetype/filetype_folder_shared.svg);
+}
+
+.tree-row > .file-row > .team-drive-root[file-type-icon='folder'] {
+  -webkit-mask-image: url(../images/filetype/filetype_team_drive.svg);
+}
+
+[file-type-icon='gdoc'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gdoc.svg);
+  /* TODO(crbug.com/1345818) Revert the first CL on that bug when it's fixed. */
+  background-color: var(--cros-icon-color-blue);
+}
+
+[file-type-icon='gdraw'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gdraw.svg);
+}
+
+[file-type-icon='glink'] {
+  -webkit-mask-image: url(../images/filetype/filetype_generic.svg);
+}
+
+[file-type-icon='gsheet'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gsheet.svg);
+}
+
+[file-type-icon='gslides'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gslides.svg);
+}
+
+[file-type-icon='gtable'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gtable.svg);
+}
+
+[file-type-icon='gform'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gform.svg);
+}
+
+[file-type-icon='gmap'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gmap.svg);
+}
+
+[file-type-icon='gsite'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gsite.svg);
+}
+
+[file-type-icon='image'] {
+  -webkit-mask-image: url(../images/filetype/filetype_image.svg);
+}
+
+[file-type-icon='pdf'] {
+  -webkit-mask-image: url(../images/filetype/filetype_pdf.svg);
+}
+
+[file-type-icon='ppt'] {
+  -webkit-mask-image: none;
+  background-color: transparent;
+  background-image: url(../images/filetype/filetype_ppt.svg);
+}
+
+[file-type-icon='script'] {
+  -webkit-mask-image: url(../images/filetype/filetype_script.svg);
+}
+
+[file-type-icon='sites'] {
+  -webkit-mask-image: url(../images/filetype/filetype_sites.svg);
+}
+
+[file-type-icon='smb'] {
+  -webkit-mask-image: url(../images/volumes/smb.svg);
+}
+
+[file-type-icon='tini'] {
+  -webkit-mask-image: url(../images/filetype/filetype_tini.svg);
+}
+
+[file-type-icon='video'] {
+  -webkit-mask-image: url(../images/filetype/filetype_video.svg);
+}
+
+[file-type-icon='word'] {
+  -webkit-mask-image: none;
+  background-color: transparent;
+  background-image: url(../images/filetype/filetype_word.svg);
+}
+
+/* Large generic thumbnails, used when a file does not have a thumbnail. */
+.no-thumbnail[generic-thumbnail] {
+  -webkit-mask-image: url(../images/files/ui/filetype_placeholder_generic.svg);
+  -webkit-mask-position: center;
+  -webkit-mask-repeat: no-repeat;
+  -webkit-mask-size: 48px;
+  background-color: var(--cros-icon-color-primary);
+  background-position: center;
+  background-repeat: no-repeat;
+  background-size: 48px;
+}
+
+.no-thumbnail[generic-thumbnail='audio'] {
+  -webkit-mask-image: url(../images/filetype/filetype_audio.svg);
+}
+
+.no-thumbnail[generic-thumbnail='image'],
+.no-thumbnail[generic-thumbnail='raw'] {
+  -webkit-mask-image: url(../images/filetype/filetype_image.svg);
+}
+
+.no-thumbnail[generic-thumbnail='video'] {
+  -webkit-mask-image: url(../images/filetype/filetype_video.svg);
+}
+
+/* grid view large icons for known types. */
+.no-thumbnail[generic-thumbnail='archive'] {
+  -webkit-mask-image: url(../images/filetype/filetype_archive.svg);
+}
+
+.no-thumbnail[generic-thumbnail='tini'] {
+  -webkit-mask-image: url(../images/filetype/filetype_tini.svg);
+}
+
+.no-thumbnail[generic-thumbnail='excel'] {
+  -webkit-mask-image: none;
+  background-color: transparent;
+  background-image: url(../images/filetype/filetype_excel.svg);
+}
+
+.no-thumbnail[generic-thumbnail='gdoc'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gdoc.svg);
+}
+
+.no-thumbnail[generic-thumbnail='gdraw'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gdraw.svg);
+}
+
+.no-thumbnail[generic-thumbnail='gsheet'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gsheet.svg);
+}
+
+.no-thumbnail[generic-thumbnail='gslides'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gslides.svg);
+}
+
+.no-thumbnail[generic-thumbnail='gtable'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gtable.svg);
+}
+
+.no-thumbnail[generic-thumbnail='gform'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gform.svg);
+}
+
+.no-thumbnail[generic-thumbnail='gmap'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gmap.svg);
+}
+
+.no-thumbnail[generic-thumbnail='gsite'] {
+  -webkit-mask-image: url(../images/filetype/filetype_gsite.svg);
+}
+
+.no-thumbnail[generic-thumbnail='pdf'] {
+  -webkit-mask-image: url(../images/filetype/filetype_pdf.svg);
+}
+
+.no-thumbnail[generic-thumbnail='ppt'] {
+  -webkit-mask-image: none;
+  background-color: transparent;
+  background-image: url(../images/filetype/filetype_ppt.svg);
+}
+
+.no-thumbnail[generic-thumbnail='script'] {
+  -webkit-mask-image: url(../images/filetype/filetype_script.svg);
+}
+
+.no-thumbnail[generic-thumbnail='sites'] {
+  -webkit-mask-image: url(../images/filetype/filetype_sites.svg);
+}
+
+.no-thumbnail[generic-thumbnail='word'] {
+  -webkit-mask-image: none;
+  background-color: transparent;
+  background-image: url(../images/filetype/filetype_word.svg);
+}
+
+/* File type icon and thumbnail colors. */
+[file-type-icon='script'],
+[file-type-icon='tini'],
+.no-thumbnail[generic-thumbnail='gdoc'],
+.no-thumbnail[generic-thumbnail='script'],
+.no-thumbnail[generic-thumbnail='tini'] {
+  background-color: var(--cros-icon-color-blue);
+}
+
+[file-type-icon='audio'],
+[file-type-icon='gdraw'],
+[file-type-icon='image'],
+[file-type-icon='gmap'],
+[file-type-icon='pdf'],
+[file-type-icon='video'],
+.no-thumbnail[generic-thumbnail='audio'],
+.no-thumbnail[generic-thumbnail='gdraw'],
+.no-thumbnail[generic-thumbnail='image'],
+.no-thumbnail[generic-thumbnail='gmap'],
+.no-thumbnail[generic-thumbnail='pdf'],
+.no-thumbnail[generic-thumbnail='raw'],
+.no-thumbnail[generic-thumbnail='video'] {
+  background-color: var(--cros-icon-color-red);
+}
+
+[file-type-icon='gsheet'],
+[file-type-icon='gtable'],
+.no-thumbnail[generic-thumbnail='gsheet'],
+.no-thumbnail[generic-thumbnail='gtable'] {
+  background-color: var(--cros-icon-color-green);
+}
+
+[file-type-icon='gslides'],
+.no-thumbnail[generic-thumbnail='gslides'] {
+  background-color: var(--cros-icon-color-yellow);
+}
+
+/* The following 4 colors are one off colors, not in the existing palette. */
+[file-type-icon='gform'],
+.no-thumbnail[generic-thumbnail='gform'] {
+  background-color: rgb(114, 72, 185);
+}
+
+[file-type-icon='gsite'],
+[file-type-icon='sites'],
+.no-thumbnail[generic-thumbnail='gsite'],
+.no-thumbnail[generic-thumbnail='sites'] {
+  background-color: rgb(121, 110, 238);
+}
+
+@media (prefers-color-theme: dark) {
+  [file-type-icon='gform'],
+  .no-thumbnail[generic-thumbnail='gform'] {
+    background-color: rgb(180, 140, 255);
+  }
+
+  [file-type-icon='gsite'],
+  [file-type-icon='sites'],
+  .no-thumbnail[generic-thumbnail='gsite'],
+  .no-thumbnail[generic-thumbnail='sites'] {
+    background-color: rgb(140, 158, 255);
+  }
+}
+
+/* Icons for volume types. A ".tree-row > .file-row" component in any rules
+   means the rule only matches in files-ng. */
+.tree-row > .file-row > [volume-type-icon='archive'] {
+  -webkit-mask-image: url(../images/volumes/archive.svg);
+}
+
+.tree-row > .file-row > [root-type-icon='my_files'] {
+  -webkit-mask-image: url(../images/volumes/my_files.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='downloads'],
+.tree-row > .file-row > [file-type-icon='downloads'] {
+  -webkit-mask-image: url(../images/volumes/downloads.svg);
+}
+
+[file-type-icon='downloads'] {
+  -webkit-mask-image: url(../images/volumes/downloads.svg);
+}
+
+[file-type-icon='camera-folder'] {
+  -webkit-mask-image: url(../images/volumes/camera.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='drive'] {
+  -webkit-mask-image: url(../images/volumes/drive.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='shortcut'] {
+  -webkit-mask-image: url(../images/volumes/shortcut.svg);
+}
+
+.drive-volume > .tree-row > .file-row > [volume-type-icon='drive'],
+.tree-row > .file-row > [root-type-icon='drive'] {
+  -webkit-mask-image: url(../images/volumes/service_drive.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='shared_drives_grand_root'] {
+  -webkit-mask-image: url(../images/volumes/team_drive.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='team_drive'] {
+  -webkit-mask-image: url(../images/volumes/hard_drive.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='computers_grand_root'] {
+  -webkit-mask-image: url(../images/volumes/devices.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='computer'] {
+  -webkit-mask-image: url(../images/volumes/computer.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='drive_offline'] {
+  -webkit-mask-image: url(../images/volumes/offline.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='drive_shared_with_me'] {
+  -webkit-mask-image: url(../images/volumes/shared.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='drive_recent'] {
+  -webkit-mask-image: url(../images/volumes/recent.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='external_media'],
+.tree-row > .file-row > [volume-type-icon='removable'],
+.tree-row > .file-row > [root-type-icon='removable'] {
+  -webkit-mask-image: url(../images/volumes/usb.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='removable'][volume-subtype='sd'] {
+  -webkit-mask-image: url(../images/volumes/sd.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='removable'][volume-subtype='optical'] {
+  -webkit-mask-image: url(../images/volumes/cd.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='mtp'] {
+  -webkit-mask-image: url(../images/volumes/phone.svg);
+}
+
+[file-type-icon='removable'] {
+  -webkit-mask-image: url(../images/volumes/hard_drive.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='removable'][volume-subtype='unknown'],
+.tree-item .tree-item > .tree-row > .file-row > [volume-type-icon='removable'] {
+  -webkit-mask-image: url(../images/volumes/hard_drive.svg);
+}
+
+.tree-row > .file-row > [root-type-icon='recent'] {
+  -webkit-mask-image: url(../images/volumes/recent.svg);
+}
+
+[file-type-icon='crostini'] {
+  -webkit-mask-image: url(../images/volumes/linux_files.svg);
+}
+
+.tree-row > .file-row > [root-type-icon='crostini'],
+.tree-row > .file-row > [volume-type-icon='crostini'] {
+  -webkit-mask-image: url(../images/volumes/linux_files.svg);
+}
+
+[file-type-icon='bruschetta'] {
+  -webkit-mask-image: url(../images/volumes/linux_files.svg);
+}
+
+.tree-row > .file-row > [root-type-icon='bruschetta'],
+.tree-row > .file-row > [volume-type-icon='bruschetta'] {
+  -webkit-mask-image: url(../images/volumes/linux_files.svg);
+}
+
+[file-type-icon='android_files'] {
+  -webkit-mask-image: url(../images/volumes/android.svg);
+}
+
+.tree-row > .file-row > [root-type-icon='android_files'],
+.tree-row > .file-row > [volume-type-icon='android_files'] {
+  -webkit-mask-image: url(../images/volumes/android.svg);
+}
+
+[file-type-icon='plugin_vm'] {
+  -webkit-mask-image: url(../images/volumes/plugin_vm_ng.svg);
+}
+
+.tree-row > .file-row > [file-type-icon='plugin_vm'] {
+  -webkit-mask-image: url(../images/volumes/plugin_vm_ng.svg);
+}
+
+.tree-row > .file-row > [volume-type-icon='smb'] {
+  -webkit-mask-image: url(../images/volumes/smb.svg);
+}
+
+[file-type-icon='trash'] {
+  -webkit-mask-image: url(../images/files/ui/delete_ng.svg);
+}
+
+.tree-row > .file-row > [root-type-icon='trash'],
+.tree-row > .file-row > [volume-type-icon='trash'] {
+  -webkit-mask-image: url(../images/files/ui/delete_ng.svg);
+}
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
index 7ce797b..54dc85d 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -190,7 +190,7 @@
 directorytree.styleRowElementDepth = (item, depth) => {
   const fileRowElement = item.rowElement.firstElementChild;
 
-  const indent = depth * 22;
+  const indent = depth * (util.isJellyEnabled() ? 20 : 22);
   let style = 'padding-inline-start: ' + indent + 'px';
   const width = indent + 60;
   style += '; min-width: ' + width + 'px;';
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_grid.js b/ui/file_manager/file_manager/foreground/js/ui/file_grid.js
index 1fcde69..97342e9 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_grid.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_grid.js
@@ -570,7 +570,8 @@
   getFolderItemHeight_() {
     // Align with CSS value for .thumbnail-item.directory: height + margin +
     // border.
-    return 40 + this.getItemMarginTop_() + 2;
+    const height = util.isJellyEnabled() ? 48 : 40;
+    return height + this.getItemMarginTop_() + 2;
   }
 
   /**
@@ -647,7 +648,8 @@
    */
   getItemWidth_() {
     // Align with CSS value for .thumbnail-item: width + margin + border.
-    return 180 + this.getItemMarginLeft_() + 2;
+    const width = util.isJellyEnabled() ? 160 : 180;
+    return width + this.getItemMarginLeft_() + 2;
   }
 
   /**
@@ -1016,7 +1018,7 @@
     // resize it to cover the thumbnail box.
     const type = FileType.getType(entry, opt_mimeType);
     if ((type.type === 'image' && type.subtype === 'JPEG') ||
-        width > FileGrid.GridSize || height > FileGrid.GridSize) {
+        width > FileGrid.GridSize() || height > FileGrid.GridSize()) {
       thumbnail.style.backgroundSize = 'cover';
     }
 
@@ -1194,10 +1196,12 @@
 }
 
 /**
- * Grid size.
- * @const {number}
+ * Grid size, in "px".
+ * @return {number}
  */
-FileGrid.GridSize = 180;  // px
+FileGrid.GridSize = () => {
+  return util.isJellyEnabled() ? 160 : 180;
+};
 
 FileGrid.Item = class extends ListItem {
   constructor() {
diff --git a/ui/file_manager/file_manager/widgets/xf_splitter.ts b/ui/file_manager/file_manager/widgets/xf_splitter.ts
index 5d56622..79081b4 100644
--- a/ui/file_manager/file_manager/widgets/xf_splitter.ts
+++ b/ui/file_manager/file_manager/widgets/xf_splitter.ts
@@ -194,6 +194,7 @@
       padding: 0;
       position: relative;
       width: 16px;
+      z-index: var(--xf-splitter-z-index);
     }
 
     :host-context(html[dir=rtl]) #tracker {
diff --git a/ui/file_manager/integration_tests/file_manager/search.js b/ui/file_manager/integration_tests/file_manager/search.js
index 0072b67..79be994 100644
--- a/ui/file_manager/integration_tests/file_manager/search.js
+++ b/ui/file_manager/integration_tests/file_manager/search.js
@@ -677,27 +677,42 @@
  * search.
  */
 testcase.selectionPath = async () => {
-  const appId = await setupAndWaitUntilReady(RootPath.DOWNLOADS);
+  const appId =
+      await setupAndWaitUntilReady(RootPath.DOWNLOADS, NESTED_ENTRY_SET.concat([
+        ENTRIES.hello,
+        ENTRIES.desktop,
+        ENTRIES.deeplyBurriedSmallJpeg,
+      ]));
   // Search for files containing 'e'; should be three of those.
   await remoteCall.typeSearchText(appId, 'e');
   await remoteCall.waitForFiles(appId, TestEntryInfo.getExpectedRows([
     ENTRIES.hello,
     ENTRIES.desktop,
-    ENTRIES.beautiful,
+    ENTRIES.deeplyBurriedSmallJpeg,
   ]));
   await remoteCall.waitUntilSelected(appId, ENTRIES.hello.nameText);
   const singleSelectionPath = await remoteCall.waitForElement(appId, [
     'xf-path-display',
   ]);
   chrome.test.assertEq(
-      'My files/Downloads/hello.txt', singleSelectionPath.attributes.path);
-  // Select now the desktop entry, too.
+      'My files/Downloads', singleSelectionPath.attributes.path);
+  // Select now the desktop entry, too. Both are in the same
+  // directory, so the path should not change.
   await remoteCall.waitAndClickElement(
       appId, `#file-list [file-name="${ENTRIES.desktop.nameText}"]`,
-      {shift: true});
-  const multiSelectionPath = await remoteCall.waitForElement(appId, [
+      {ctrl: true});
+  const twoFilesOneFolderPath = await remoteCall.waitForElement(appId, [
     'xf-path-display',
   ]);
   chrome.test.assertEq(
-      'Multiple file locations', multiSelectionPath.attributes.path);
+      'My files/Downloads', twoFilesOneFolderPath.attributes.path);
+  await remoteCall.waitAndClickElement(
+      appId,
+      `#file-list [file-name="${ENTRIES.deeplyBurriedSmallJpeg.nameText}"]`,
+      {ctrl: true});
+  const threeFilesTwoFolderPath = await remoteCall.waitForElement(appId, [
+    'xf-path-display',
+  ]);
+  chrome.test.assertEq(
+      'Multiple file locations', threeFilesTwoFolderPath.attributes.path);
 };
diff --git a/ui/gl/gl_api_unittest.cc b/ui/gl/gl_api_unittest.cc
index 19eae42..51b02a53 100644
--- a/ui/gl/gl_api_unittest.cc
+++ b/ui/gl/gl_api_unittest.cc
@@ -74,13 +74,13 @@
   }
 
   void SetFakeExtensionString(const char* fake_string) {
-    SetGLImplementation(kGLImplementationDesktopGL);
+    SetGLImplementation(kGLImplementationEGLANGLE);
     fake_extension_string_ = fake_string;
     fake_version_string_ = "2.1";
   }
 
   void SetFakeExtensionStrings(const char** fake_strings, uint32_t count) {
-    SetGLImplementation(kGLImplementationDesktopGL);
+    SetGLImplementation(kGLImplementationEGLANGLE);
     num_fake_extension_strings_ = count;
     fake_extension_strings_ = fake_strings;
     fake_version_string_ = "3.0";
diff --git a/ui/gl/gl_context.cc b/ui/gl/gl_context.cc
index 4a2f654..6804c3a8 100644
--- a/ui/gl/gl_context.cc
+++ b/ui/gl/gl_context.cc
@@ -325,8 +325,6 @@
 
 bool GLContext::LosesAllContextsOnContextLost() {
   switch (GetGLImplementation()) {
-    case kGLImplementationDesktopGL:
-      return false;
     case kGLImplementationEGLGLES2:
     case kGLImplementationEGLANGLE:
       return true;
diff --git a/ui/gl/gl_implementation.cc b/ui/gl/gl_implementation.cc
index b4bbac7..5e49062 100644
--- a/ui/gl/gl_implementation.cc
+++ b/ui/gl/gl_implementation.cc
@@ -75,10 +75,6 @@
   switch (gl) {
     case GLImplementation::kGLImplementationNone:
       return "none";
-    case GLImplementation::kGLImplementationDesktopGL:
-      return "desktop-gl";
-    case GLImplementation::kGLImplementationDesktopGLCoreProfile:
-      return "desktop-gl-core-profile";
     case GLImplementation::kGLImplementationEGLGLES2:
       return "egl-gles2";
     case GLImplementation::kGLImplementationMockGL:
@@ -126,8 +122,6 @@
   const char* angle_name;
   GLImplementationParts implementation;
 } kGLImplementationNamePairs[] = {
-    {kGLImplementationDesktopName, kANGLEImplementationNoneName,
-     GLImplementationParts(kGLImplementationDesktopGL)},
     {kGLImplementationEGLName, kANGLEImplementationNoneName,
      GLImplementationParts(kGLImplementationEGLGLES2)},
     {kGLImplementationANGLEName, kANGLEImplementationNoneName,
@@ -285,6 +279,8 @@
     const base::CommandLine* command_line,
     bool* fallback_to_software_gl) {
   *fallback_to_software_gl = false;
+  bool overrideUseSoftwareGL =
+      command_line->HasSwitch(switches::kOverrideUseSoftwareGLForTests);
 #if BUILDFLAG(IS_LINUX) || \
     (BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_CHROMEOS_DEVICE))
   if (std::getenv("RUNNING_UNDER_RR")) {
@@ -292,9 +288,12 @@
     // is unhappy when things like GPU drivers write directly into the
     // process's address space.  Using swiftshader helps ensure that doesn't
     // happen and keeps Chrome and linux-chromeos usable with rr.
-    return GetSoftwareGLImplementation();
+    overrideUseSoftwareGL = true;
   }
 #endif
+  if (overrideUseSoftwareGL) {
+    return GetSoftwareGLImplementation();
+  }
 
   if (!command_line->HasSwitch(switches::kUseGL) &&
       !command_line->HasSwitch(switches::kUseANGLE)) {
@@ -371,11 +370,6 @@
   return g_gl_implementation.angle;
 }
 
-bool HasDesktopGLFeatures() {
-  return kGLImplementationDesktopGL == g_gl_implementation.gl ||
-         kGLImplementationDesktopGLCoreProfile == g_gl_implementation.gl;
-}
-
 void AddGLNativeLibrary(base::NativeLibrary library) {
   DCHECK(library);
 
diff --git a/ui/gl/gl_implementation.h b/ui/gl/gl_implementation.h
index 03c7218..45bb03e 100644
--- a/ui/gl/gl_implementation.h
+++ b/ui/gl/gl_implementation.h
@@ -32,9 +32,9 @@
 // in /tool/metrics/histograms/enums.xml
 enum GLImplementation {
   kGLImplementationNone = 0,
-  kGLImplementationDesktopGL = 1,
-  kGLImplementationDesktopGLCoreProfile = 2,
-  // Note: 3 and 4 are skipped and should not be reused.
+  // Note: 1, 2, 3, 4 are skipped and should not be reused.
+  // 1 used to be desktop GL.
+  // 2 used to be desktop GL core profile.
   // 3 used to be legacy SwiftShader.
   // 4 used to be Apple's software GL.
   kGLImplementationEGLGLES2 = 5,  // Native EGL/GLES2
@@ -187,10 +187,6 @@
 // Whether the implementation is one of the software GL implementations
 GL_EXPORT bool IsSoftwareGLImplementation(GLImplementationParts implementation);
 
-// Does the underlying GL support all features from Desktop GL 2.0 that were
-// removed from the ES 2.0 spec without requiring specific extension strings.
-GL_EXPORT bool HasDesktopGLFeatures();
-
 // Get the GL implementation with a given name.
 GL_EXPORT GLImplementationParts
 GetNamedGLImplementation(const std::string& gl_name,
diff --git a/ui/gl/gl_switches.cc b/ui/gl/gl_switches.cc
index 790feea..920de287 100644
--- a/ui/gl/gl_switches.cc
+++ b/ui/gl/gl_switches.cc
@@ -124,6 +124,10 @@
 // the GL output will not be correct but tests will run faster.
 const char kDisableGLDrawingForTests[] = "disable-gl-drawing-for-tests";
 
+// Forces the use of software GL instead of hardware gpu for tests.
+const char kOverrideUseSoftwareGLForTests[] =
+    "override-use-software-gl-for-tests";
+
 // Disables specified comma separated GL Extensions if found.
 const char kDisableGLExtensions[] = "disable-gl-extensions";
 
@@ -155,6 +159,7 @@
     kEnableSgiVideoSync,
     kGpuNoContextLost,
     kDisableGLDrawingForTests,
+    kOverrideUseSoftwareGLForTests,
     kUseANGLE,
     kEnableSwapBuffersWithBounds,
     kEnableDirectCompositionVideoOverlays,
diff --git a/ui/gl/gl_switches.h b/ui/gl/gl_switches.h
index 4172b89..ea8c050 100644
--- a/ui/gl/gl_switches.h
+++ b/ui/gl/gl_switches.h
@@ -77,6 +77,7 @@
 
 // These flags are used by the test harness code, not passed in by users.
 GL_EXPORT extern const char kDisableGLDrawingForTests[];
+GL_EXPORT extern const char kOverrideUseSoftwareGLForTests[];
 
 GL_EXPORT extern const char* const kGLSwitchesCopiedFromGpuProcessHost[];
 GL_EXPORT extern const int kGLSwitchesCopiedFromGpuProcessHostNumSwitches;
diff --git a/ui/gl/init/gl_factory.cc b/ui/gl/init/gl_factory.cc
index 3bd0dfe..12e100f6 100644
--- a/ui/gl/init/gl_factory.cc
+++ b/ui/gl/init/gl_factory.cc
@@ -65,14 +65,6 @@
   std::vector<GLImplementationParts> allowed_impls =
       GetAllowedGLImplementations();
 
-  if (GetGlWorkarounds().disable_es3gl_context) {
-    auto iter = base::ranges::find(
-        allowed_impls,
-        GLImplementationParts(kGLImplementationDesktopGLCoreProfile));
-    if (iter != allowed_impls.end())
-      allowed_impls.erase(iter);
-  }
-
   if (GetGlWorkarounds().disable_es3gl_context_for_testing) {
     GLVersionInfo::DisableES3ForTesting();
   }
diff --git a/ui/gl/init/gl_initializer_mac.cc b/ui/gl/init/gl_initializer_mac.cc
index e7bf812..c2e7ddcd 100644
--- a/ui/gl/init/gl_initializer_mac.cc
+++ b/ui/gl/init/gl_initializer_mac.cc
@@ -4,10 +4,6 @@
 
 #include "ui/gl/init/gl_initializer.h"
 
-#include <OpenGL/CGLRenderers.h>
-
-#include <vector>
-
 #include "base/base_paths.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
@@ -35,57 +31,6 @@
 
 namespace {
 
-const char kOpenGLFrameworkPath[] =
-    "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL";
-
-bool InitializeOneOffForSandbox() {
-  static bool initialized = false;
-  if (initialized)
-    return true;
-
-  // This is called from the sandbox warmup code on Mac OS X.
-  // GPU-related stuff is very slow without this, probably because
-  // the sandbox prevents loading graphics drivers or some such.
-  std::vector<CGLPixelFormatAttribute> attribs;
-  if (GLContext::SwitchableGPUsSupported()) {
-    // Avoid switching to the discrete GPU just for this pixel
-    // format selection.
-    attribs.push_back(kCGLPFAAllowOfflineRenderers);
-  }
-  attribs.push_back(static_cast<CGLPixelFormatAttribute>(0));
-
-  CGLPixelFormatObj format;
-  GLint num_pixel_formats;
-  if (CGLChoosePixelFormat(&attribs.front(), &format, &num_pixel_formats) !=
-      kCGLNoError) {
-    LOG(ERROR) << "Error choosing pixel format.";
-    return false;
-  }
-  if (!format) {
-    LOG(ERROR) << "format == 0.";
-    return false;
-  }
-  CGLReleasePixelFormat(format);
-  DCHECK_NE(num_pixel_formats, 0);
-  initialized = true;
-  return true;
-}
-
-bool InitializeStaticCGLInternal(GLImplementation implementation) {
-  base::NativeLibrary library =
-      base::LoadNativeLibrary(base::FilePath(kOpenGLFrameworkPath), nullptr);
-  if (!library) {
-    LOG(ERROR) << "OpenGL framework not found";
-    return false;
-  }
-
-  AddGLNativeLibrary(library);
-  SetGLImplementation(implementation);
-
-  InitializeStaticGLBindingsGL();
-  return true;
-}
-
 #if defined(USE_EGL)
 const char kGLESv2ANGLELibraryName[] = "libGLESv2.dylib";
 const char kEGLANGLELibraryName[] = "libEGL.dylib";
@@ -169,12 +114,6 @@
 GLDisplay* InitializeGLOneOffPlatform(gl::GpuPreference gpu_preference) {
   GLDisplayEGL* display = GetDisplayEGL(gpu_preference);
   switch (GetGLImplementation()) {
-    case kGLImplementationDesktopGL:
-    case kGLImplementationDesktopGLCoreProfile:
-      if (!InitializeOneOffForSandbox()) {
-        LOG(ERROR) << "GLSurfaceCGL::InitializeOneOff failed.";
-      }
-      break;
 #if defined(USE_EGL)
     case kGLImplementationEGLGLES2:
     case kGLImplementationEGLANGLE:
@@ -203,9 +142,6 @@
   base::ScopedAllowBlocking allow_blocking;
 
   switch (implementation.gl) {
-    case kGLImplementationDesktopGL:
-    case kGLImplementationDesktopGLCoreProfile:
-      return InitializeStaticCGLInternal(implementation.gl);
 #if defined(USE_EGL)
     case kGLImplementationEGLGLES2:
     case kGLImplementationEGLANGLE:
diff --git a/ui/gl/mojom/gl_implementation.mojom b/ui/gl/mojom/gl_implementation.mojom
index ac8d96c..52496c67 100644
--- a/ui/gl/mojom/gl_implementation.mojom
+++ b/ui/gl/mojom/gl_implementation.mojom
@@ -7,8 +7,6 @@
 // Maps to its namesake in ui/gl/gl_implementation.h.
 enum GLImplementation {
   kGLImplementationNone,
-  kGLImplementationDesktopGL,
-  kGLImplementationDesktopGLCoreProfile,
   kGLImplementationEGLGLES2,
   kGLImplementationMockGL,
   kGLImplementationStubGL,
diff --git a/ui/gl/mojom/gl_implementation_mojom_traits.cc b/ui/gl/mojom/gl_implementation_mojom_traits.cc
index 15d9d7b..fb28d2d 100644
--- a/ui/gl/mojom/gl_implementation_mojom_traits.cc
+++ b/ui/gl/mojom/gl_implementation_mojom_traits.cc
@@ -14,10 +14,6 @@
   switch (impl) {
     case gl::kGLImplementationNone:
       return gl::mojom::GLImplementation::kGLImplementationNone;
-    case gl::kGLImplementationDesktopGL:
-      return gl::mojom::GLImplementation::kGLImplementationDesktopGL;
-    case gl::kGLImplementationDesktopGLCoreProfile:
-      return gl::mojom::GLImplementation::kGLImplementationDesktopGLCoreProfile;
     case gl::kGLImplementationEGLGLES2:
       return gl::mojom::GLImplementation::kGLImplementationEGLGLES2;
     case gl::kGLImplementationMockGL:
@@ -29,8 +25,7 @@
     case gl::kGLImplementationEGLANGLE:
       return gl::mojom::GLImplementation::kGLImplementationEGLANGLE;
   }
-  NOTREACHED();
-  return gl::mojom::GLImplementation::kGLImplementationNone;
+  NOTREACHED_NORETURN();
 }
 
 // static
@@ -41,12 +36,6 @@
     case gl::mojom::GLImplementation::kGLImplementationNone:
       *out = gl::kGLImplementationNone;
       return true;
-    case gl::mojom::GLImplementation::kGLImplementationDesktopGL:
-      *out = gl::kGLImplementationDesktopGL;
-      return true;
-    case gl::mojom::GLImplementation::kGLImplementationDesktopGLCoreProfile:
-      *out = gl::kGLImplementationDesktopGLCoreProfile;
-      return true;
     case gl::mojom::GLImplementation::kGLImplementationEGLGLES2:
       *out = gl::kGLImplementationEGLGLES2;
       return true;
@@ -63,8 +52,7 @@
       *out = gl::kGLImplementationEGLANGLE;
       return true;
   }
-  NOTREACHED();
-  return false;
+  NOTREACHED_NORETURN();
 }
 
 // static
@@ -93,8 +81,7 @@
     case gl::ANGLEImplementation::kDefault:
       return gl::mojom::ANGLEImplementation::kDefault;
   }
-  NOTREACHED();
-  return gl::mojom::ANGLEImplementation::kNone;
+  NOTREACHED_NORETURN();
 }
 
 // static
@@ -133,8 +120,7 @@
       *out = gl::ANGLEImplementation::kDefault;
       return true;
   }
-  NOTREACHED();
-  return false;
+  NOTREACHED_NORETURN();
 }
 
 // static
diff --git a/ui/gl/test/gl_surface_test_support.cc b/ui/gl/test/gl_surface_test_support.cc
index 19361a9..998fb7a 100644
--- a/ui/gl/test/gl_surface_test_support.cc
+++ b/ui/gl/test/gl_surface_test_support.cc
@@ -63,6 +63,9 @@
     impl = gl::GetSoftwareGLImplementation();
   }
 
+  DCHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseGL))
+      << "kUseGL has not effect in tests";
+
   bool fallback_to_software_gl = false;
   bool disable_gl_drawing = true;
 
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
index fc68bb7..ebe4a33 100644
--- a/ui/ozone/platform/wayland/BUILD.gn
+++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -48,6 +48,8 @@
     "gpu/wayland_surface_factory.cc",
     "gpu/wayland_surface_factory.h",
     "gpu/wayland_surface_gpu.h",
+    "host/fractional_scale_manager.cc",
+    "host/fractional_scale_manager.h",
     "host/gtk_primary_selection_device.cc",
     "host/gtk_primary_selection_device.h",
     "host/gtk_primary_selection_device_manager.cc",
@@ -248,6 +250,7 @@
     "//third_party/wayland-protocols:content_type_protocol",
     "//third_party/wayland-protocols:cursor_shapes_protocol",
     "//third_party/wayland-protocols:extended_drag",
+    "//third_party/wayland-protocols:fractional_scale_protocol",
     "//third_party/wayland-protocols:gtk_primary_selection_protocol",
     "//third_party/wayland-protocols:gtk_shell_protocol",
     "//third_party/wayland-protocols:idle_inhibit_protocol",
diff --git a/ui/ozone/platform/wayland/common/wayland_object.cc b/ui/ozone/platform/wayland/common/wayland_object.cc
index 9a790e18..a1089b0 100644
--- a/ui/ozone/platform/wayland/common/wayland_object.cc
+++ b/ui/ozone/platform/wayland/common/wayland_object.cc
@@ -10,6 +10,7 @@
 #include <content-type-v1-client-protocol.h>
 #include <cursor-shapes-unstable-v1-client-protocol.h>
 #include <extended-drag-unstable-v1-client-protocol.h>
+#include <fractional-scale-v1-client-protocol.h>
 #include <gtk-primary-selection-client-protocol.h>
 #include <gtk-shell-client-protocol.h>
 #include <idle-client-protocol.h>
@@ -225,6 +226,8 @@
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(wp_viewporter)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(wp_content_type_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(wp_content_type_manager_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(wp_fractional_scale_manager_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(wp_fractional_scale_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(xdg_activation_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(xdg_activation_token_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(xdg_popup)
diff --git a/ui/ozone/platform/wayland/common/wayland_object.h b/ui/ozone/platform/wayland/common/wayland_object.h
index 6f8971c..af491c7 100644
--- a/ui/ozone/platform/wayland/common/wayland_object.h
+++ b/ui/ozone/platform/wayland/common/wayland_object.h
@@ -145,6 +145,8 @@
 DECLARE_WAYLAND_OBJECT_TRAITS(wp_viewporter)
 DECLARE_WAYLAND_OBJECT_TRAITS(wp_content_type_manager_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(wp_content_type_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(wp_fractional_scale_manager_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(wp_fractional_scale_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(xdg_activation_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(xdg_activation_token_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(xdg_popup)
diff --git a/ui/ozone/platform/wayland/host/fractional_scale_manager.cc b/ui/ozone/platform/wayland/host/fractional_scale_manager.cc
new file mode 100644
index 0000000..0a5ab25f
--- /dev/null
+++ b/ui/ozone/platform/wayland/host/fractional_scale_manager.cc
@@ -0,0 +1,48 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/wayland/host/fractional_scale_manager.h"
+
+#include <fractional-scale-v1-client-protocol.h>
+
+#include "base/check_op.h"
+#include "base/logging.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+
+namespace ui {
+
+namespace {
+
+constexpr uint32_t kMaxVersion = 1;
+
+}  // namespace
+
+// static
+void FractionalScaleManager::Instantiate(WaylandConnection* connection,
+                                         wl_registry* registry,
+                                         uint32_t name,
+                                         const std::string& interface,
+                                         uint32_t version) {
+  CHECK_EQ(interface, kInterfaceName) << "Expected \"" << kInterfaceName
+                                      << "\" but got \"" << interface << "\"";
+
+  if (connection->fractional_scale_manager_v1_) {
+    return;
+  }
+
+  auto instance = wl::Bind<::wp_fractional_scale_manager_v1>(
+      registry, name, std::min(version, kMaxVersion));
+  if (!instance) {
+    LOG(ERROR) << "Failed to bind " << kInterfaceName;
+    return;
+  }
+  connection->fractional_scale_manager_v1_ = std::move(instance);
+
+  // fractional-scale-v1 requires clients to report a scale of 1 for all
+  // surfaces.
+  connection->set_surface_submission_in_pixel_coordinates(true);
+}
+
+}  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/fractional_scale_manager.h b/ui/ozone/platform/wayland/host/fractional_scale_manager.h
new file mode 100644
index 0000000..eae1968
--- /dev/null
+++ b/ui/ozone/platform/wayland/host/fractional_scale_manager.h
@@ -0,0 +1,29 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_FRACTIONAL_SCALE_MANAGER_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_FRACTIONAL_SCALE_MANAGER_H_
+
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+
+namespace ui {
+
+// Sets up the global wp_fractional_scale_manager_v1 instance.
+class FractionalScaleManager
+    : public wl::GlobalObjectRegistrar<FractionalScaleManager> {
+ public:
+  static constexpr char kInterfaceName[] = "wp_fractional_scale_manager_v1";
+
+  static void Instantiate(WaylandConnection* connection,
+                          wl_registry* registry,
+                          uint32_t name,
+                          const std::string& interface,
+                          uint32_t version);
+
+  FractionalScaleManager() = delete;
+};
+
+}  // namespace ui
+
+#endif  // UI_OZONE_PLATFORM_WAYLAND_HOST_FRACTIONAL_SCALE_MANAGER_H_
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.cc b/ui/ozone/platform/wayland/host/wayland_connection.cc
index f04dbf0..e3641cad 100644
--- a/ui/ozone/platform/wayland/host/wayland_connection.cc
+++ b/ui/ozone/platform/wayland/host/wayland_connection.cc
@@ -27,6 +27,8 @@
 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/ozone/common/features.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/fractional_scale_manager.h"
 #include "ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h"
 #include "ui/ozone/platform/wayland/host/gtk_shell1.h"
 #include "ui/ozone/platform/wayland/host/org_kde_kwin_idle.h"
@@ -129,6 +131,8 @@
 bool WaylandConnection::Initialize() {
   // Register factories for classes that implement wl::GlobalObjectRegistrar<T>.
   // Keep alphabetical order for convenience.
+  RegisterGlobalObjectFactory(FractionalScaleManager::kInterfaceName,
+                              &FractionalScaleManager::Instantiate);
   RegisterGlobalObjectFactory(GtkPrimarySelectionDeviceManager::kInterfaceName,
                               &GtkPrimarySelectionDeviceManager::Instantiate);
   RegisterGlobalObjectFactory(GtkShell1::kInterfaceName,
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.h b/ui/ozone/platform/wayland/host/wayland_connection.h
index c0197481..0b436d7 100644
--- a/ui/ozone/platform/wayland/host/wayland_connection.h
+++ b/ui/ozone/platform/wayland/host/wayland_connection.h
@@ -160,6 +160,10 @@
     return xdg_output_manager_.get();
   }
 
+  wp_fractional_scale_manager_v1* fractional_scale_manager_v1() const {
+    return fractional_scale_manager_v1_.get();
+  }
+
   void SetPlatformCursor(wl_cursor* cursor_data, int buffer_scale);
 
   void SetCursorBufferListener(WaylandCursorBufferListener* listener);
@@ -320,6 +324,7 @@
   // makes it possible to avoid exposing setters for all those global objects:
   // these setters would only be needed by the globals but would be visible to
   // everyone.
+  friend class FractionalScaleManager;
   friend class GtkPrimarySelectionDeviceManager;
   friend class GtkShell1;
   friend class OrgKdeKwinIdle;
@@ -403,6 +408,7 @@
   wl::Object<zxdg_decoration_manager_v1> xdg_decoration_manager_;
   wl::Object<zcr_extended_drag_v1> extended_drag_v1_;
   wl::Object<zxdg_output_manager_v1> xdg_output_manager_;
+  wl::Object<wp_fractional_scale_manager_v1> fractional_scale_manager_v1_;
 
   // Manages Wayland windows.
   WaylandWindowManager window_manager_{this};
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.cc b/ui/ozone/platform/wayland/host/wayland_surface.cc
index 6322180..bfba1e2 100644
--- a/ui/ozone/platform/wayland/host/wayland_surface.cc
+++ b/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -7,6 +7,7 @@
 #include <alpha-compositing-unstable-v1-client-protocol.h>
 #include <chrome-color-management-client-protocol.h>
 #include <content-type-v1-client-protocol.h>
+#include <fractional-scale-v1-client-protocol.h>
 #include <linux-explicit-synchronization-unstable-v1-client-protocol.h>
 #include <overlay-prioritizer-client-protocol.h>
 #include <surface-augmenter-client-protocol.h>
@@ -28,6 +29,7 @@
 #include "ui/gfx/native_widget_types.h"
 #include "ui/gfx/overlay_priority_hint.h"
 #include "ui/ozone/platform/wayland/common/wayland_util.h"
+#include "ui/ozone/platform/wayland/host/fractional_scale_manager.h"
 #include "ui/ozone/platform/wayland/host/overlay_prioritizer.h"
 #include "ui/ozone/platform/wayland/host/surface_augmenter.h"
 #include "ui/ozone/platform/wayland/host/wayland_buffer_handle.h"
@@ -120,6 +122,18 @@
   };
   wl_surface_add_listener(surface_.get(), &surface_listener, this);
 
+  if (auto* fractional_scale_manager =
+          connection_->fractional_scale_manager_v1()) {
+    static struct wp_fractional_scale_v1_listener fractional_scale_listener {
+      &WaylandSurface::PreferredScale,
+    };
+    fractional_scale_ =
+        wl::Object(wp_fractional_scale_manager_v1_get_fractional_scale(
+            fractional_scale_manager, surface_.get()));
+    wp_fractional_scale_v1_add_listener(fractional_scale_.get(),
+                                        &fractional_scale_listener, this);
+  }
+
   if (connection_->viewporter()) {
     viewport_.reset(
         wp_viewporter_get_viewport(connection_->viewporter(), surface()));
@@ -812,6 +826,25 @@
   surface->RemoveEnteredOutput(wayland_output->output_id());
 }
 
+// static
+void WaylandSurface::PreferredScale(
+    void* data,
+    struct wp_fractional_scale_v1* wp_fractional_scale_v1,
+    uint32_t scale) {
+  // Specified in fractional-scale-v1
+  constexpr float kFractionalScaleDenominator = 120.0f;
+
+  auto* surface = static_cast<WaylandSurface*>(data);
+  DCHECK(surface);
+
+  // If the compositor sends a scale of 0, reset it to 1.
+  if (scale == 0) {
+    surface->set_surface_buffer_scale(1.0f);
+  } else {
+    surface->set_surface_buffer_scale(scale / kFractionalScaleDenominator);
+  }
+}
+
 void WaylandSurface::RemoveEnteredOutput(uint32_t output_id) {
   auto it = base::ranges::find(entered_outputs_, output_id);
   if (it == entered_outputs_.end())
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.h b/ui/ozone/platform/wayland/host/wayland_surface.h
index b478f50..f17b1b8f 100644
--- a/ui/ozone/platform/wayland/host/wayland_surface.h
+++ b/ui/ozone/platform/wayland/host/wayland_surface.h
@@ -27,6 +27,7 @@
 #include "ui/ozone/platform/wayland/host/wayland_zcr_color_space.h"
 
 struct wp_content_type_v1;
+struct wp_fractional_scale_v1;
 struct zwp_linux_buffer_release_v1;
 struct zcr_blending_v1;
 
@@ -352,6 +353,7 @@
   wl::Object<overlay_prioritized_surface> overlay_priority_surface_;
   wl::Object<augmented_surface> augmented_surface_;
   wl::Object<wp_content_type_v1> content_type_;
+  wl::Object<wp_fractional_scale_v1> fractional_scale_;
   std::unique_ptr<WaylandZcrColorManagementSurface>
       zcr_color_management_surface_;
   base::flat_map<zwp_linux_buffer_release_v1*, ExplicitReleaseInfo>
@@ -384,6 +386,12 @@
                     struct wl_surface* wl_surface,
                     struct wl_output* output);
 
+  // wp_fractional_scale_v1_listener
+  static void PreferredScale(
+      void* data,
+      struct wp_fractional_scale_v1* wp_fractional_scale_v1,
+      uint32_t scale);
+
   // zwp_linux_buffer_release_v1_listener
   static void FencedRelease(
       void* data,
diff --git a/ui/views/controls/combobox/combobox_util.cc b/ui/views/controls/combobox/combobox_util.cc
index c92e8cd..191a7353 100644
--- a/ui/views/controls/combobox/combobox_util.cc
+++ b/ui/views/controls/combobox/combobox_util.cc
@@ -71,8 +71,16 @@
 void ConfigureComboboxButtonInkDrop(Button* host_view) {
   InkDrop::Get(host_view)->SetMode(views::InkDropHost::InkDropMode::ON);
   host_view->SetHasInkDropActionOnClick(true);
-  InkDrop::UseInkDropForSquareRipple(InkDrop::Get(host_view),
-                                     /*highlight_on_hover=*/false);
+  if (features::IsChromeRefresh2023()) {
+    // We must use UseInkDropForFloodFillRipple here because
+    // UseInkDropForSquareRipple hides the InkDrop when the ripple effect is
+    // active instead of layering underneath it causing flashing.
+    InkDrop::UseInkDropForFloodFillRipple(InkDrop::Get(host_view),
+                                          /*highlight_on_hover=*/true);
+  } else {
+    InkDrop::UseInkDropForSquareRipple(InkDrop::Get(host_view),
+                                       /*highlight_on_hover=*/false);
+  }
   views::InkDrop::Get(host_view)->SetBaseColorCallback(base::BindRepeating(
       [](Button* host) {
         // Use the same foreground base color as a label button.
diff --git a/ui/views/controls/editable_combobox/editable_combobox.cc b/ui/views/controls/editable_combobox/editable_combobox.cc
index d75ff249..9081aaf 100644
--- a/ui/views/controls/editable_combobox/editable_combobox.cc
+++ b/ui/views/controls/editable_combobox/editable_combobox.cc
@@ -68,15 +68,23 @@
 
 namespace {
 
+int kEditableComboboxButtonSize = 24;
+int kEditableComboboxControlsContainerInsets = 6;
+
 class Arrow : public Button {
  public:
   METADATA_HEADER(Arrow);
 
   explicit Arrow(PressedCallback callback) : Button(std::move(callback)) {
-    SetPreferredSize(gfx::Size(GetComboboxArrowContainerWidthAndMargins(),
-                               ComboboxArrowSize().height()));
-    // Similar to Combobox's TransparentButton.
-    SetFocusBehavior(FocusBehavior::NEVER);
+    if (features::IsChromeRefresh2023()) {
+      SetPreferredSize(
+          gfx::Size(kEditableComboboxButtonSize, kEditableComboboxButtonSize));
+    } else {
+      SetPreferredSize(gfx::Size(GetComboboxArrowContainerWidthAndMargins(),
+                                 ComboboxArrowSize().height()));
+      SetFocusBehavior(FocusBehavior::NEVER);
+    }
+
     button_controller()->set_notify_action(
         ButtonController::NotifyAction::kOnPress);
 
@@ -370,11 +378,12 @@
   AddChildView(textfield_.get());
 
   control_elements_container_ = AddChildView(std::make_unique<BoxLayoutView>());
-  control_elements_container_->SetInsideBorderInsets(
-      gfx::Insets::TLBR(0, 0, 0,
-                        GetComboboxArrowContainerWidthAndMargins() -
-                            GetComboboxArrowContainerWidth()));
-
+  if (features::IsChromeRefresh2023()) {
+    control_elements_container_->SetInsideBorderInsets(
+        gfx::Insets::TLBR(kEditableComboboxControlsContainerInsets, 0,
+                          kEditableComboboxControlsContainerInsets,
+                          kEditableComboboxControlsContainerInsets));
+  }
   if (display_arrow) {
     arrow_ = AddControlElement(std::make_unique<Arrow>(base::BindRepeating(
         &EditableCombobox::ArrowButtonPressed, base::Unretained(this))));
@@ -498,7 +507,16 @@
   }
 }
 
+bool EditableCombobox::ShouldApplyInkDropEffects() {
+  return features::IsChromeRefresh2023() && arrow_ && InkDrop::Get(arrow_) &&
+         GetWidget();
+}
+
 void EditableCombobox::CloseMenu() {
+  if (ShouldApplyInkDropEffects()) {
+    InkDrop::Get(arrow_)->AnimateToState(InkDropState::DEACTIVATED, nullptr);
+    InkDrop::Get(arrow_)->GetInkDrop()->SetHovered(arrow_->IsMouseHovered());
+  }
   menu_runner_.reset();
   pre_target_handler_.reset();
 }
@@ -531,6 +549,9 @@
 
 void EditableCombobox::ArrowButtonPressed(const ui::Event& event) {
   textfield_->RequestFocus();
+  if (ShouldApplyInkDropEffects()) {
+    InkDrop::Get(arrow_)->AnimateToState(InkDropState::ACTIVATED, nullptr);
+  }
   if (menu_runner_ && menu_runner_->IsRunning()) {
     CloseMenu();
   } else {
diff --git a/ui/views/controls/editable_combobox/editable_combobox.h b/ui/views/controls/editable_combobox/editable_combobox.h
index 5b22707..f5eda26 100644
--- a/ui/views/controls/editable_combobox/editable_combobox.h
+++ b/ui/views/controls/editable_combobox/editable_combobox.h
@@ -132,6 +132,8 @@
 
   Textfield& GetTextfield() { return *textfield_; }
 
+  Button* GetArrowButtonForTesting() { return arrow_; }
+
  private:
   friend class EditableComboboxTest;
   friend class EditablePasswordComboboxTest;
@@ -186,6 +188,8 @@
   void OnLayoutIsAnimatingChanged(views::AnimatingLayoutManager* source,
                                   bool is_animating) override;
 
+  bool ShouldApplyInkDropEffects();
+
   raw_ptr<Textfield> textfield_;
   raw_ptr<BoxLayoutView> control_elements_container_ = nullptr;
   raw_ptr<Button> arrow_ = nullptr;
diff --git a/ui/views/controls/editable_combobox/editable_combobox_unittest.cc b/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
index 31cebb8c..8fe5823 100644
--- a/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
+++ b/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
@@ -32,6 +32,7 @@
 #include "ui/views/controls/combobox/combobox_util.h"
 #include "ui/views/controls/menu/menu_runner.h"
 #include "ui/views/controls/textfield/textfield.h"
+#include "ui/views/test/button_test_api.h"
 #include "ui/views/test/menu_test_utils.h"
 #include "ui/views/test/views_test_base.h"
 #include "ui/views/view.h"
@@ -268,23 +269,10 @@
 }
 
 void EditableComboboxTest::ClickArrow() {
-  const gfx::Point arrow_button(combobox_->x() + combobox_->width() - 1,
-                                combobox_->y() + 1);
-  PerformClick(widget_, arrow_button);
-}
-
-void EditableComboboxTest::ClickMenuItem(const int index) {
-  DCHECK(GetMenuRunner());
-  const gfx::Point middle_of_item(
-      combobox_->x() + combobox_->width() / 2,
-      combobox_->y() + combobox_->height() / 2 + combobox_->height() * index);
-  // For the menu, we send the click event to the child widget where the menu is
-  // shown. That child widget is the MenuHost object created inside
-  // EditableCombobox's MenuRunner to host the menu items.
-  std::set<Widget*> child_widgets;
-  Widget::GetAllOwnedWidgets(widget_->GetNativeView(), &child_widgets);
-  ASSERT_EQ(1UL, child_widgets.size());
-  PerformClick(*child_widgets.begin(), middle_of_item);
+  ui::MouseEvent e(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
+                   ui::EventTimeForNow(), 0, 0);
+  views::test::ButtonTestApi test_api(combobox_->GetArrowButtonForTesting());
+  test_api.NotifyClick(e);
 }
 
 void EditableComboboxTest::FocusTextfield() {
@@ -379,7 +367,11 @@
   EXPECT_TRUE(IsTextfieldFocused());
   SendKeyEvent(ui::VKEY_TAB);
   EXPECT_FALSE(IsTextfieldFocused());
-  EXPECT_TRUE(dummy_focusable_view_->HasFocus());
+  // In Chrome Refresh the drop down arrow will behave more like a normal button
+  // and therefore will be focusable.
+  if (!features::IsChromeRefresh2023()) {
+    EXPECT_TRUE(dummy_focusable_view_->HasFocus());
+  }
   WaitForMenuClosureAnimation();
   EXPECT_FALSE(IsMenuOpen());
 }
@@ -634,17 +626,6 @@
   EXPECT_EQ(u"abc", combobox_->GetText());
 }
 
-TEST_F(EditableComboboxTest, ClickOnMenuItemSelectsItAndClosesMenu) {
-  InitEditableCombobox();
-  ClickArrow();
-  ASSERT_TRUE(IsMenuOpen());
-
-  ClickMenuItem(/*index=*/0);
-  WaitForMenuClosureAnimation();
-  EXPECT_FALSE(IsMenuOpen());
-  EXPECT_EQ(u"item[0]", combobox_->GetText());
-}
-
 // This is different from the regular read-only Combobox, where SPACE
 // opens/closes the menu.
 TEST_F(EditableComboboxTest, SpaceIsReflectedInTextfield) {
diff --git a/ui/views/controls/editable_combobox/editable_password_combobox.cc b/ui/views/controls/editable_combobox/editable_password_combobox.cc
index 5193715..6fc8b23a 100644
--- a/ui/views/controls/editable_combobox/editable_password_combobox.cc
+++ b/ui/views/controls/editable_combobox/editable_password_combobox.cc
@@ -20,6 +20,7 @@
 #include "ui/views/border.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/button/image_button_factory.h"
+#include "ui/views/controls/combobox/combobox_util.h"
 #include "ui/views/controls/editable_combobox/editable_combobox.h"
 #include "ui/views/controls/textfield/textfield.h"
 #include "ui/views/layout/box_layout_view.h"
@@ -49,6 +50,7 @@
   SetToggledImageFromVectorIconWithColorId(
       button.get(), kEyeCrossedIcon, ui::kColorIcon, ui::kColorIconDisabled);
 
+  ConfigureComboboxButtonInkDrop(button.get());
   return button;
 }
 
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble.ts b/ui/webui/resources/cr_components/help_bubble/help_bubble.ts
index d98b1a46..b52ce74 100644
--- a/ui/webui/resources/cr_components/help_bubble/help_bubble.ts
+++ b/ui/webui/resources/cr_components/help_bubble/help_bubble.ts
@@ -46,9 +46,7 @@
   nativeId: any,
 }>;
 
-type ResizeListener = (this: Window, ev: UIEvent) => any;
-
-export function debounceEnd(fn: Function, time: number = 50) {
+export function debounceEnd(fn: Function, time: number = 50): () => void {
   let timerId: number|undefined;
   return () => {
     clearTimeout(timerId);
@@ -109,8 +107,7 @@
   forceCloseButton: boolean;
   timeoutMs: number|null = null;
   timeoutTimerId: number|null = null;
-  debouncedUpdate: ResizeListener|EventListenerOrEventListenerObject|null =
-      null;
+  debouncedUpdate: (() => void)|null = null;
   padding: InsetsF = new InsetsF();
   fixed: boolean = false;
 
@@ -166,9 +163,8 @@
     }, 50);
 
     this.$.buttonlist.addEventListener(
-        'rendered-item-count-changed',
-        this.debouncedUpdate as EventListenerOrEventListenerObject);
-    window.addEventListener('resize', this.debouncedUpdate as ResizeListener);
+        'rendered-item-count-changed', this.debouncedUpdate);
+    window.addEventListener('resize', this.debouncedUpdate);
 
     if (this.timeoutMs !== null) {
       const timedOutCallback = () => {
@@ -211,11 +207,9 @@
       this.timeoutTimerId = null;
     }
     if (this.debouncedUpdate) {
-      window.removeEventListener(
-          'resize', this.debouncedUpdate as ResizeListener);
+      window.removeEventListener('resize', this.debouncedUpdate);
       this.$.buttonlist.removeEventListener(
-          'rendered-item-count-changed',
-          this.debouncedUpdate as EventListenerOrEventListenerObject);
+          'rendered-item-count-changed', this.debouncedUpdate);
       this.debouncedUpdate = null;
     }
   }
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts b/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts
index 2993ca1..849c0c9 100644
--- a/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts
+++ b/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
-import {InsetsF} from 'chrome://resources/mojo/ui/gfx/geometry/mojom/geometry.mojom-webui.js';
+import {InsetsF, RectF} from 'chrome://resources/mojo/ui/gfx/geometry/mojom/geometry.mojom-webui.js';
 
 import {HELP_BUBBLE_SCROLL_ANCHOR_OPTIONS, HelpBubbleElement} from './help_bubble.js';
 import {HelpBubbleArrowPosition, HelpBubbleParams} from './help_bubble.mojom-webui.js';
@@ -81,9 +81,12 @@
    */
   private isBubbleShowing_: boolean = false;
 
-  // Keep track of last-known anchor visibility status
+  /** Keep track of last known anchor visibility status. */
   private isAnchorVisible_: boolean = false;
 
+  /** Keep track of last known anchor bounds. */
+  private lastAnchorBounds_: RectF = new RectF();
+
   /*
    * This flag is used to know whether to send position updates for
    * external bubbles
@@ -138,8 +141,19 @@
     return this.isAnchorVisible_;
   }
 
-  cacheAnchorVisibility(isVisible: boolean) {
+  getLastAnchorBounds() {
+    return this.lastAnchorBounds_;
+  }
+
+  updateAnchorVisibility(isVisible: boolean, bounds: RectF): boolean {
+    const changed = isVisible !== this.isAnchorVisible_ ||
+        bounds.x !== this.lastAnchorBounds_.x ||
+        bounds.y !== this.lastAnchorBounds_.y ||
+        bounds.width !== this.lastAnchorBounds_.width ||
+        bounds.height !== this.lastAnchorBounds_.height;
     this.isAnchorVisible_ = isVisible;
+    this.lastAnchorBounds_ = bounds;
+    return changed;
   }
 
   isAnchorFixed(): boolean {
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts b/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts
index f8cf8c0..29fd930 100644
--- a/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts
+++ b/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts
@@ -49,11 +49,11 @@
         private helpBubbleListenerIds_: number[] = [];
         private helpBubbleFixedAnchorObserver_: IntersectionObserver|null =
             null;
-        private helpBubbleAnchorResizeObserver_: ResizeObserver|null = null;
+        private helpBubbleResizeObserver_: ResizeObserver|null = null;
         private helpBubbleDismissedEventTracker_: EventTracker =
             new EventTracker();
-        private helpBubbleScrollCallbackDebounced_:
-            EventListenerOrEventListenerObject|null = null;
+        private debouncedAnchorMayHaveChangedCallback_:
+            (() => void)|null = null;
 
         constructor(...args: any[]) {
           super(...args);
@@ -83,22 +83,30 @@
             return rect.height > 0 && rect.width > 0;
           };
 
-          this.helpBubbleAnchorResizeObserver_ = new ResizeObserver(
-              entries => entries.forEach(
-                  ({target}) => this.onAnchorVisibilityChanged_(
-                      target as HTMLElement, isVisible(target))));
+          this.debouncedAnchorMayHaveChangedCallback_ =
+              debounceEnd(this.onAnchorBoundsMayHaveChanged_.bind(this), 50);
+
+          this.helpBubbleResizeObserver_ =
+              new ResizeObserver(entries => entries.forEach(({target}) => {
+                if (target === document.body) {
+                  if (this.debouncedAnchorMayHaveChangedCallback_) {
+                    this.debouncedAnchorMayHaveChangedCallback_();
+                  }
+                } else {
+                  this.onAnchorVisibilityChanged_(
+                      target as HTMLElement, isVisible(target));
+                }
+              }));
           this.helpBubbleFixedAnchorObserver_ = new IntersectionObserver(
               entries => entries.forEach(
                   ({target, isIntersecting}) => this.onAnchorVisibilityChanged_(
                       target as HTMLElement, isIntersecting)),
               {root: null});
 
-          this.helpBubbleScrollCallbackDebounced_ =
-              debounceEnd(this.helpBubbleScrollCallback_.bind(this), 50) as
-              EventListenerOrEventListenerObject;
           document.addEventListener(
-              'scroll', this.helpBubbleScrollCallbackDebounced_,
+              'scroll', this.debouncedAnchorMayHaveChangedCallback_,
               {passive: true});
+          this.helpBubbleResizeObserver_.observe(document.body);
 
           // When the component is connected, if the target elements were
           // already registered, they should be observed now. Any targets
@@ -117,17 +125,17 @@
             this.helpBubbleCallbackRouter_.removeListener(listenerId);
           }
           this.helpBubbleListenerIds_ = [];
-          assert(this.helpBubbleAnchorResizeObserver_);
-          this.helpBubbleAnchorResizeObserver_.disconnect();
-          this.helpBubbleAnchorResizeObserver_ = null;
+          assert(this.helpBubbleResizeObserver_);
+          this.helpBubbleResizeObserver_.disconnect();
+          this.helpBubbleResizeObserver_ = null;
           assert(this.helpBubbleFixedAnchorObserver_);
           this.helpBubbleFixedAnchorObserver_.disconnect();
           this.helpBubbleFixedAnchorObserver_ = null;
           this.helpBubbleControllerById_.clear();
-          if (this.helpBubbleScrollCallbackDebounced_) {
+          if (this.debouncedAnchorMayHaveChangedCallback_) {
             document.removeEventListener(
-                'scroll', this.helpBubbleScrollCallbackDebounced_);
-            this.helpBubbleScrollCallbackDebounced_ = null;
+                'scroll', this.debouncedAnchorMayHaveChangedCallback_);
+            this.debouncedAnchorMayHaveChangedCallback_ = null;
           }
         }
 
@@ -203,7 +211,7 @@
           // This can be called before or after `connectedCallback()`, so if the
           // component isn't connected and the observer set up yet, delay
           // observation until it is.
-          if (this.helpBubbleAnchorResizeObserver_) {
+          if (this.helpBubbleResizeObserver_) {
             this.observeControllerAnchor_(controller);
           }
           return controller;
@@ -231,8 +239,8 @@
             assert(this.helpBubbleFixedAnchorObserver_);
             this.helpBubbleFixedAnchorObserver_.observe(anchor);
           } else {
-            assert(this.helpBubbleAnchorResizeObserver_);
-            this.helpBubbleAnchorResizeObserver_.observe(anchor);
+            assert(this.helpBubbleResizeObserver_);
+            this.helpBubbleResizeObserver_.observe(anchor);
           }
         }
 
@@ -243,8 +251,8 @@
             assert(this.helpBubbleFixedAnchorObserver_);
             this.helpBubbleFixedAnchorObserver_.unobserve(anchor);
           } else {
-            assert(this.helpBubbleAnchorResizeObserver_);
-            this.helpBubbleAnchorResizeObserver_.unobserve(anchor);
+            assert(this.helpBubbleResizeObserver_);
+            this.helpBubbleResizeObserver_.unobserve(anchor);
           }
         }
 
@@ -406,9 +414,6 @@
           const nativeId = target.dataset['nativeId'];
           assert(nativeId);
           const ctrl = this.helpBubbleControllerById_.get(nativeId);
-          if (ctrl) {
-            ctrl.cacheAnchorVisibility(isVisible);
-          }
           const hidden = this.hideHelpBubble(nativeId);
           if (hidden) {
             this.helpBubbleHandler_.helpBubbleClosed(
@@ -416,20 +421,24 @@
           }
           const bounds =
               isVisible ? this.getElementBounds_(target) : new RectF();
-          this.helpBubbleHandler_.helpBubbleAnchorVisibilityChanged(
-              nativeId, isVisible, bounds);
+          if (!ctrl || ctrl.updateAnchorVisibility(isVisible, bounds)) {
+            this.helpBubbleHandler_.helpBubbleAnchorVisibilityChanged(
+                nativeId, isVisible, bounds);
+          }
         }
 
         /**
-         * When the document scrolls, we need to update cached positions
-         * of bubble anchors
+         * When the document scrolls or resizes, we need to update cached
+         * positions of bubble anchors.
          */
-        private helpBubbleScrollCallback_() {
+        private onAnchorBoundsMayHaveChanged_() {
           for (const ctrl of this.controllers) {
             if (ctrl.hasAnchor() && ctrl.getAnchorVisibility()) {
-              this.helpBubbleHandler_.helpBubbleAnchorVisibilityChanged(
-                  ctrl.getNativeId(), ctrl.getAnchorVisibility(),
-                  this.getElementBounds_(ctrl.getAnchor()!));
+              const bounds = this.getElementBounds_(ctrl.getAnchor()!);
+              if (ctrl.updateAnchorVisibility(true, bounds)) {
+                this.helpBubbleHandler_.helpBubbleAnchorVisibilityChanged(
+                    ctrl.getNativeId(), true, bounds);
+              }
             }
           }
         }
diff --git a/ui/webui/resources/cr_elements/chromeos/cros_color_overrides.css b/ui/webui/resources/cr_elements/chromeos/cros_color_overrides.css
index 06f561a..6fa6ef5 100644
--- a/ui/webui/resources/cr_elements/chromeos/cros_color_overrides.css
+++ b/ui/webui/resources/cr_elements/chromeos/cros_color_overrides.css
@@ -250,6 +250,11 @@
   color: var(--cros-sys-on_primary);
 }
 
+/* Tabs */
+:host-context(body.jelly-enabled) cr-tabs {
+  --cr-tabs-selected-color: var(--cros-sys-primary);
+}
+
 /* Toggle */
 :host-context(body.jelly-enabled) cr-toggle {
   --cr-toggle-checked-bar-color: var(--cros-sys-primary_container);
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html
index 336424f..2c6fcc45 100644
--- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html
+++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html
@@ -55,7 +55,7 @@
       #slot {
         align-items: center;
         display: flex;
-        gap: 16px;
+        gap: var(--cr-toolbar-selection-overlay-slot-gap, 16px);
         margin-inline-start: 8px;
       }
     </style>
diff --git a/ui/webui/resources/css/BUILD.gn b/ui/webui/resources/css/BUILD.gn
index 24ba181..ed002687 100644
--- a/ui/webui/resources/css/BUILD.gn
+++ b/ui/webui/resources/css/BUILD.gn
@@ -24,7 +24,6 @@
   out_manifest = "$target_gen_dir/$preprocess_manifest"
   in_files = [
     "action_link.css",
-    "butter_bar.css",
     "chrome_shared.css",
     "list.css",
     "menu_button.css",
diff --git a/ui/webui/resources/css/butter_bar.css b/ui/webui/resources/css/butter_bar.css
deleted file mode 100644
index 86cf04a..0000000
--- a/ui/webui/resources/css/butter_bar.css
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright 2012 The Chromium Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-/* A butter bar is an non-modal notification, usually yellow, that appears at
- * the top of the screen. Generally, they should contain a single line of text,
- * and one or two links at the end of the text. Example:
- *   <div class="butter-bar">You deleted something. <a href="#">Undo</a></div>
- */
-
-.butter-bar {
-  background-color: rgb(249, 237, 190);
-  border: 1px solid rgb(240, 195, 109);
-  border-radius: 2px;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-  display: inline-block;
-  padding: 8px 10px;
-  text-align: center;
-}
-
-.butter-bar a {
-  margin-left: 0.45em;
-  text-decoration: underline;
-}
diff --git a/weblayer/BUILD.gn b/weblayer/BUILD.gn
index 639fbaae..280e119a 100644
--- a/weblayer/BUILD.gn
+++ b/weblayer/BUILD.gn
@@ -9,6 +9,7 @@
 import("//build/config/ui.gni")
 import("//build/config/win/console_app.gni")
 import("//build/config/win/manifest.gni")
+import("//components/services/screen_ai/buildflags/features.gni")
 import("//components/spellcheck/spellcheck_build_features.gni")
 import("//device/vr/buildflags/buildflags.gni")
 import("//gpu/vulkan/features.gni")
@@ -51,6 +52,7 @@
       "enable_arcore=$enable_arcore",
       "enable_pdf=$enable_pdf",
       "enable_print_preview=$enable_print_preview",
+      "enable_screen_ai_service=$enable_screen_ai_service",
       "enable_vr=$enable_vr",
     ]