Merge mozilla-central to inbound. CLOSED TREE
authorNarcis Beleuzu <nbeleuzu@mozilla.com>
Thu, 04 Oct 2018 19:02:02 +0300
changeset 495433 e36372b6a29c2858941bab69aa5d65b05cab225f
parent 495432 6de689423ff668027dd71205bfa21f3dfa3fb05c (current diff)
parent 495358 f66e525e6978c2fbc7351501936711876261b546 (diff)
child 495434 4bcce93eae6401679746dda3cd7c192aba62f4f5
push id9984
push userffxbld-merge
push dateMon, 15 Oct 2018 21:07:35 +0000
treeherdermozilla-beta@183d27ea8570 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone64.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to inbound. CLOSED TREE
devtools/client/aboutdebugging-new/src/modules/debug-target-support.js
devtools/client/themes/images/aboutdebugging-firefox-aurora.svg
devtools/client/themes/images/aboutdebugging-firefox-beta.svg
devtools/client/themes/images/aboutdebugging-firefox-nightly.svg
devtools/client/themes/images/aboutdebugging-firefox-release.svg
devtools/server/actor-registry.js
dom/locales/en-US/chrome/dom/dom.properties
--- a/accessible/html/HTMLTableAccessible.cpp
+++ b/accessible/html/HTMLTableAccessible.cpp
@@ -618,18 +618,17 @@ HTMLTableAccessible::CellAt(uint32_t aRo
 
   nsIContent* cellContent = tableFrame->GetCellAt(aRowIdx, aColIdx);
   Accessible* cell = mDoc->GetAccessible(cellContent);
 
   // Sometimes, the accessible returned here is a row accessible instead of
   // a cell accessible, for example when a cell has CSS display:block; set.
   // In such cases, iterate through the cells in this row differently to find it.
   if (cell && cell->IsTableRow()) {
-    Accessible* row = RowAt(aRowIdx);
-    return CellInRowAt(row, aColIdx);
+    return CellInRowAt(cell, aColIdx);
   }
 
   // XXX bug 576838: crazy tables (like table6 in tables/test_table2.html) may
   // return itself as a cell what makes Orca hang.
   return cell == this ? nullptr : cell;
 }
 
 int32_t
new file mode 100644
--- /dev/null
+++ b/accessible/tests/crashtests/1494707.html
@@ -0,0 +1,15 @@
+<html>
+  <head>
+    <style>
+      *::after {
+        content: counters(bar, '', none);
+      }
+    </style>    
+  </head>
+  <body>
+    <table>
+      <thead></thead>
+      <th></th>
+    </table>
+  </body>
+</html>
--- a/accessible/tests/crashtests/crashtests.list
+++ b/accessible/tests/crashtests/crashtests.list
@@ -3,12 +3,13 @@ load 471493.xul
 asserts-if(!browserIsRemote,2) load 884202.html
 load 890760.html
 load 893515.html
 load 1072792.xhtml
 load 1380199.html
 load 1402999.html
 load 1463962.html
 load 1484778.html
+load 1494707.html
 
 # last_test_to_unload_testsuite.xul MUST be the last test in the list because it
 # is responsible for shutting down accessibility service affecting later tests.
 load last_test_to_unload_testsuite.xul
--- a/browser/base/content/test/static/browser_all_files_referenced.js
+++ b/browser/base/content/test/static/browser_all_files_referenced.js
@@ -163,25 +163,16 @@ var whitelist = [
   {file: "resource://gre/modules/Promise.jsm"},
   // Still used by WebIDE, which is going away but not entirely gone.
   {file: "resource://gre/modules/ZipUtils.jsm"},
   // Bug 1463225 (on Mac this is only used by a test)
   {file: "chrome://global/content/bindings/toolbar.xml",
    platforms: ["macosx"]},
   // Bug 1483277 (temporarily unreferenced)
   {file: "chrome://browser/content/browser.xhtml"},
-  // Bug 1494170 (the url below is dynamically generated by JS when we use)
-  {file: "chrome://devtools/skin/images/aboutdebugging-firefox-aurora.svg",
-   isFromDevTools: true},
-  // Bug 1494170 (the url below is dynamically generated by JS when we use)
-  {file: "chrome://devtools/skin/images/aboutdebugging-firefox-beta.svg",
-   isFromDevTools: true},
-  // Bug 1494170 (the url below is dynamically generated by JS when we use)
-  {file: "chrome://devtools/skin/images/aboutdebugging-firefox-release.svg",
-   isFromDevTools: true},
 ];
 
 whitelist = new Set(whitelist.filter(item =>
   ("isFromDevTools" in item) == isDevtools &&
   (!item.skipUnofficial || !AppConstants.MOZILLA_OFFICIAL) &&
   (!item.platforms || item.platforms.includes(AppConstants.platform))
 ).map(item => item.file));
 
--- a/browser/components/extensions/parent/ext-browser.js
+++ b/browser/components/extensions/parent/ext-browser.js
@@ -184,16 +184,22 @@ global.TabContext = class extends EventE
     if (event.type == "TabSelect") {
       let nativeTab = event.target;
       this.emit("tab-select", nativeTab);
       this.emit("location-change", nativeTab);
     }
   }
 
   onLocationChange(browser, webProgress, request, locationURI, flags) {
+    if (!webProgress.isTopLevel) {
+      // Only pageAction and browserAction are consuming the "location-change" event
+      // to update their per-tab status, and they should only do so in response of
+      // location changes related to the top level frame (See Bug 1493470 for a rationale).
+      return;
+    }
     let gBrowser = browser.ownerGlobal.gBrowser;
     let tab = gBrowser.getTabForBrowser(browser);
     // fromBrowse will be false in case of e.g. a hash change or history.pushState
     let fromBrowse = !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT);
     this.emit("location-change", tab, fromBrowse);
   }
 
   /**
--- a/browser/components/extensions/test/browser/browser_ext_pageAction_simple.js
+++ b/browser/components/extensions/test/browser/browser_ext_pageAction_simple.js
@@ -1,14 +1,16 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
 ChromeUtils.import("resource:///modules/PageActions.jsm");
 
+const BASE = "http://example.com/browser/browser/components/extensions/test/browser/";
+
 add_task(async function test_pageAction_basic() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "page_action": {
         "default_popup": "popup.html",
         "unrecognized_property": "with-a-random-value",
       },
     },
@@ -101,8 +103,88 @@ add_task(async function test_pageAction_
 
   // There are plenty of tests for the main action button, we just verify
   // that we've properly set the pinned value to false.
   let action = PageActions.actionForID(makeWidgetId(extension.id));
   ok(action && !action.pinnedToUrlbar, "pageAction is in main pageaction menu");
 
   await extension.unload();
 });
+
+add_task(async function test_pageAction_icon_on_subframe_navigation() {
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "page_action": {
+        "default_popup": "popup.html",
+      },
+    },
+
+    files: {
+      "popup.html": `
+      <!DOCTYPE html>
+      <html><body>
+      </body></html>
+      `,
+    },
+
+    background: function() {
+      browser.tabs.query({active: true, currentWindow: true}, tabs => {
+        let tabId = tabs[0].id;
+
+        browser.pageAction.show(tabId).then(() => {
+          browser.test.sendMessage("page-action-shown");
+        });
+      });
+    },
+  });
+
+  await navigateTab(gBrowser.selectedTab, "data:text/html,<h1>Top Level Frame</h1>");
+
+  await extension.startup();
+  await extension.awaitMessage("page-action-shown");
+
+  const pageActionId = BrowserPageActions.urlbarButtonNodeIDForActionID(makeWidgetId(extension.id));
+
+  await BrowserTestUtils.waitForCondition(() => {
+    return document.getElementById(pageActionId);
+  }, "pageAction is initially visible");
+
+  info("Create a sub-frame");
+
+  let subframeURL = `${BASE}#subframe-url-1`;
+  await ContentTask.spawn(gBrowser.selectedBrowser, subframeURL, async (url) => {
+    const iframe = this.content.document.createElement("iframe");
+    iframe.setAttribute("id", "test-subframe");
+    iframe.setAttribute("src", url);
+    iframe.setAttribute("style", "height: 200px; width: 200px");
+
+    // Await the initial url to be loaded in the subframe.
+    await new Promise(resolve => {
+      iframe.onload = resolve;
+      this.content.document.body.appendChild(iframe);
+    });
+  });
+
+  await BrowserTestUtils.waitForCondition(() => {
+    return document.getElementById(pageActionId);
+  }, "pageAction should be visible when a subframe is created");
+
+  info("Navigating the sub-frame");
+
+  subframeURL = `${BASE}/file_dummy.html#subframe-url-2`;
+  await ContentTask.spawn(gBrowser.selectedBrowser, subframeURL, async (url) => {
+    const iframe = this.content.document.querySelector("iframe#test-subframe");
+
+    // Await the subframe navigation.
+    await new Promise(resolve => {
+      iframe.onload = resolve;
+      iframe.setAttribute("src", url);
+    });
+  });
+
+  info("Subframe location changed");
+
+  await BrowserTestUtils.waitForCondition(() => {
+    return document.getElementById(pageActionId);
+  }, "pageAction should be visible after a subframe navigation");
+
+  await extension.unload();
+});
--- a/devtools/client/aboutdebugging-new/src/actions/debug-targets.js
+++ b/devtools/client/aboutdebugging-new/src/actions/debug-targets.js
@@ -5,17 +5,16 @@
 "use strict";
 
 const { AddonManager } = require("resource://gre/modules/AddonManager.jsm");
 const { gDevToolsBrowser } = require("devtools/client/framework/devtools-browser");
 
 const {
   debugLocalAddon,
   debugRemoteAddon,
-  getAddonForm,
   openTemporaryExtension,
   uninstallAddon,
 } = require("../modules/extensions-helper");
 
 const {
   getCurrentClient,
   getCurrentRuntime
 } = require("../modules/runtimes-state-helper");
@@ -49,18 +48,17 @@ function inspectDebugTarget(type, id) {
                       `&host=${host}&port=${port}`);
         } else if (runtimeType === RUNTIMES.THIS_FIREFOX) {
           window.open(`about:devtools-toolbox?type=tab&id=${id}`);
         }
         break;
       }
       case DEBUG_TARGETS.EXTENSION: {
         if (runtimeType === RUNTIMES.NETWORK) {
-          const addonForm = await getAddonForm(id, client);
-          debugRemoteAddon(addonForm, client);
+          await debugRemoteAddon(id, client);
         } else if (runtimeType === RUNTIMES.THIS_FIREFOX) {
           debugLocalAddon(id);
         }
         break;
       }
       case DEBUG_TARGETS.WORKER: {
         // Open worker toolbox in new window.
         gDevToolsBrowser.openWorkerToolbox(client, id);
--- a/devtools/client/aboutdebugging-new/src/actions/runtimes.js
+++ b/devtools/client/aboutdebugging-new/src/actions/runtimes.js
@@ -8,23 +8,21 @@ const { ADB } = require("devtools/shared
 const { DebuggerClient } = require("devtools/shared/client/debugger-client");
 const { DebuggerServer } = require("devtools/server/main");
 
 const Actions = require("./index");
 
 const {
   findRuntimeById,
 } = require("../modules/runtimes-state-helper");
-const { isSupportedDebugTarget } = require("../modules/debug-target-support");
 
 const {
   CONNECT_RUNTIME_FAILURE,
   CONNECT_RUNTIME_START,
   CONNECT_RUNTIME_SUCCESS,
-  DEBUG_TARGETS,
   DISCONNECT_RUNTIME_FAILURE,
   DISCONNECT_RUNTIME_START,
   DISCONNECT_RUNTIME_SUCCESS,
   RUNTIMES,
   UNWATCH_RUNTIME_FAILURE,
   UNWATCH_RUNTIME_START,
   UNWATCH_RUNTIME_SUCCESS,
   USB_RUNTIMES_UPDATED,
@@ -63,48 +61,28 @@ async function createClientForRuntime(ru
     return createNetworkClient(host, port);
   } else if (type === RUNTIMES.USB) {
     return createUSBClient(runtime.socketPath);
   }
 
   return null;
 }
 
-async function getRuntimeInfo(runtime, client) {
-  const { model, type } = runtime;
-  const deviceFront = await client.mainRoot.getFront("device");
-  const { brandName: name, channel, version } = await deviceFront.getDescription();
-  const icon =
-    (channel === "release" || channel === "beta" || channel === "aurora")
-      ? `chrome://devtools/skin/images/aboutdebugging-firefox-${ channel }.svg`
-      : "chrome://devtools/skin/images/aboutdebugging-firefox-nightly.svg";
-
-  return {
-    icon,
-    model,
-    name,
-    type,
-    version,
-  };
-}
-
 function connectRuntime(id) {
   return async (dispatch, getState) => {
     dispatch({ type: CONNECT_RUNTIME_START });
     try {
       const runtime = findRuntimeById(id, getState().runtimes);
       const client = await createClientForRuntime(runtime);
-      const info = await getRuntimeInfo(runtime, client);
 
       dispatch({
         type: CONNECT_RUNTIME_SUCCESS,
         runtime: {
           id,
           client,
-          info,
           type: runtime.type,
         }
       });
     } catch (e) {
       dispatch({ type: CONNECT_RUNTIME_FAILURE, error: e.message });
     }
   };
 }
@@ -141,27 +119,19 @@ function watchRuntime(id) {
         // THIS_FIREFOX connects and disconnects on the fly when opening the page.
         await dispatch(connectRuntime(RUNTIMES.THIS_FIREFOX));
       }
 
       // The selected runtime should already have a connected client assigned.
       const runtime = findRuntimeById(id, getState().runtimes);
       await dispatch({ type: WATCH_RUNTIME_SUCCESS, runtime });
 
-      if (isSupportedDebugTarget(runtime.type, DEBUG_TARGETS.EXTENSION)) {
-        dispatch(Actions.requestExtensions());
-      }
-
-      if (isSupportedDebugTarget(runtime.type, DEBUG_TARGETS.TAB)) {
-        dispatch(Actions.requestTabs());
-      }
-
-      if (isSupportedDebugTarget(runtime.type, DEBUG_TARGETS.WORKER)) {
-        dispatch(Actions.requestWorkers());
-      }
+      dispatch(Actions.requestExtensions());
+      dispatch(Actions.requestTabs());
+      dispatch(Actions.requestWorkers());
     } catch (e) {
       dispatch({ type: WATCH_RUNTIME_FAILURE, error: e.message });
     }
   };
 }
 
 function unwatchRuntime(id) {
   return async (dispatch, getState) => {
--- a/devtools/client/aboutdebugging-new/src/components/RuntimeInfo.js
+++ b/devtools/client/aboutdebugging-new/src/components/RuntimeInfo.js
@@ -1,54 +1,41 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-const { createFactory, PureComponent } = require("devtools/client/shared/vendor/react");
+const { PureComponent } = require("devtools/client/shared/vendor/react");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 
-const FluentReact = require("devtools/client/shared/vendor/fluent-react");
-const Localized = createFactory(FluentReact.Localized);
-
 /**
  * This component displays runtime information.
  */
 class RuntimeInfo extends PureComponent {
   static get propTypes() {
     return {
       icon: PropTypes.string.isRequired,
-      model: PropTypes.string,
       name: PropTypes.string.isRequired,
       version: PropTypes.string.isRequired,
     };
   }
 
   render() {
-    const { icon, model, name, version } = this.props;
+    const { icon, name, version } = this.props;
 
     return dom.h1(
       {
         className: "runtime-info",
       },
       dom.img(
         {
           className: "runtime-info__icon",
           src: icon,
         }
       ),
-      Localized(
-        {
-          id: model ? "about-debugging-runtime-info-with-model"
-                    : "about-debugging-runtime-info",
-          $name: name,
-          $model: model,
-          $version: version,
-        },
-        dom.label({}, `${ name } on ${ model } (${ version })`)
-      )
+      `${ name } (${ version })`
     );
   }
 }
 
 module.exports = RuntimeInfo;
--- a/devtools/client/aboutdebugging-new/src/components/RuntimePage.js
+++ b/devtools/client/aboutdebugging-new/src/components/RuntimePage.js
@@ -18,132 +18,154 @@ const InspectAction = createFactory(requ
 const RuntimeInfo = createFactory(require("./RuntimeInfo"));
 const ServiceWorkerAction = createFactory(require("./debugtarget/ServiceWorkerAction"));
 const TabDetail = createFactory(require("./debugtarget/TabDetail"));
 const TemporaryExtensionAction = createFactory(require("./debugtarget/TemporaryExtensionAction"));
 const TemporaryExtensionInstaller =
   createFactory(require("./debugtarget/TemporaryExtensionInstaller"));
 const WorkerDetail = createFactory(require("./debugtarget/WorkerDetail"));
 
+const Services = require("Services");
 const { DEBUG_TARGET_PANE } = require("../constants");
-const { getCurrentRuntimeInfo } = require("../modules/runtimes-state-helper");
-const { isSupportedDebugTargetPane } = require("../modules/debug-target-support");
 
 class RuntimePage extends PureComponent {
   static get propTypes() {
     return {
       collapsibilities: PropTypes.object.isRequired,
       dispatch: PropTypes.func.isRequired,
       installedExtensions: PropTypes.arrayOf(PropTypes.object).isRequired,
       otherWorkers: PropTypes.arrayOf(PropTypes.object).isRequired,
-      runtimeInfo: PropTypes.object,
       serviceWorkers: PropTypes.arrayOf(PropTypes.object).isRequired,
       sharedWorkers: PropTypes.arrayOf(PropTypes.object).isRequired,
       tabs: PropTypes.arrayOf(PropTypes.object).isRequired,
       temporaryExtensions: PropTypes.arrayOf(PropTypes.object).isRequired,
     };
   }
 
-  renderDebugTargetPane(name, targets, actionComponent,
-                        detailComponent, paneKey, localizationId) {
-    const { collapsibilities, dispatch, runtimeInfo } = this.props;
-
-    if (!isSupportedDebugTargetPane(runtimeInfo.type, paneKey)) {
-      return null;
-    }
-
-    return Localized(
-      {
-        id: localizationId,
-        attrs: { name: true }
-      },
-      DebugTargetPane({
-        actionComponent,
-        collapsibilityKey: paneKey,
-        detailComponent,
-        dispatch,
-        isCollapsed: collapsibilities.get(paneKey),
-        name,
-        targets,
-      })
-    );
-  }
-
   render() {
     const {
+      collapsibilities,
       dispatch,
       installedExtensions,
       otherWorkers,
-      runtimeInfo,
       serviceWorkers,
       sharedWorkers,
       tabs,
       temporaryExtensions,
     } = this.props;
 
-    if (!runtimeInfo) {
-      // runtimeInfo can be null when the selectPage action navigates from a runtime A
-      // to a runtime B (between unwatchRuntime and watchRuntime).
-      return null;
-    }
-
     return dom.article(
       {
         className: "page js-runtime-page",
       },
-      RuntimeInfo(runtimeInfo),
-      isSupportedDebugTargetPane(runtimeInfo.type, DEBUG_TARGET_PANE.TEMPORARY_EXTENSION)
-        ? TemporaryExtensionInstaller({ dispatch })
-        : null,
-      this.renderDebugTargetPane("Temporary Extensions",
-                                 temporaryExtensions,
-                                 TemporaryExtensionAction,
-                                 ExtensionDetail,
-                                 DEBUG_TARGET_PANE.TEMPORARY_EXTENSION,
-                                 "about-debugging-runtime-temporary-extensions"),
-      this.renderDebugTargetPane("Extensions",
-                                 installedExtensions,
-                                 InspectAction,
-                                 ExtensionDetail,
-                                 DEBUG_TARGET_PANE.INSTALLED_EXTENSION,
-                                 "about-debugging-runtime-extensions"),
-      this.renderDebugTargetPane("Tabs",
-                                 tabs,
-                                 InspectAction,
-                                 TabDetail,
-                                 DEBUG_TARGET_PANE.TAB,
-                                 "about-debugging-runtime-tabs"),
-      this.renderDebugTargetPane("Service Workers",
-                                 serviceWorkers,
-                                 ServiceWorkerAction,
-                                 WorkerDetail,
-                                 DEBUG_TARGET_PANE.SERVICE_WORKER,
-                                 "about-debugging-runtime-service-workers"),
-      this.renderDebugTargetPane("Shared Workers",
-                                 sharedWorkers,
-                                 InspectAction,
-                                 WorkerDetail,
-                                 DEBUG_TARGET_PANE.SHARED_WORKER,
-                                 "about-debugging-runtime-shared-workers"),
-      this.renderDebugTargetPane("Other Workers",
-                                 otherWorkers,
-                                 InspectAction,
-                                 WorkerDetail,
-                                 DEBUG_TARGET_PANE.OTHER_WORKER,
-                                 "about-debugging-runtime-other-workers"),
+      RuntimeInfo({
+        icon: "chrome://branding/content/icon64.png",
+        name: Services.appinfo.name,
+        version: Services.appinfo.version,
+      }),
+      TemporaryExtensionInstaller({ dispatch }),
+      Localized(
+        {
+          id: "about-debugging-runtime-temporary-extensions",
+          attrs: { name: true }
+        },
+        DebugTargetPane({
+          actionComponent: TemporaryExtensionAction,
+          collapsibilityKey: DEBUG_TARGET_PANE.TEMPORARY_EXTENSION,
+          detailComponent: ExtensionDetail,
+          dispatch,
+          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.TEMPORARY_EXTENSION),
+          name: "Temporary Extensions",
+          targets: temporaryExtensions,
+        })
+      ),
+      Localized(
+        {
+          id: "about-debugging-runtime-extensions",
+          attrs: { name: true }
+        },
+        DebugTargetPane({
+          actionComponent: InspectAction,
+          collapsibilityKey: DEBUG_TARGET_PANE.INSTALLED_EXTENSION,
+          detailComponent: ExtensionDetail,
+          dispatch,
+          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.INSTALLED_EXTENSION),
+          name: "Extensions",
+          targets: installedExtensions,
+        })
+      ),
+      Localized(
+        {
+          id: "about-debugging-runtime-tabs",
+          attrs: { name: true }
+        },
+        DebugTargetPane({
+          actionComponent: InspectAction,
+          collapsibilityKey: DEBUG_TARGET_PANE.TAB,
+          detailComponent: TabDetail,
+          dispatch,
+          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.TAB),
+          name: "Tabs",
+          targets: tabs
+        })
+      ),
+      Localized(
+        {
+          id: "about-debugging-runtime-service-workers",
+          attrs: { name: true }
+        },
+        DebugTargetPane({
+          actionComponent: ServiceWorkerAction,
+          collapsibilityKey: DEBUG_TARGET_PANE.SERVICE_WORKER,
+          detailComponent: WorkerDetail,
+          dispatch,
+          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.SERVICE_WORKER),
+          name: "Service Workers",
+          targets: serviceWorkers
+        })
+      ),
+      Localized(
+        {
+          id: "about-debugging-runtime-shared-workers",
+          attrs: { name: true }
+        },
+        DebugTargetPane({
+          actionComponent: InspectAction,
+          collapsibilityKey: DEBUG_TARGET_PANE.SHARED_WORKER,
+          detailComponent: WorkerDetail,
+          dispatch,
+          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.SHARED_WORKER),
+          name: "Shared Workers",
+          targets: sharedWorkers
+        })
+      ),
+      Localized(
+        {
+          id: "about-debugging-runtime-other-workers",
+          attrs: { name: true }
+        },
+        DebugTargetPane({
+          actionComponent: InspectAction,
+          collapsibilityKey: DEBUG_TARGET_PANE.OTHER_WORKER,
+          detailComponent: WorkerDetail,
+          dispatch,
+          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.OTHER_WORKER),
+          name: "Other Workers",
+          targets: otherWorkers
+        })
+      ),
     );
   }
 }
 
 const mapStateToProps = state => {
   return {
     collapsibilities: state.ui.debugTargetCollapsibilities,
     installedExtensions: state.debugTargets.installedExtensions,
     otherWorkers: state.debugTargets.otherWorkers,
-    runtimeInfo: getCurrentRuntimeInfo(state.runtimes),
     serviceWorkers: state.debugTargets.serviceWorkers,
     sharedWorkers: state.debugTargets.sharedWorkers,
     tabs: state.debugTargets.tabs,
     temporaryExtensions: state.debugTargets.temporaryExtensions,
   };
 };
 
 module.exports = connect(mapStateToProps)(RuntimePage);
deleted file mode 100644
--- a/devtools/client/aboutdebugging-new/src/modules/debug-target-support.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const { DEBUG_TARGETS, DEBUG_TARGET_PANE, RUNTIMES } = require("../constants");
-
-function isSupportedDebugTarget(runtimeType, debugTargetType) {
-  if (runtimeType === RUNTIMES.THIS_FIREFOX) {
-    return true;
-  }
-
-  return debugTargetType === DEBUG_TARGETS.TAB;
-}
-exports.isSupportedDebugTarget = isSupportedDebugTarget;
-
-function isSupportedDebugTargetPane(runtimeType, debugTargetPaneKey) {
-  if (runtimeType === RUNTIMES.THIS_FIREFOX) {
-    return true;
-  }
-
-  return debugTargetPaneKey === DEBUG_TARGET_PANE.TAB;
-}
-exports.isSupportedDebugTargetPane = isSupportedDebugTargetPane;
--- a/devtools/client/aboutdebugging-new/src/modules/extensions-helper.js
+++ b/devtools/client/aboutdebugging-new/src/modules/extensions-helper.js
@@ -42,22 +42,25 @@ exports.debugLocalAddon = async function
       browserToolboxProcess = null;
     }
   });
 };
 
 /**
  * Start debugging an addon in a remote instance of Firefox.
  *
- * @param {Object} addonForm
- *        Necessary to create an addon debugging target.
+ * @param {String} id
+ *        The addon id to debug.
  * @param {DebuggerClient} client
  *        Required for remote debugging.
  */
-exports.debugRemoteAddon = async function(addonForm, client) {
+exports.debugRemoteAddon = async function(id, client) {
+  const { addons } = await client.listAddons();
+  const addonForm = addons.find(addon => addon.id === id);
+
   // Close previous addon debugging toolbox.
   closeToolbox();
 
   const options = {
     form: addonForm,
     chrome: true,
     client,
   };
@@ -66,21 +69,16 @@ exports.debugRemoteAddon = async functio
 
   const hostType = Toolbox.HostType.WINDOW;
   remoteAddonToolbox = await gDevTools.showToolbox(target, null, hostType);
   remoteAddonToolbox.once("destroy", () => {
     remoteAddonToolbox = null;
   });
 };
 
-exports.getAddonForm = async function(addonID, client) {
-  const { addons } = await client.listAddons();
-  return addons.find(addon => addon.id === addonID);
-};
-
 /**
  * Uninstall the addon with the provided id.
  * Resolves when the addon shutdown has completed.
  */
 exports.uninstallAddon = async function(addonID) {
   const addon = await AddonManager.getAddonByID(addonID);
   return addon && addon.uninstall();
 };
--- a/devtools/client/aboutdebugging-new/src/modules/moz.build
+++ b/devtools/client/aboutdebugging-new/src/modules/moz.build
@@ -1,12 +1,11 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DevToolsModules(
     'debug-target-collapsibilities.js',
-    'debug-target-support.js',
     'extensions-helper.js',
     'network-locations.js',
     'runtimes-state-helper.js',
     'usb-runtimes.js',
 )
--- a/devtools/client/aboutdebugging-new/src/modules/runtimes-state-helper.js
+++ b/devtools/client/aboutdebugging-new/src/modules/runtimes-state-helper.js
@@ -10,22 +10,16 @@ function getCurrentRuntime(runtimesState
 }
 exports.getCurrentRuntime = getCurrentRuntime;
 
 function getCurrentClient(runtimesState) {
   return getCurrentRuntime(runtimesState).client;
 }
 exports.getCurrentClient = getCurrentClient;
 
-function getCurrentRuntimeInfo(runtimesState) {
-  const runtime = getCurrentRuntime(runtimesState);
-  return runtime ? runtime.info : null;
-}
-exports.getCurrentRuntimeInfo = getCurrentRuntimeInfo;
-
 function findRuntimeById(id, runtimesState) {
   const allRuntimes = [
     ...runtimesState.networkRuntimes,
     ...runtimesState.thisFirefoxRuntimes,
     ...runtimesState.usbRuntimes,
   ];
   return allRuntimes.find(r => r.id === id);
 }
--- a/devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
+++ b/devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
@@ -20,64 +20,66 @@ const {
 
 // Map between known runtime types and nodes in the runtimes state.
 const TYPE_TO_RUNTIMES_KEY = {
   [RUNTIMES.THIS_FIREFOX]: "thisFirefoxRuntimes",
   [RUNTIMES.NETWORK]: "networkRuntimes",
   [RUNTIMES.USB]: "usbRuntimes",
 };
 
-function RuntimesState(networkRuntimes = []) {
+function RuntimesState() {
   return {
-    networkRuntimes,
+    networkRuntimes: [],
     selectedRuntimeId: null,
     thisFirefoxRuntimes: [{
       id: RUNTIMES.THIS_FIREFOX,
       type: RUNTIMES.THIS_FIREFOX,
     }],
     usbRuntimes: [],
   };
 }
 
+/**
+ * Update the runtime matching the provided runtimeId with the content of updatedRuntime,
+ * and return the new state.
+ *
+ * @param  {String} runtimeId
+ *         The id of the runtime to update
+ * @param  {Object} updatedRuntime
+ *         Object used to update the runtime matching the idea using Object.assign.
+ * @param  {Object} state
+ *         Current runtimes state.
+ * @return {Object} The updated state
+ */
+function _updateRuntimeById(runtimeId, updatedRuntime, state) {
+  // Find the array of runtimes that contains the updated runtime.
+  const runtime = findRuntimeById(runtimeId, state);
+  const key = TYPE_TO_RUNTIMES_KEY[runtime.type];
+  const runtimesToUpdate = state[key];
+
+  // Update the runtime with the provided updatedRuntime.
+  const updatedRuntimes = runtimesToUpdate.map(r => {
+    if (r.id === runtimeId) {
+      return Object.assign({}, r, updatedRuntime);
+    }
+    return r;
+  });
+  return Object.assign({}, state, { [key]: updatedRuntimes });
+}
+
 function runtimesReducer(state = RuntimesState(), action) {
   switch (action.type) {
     case CONNECT_RUNTIME_SUCCESS: {
-      const { id, client, info } = action.runtime;
-
-      // Find the array of runtimes that contains the updated runtime.
-      const runtime = findRuntimeById(id, state);
-      const key = TYPE_TO_RUNTIMES_KEY[runtime.type];
-      const runtimesToUpdate = state[key];
-
-      // Add the new client to the runtime.
-      const updatedRuntimes = runtimesToUpdate.map(r => {
-        if (r.id === id) {
-          return Object.assign({}, r, { client, info });
-        }
-        return r;
-      });
-      return Object.assign({}, state, { [key]: updatedRuntimes });
+      const { id, client } = action.runtime;
+      return _updateRuntimeById(id, { client }, state);
     }
 
     case DISCONNECT_RUNTIME_SUCCESS: {
       const { id } = action.runtime;
-
-      // Find the array of runtimes that contains the updated runtime.
-      const runtime = findRuntimeById(id, state);
-      const key = TYPE_TO_RUNTIMES_KEY[runtime.type];
-      const runtimesToUpdate = state[key];
-
-      // Remove the client from the updated runtime.
-      const updatedRuntimes = runtimesToUpdate.map(r => {
-        if (r.id === id) {
-          return Object.assign({}, r, { client: null, info: null });
-        }
-        return r;
-      });
-      return Object.assign({}, state, { [key]: updatedRuntimes });
+      return _updateRuntimeById(id, { client: null }, state);
     }
 
     case NETWORK_LOCATIONS_UPDATED: {
       const { locations } = action;
       const networkRuntimes = locations.map(location => {
         return {
           id: location,
           name: location,
@@ -91,17 +93,16 @@ function runtimesReducer(state = Runtime
       return Object.assign({}, state, { selectedRuntimeId: null });
     }
 
     case USB_RUNTIMES_UPDATED: {
       const { runtimes } = action;
       const usbRuntimes = runtimes.map(runtime => {
         return {
           id: runtime.id,
-          model: runtime._model,
           name: runtime.name,
           socketPath: runtime._socketPath,
           type: RUNTIMES.USB,
         };
       });
       return Object.assign({}, state, { usbRuntimes });
     }
 
--- a/devtools/client/aboutdebugging-new/tmp-locale/en-US/aboutdebugging.notftl
+++ b/devtools/client/aboutdebugging-new/tmp-locale/en-US/aboutdebugging.notftl
@@ -162,19 +162,8 @@ about-debugging-worker-status-running = 
 
 # Displayed for service workers in runtime pages, for service workers in STOPPED state.
 about-debugging-worker-status-stopped = Stopped
 
 # Displayed for service workers in runtime pages, for service workers for which no
 # registration could be found yet. Only active registrations are visible from
 # about:debugging, so such service workers are considered as registering.
 about-debugging-worker-status-registering = Registering
-
-# Displayed for runtime info in runtime pages.
-# { $name } is brand name such as "Firefox Nightly"
-# { $version } is version such as "64.0a1"
-about-debugging-runtime-info = { $name } ({ $version })
-
-# Displayed for runtime info in runtime page when we display the model as well.
-# { $name } is brand name such as "Firefox Nightly"
-# { $version } is version such as "64.0a1"
-# { $model } is model name of device
-about-debugging-runtime-info-with-model = { $name } on { $model } ({ $version })
--- a/devtools/client/aboutdebugging/components/addons/Target.js
+++ b/devtools/client/aboutdebugging/components/addons/Target.js
@@ -175,17 +175,17 @@ class AddonTarget extends Component {
     this.uninstall = this.uninstall.bind(this);
     this.reload = this.reload.bind(this);
   }
 
   debug() {
     const { client, connect, target } = this.props;
 
     if (connect.type === "REMOTE") {
-      debugRemoteAddon(target.form, client);
+      debugRemoteAddon(target.addonID, client);
     } else if (connect.type === "LOCAL") {
       debugLocalAddon(target.addonID);
     }
   }
 
   uninstall() {
     const { target } = this.props;
     uninstallAddon(target.addonID);
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -109,21 +109,17 @@ devtools.jar:
     skin/images/arrowhead-left.svg (themes/images/arrowhead-left.svg)
     skin/images/arrowhead-down.svg (themes/images/arrowhead-down.svg)
     skin/images/arrowhead-up.svg (themes/images/arrowhead-up.svg)
     skin/images/breadcrumbs-divider.svg (themes/images/breadcrumbs-divider.svg)
     skin/images/filters.svg (themes/images/filters.svg)
     skin/images/filter-swatch.svg (themes/images/filter-swatch.svg)
     skin/images/aboutdebugging-collapse-icon.svg (themes/images/aboutdebugging-collapse-icon.svg)
     skin/images/aboutdebugging-connect-icon.svg (themes/images/aboutdebugging-connect-icon.svg)
-    skin/images/aboutdebugging-firefox-aurora.svg (themes/images/aboutdebugging-firefox-aurora.svg)
-    skin/images/aboutdebugging-firefox-beta.svg (themes/images/aboutdebugging-firefox-beta.svg)
     skin/images/aboutdebugging-firefox-logo.svg (themes/images/aboutdebugging-firefox-logo.svg)
-    skin/images/aboutdebugging-firefox-nightly.svg (themes/images/aboutdebugging-firefox-nightly.svg)
-    skin/images/aboutdebugging-firefox-release.svg (themes/images/aboutdebugging-firefox-release.svg)
     skin/images/aboutdebugging-globe-icon.svg (themes/images/aboutdebugging-globe-icon.svg)
     skin/images/fox-smiling.svg (themes/images/fox-smiling.svg)
     skin/images/grid.svg (themes/images/grid.svg)
     skin/images/angle-swatch.svg (themes/images/angle-swatch.svg)
     skin/images/pseudo-class.svg (themes/images/pseudo-class.svg)
     skin/images/controls.png (themes/images/controls.png)
     skin/images/controls@2x.png (themes/images/controls@2x.png)
     skin/images/copy.svg (themes/images/copy.svg)
--- a/devtools/client/shared/key-shortcuts.js
+++ b/devtools/client/shared/key-shortcuts.js
@@ -218,19 +218,26 @@ KeyShortcuts.prototype = {
     }
     if (shortcut.ctrl != event.ctrlKey) {
       return false;
     }
     if (shortcut.alt != event.altKey) {
       return false;
     }
     if (shortcut.shift != event.shiftKey) {
+      // Check the `keyCode` to see whether it's a character (see also Bug 1493646)
+      const char = String.fromCharCode(event.keyCode);
+      let isAlphabetical = (char.length == 1 && char.match(/[a-zA-Z]/));
+
       // Shift is a special modifier, it may implicitly be required if the expected key
       // is a special character accessible via shift.
-      const isAlphabetical = event.key && event.key.match(/[a-zA-Z]/);
+      if (!isAlphabetical) {
+        isAlphabetical = event.key && event.key.match(/[a-zA-Z]/);
+      }
+
       // OSX: distinguish cmd+[key] from cmd+shift+[key] shortcuts (Bug 1300458)
       const cmdShortcut = shortcut.meta && !shortcut.alt && !shortcut.ctrl;
       if (isAlphabetical || cmdShortcut) {
         return false;
       }
     }
 
     if (shortcut.keyCode) {
--- a/devtools/client/shared/test/browser_key_shortcuts.js
+++ b/devtools/client/shared/test/browser_key_shortcuts.js
@@ -19,16 +19,17 @@ add_task(async function() {
   await testExactModifiers(shortcuts);
   await testLooseShiftModifier(shortcuts);
   await testStrictLetterShiftModifier(shortcuts);
   await testAltModifier(shortcuts);
   await testCommandOrControlModifier(shortcuts);
   await testCtrlModifier(shortcuts);
   await testInvalidShortcutString(shortcuts);
   await testCmdShiftShortcut(shortcuts);
+  await testTabCharacterShortcut(shortcuts);
   shortcuts.destroy();
 
   await testTarget();
 });
 
 // Test helper to listen to the next key press for a given key,
 // returning a promise to help using Tasks.
 function once(shortcuts, key, listener) {
@@ -417,8 +418,45 @@ function testInvalidShortcutString(short
   info("Test wrong shortcut string");
 
   const shortcut = KeyShortcuts.parseElectronKey(window, "Cmmd+F");
   ok(!shortcut, "Passing a invalid shortcut string should return a null object");
 
   shortcuts.on("Cmmd+F", function() {});
   ok(true, "on() shouldn't throw when passing invalid shortcut string");
 }
+
+/**
+ * Shift+Alt+I generates ^ key (`event.key`) on OSX and KeyShortcuts module
+ * must ensure that this doesn't interfere with shortcuts CmdOrCtrl+Alt+Shift+I
+ * for opening the Browser Toolbox and CmdOrCtrl+Alt+I for toggling the Toolbox.
+ */
+async function testTabCharacterShortcut(shortcuts) {
+  if (!isOSX) {
+    return;
+  }
+
+  info("Test tab character shortcut");
+
+  once(shortcuts, "CmdOrCtrl+Alt+I", event => {
+    ok(false, "This handler must not be executed");
+  });
+
+  const onKey = once(shortcuts, "CmdOrCtrl+Alt+Shift+I", event => {
+    info("Test for CmdOrCtrl+Alt+Shift+I");
+    is(event.key, "^");
+    is(event.keyCode, 73);
+  });
+
+  // Simulate `CmdOrCtrl+Alt+Shift+I` shortcut. Note that EventUtils doesn't
+  // generate `^` like real keyboard, so we need to pass it explicitly
+  // and use proper keyCode for `I` character.
+  EventUtils.synthesizeKey("^", {
+    code: "KeyI",
+    key: "^",
+    keyCode: 73,
+    shiftKey: true,
+    altKey: true,
+    metaKey: true,
+  }, window);
+
+  await onKey;
+}
--- a/devtools/client/themes/common.css
+++ b/devtools/client/themes/common.css
@@ -815,30 +815,39 @@ checkbox:-moz-focusring {
   font-size: 16px;
   width: 2em;
   height: 1em;
   border-radius: 1em;
   /* Animate the thumb position between states of the checkbox. */
   transition: background-color .1s ease-out;
 }
 
+/* For right-to-left layout, the toggle thumb goes in the opposite direction. */
+html[dir="rtl"] .devtools-checkbox-toggle {
+  --x-pos: -.15em;
+}
+
 .devtools-checkbox-toggle:focus {
   box-shadow: 0 0 0 1px var(--blue-55);
 }
 
 .devtools-checkbox-toggle:checked:focus {
   background-color: var(--blue-40);
   box-shadow: none;
 }
 
 .devtools-checkbox-toggle:checked {
   --x-pos: 1.15em;
   background-color: var(--blue-55);
 }
 
+html[dir="rtl"] .devtools-checkbox-toggle:checked {
+  --x-pos: -1.15em;
+}
+
 .devtools-checkbox-toggle::before {
   position: relative;
   width: calc(1em - .3em);
   height: calc(1em - .3em);
   transform: translateY(.15em) translateX(var(--x-pos));
   border-radius: 100%;
   display: block;
   content: "";
deleted file mode 100644
--- a/devtools/client/themes/images/aboutdebugging-firefox-aurora.svg
+++ /dev/null
@@ -1,1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 955.45 986.16"><defs><linearGradient id="linear-gradient" x1="-14371.64" y1="9293.53" x2="-14108.4" y2="9293.53" gradientTransform="matrix(0.76, 0.03, 0.05, -1.12, 11228.23, 11186.79)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0083ff"/><stop offset="0.18" stop-color="#0096f6"/><stop offset="0.51" stop-color="#00b3e6"/><stop offset="0.79" stop-color="#00c6dd"/><stop offset="1" stop-color="#00ccda"/></linearGradient><linearGradient id="linear-gradient-2" x1="-541.3" y1="256.54" x2="-732.73" y2="882.77" gradientTransform="matrix(1, 0, 0, -1, 1081.94, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000f40" stop-opacity="0.6"/><stop offset="0.61" stop-color="#000f40" stop-opacity="0.18"/><stop offset="1" stop-color="#000f40" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-3" x1="540.64" y1="256.54" x2="349.2" y2="882.77" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000f43" stop-opacity="0.4"/><stop offset="0.48" stop-color="#001962" stop-opacity="0.17"/><stop offset="1" stop-color="#002079" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-4" x1="-8570.46" y1="7439.08" x2="-8685.71" y2="7447.98" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10478.03, 10900.02)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#002275"/><stop offset="1" stop-color="#005fe7"/></linearGradient><linearGradient id="linear-gradient-5" x1="-8653.32" y1="7586.86" x2="-8545.37" y2="7698.98" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10478.03, 10900.02)" gradientUnits="userSpaceOnUse"><stop offset="0.05" stop-color="#005fe7"/><stop offset="0.19" stop-color="#005ce1"/><stop offset="0.38" stop-color="#0052cf"/><stop offset="0.6" stop-color="#0043b2"/><stop offset="0.84" stop-color="#002d8a"/><stop offset="0.95" stop-color="#002275"/></linearGradient><linearGradient id="linear-gradient-6" x1="-8856.78" y1="7335.52" x2="-8625.9" y2="7334.98" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10478.03, 10900.02)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#002079"/><stop offset="0.99" stop-color="#000f40"/></linearGradient><radialGradient id="radial-gradient" cx="584.1" cy="600.57" fx="717.5140400954007" fy="478.32765335281425" r="751.57" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0.16" stop-color="#58c1ff"/><stop offset="0.24" stop-color="#4cb8ff"/><stop offset="0.39" stop-color="#2ea0ff"/><stop offset="0.54" stop-color="#0a84ff"/><stop offset="0.76" stop-color="#0060df"/><stop offset="0.8" stop-color="#0067de"/><stop offset="0.85" stop-color="#007bdd"/><stop offset="0.91" stop-color="#009cda"/><stop offset="0.98" stop-color="#00c8d7"/></radialGradient><linearGradient id="linear-gradient-7" x1="-7658.58" y1="9078.09" x2="-7729.61" y2="8279.7" gradientTransform="matrix(1.23, 0, 0, -1.22, 10201.91, 11050.28)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00feff"/><stop offset="0.3" stop-color="#04c9ff"/><stop offset="0.61" stop-color="#0897ff"/><stop offset="0.77" stop-color="#0a84ff"/><stop offset="0.79" stop-color="#0a84ff" stop-opacity="0.93"/><stop offset="0.84" stop-color="#0a84ff" stop-opacity="0.76"/><stop offset="0.9" stop-color="#0a84ff" stop-opacity="0.49"/><stop offset="0.98" stop-color="#0a84ff" stop-opacity="0.11"/><stop offset="1" stop-color="#0a84ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-8" x1="-9129.99" y1="7770.74" x2="-8993.52" y2="7770.74" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10478.03, 10900.02)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#003eaa"/><stop offset="0.3" stop-color="#0054c5" stop-opacity="0.68"/><stop offset="0.78" stop-color="#0076ef" stop-opacity="0.19"/><stop offset="1" stop-color="#0083ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-9" x1="553.42" y1="650.09" x2="358.4" y2="653.09" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00feff" stop-opacity="0.25"/><stop offset="0.54" stop-color="#2ddfff" stop-opacity="0.12"/><stop offset="1" stop-color="#58c1ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-10" x1="208.63" y1="2142.48" x2="90.81" y2="2394.32" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, -255.6, 2416.49)" gradientUnits="userSpaceOnUse"><stop offset="0.19" stop-color="#002275" stop-opacity="0.7"/><stop offset="0.63" stop-color="#009dc2" stop-opacity="0.36"/><stop offset="0.94" stop-color="#00feff" stop-opacity="0.1"/></linearGradient><linearGradient id="linear-gradient-11" x1="-43.75" y1="388.32" x2="50.36" y2="281.43" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 223.54, 856.07)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#002275" stop-opacity="0.8"/><stop offset="0.07" stop-color="#002479" stop-opacity="0.74"/><stop offset="0.95" stop-color="#003eaa" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-12" x1="136.86" y1="206.19" x2="136.9" y2="259.62" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 223.54, 856.07)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#002275" stop-opacity="0.6"/><stop offset="0.24" stop-color="#002275" stop-opacity="0.34"/><stop offset="0.49" stop-color="#002275" stop-opacity="0.15"/><stop offset="0.72" stop-color="#002275" stop-opacity="0.04"/><stop offset="0.93" stop-color="#002275" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-13" x1="569.33" y1="1064.11" x2="877.68" y2="374.6" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00feff"/><stop offset="0.28" stop-color="#03dfff"/><stop offset="0.9" stop-color="#0992ff"/><stop offset="1" stop-color="#0a84ff"/></linearGradient><linearGradient id="linear-gradient-14" x1="680.88" y1="556.54" x2="536.1" y2="167.79" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0060df"/><stop offset="0.09" stop-color="#0067e5" stop-opacity="0.81"/><stop offset="0.21" stop-color="#006eec" stop-opacity="0.59"/><stop offset="0.33" stop-color="#0075f2" stop-opacity="0.41"/><stop offset="0.46" stop-color="#007af7" stop-opacity="0.26"/><stop offset="0.58" stop-color="#007efa" stop-opacity="0.15"/><stop offset="0.71" stop-color="#0081fd" stop-opacity="0.06"/><stop offset="0.85" stop-color="#0082fe" stop-opacity="0.02"/><stop offset="1" stop-color="#0083ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-15" x1="640" y1="1020.28" x2="747.99" y2="109.82" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#75feff"/><stop offset="0.28" stop-color="#5adfff"/><stop offset="0.9" stop-color="#1692ff"/><stop offset="1" stop-color="#0a84ff"/></linearGradient><linearGradient id="linear-gradient-16" x1="735.59" y1="578.41" x2="653.1" y2="230.43" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#9ee7ff"/><stop offset="0.14" stop-color="#8cdbff" stop-opacity="0.88"/><stop offset="0.46" stop-color="#5ebdff" stop-opacity="0.57"/><stop offset="0.92" stop-color="#168cff" stop-opacity="0.08"/><stop offset="1" stop-color="#0a84ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-17" x1="649" y1="1002.59" x2="724.57" y2="429.48" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00feff"/><stop offset="0.14" stop-color="#0bf7ff" stop-opacity="0.88"/><stop offset="0.46" stop-color="#26e4ff" stop-opacity="0.57"/><stop offset="0.92" stop-color="#51c6ff" stop-opacity="0.08"/><stop offset="1" stop-color="#58c1ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-18" x1="662.8" y1="968.07" x2="1060.94" y2="345.6" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00feff"/><stop offset="0.14" stop-color="#01efff" stop-opacity="0.88"/><stop offset="0.46" stop-color="#04caff" stop-opacity="0.57"/><stop offset="0.92" stop-color="#098eff" stop-opacity="0.08"/><stop offset="1" stop-color="#0a84ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-19" x1="754.44" y1="521.58" x2="313.86" y2="178" xlink:href="#linear-gradient-16"/><linearGradient id="linear-gradient-20" x1="358.66" y1="754.08" x2="43.38" y2="513.58" xlink:href="#linear-gradient-18"/><linearGradient id="linear-gradient-21" x1="145.65" y1="859.21" x2="130.45" y2="726.91" xlink:href="#linear-gradient-18"/><linearGradient id="linear-gradient-22" x1="292.53" y1="562.84" x2="195.52" y2="368.82" xlink:href="#linear-gradient-18"/></defs><title>firefox-logo-developer-edition</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="Layer_2-2" data-name="Layer 2"><g id="Fox_Lines_-_Outlined" data-name="Fox Lines - Outlined"><polygon points="916.77 436.39 896.46 368.8 838.37 258.88 771.93 188.65 701.38 138.15 640.13 114.04 566.64 87.83 445.64 80.1 369.34 93.91 307.08 113.11 196.61 177.94 127.56 255.17 63.9 358.86 38.86 447.1 34.18 580.97 58.05 672.25 110.71 776.17 147.85 826.37 199.21 873.58 263.35 917.09 342.45 951.59 474.81 967.17 543.93 969.1 646.22 940.21 737.65 889.89 796.48 839.57 842.09 785 906.58 658.41 920.82 571.82 916.77 436.39" style="fill:#061a58"/><polygon points="447.85 140.94 393.67 194.85 482.06 230.78 447.85 140.94" style="fill:#133691"/><polygon points="482.06 230.78 447.85 140.94 547.82 149.01 482.06 230.78" style="fill:#1943ae"/><polygon points="482.06 230.78 653.2 225.58 547.82 149.01 482.06 230.78" style="fill:#2053cf"/><polygon points="653.2 225.58 547.82 149.01 640.49 148.44 653.2 225.58" style="fill:#2660eb"/><polygon points="653.2 225.58 750.65 219.2 640.49 148.44 653.2 225.58" style="fill:#306dff"/><polygon points="750.65 219.2 640.49 148.44 695.25 142.59 750.65 219.2" style="fill:#235adb"/><polygon points="750.65 219.2 695.25 142.59 771.93 188.65 750.65 219.2" style="fill:#2660eb"/><polygon points="824.01 266.11 750.65 219.2 771.93 188.65 824.01 266.11" style="fill:#2053cf"/><polygon points="750.65 219.2 738.38 271.68 805.48 298.57 750.65 219.2" style="fill:#1c4abd"/><polygon points="750.65 219.2 824.01 266.11 805.48 298.57 750.65 219.2" style="fill:#1a46b4"/><polygon points="653.2 225.58 750.65 219.2 738.38 271.68 653.2 225.58" style="fill:#2660eb"/><polygon points="653.2 225.58 738.38 271.68 675.3 344.13 653.2 225.58" style="fill:#235adb"/><polygon points="653.2 225.58 576.21 295.46 675.3 344.13 653.2 225.58" style="fill:#1f51ca"/><polygon points="482.06 230.78 653.2 225.58 576.21 295.46 482.06 230.78" style="fill:#1f50c9"/><polygon points="675.3 344.13 738.38 271.68 784.98 362.3 675.3 344.13" style="fill:#2053cf"/><polygon points="738.38 271.68 784.98 362.3 805.48 298.57 738.38 271.68" style="fill:#1b48b9"/><polygon points="784.98 362.3 805.48 298.57 854.3 415.01 784.98 362.3" style="fill:#173fa5"/><polygon points="805.48 298.57 879.88 353.21 854.3 415.01 805.48 298.57" style="fill:#12348d"/><polygon points="805.48 298.57 879.88 353.21 824.01 266.11 805.48 298.57" style="fill:#143895"/><polygon points="824.01 266.11 838.37 258.88 879.88 353.21 824.01 266.11" style="fill:#0f2f82"/><polygon points="879.88 353.21 896.46 368.8 838.37 258.88 879.88 353.21" style="fill:#05154c"/><polygon points="824.01 266.11 838.37 258.88 771.93 188.65 824.01 266.11" style="fill:#163c9e"/><polygon points="913.04 489.2 896.46 368.8 916.77 436.39 912.77 489.2 913.04 489.2" style="fill:#051753"/><polygon points="879.88 353.21 913.04 489.2 896.46 368.8 879.88 353.21" style="fill:#061a57"/><polygon points="854.3 415.01 913.04 489.2 879.88 353.21 854.3 415.01" style="fill:#05154c"/><polygon points="912.77 489.2 916.77 436.39 920.82 571.82 913.04 489.2 912.77 489.2" style="fill:#081f63"/><polygon points="903.2 596.22 920.82 571.82 913.04 489.2 903.2 596.22" style="fill:#12348d"/><polygon points="906.58 658.41 892.49 665.22 920.82 571.82 906.58 658.41" style="fill:#123392"/><polygon points="892.49 665.22 920.82 571.82 903.2 596.22 892.49 665.22" style="fill:#0c2674"/><polygon points="903.2 596.22 913.04 489.2 882.86 524.9 903.2 596.22" style="fill:#081f63"/><polygon points="892.49 665.22 903.2 596.22 844.99 694.32 892.49 665.22" style="fill:#0f2f82"/><polygon points="854.3 415.01 913.04 489.2 882.86 524.9 854.3 415.01" style="fill:#061a57"/><polygon points="903.2 596.22 882.86 524.9 852.17 612.75 903.2 596.22" style="fill:#081e5f"/><polygon points="844.99 694.32 903.2 596.22 852.17 612.75 844.99 694.32" style="fill:#092167"/><polygon points="842.09 785 906.58 658.41 892.49 665.22 842.09 785" style="fill:#163aa2"/><polygon points="842.09 785 892.49 665.22 845.34 752.53 842.09 785" style="fill:#163aa2"/><polygon points="845.34 752.53 892.49 665.22 844.99 694.32 845.34 752.53" style="fill:#0e2b7e"/><polygon points="796.48 839.57 845.34 752.53 842.09 785 796.48 839.57" style="fill:#123392"/><polyline points="734.31 868.24 796.48 839.57 737.65 889.89 734.31 868.24" style="fill:#1a45b2"/><polygon points="796.48 839.57 845.34 752.53 734.31 868.24 796.48 839.57" style="fill:#123392"/><polygon points="734.31 868.24 737.65 889.89 685.8 905.97 734.31 868.24" style="fill:#133493"/><polygon points="646.22 940.21 685.8 905.97 737.65 889.89 646.22 940.21" style="fill:#1a45b2"/><polygon points="646.22 940.21 685.8 905.97 557.16 954.07 646.22 940.21" style="fill:#1a45b2"/><polygon points="543.93 969.1 646.22 940.21 557.16 954.07 543.93 969.1" style="fill:#1a45b2"/><polygon points="474.81 967.17 543.93 969.1 557.16 954.07 474.81 967.17" style="fill:#1a45b2"/><polygon points="342.45 951.59 334.9 939.52 474.81 967.17 342.45 951.59" style="fill:#1f51ca"/><polygon points="342.45 951.59 334.9 939.52 263.35 917.09 342.45 951.59" style="fill:#173fad"/><polygon points="199.21 873.58 147.85 826.37 263.35 917.09 199.21 873.58" style="fill:#173fad"/><polygon points="147.85 826.37 110.71 776.17 135.38 784.31 147.85 826.37" style="fill:#1b47b5"/><polygon points="147.85 826.37 263.35 917.09 225.57 868.79 147.85 826.37" style="fill:#163aa3"/><polygon points="147.85 826.37 225.57 868.79 135.38 784.31 147.85 826.37" style="fill:#173fad"/><polygon points="225.57 868.79 334.9 939.52 263.35 917.09 225.57 868.79" style="fill:#133595"/><polygon points="225.57 868.79 334.9 939.52 336.71 897.93 225.57 868.79" style="fill:#163ba4"/><polygon points="394.33 924.94 334.9 939.52 336.71 897.93 394.33 924.94" style="fill:#163aa2"/><polygon points="135.38 784.31 110.71 776.17 94.21 702.09 135.38 784.31" style="fill:#2053cf"/><polygon points="110.71 776.17 58.05 672.25 94.21 702.09 110.71 776.17" style="fill:#306dff"/><polyline points="40.73 560.38 94.21 702.09 58.05 672.25" style="fill:#1f51ca"/><polygon points="58.05 672.25 34.18 580.97 40.73 560.38 58.05 672.25" style="fill:#2257d7"/><polygon points="40.73 560.38 34.18 580.97 38.86 447.1 40.73 560.38" style="fill:#11318d"/><polygon points="63.9 358.86 80.28 352.77 38.86 447.1 63.9 358.86" style="fill:#0c2674"/><polygon points="38.86 447.1 70.22 441.25 80.28 352.77 38.86 447.1" style="fill:#102f88"/><polygon points="40.73 560.38 38.86 447.1 70.22 441.25 40.73 560.38" style="fill:#133595"/><polygon points="70.22 441.25 68.11 537.91 40.73 560.38 70.22 441.25" style="fill:#12328e"/><polygon points="127.56 255.17 80.28 352.77 63.9 358.86 127.56 255.17" style="fill:#0b2572"/><polygon points="127.56 255.17 187.95 197.36 196.61 177.94 127.56 255.17" style="fill:#020b2e"/><polygon points="196.61 177.94 268.46 142.13 187.95 197.36 196.61 177.94" style="fill:#092064"/><polyline points="196.61 177.94 307.08 113.11 268.46 142.13 196.61 177.94" style="fill:#030f41"/><polygon points="268.46 142.13 369.34 93.91 307.08 113.11 268.46 142.13" style="fill:#081e5f"/><polygon points="369.34 93.91 329.9 136.51 268.46 142.13 369.34 93.91" style="fill:#081f61"/><polygon points="329.9 136.51 423.87 98.83 369.34 93.91 329.9 136.51" style="fill:#0d2a78"/><polygon points="445.64 80.1 369.34 93.91 423.87 98.83 445.64 80.1" style="fill:#11338b"/><polyline points="517.8 97.89 423.87 98.83 445.64 80.1" style="fill:#153a99"/><polygon points="445.64 80.1 566.64 87.83 517.8 97.89 445.64 80.1" style="fill:#0d2a78"/><polygon points="517.8 97.89 566.64 87.83 640.13 114.04 517.8 97.89" style="fill:#2053ce"/><polygon points="695.25 142.59 640.13 114.04 701.38 138.15 695.25 142.59" style="fill:#1e4dc3"/><polygon points="695.25 142.59 701.38 138.15 771.93 188.65 695.25 142.59" style="fill:#1e4fc7"/><polygon points="334.9 939.52 474.81 967.17 394.33 924.94 334.9 939.52" style="fill:#1a45b2"/><polygon points="474.81 967.17 394.33 924.94 473.09 910.23 474.81 967.17" style="fill:#163aa2"/><polygon points="557.16 954.07 474.81 967.17 473.09 910.23 557.16 954.07" style="fill:#1a45b2"/><polygon points="557.16 954.07 473.09 910.23 588.95 879.02 557.16 954.07" style="fill:#1741aa"/><polyline points="685.8 905.97 557.16 954.07 588.95 879.02" style="fill:#1a45b2"/><polygon points="685.8 905.97 691.68 830.87 588.95 879.02 685.8 905.97" style="fill:#133493"/><polygon points="685.8 905.97 691.68 830.87 734.31 868.24 685.8 905.97" style="fill:#163aa2"/><polygon points="734.31 868.24 691.68 830.87 794.68 762.24 734.31 868.24" style="fill:#133493"/><polygon points="734.31 868.24 794.68 762.24 845.34 752.53 734.31 868.24" style="fill:#1a45b2"/><polygon points="845.34 752.53 844.99 694.32 794.68 762.24 845.34 752.53" style="fill:#092167"/><polyline points="640.13 114.04 640.49 148.44 695.25 142.59" style="fill:#2258d9"/><polygon points="640.49 148.44 640.13 114.04 517.8 97.89 640.49 148.44" style="fill:#2257d7"/><polygon points="517.8 97.89 547.82 149.01 640.49 148.44 517.8 97.89" style="fill:#2257d7"/><polygon points="517.8 97.89 547.82 149.01 447.85 140.94 517.8 97.89" style="fill:#1a46b3"/><polygon points="423.87 98.83 447.85 140.94 517.8 97.89 423.87 98.83" style="fill:#163c9f"/><polygon points="329.9 136.51 423.87 98.83 447.85 140.94 329.9 136.51" style="fill:#103186"/><polygon points="393.67 194.85 329.9 136.51 447.85 140.94 393.67 194.85" style="fill:#163c9e"/><polygon points="268.46 142.13 187.95 197.36 226.1 234.11 268.46 142.13" style="fill:#031043"/><polygon points="329.9 136.51 226.1 234.11 268.46 142.13 329.9 136.51" style="fill:#030f41"/><polygon points="226.1 234.11 292.33 245.16 329.9 136.51 226.1 234.11" style="fill:#05164e"/><polygon points="292.33 245.16 329.9 136.51 393.67 194.85 292.33 245.16" style="fill:#092064"/><polygon points="127.56 255.17 131.6 294.44 187.95 197.36 127.56 255.17" style="fill:#030f41"/><polygon points="80.28 352.77 127.56 255.17 131.6 294.44 80.28 352.77" style="fill:#091f64"/><polygon points="131.6 294.44 187.95 197.36 226.1 234.11 131.6 294.44" style="fill:#041345"/><polygon points="128.19 378.6 131.6 294.44 80.28 352.77 128.19 378.6" style="fill:#0a226b"/><polygon points="128.19 378.6 131.6 294.44 198.19 348.64 128.19 378.6" style="fill:#091f64"/><polygon points="198.19 348.64 226.1 234.11 131.6 294.44 198.19 348.64" style="fill:#061853"/><polygon points="198.19 348.64 226.1 234.11 292.33 245.16 198.19 348.64" style="fill:#030f42"/><polygon points="70.22 441.25 80.28 352.77 128.19 378.6 70.22 441.25" style="fill:#0b2572"/><polygon points="94.21 702.09 68.11 537.91 40.73 560.38 94.21 702.09" style="fill:#173da9"/><polygon points="135.38 784.31 94.21 702.09 138.33 708.3 135.38 784.31" style="fill:#1a45b2"/><polygon points="94.21 702.09 138.33 708.3 107.44 635.98 94.21 702.09" style="fill:#1741aa"/><polygon points="94.21 702.09 68.11 537.91 107.44 635.98 94.21 702.09" style="fill:#10308b"/><polygon points="135.38 784.31 181.75 793.26 138.33 708.3 135.38 784.31" style="fill:#123390"/><polygon points="135.38 784.31 225.57 868.79 181.75 793.26 135.38 784.31" style="fill:#133493"/><polygon points="225.57 868.79 258.2 837.33 181.75 793.26 225.57 868.79" style="fill:#1a45b2"/><polygon points="225.57 868.79 336.71 897.93 258.2 837.33 225.57 868.79" style="fill:#163aa2"/><polygon points="336.71 897.93 394.33 924.94 473.09 910.23 336.71 897.93" style="fill:#1a45b2"/><polygon points="336.71 897.93 374.38 818.85 473.09 910.23 336.71 897.93" style="fill:#123392"/><polygon points="68.11 537.91 132.48 537.82 70.22 441.25 68.11 537.91" style="fill:#102f87"/><polygon points="70.22 441.25 132.48 537.82 128.19 378.6 70.22 441.25" style="fill:#081f63"/><polygon points="68.11 537.91 107.44 635.98 132.48 537.82 68.11 537.91" style="fill:#163ba4"/><polygon points="107.44 635.98 132.48 537.82 163.61 615.38 107.44 635.98" style="fill:#11318c"/><polygon points="138.33 708.3 163.61 615.38 107.44 635.98 138.33 708.3" style="fill:#123390"/><polygon points="138.33 708.3 257.7 782.47 163.61 615.38 138.33 708.3" style="fill:#123392"/><polygon points="181.75 793.26 257.7 782.47 138.33 708.3 181.75 793.26" style="fill:#163aa2"/><polygon points="258.2 837.33 257.7 782.47 181.75 793.26 258.2 837.33" style="fill:#1741aa"/><polygon points="258.2 837.33 257.7 782.47 374.38 818.85 258.2 837.33" style="fill:#123392"/><polygon points="258.2 837.33 336.71 897.93 374.38 818.85 258.2 837.33" style="fill:#123392"/><polygon points="473.09 910.23 483 820.09 374.38 818.85 473.09 910.23" style="fill:#0e2b80"/><polygon points="473.09 910.23 483 820.09 588.95 879.02 473.09 910.23" style="fill:#143698"/><polygon points="588.95 879.02 584.83 777.69 483 820.09 588.95 879.02" style="fill:#0d2878"/><polygon points="588.95 879.02 584.83 777.69 691.68 830.87 588.95 879.02" style="fill:#123392"/><polygon points="584.83 777.69 650.94 717.65 691.68 830.87 584.83 777.69" style="fill:#081f63"/><polygon points="691.68 830.87 741.66 679.1 650.94 717.65 691.68 830.87" style="fill:#061a57"/><polygon points="794.68 762.24 691.68 830.87 741.66 679.1 794.68 762.24" style="fill:#0f2f82"/><polygon points="794.68 762.24 844.99 694.32 741.66 679.1 794.68 762.24" style="fill:#092167"/><polygon points="844.99 694.32 741.66 679.1 852.17 612.75 844.99 694.32" style="fill:#05164f"/><polyline points="882.86 524.9 810.95 473.57 852.17 612.75 882.86 524.9" style="fill:#051753"/><polygon points="882.86 524.9 854.3 415.01 810.95 473.57 882.86 524.9" style="fill:#031043"/><polygon points="741.66 679.1 852.17 612.75 745.06 564.94 741.66 679.1" style="fill:#031043"/><polygon points="741.66 679.1 641.5 577.61 650.94 717.65 741.66 679.1" style="fill:#030f41"/><polygon points="584.83 777.69 507.93 709.41 650.94 717.65 584.83 777.69" style="fill:#092167"/><polygon points="584.83 777.69 483 820.09 507.93 709.41 584.83 777.69" style="fill:#0f2f82"/><polygon points="374.38 818.85 483 820.09 348.75 732.05 374.38 818.85" style="fill:#123390"/><polygon points="374.38 818.85 348.75 732.05 257.7 782.47 374.38 818.85" style="fill:#0f2d84"/><polygon points="257.7 782.47 274.73 694.32 348.75 732.05 257.7 782.47" style="fill:#0e2b7e"/><polygon points="274.73 694.32 163.61 615.38 257.7 782.47 274.73 694.32" style="fill:#0f2e86"/><polygon points="483 820.09 507.93 709.41 348.75 732.05 483 820.09" style="fill:#081f63"/><polygon points="132.48 537.82 164.41 435.6 128.19 378.6 132.48 537.82" style="fill:#0a236c"/><polygon points="128.19 378.6 164.41 435.6 198.19 348.64 128.19 378.6" style="fill:#081f63"/><polygon points="198.19 348.64 338.33 307.68 292.33 245.16 198.19 348.64" style="fill:#05164e"/><polygon points="198.19 348.64 338.33 307.68 264.31 459.32 198.19 348.64" style="fill:#030f41"/><polygon points="741.66 679.1 641.5 577.61 745.06 564.94 741.66 679.1" style="fill:#05164f"/><polygon points="852.17 612.75 810.95 473.57 745.06 564.94 852.17 612.75" style="fill:#030f42"/><polygon points="650.94 717.65 536.4 606.6 641.5 577.61 650.94 717.65" style="fill:#030f41"/><polygon points="507.93 709.41 650.94 717.65 536.4 606.6 507.93 709.41" style="fill:#05164f"/><polygon points="507.93 709.41 429.6 645.45 536.4 606.6 507.93 709.41" style="fill:#031042"/><polygon points="810.95 473.57 854.3 415.01 784.98 362.3 810.95 473.57" style="fill:#0f2e82"/><polygon points="198.19 348.64 264.31 459.32 164.41 435.6 198.19 348.64" style="fill:#061853"/><polygon points="164.41 435.6 264.31 459.32 196.75 566.02 164.41 435.6" style="fill:#081f63"/><polygon points="338.33 307.68 393.67 194.85 292.33 245.16 338.33 307.68" style="fill:#081e5f"/><polyline points="196.75 566.02 164.41 435.6 132.48 537.82" style="fill:#091f64"/><polygon points="132.48 537.82 196.75 566.02 163.61 615.38 132.48 537.82" style="fill:#11318c"/><polygon points="196.75 566.02 274.73 694.32 163.61 615.38 196.75 566.02" style="fill:#0e2b7e"/><polygon points="274.73 694.32 285.15 539.09 196.75 566.02 274.73 694.32" style="fill:#092167"/><polygon points="274.73 694.32 429.6 645.45 285.15 539.09 274.73 694.32" style="fill:#061a57"/><polygon points="429.6 645.45 414.51 525.44 285.15 539.09 429.6 645.45" style="fill:#05164f"/><polygon points="536.4 606.6 429.6 645.45 414.51 525.44 536.4 606.6" style="fill:#041245"/><polygon points="414.51 525.44 523.74 484.47 536.4 606.6 414.51 525.44" style="fill:#030f42"/><polygon points="348.75 732.05 507.93 709.41 429.6 645.45 348.75 732.05" style="fill:#092167"/><polygon points="348.75 732.05 274.73 694.32 429.6 645.45 348.75 732.05" style="fill:#0c2674"/><polygon points="338.33 307.68 433.19 317.74 393.67 194.85 338.33 307.68" style="fill:#0c2771"/><polygon points="482.06 230.78 393.67 194.85 433.19 317.74 482.06 230.78" style="fill:#153a99"/><polygon points="482.06 230.78 576.21 295.46 433.19 317.74 482.06 230.78" style="fill:#163da0"/><polygon points="433.19 317.74 573.48 392.34 523.74 484.47 433.19 317.74" style="fill:#11338b"/><polygon points="573.48 392.34 576.21 295.46 433.19 317.74 573.48 392.34" style="fill:#163ca0"/><polygon points="573.48 392.34 576.21 295.46 675.3 344.13 573.48 392.34" style="fill:#1a45b2"/><polygon points="433.19 317.74 523.74 484.47 364.92 404.7 433.19 317.74" style="fill:#0c266e"/><polygon points="414.51 525.44 523.74 484.47 364.92 404.7 414.51 525.44" style="fill:#071b5c"/><polygon points="523.74 484.47 663.82 458.82 573.48 392.34 523.74 484.47" style="fill:#0f2f82"/><polygon points="675.3 344.13 663.82 458.82 573.48 392.34 675.3 344.13" style="fill:#1741aa"/><polygon points="675.3 344.13 741.42 434.17 663.82 458.82 675.3 344.13" style="fill:#153a99"/><polygon points="784.98 362.3 675.3 344.13 741.42 434.17 784.98 362.3" style="fill:#1945b1"/><polygon points="741.42 434.17 810.95 473.57 784.98 362.3 741.42 434.17" style="fill:#12338c"/><polygon points="745.06 564.94 810.95 473.57 741.42 434.17 745.06 564.94" style="fill:#081e60"/><polygon points="745.06 564.94 741.42 434.17 663.82 458.82 745.06 564.94" style="fill:#081e5f"/><polyline points="663.82 458.82 641.5 577.61 745.06 564.94" style="fill:#061a57"/><polygon points="523.74 484.47 663.82 458.82 641.5 577.61 523.74 484.47" style="fill:#031042"/><polygon points="536.4 606.6 641.5 577.61 523.74 484.47 536.4 606.6" style="fill:#05164f"/><polygon points="338.33 307.68 364.92 404.7 433.19 317.74 338.33 307.68" style="fill:#05174f"/><polygon points="338.33 307.68 264.31 459.32 364.92 404.7 338.33 307.68" style="fill:#061853"/><polygon points="364.92 404.7 285.15 539.09 414.51 525.44 364.92 404.7" style="fill:#030f41"/><polygon points="285.15 539.09 364.92 404.7 264.31 459.32 285.15 539.09" style="fill:#041245"/><polygon points="196.75 566.02 264.31 459.32 285.15 539.09 196.75 566.02" style="fill:#061a58"/><path d="M922.81,571.94v-.19h0l-4-135.4v-.48h0l-20.3-67.57h0v-.11l-.06-.14V368L840.14,258v-.05l-.07-.11-.07-.1v-.06l-.06-.07v-.05L773.5,187.28h0l-.12-.1-.09-.08h0l-70.52-50.48h-.07l-.15-.08-.15-.08h0L640.91,112.2h-.12L567.31,85.94h-.54l-121-7.72h-.48L369,91.94h-.25l-62.19,19.17h0l-.14.06-.16.07h-.08l-110.58,65h0l-.09.06-.08.06-.08.06-.07.05-.08.08-.06.06h0l-69,77.21h0v.12l-.06.09h0L62.2,357.81v.06l-.06.11,0,.12-.05.14v.06L37,446.54h0v.4h0l-4.86,134v.63h0L56,672.75h0v.07a1.08,1.08,0,0,0,.08.19h0v.1h0L108.77,777h0v0l.1.17h0L146,827.38h0v.06l.11.11.08.09,51.36,47.22.13.1.1.09,64.14,43.51h0l.15.09h.08l79.09,34.5h.08l.18.06h.31l132.37,15.58h.18l69.11,1.93h.07a1.27,1.27,0,0,0,.39,0h.14l102.29-28.89h.29l.12-.05h0l91.38-50.29h0l.15-.11h0l.12-.09h0L797.23,841l.06-.06.08-.07.07-.08h0l45.61-54.56h0a1.43,1.43,0,0,0,.16-.24l0-.09h0l64.49-126.59v-.09a.15.15,0,0,1,.07-.15v-.34l14.23-86.57h0V572A3.25,3.25,0,0,0,922.81,571.94ZM200.46,872l-13.3-12.23,29.92,23.5ZM394.6,922.85l-46.75-21.92,110.65,10Zm17-399.13-122.74,13,75.69-127.51ZM368.8,408.89l150,75.32L415.62,522.88Zm44,118.74L427,641.08,290.49,540.54Zm12.48,117.1L277,691.53l10-148.67ZM417,529.52l115,76.55L431.27,642.72Zm1.83-3.59L522,487.25l12,115.33ZM577.36,392.71,673,347.45,662.18,455.13Zm81.55,65-131.43,24,46.66-86.44ZM523.74,480.27,438.12,322.63l132.64,70.53Zm-4.8-.45L368,404l64.88-82.64ZM285.87,534l-19.23-73.62L359.5,410ZM273.16,687.88,199.8,567.18,283,541.85ZM423,649.65l-74.63,79.94L280,694.76Zm110.5-39.84-26.62,96.12-73.23-59.8ZM526.22,489l110.94,87.75-99,27.31Zm2.23-3.34,132.87-24.34L640.15,574ZM666.11,456l10.66-106.48,61.38,83.59Zm73.38-19.11,3.4,121.94-75.75-99ZM575.57,389.14l2.55-90.51,92.58,45.46Zm-4-.08L439.43,318.79l134.71-21ZM365.8,400.34,341,310l88.35,9.37Zm-3.23,3.36-93.73,50.88,69-141.26Zm-79.84,134-81.4,24.8,62.21-98.26ZM268,687.08l-101.63-72.2,30.32-45.15Zm8.2,10.23,68.3,34.81-84,46.52Zm153.6-49.13,73.35,59.89-149,21.2Zm107.65-37.8,108.26,105-135.17-7.79Zm2.87-2.78,99.36-27.4,8.93,132.4ZM665,463.59l76.39,99.79L644,575.3Zm78.56-25.94L808,474.21,746.89,559Zm.68-4.21,40-65.91,23.82,102Zm-2.94-2.87L679.82,346.9l101.91,16.89ZM579.73,295l72.16-65.5L672.6,340.57ZM437,315.13l45.78-81.46L571,294.26ZM341.38,306l51.89-105.81,37.07,115.25ZM264.13,455.12l-62.9-105.28,133.31-39ZM197.57,561,167.14,438.31l94,22.31Zm-33.51,50.13-27.9-69.51,57.6,25.27Zm108.46,84.08-15.75,81.54-87-154.56Zm75,39.8,23.87,80.82L262.76,782ZM505.34,711.8l-23.66,105-127.4-83.52Zm140.72,7.57L584.82,775l-71.25-63.26Zm-2.21-136.53,94.31,95.55L652.74,714.7Zm1.93-3.75L743,567.21l-3.2,107.15ZM810.19,478,849,609.16l-100.9-45Zm-22-110.79,63.33,48.15-39.6,53.5Zm-109-24.51L738,275.18l43.43,84.46Zm-2.65-3L655.93,229.33l79.29,42.91ZM576,292.92,488.2,232.6l159.61-4.86ZM433.69,312.77,396.88,198.32l82.32,33.47ZM338,303.84l-42.63-57.95,93.92-46.63Zm-3,2.72L204.46,344.73l87.72-96.42ZM260.16,456.28l-93.05-22.09,31.46-81ZM193.83,562.55,134.92,536.7,164.19,443ZM161,614.21l-50.67,18.58,22.59-88.55Zm91.14,162.44L140.65,707.38l23.61-86.78Zm113.5,41.56L260.18,835l-.46-49.79Zm-13.42-81.5,124,81.3-100.3-1.14Zm156.93-23.55,72,63.91L485.8,816.75Zm140.93,8,38,105.71L588.34,777.2Zm3.39-2.39,84.91-36.09L691.6,824.73ZM747,568l100.88,45L743.77,675.5Zm67.55-89.41,66,47.08L852.4,606.26Zm-.75-5.45,39.64-53.56,26.13,100.5ZM787.31,361.56l18.41-57.23L849.57,408.9Zm-2.77-4.47L742.6,275.52,803,299.73Zm-124.3-130,87.83-5.75L737,268.67Zm-173.91,1.53,61.84-76.9,99.11,72Zm-3.65-1.84-31.84-83.62,93,7.52Zm-4.13.39-81.34-33.06,49.86-49.61Zm-182.73,14L330.8,140l59.37,54.32ZM202,341.5l25.6-105.11,60.78,10.14Zm-38,89.7-32.84-51.68,63.46-27.15Zm-1.75,4.7-28.07,89.85-3.77-140ZM129.9,539.82,107,629.55,71.07,539.9Zm-59.74-3.91,1.92-88.09,56.73,88Zm90.5,82.68-22.75,83.63L110.1,637.13ZM252,781.27l-69.09,9.81L143.42,713.8Zm3.75,3.51.45,49.07-68.4-39.42ZM371,821.43l-35,73.41-72.88-56.25Zm4.08.74,92.41,85.55L339.75,896.19Zm4.53-1.26,101.22,1.15-9.23,84ZM583,780.64l3.86,94.9-99.23-55.19Zm4,.35L687.1,830.82l-96.26,45.12Zm155.27-97.26L792,761.66,695.39,826Zm3.46-2,95.69,14.1-46.59,62.9Zm1.78-3.78,102.35-61.44L843.18,692ZM882.67,531.51l18.07,63.4L855.38,609.6Zm-24-107.82,51.84,65.46-26.63,31.5ZM810.11,304.45l67.32,49.44L854.28,409.8Zm-69.4-34L751.57,224l48.49,70.19Zm-85.84-47-11.69-70.91,101.27,65Zm-4.44-2.37L553.92,151l84.87-.53ZM454.11,139.44l63-38.77,27,46Zm-60.5,52.65-58.34-53.37,107.91,4.05ZM291,242.91,230.41,232.8l95-89.27ZM197,345.1l-62-50.46,88-56.16Zm-2.63,3-64,27.4,3.12-77ZM130.29,530.73,72.74,441.46l53.58-57.91ZM105.36,636.17l-10.92,54.6L72.89,555.18Zm2.77,6.53,27,63.13-38.51-5.41Zm70,147.82-40.66-7.84L140,716Zm76.8,47.22L226,865.58l-38.78-66.85Zm3.45,2.23L327.7,893.5l-98.18-25.74ZM484.66,823.3l99,55.07L475.4,907.54Zm204.76,10.84L684,903.39l-89.31-24.85Zm99.35-65.56-55,96.54-38.82-34ZM843,700.33l.31,50.55-44,8.42Zm11-86.09,44.73-14.49-51,86Zm31-88.87,25.39-30-8.28,90ZM856.6,414.69l22.8-55.06,29.54,121.15ZM808.1,298l16-28,48.27,75.26Zm-2.78-3.19-47.38-68.58,63.39,40.53Zm-159-145,48-5.12,48.52,67.09ZM549,147l-26.42-45,108,44.49Zm-100.39-8.85-21.27-37.36,83.33-.83Zm-4.23.65-105-3.94L423,101.33ZM232.21,225.62,269.79,144l54.51-5Zm-6.75,5.1-34.36-33.1,72.51-49.74Zm-2.58,3.07-85.42,54.53,50.94-87.75ZM126.32,375.32,83.45,352.21,129.37,300ZM125,379.13,72.9,435.41l9-79.47ZM66.13,537l-22,18,23.71-95.77Zm.55,4.72L89.16,683l-46-122ZM136.26,710l-2.58,66.43-36-71.85Zm44.21,85L217,858l-75.2-70.41ZM334.64,899.4l-1.59,36.49-95.92-62.06Zm3.94,1.56,49.78,23.34L337,936.94Zm132.59,11.61,1.55,51.18-72.35-38ZM585.51,882l-29.34,69.3-77.6-40.47Zm4.6-.6,89.24,24.83L560.82,950.57ZM693.36,835l37.81,33.14-43,33.46ZM796,764l43.59-8.35L744,855.23Zm51.33-19.32-.3-49.27L887.2,670.8Zm3.54-56.31,48.81-82.25-9,57.84Zm62.24-177.62,5.69,60.47-12.9,17.87Zm-29.64-151.5,11.15,10.49,11.15,81Zm-56.53-92.39,10.49-5.28,30.34,68.94ZM753.52,218.6l18.42-26.44,45.09,67Zm-2.86-2.89-48-66.4,66.47,39.92Zm-108.2-69.49-.3-28.87,46.26,24Zm-4-.78L532.74,101.88,638.15,115.8ZM429.33,96.77l16.83-14.48L502,96Zm-91.92,34.57L370.14,96l45.26,4.08ZM329,134.59l-49.56,4.53,81.37-38.89ZM192.66,191.7l5.48-12.3,45.48-22.67ZM133,288.11l-3.31-32.17,49.47-47.36Zm-3.44,5.66-41,46.64,37.8-78ZM68.4,439.55l-26.19,4.89L76.8,365.67Zm-.87,4.23L42.48,545l-1.59-96.25Zm22.15,252L59.91,671.19,45.65,579.07Zm41.75,85.14-19-6.28L99.69,717.51Zm81.29,78.59L149.53,825l-10.14-34.19Zm11.52,10.85,27.36,35L168,839.63ZM234.47,877l87,56.28-56.92-17.84Zm159.59,50.13,67.6,35.47L344.15,939.31Zm81.13-13.48L550.87,953l-74.13,11.79Zm200.87-1.84-30.72,26.58L576.21,949.1Zm56.78-39.84,2.56,16.58-39.7,12.3Zm103-106.65L795.05,838l-52,24Zm11.39-12.13,27.36-50.66L845.41,772ZM905.1,597l10.33-14.3-16.6,54.74ZM915,489h0v-.09h0l-.15-1.06,1-13.56,1,35.11Zm-2.75-20L902,394l12.8,42.58Zm-30.7-117-18.86-42.86,26.39,49.94Zm-56.86-88.51-37.66-56,48,50.78Zm-125.82-121,2.52-1.82,29,20.73Zm-3.8-2.19L675.5,130.11l21.76,8.56ZM529.81,97.46,566.5,89.9l55.21,19.69Zm-12-1.62-50-12.31,83.76,5.35Zm-94.64.92-39-3.51,54.52-9.87Zm-137.5,34.91L308,114.91l35.94-11.08Zm-18.3,8.75L248,150.06l29.73-17.45Zm-81.13,55.77-22.94,22,26.23-29.34ZM78.8,351.19,68.64,355l39.62-64.53Zm-13.29,9.2,11-4.09L48.72,419.66ZM38.14,524.81l.58,35.27-2,6.41Zm1.91,44.28,10,64.83L36.26,581ZM92.41,703.2l12.89,57.86L64.16,679.89Zm41.35,82.69,9,30.11-26.64-36ZM333.59,941.21l3.73,6-39.1-17.05Zm10,8.51L339,942.38l85.06,16.81ZM552,956.92l-9,10.15-46.69-1.3Zm6.2-1,55.66-8.67-63.93,18.06Zm128.61-48.19,32.64-10.12-57.56,31.68ZM739.08,886l-2.56-16.61,47.7-22ZM842.4,761.86l-2.23,22.32L808.8,821.71ZM894,666.69l8.06-3.89-36.89,72.42Zm10.73-9.63-9,4.37,18.19-60Z" style="fill:#58c1ff;fill-opacity:0.30000001192092896"/><path d="M80,726.72c51.48,39.42,209.8,68.08,396.9,68.08s345.08-28.62,397-67.94" style="fill:none;stroke:#f9f9fa;stroke-linecap:round;stroke-miterlimit:10;stroke-width:6px"/><path d="M770.28,91.82c-23.95,27.88-35.1,90.64-10.82,154.26s61.5,49.8,84.7,114.67c30.62,85.6,16.37,200.59,16.37,200.59s36.82,106.6,62.47-6.64C979.79,342,770.28,144.2,770.28,91.82Z" style="fill:url(#linear-gradient)"/><path d="M810.67,803.89a245.54,245.54,0,0,1-30.12,18.18,702.48,702.48,0,0,0,38.3-63C828.31,748.6,837,738.42,844,727.42c3.44-5.41,7.31-12.08,11.42-19.82,24.92-44.9,52.4-117.56,53.18-192.2v-5.69A257.57,257.57,0,0,0,902.93,454c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.37,2,.66,4,1,6,5.09,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.39,2.09-151.6,0,0-4.19-25.38-35.38-102.44C835,280.36,803.18,244,775,217.5c-24.69-30.55-47.11-51-59.47-64.06-25.82-27.19-36.64-47.57-41.09-60.87-3.85-1.93-53.14-49.81-57.05-51.63-21.51,33.35-89.16,137.67-57,235.15,14.58,44.17,51.47,90,90.07,115.74,1.69,1.94,23,25,33.09,77.16,10.45,53.85,5,95.86-16.54,158C641.73,681.5,577,735.38,516.3,740.89c-129.67,11.78-177.15-65.11-177.15-65.11,46.34,18.52,97.57,14.65,128.72-4.56,31.4-19.43,50.39-33.83,65.81-28.15,15.2,5.65,27.3-10.76,16.44-27.77a78.52,78.52,0,0,0-79.4-34.57c-31.43,5.11-60.23,30-101.41,5.89a82.13,82.13,0,0,1-7.73-5.06c-2.71-1.79,8.83,2.72,6.13.69-8-4.35-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.13-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.2.9-.15,1.36-.34,4.66,2.25,15,8.1,20.41,11.67,7.07,5,9.33,9.44,9.33,9.44s1.86-1,.48-5.37c-.5-1.78-2.65-7.45-9.65-13.17h.44a81.61,81.61,0,0,1,11.87,8.24c2-7.18,5.53-14.68,4.75-28.09-.48-9.43-.26-11.87-1.92-15.51-1.49-3.13.83-4.35,3.42-1.1a32.65,32.65,0,0,0-2.21-7.4V426c3.23-11.24,68.25-40.46,73-43.88a67.2,67.2,0,0,0,19.13-20.8c3.62-5.76,6.34-13.85,7-26.11.36-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.53-26.82-1.09-2.59-2.21-4.94-3.33-7.28a57.31,57.31,0,0,1-2.56-8.43c10.75-30.87,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.2-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.12a10.66,10.66,0,0,1,.83-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.19,44.19,0,0,0,.27-5.4,84.57,84.57,0,0,0-13.19,13.82l-.24.22c-37.36-15-70.23-16-98.05-9.28-6.09-6.11-9.06-1.64-22.91-32.07-.94-1.83.72,1.81,0,0-2.28-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.63,53.89-.18.59,17.16-4.9,0,0-6,1.72-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.22,7.38-11.75,15-19.75,27.64-22.78,34.21-15.19,26.18-31.93,67-48.15,131.55A334.2,334.2,0,0,1,75.2,398.62c-13.49,34.27-26.53,88.08-29.14,171a482.08,482.08,0,0,1,12.53-50.66A473,473,0,0,0,93.33,720c9.33,22.82,24.76,57.46,51,95.4,82.53,86.84,198.95,140.9,327.85,140.9C606.79,956.27,727.64,897.39,810.67,803.89Z" style="fill:url(#linear-gradient-2)"/><path d="M810.67,803.89a245.54,245.54,0,0,1-30.12,18.18,702.48,702.48,0,0,0,38.3-63C828.31,748.6,837,738.42,844,727.42c3.44-5.41,7.31-12.08,11.42-19.82,24.92-44.9,52.4-117.56,53.18-192.2v-5.69A257.57,257.57,0,0,0,902.93,454c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.37,2,.66,4,1,6,5.09,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.39,2.09-151.6,0,0-4.19-25.38-35.38-102.44C835,280.36,803.18,244,775,217.5c-24.69-30.55-47.11-51-59.47-64.06-25.82-27.19-36.64-47.57-41.09-60.87-3.85-1.93-53.14-49.81-57.05-51.63-21.51,33.35-89.16,137.67-57,235.15,14.58,44.17,51.47,90,90.07,115.74,1.69,1.94,23,25,33.09,77.16,10.45,53.85,5,95.86-16.54,158C641.73,681.5,577,735.38,516.3,740.89c-129.67,11.78-177.15-65.11-177.15-65.11,46.34,18.52,97.57,14.65,128.72-4.56,31.4-19.43,50.39-33.83,65.81-28.15,15.2,5.65,27.3-10.76,16.44-27.77a78.52,78.52,0,0,0-79.4-34.57c-31.43,5.11-60.23,30-101.41,5.89a82.13,82.13,0,0,1-7.73-5.06c-2.71-1.79,8.83,2.72,6.13.69-8-4.35-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.13-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.2.9-.15,1.36-.34,4.66,2.25,15,8.1,20.41,11.67,7.07,5,9.33,9.44,9.33,9.44s1.86-1,.48-5.37c-.5-1.78-2.65-7.45-9.65-13.17h.44a81.61,81.61,0,0,1,11.87,8.24c2-7.18,5.53-14.68,4.75-28.09-.48-9.43-.26-11.87-1.92-15.51-1.49-3.13.83-4.35,3.42-1.1a32.65,32.65,0,0,0-2.21-7.4V426c3.23-11.24,68.25-40.46,73-43.88a67.2,67.2,0,0,0,19.13-20.8c3.62-5.76,6.34-13.85,7-26.11.36-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.53-26.82-1.09-2.59-2.21-4.94-3.33-7.28a57.31,57.31,0,0,1-2.56-8.43c10.75-30.87,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.2-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.12a10.66,10.66,0,0,1,.83-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.19,44.19,0,0,0,.27-5.4,84.57,84.57,0,0,0-13.19,13.82l-.24.22c-37.36-15-70.23-16-98.05-9.28-6.09-6.11-9.06-1.64-22.91-32.07-.94-1.83.72,1.81,0,0-2.28-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.63,53.89-.18.59,17.16-4.9,0,0-6,1.72-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.22,7.38-11.75,15-19.75,27.64-22.78,34.21-15.19,26.18-31.93,67-48.15,131.55A334.2,334.2,0,0,1,75.2,398.62c-13.49,34.27-26.53,88.08-29.14,171a482.08,482.08,0,0,1,12.53-50.66A473,473,0,0,0,93.33,720c9.33,22.82,24.76,57.46,51,95.4,82.53,86.84,198.95,140.9,327.85,140.9C606.79,956.27,727.64,897.39,810.67,803.89Z" style="fill:url(#linear-gradient-3)"/><path d="M711.1,867C874,848.14,946.1,680.3,853.48,677,769.85,674.3,634,875.87,711.1,867Z" style="fill:url(#linear-gradient-4)"/><path d="M865.21,642.68C977.26,577.47,948,436.6,948,436.6s-43.25,50.24-72.62,130.32C846.4,646.22,797.84,682.07,865.21,642.68Z" style="fill:url(#linear-gradient-5)"/><path d="M509.47,950.32C665.7,1000.17,800,877.1,717.21,836,642,798.93,435.32,926.75,509.47,950.32Z" style="fill:url(#linear-gradient-6)"/><path d="M638.58,21.68l.53-.57A1.8,1.8,0,0,0,638.58,21.68ZM876.85,702.49c3.8-5.36,8.94-22.53,13.48-30.21,27.58-44.52,27.78-80,27.78-80.84,16.66-83.22,15.15-117.2,4.9-180-8.25-50.6-44.32-123.09-75.57-158-32.2-36-9.51-24.25-40.69-50.52-27.33-30.29-53.82-60.29-68.25-72.36C634.22,43.35,636.57,24.84,638.58,21.68c-.34.37-.84.92-1.47,1.64-1.23-4.92-2.11-9.06-2.11-9.06s-57,57-69,152c-7.83,62,15.38,126.68,49,168a381.17,381.17,0,0,0,59,58h0c25.4,36.48,39.38,81.49,39.38,129.91,0,121.24-98.34,219.53-219.65,219.53a220.14,220.14,0,0,1-49.13-5.52c-57.24-10.91-90.29-39.78-106.77-59.38-9.45-11.23-13.46-19.42-13.46-19.42,51.28,18.37,108,14.53,142.47-4.52,34.75-19.26,55.77-33.55,72.84-27.92,16.82,5.61,30.21-10.67,18.2-27.54-11.77-16.85-42.4-41-87.88-34.29-34.79,5.07-66.66,29.76-112.24,5.84a92.59,92.59,0,0,1-8.55-5c-3-1.77,9.77,2.69,6.79.68-8.87-4.32-24.57-13.73-28.64-17.07-.68-.56,6.88,2.16,6.2,1.6-42.62-31.45-37.3-52.69-36-66,1.07-10.66,8.81-24.32,21.86-29.86,6.3,3.08,10.23,5.43,10.23,5.43s-2.69-4.92-4.14-7.51c.51-.19,1-.15,1.5-.34,5.16,2.23,16.58,8,22.59,11.57,7.83,4.95,10.32,9.36,10.32,9.36s2.06-1,.54-5.33c-.56-1.77-2.93-7.39-10.68-13.07h.48a91.65,91.65,0,0,1,13.13,8.17c2.19-7.12,6.12-14.56,5.25-27.86-.53-9.35-.28-11.78-2.12-15.39-1.65-3.1.92-4.31,3.78-1.09a29.87,29.87,0,0,0-2.44-7.34v-.24c3.57-11.14,75.53-40.12,80.77-43.51a70.12,70.12,0,0,0,21.17-20.63c4-5.72,7-13.73,7.75-25.89.25-5.48-1.44-9.82-20.5-14-11.44-2.49-29.14-4.91-56.43-7.47-19.9-1.76-31.58-14.68-38.21-26.6-1.21-2.57-2.45-4.9-3.68-7.22A53.41,53.41,0,0,1,355.9,256a158.47,158.47,0,0,1,61.28-76.06c1.6-1.31-6.4.33-4.8-1,1.87-1.52,14.06-5.93,16.37-6.92,2.81-1.19-12-6.84-25.16-5.47-13.36,1.35-16.19,2.78-23.32,5.49,3-2.64,12.37-6.1,10.16-6.08-14.4,2-32.3,9.48-47.6,18a9.75,9.75,0,0,1,.92-4.31c-7.13,2.71-24.64,13.67-29.73,23a39.79,39.79,0,0,0,.29-5.35,89,89,0,0,0-14.6,13.7l-.27.22c-41.3-14.95-77.69-15.91-108.44-9.2-6.74-6.06-17.57-15.23-32.89-45.4-1-1.82-1.6,3.75-2.4,2-6-13.81-9.55-36.44-9-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.87-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.37,12.62-1.38,4-3.32,6.27-4.56,11.29l-.29.46c-.1-1.48.37-6.08,0-5.14a237,237,0,0,0-12.31,29.84c-5.49,18-11.88,42.61-12.89,74.57-.24,2.42,0,5.14-.25,7.32C69.2,283,60.34,295.54,57,302.06,40.18,328,21.66,368.49,3.71,432.52a319.8,319.8,0,0,1,28.54-50C17.32,416.51,2.89,469.88,0,552.05a437.48,437.48,0,0,1,13.87-50.24c-2.58,54.8,3.81,122.74,38.45,199.39,20.57,45.09,67.92,136.65,183.62,208.1h0s39.36,29.3,107,51.26c5,1.81,10.06,3.6,15.23,5.33q-2.43-1-4.71-2a484.42,484.42,0,0,0,138.8,20.4c175.18.15,226.85-70.2,226.85-70.2l-.51.38q3.71-3.48,7.14-7.26c-27.63,26.12-90.74,27.84-114.29,26,40.22-11.81,66.69-21.81,118.17-41.52q9-3.36,18.48-7.64l2-.94c1.25-.58,2.49-1.13,3.75-1.74a348.86,348.86,0,0,0,70.26-44c51.7-41.3,63-81.56,68.83-108.1-.82,2.54-3.37,8.47-5.17,12.32-13.31,28.48-42.84,46-74.91,61A689.46,689.46,0,0,0,855.3,740C865.77,729.65,869,713.41,876.85,702.49Z" style="fill:url(#radial-gradient)"/><path d="M813.92,801.24c21.08-23.24,40-49.82,54.35-80,36.9-77.58,94-206.58,49-341.31C881.77,273.48,833,215.25,771.11,158.38,670.56,66,642.48,24.78,642.48.26c0,0-116.09,129.41-65.74,264.38s153.46,130,221.68,270.87c80.27,165.74-64.95,346.61-185,397.24,7.35-1.63,267-60.38,280.61-208.88C893.68,726.6,887.83,767.67,813.92,801.24Z" style="fill:url(#linear-gradient-7)"/><path d="M477.59,319.63c.39-8.77-4.16-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.64,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.64-2.13,2.39-2.91,13.86-14.43,71.94-36.42,77.39-39.54C453.69,363.42,476.58,346.69,477.59,319.63Z" style="fill:url(#linear-gradient-8)"/><path d="M477.59,319.63c.39-8.77-4.16-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.64,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.64-2.13,2.39-2.91,13.86-14.43,71.94-36.42,77.39-39.54C453.69,363.42,476.58,346.69,477.59,319.63Z" style="fill:url(#linear-gradient-9)"/><path d="M158.31,156.73c-1-1.82-1.6,3.75-2.4,2-6-13.81-9.58-36.2-8.72-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.86-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.35,12.38-1.65,4.24-3.35,6.52-4.61,11.77-.39,1.43.39-6.32,0-5.38C84.72,201.94,80.19,271.23,82.69,268.3,133.17,214.4,191,201.62,191,201.62c-6.15-4.53-19.53-17.63-32.7-44.89Z" style="fill:url(#linear-gradient-10)"/><path d="M349.84,720.36c-69.72-29.77-149-71.75-146-167.14C207.92,427.6,321,452.43,321,452.43c-4.27,1-15.68,9.16-19.72,17.82-4.27,10.83-12.07,35.28,11.55,60.9,37.09,40.19-76.2,95.36,98.66,199.57,4.41,2.4-41-1.43-61.64-10.36Z" style="fill:url(#linear-gradient-11)"/><path d="M325.07,657.76c49.44,17.21,107,14.19,141.52-4.86,23.09-12.85,52.7-33.43,70.92-28.35-15.78-6.24-27.73-9.15-42.1-9.86-2.45,0-5.38-.05-8-.32a138.21,138.21,0,0,0-15.76.86c-8.9.82-18.77,6.43-27.74,5.53-.48,0,8.7-3.77,8-3.61-4.75,1-9.92,1.21-15.37,1.88-3.47.39-6.45.82-9.89,1-103,8.73-190-55.81-190-55.81-7.41,25,33.17,74.3,88.52,93.57Z" style="fill:url(#linear-gradient-12)"/><path d="M813.74,801.9C917.9,699.63,970.6,575.32,948.32,435.9c0,0,8.9,71.5-24.85,144.63,16.21-71.39,18.1-160.11-25-252C841,205.89,746.45,141.37,710.35,114.45,655.66,73.66,633,32.13,632.57,23.55c-16.34,33.48-65.77,148.2-5.31,247,56.64,92.56,145.86,120,208.33,205C950.67,631.92,813.74,801.9,813.74,801.9Z" style="fill:url(#linear-gradient-13)"/><path d="M798.81,535.81c-36.4-75.2-81.84-108-124.81-143.55,5,7,6.23,9.47,9,14,37.83,40.32,93.61,138.66,53.11,262.11C659.88,900.74,355,791.31,323,760.58c12.93,134.49,238,198.84,384.6,111.63C791,793.26,858.47,659,798.81,535.81Z" style="fill:url(#linear-gradient-14)"/><path d="M814.12,686.64l.94-4.85c.32-1.75.75-3.6,1-5.61.61-4,1.38-8.47,1.87-13.43a237.9,237.9,0,0,0,1.48-35A223.29,223.29,0,0,0,813.6,584a232.05,232.05,0,0,0-17.42-48.75,336.56,336.56,0,0,0-29.59-49.81c-5.8-8.24-12.31-16.18-19.09-24.06S733.27,446,725.58,438.59,709.75,424,701.44,417s-16.85-14-25.36-21-17-14.14-25.3-21.61-16.23-15.28-23.73-23.51a243.77,243.77,0,0,1-20.75-26l-2.3-3.42c-.79-1.13-1.57-2.27-2.28-3.45l-4.37-7c-1.44-2.34-2.72-4.77-4.08-7.14l-2-3.57c-.66-1.2-1.24-2.43-1.86-3.64l-3.67-7.29c-1.14-2.46-2.22-4.94-3.34-7.4-2.31-4.88-4.12-9.94-6.13-14.88l-.74-1.86-.64-1.9-1.27-3.79c-.83-2.52-1.71-5-2.49-7.54l-2-7.63-1-3.8c-.36-1.26-.53-2.55-.8-3.82a212.28,212.28,0,0,1-3.8-59.83,261.53,261.53,0,0,1,10.19-53.46,310.75,310.75,0,0,1,17-44.06,373.62,373.62,0,0,1,18.17-33.81,366.73,366.73,0,0,1,24.69-36c2.56-3.27,5.11-6.43,7.66-9.35a1,1,0,0,1,1.31,0,1,1,0,0,1,.17,1.29c-2.42,2.81-5,6-7.55,9.3a376,376,0,0,0-43,70.76,309.24,309.24,0,0,0-16.54,43.94,256.66,256.66,0,0,0-9.66,53,213.15,213.15,0,0,0,4.27,58.87c.13.63.24,1.26.38,1.88l.49,1.86,1,3.73c.68,2.48,1.28,5,2,7.48l2.49,7.4,1.25,3.72c.41,1.24,1,2.45,1.42,3.67l2.94,7.35.74,1.84.82,1.81,1.64,3.63,1.64,3.64c.55,1.21,1.08,2.44,1.7,3.62l3.63,7.16a247.86,247.86,0,0,0,37.41,53.14c7.43,8.06,15.32,15.72,23.5,23.07s16.66,14.36,25.13,21.33,17,13.82,25.32,20.84,16.44,14.16,24.23,21.51,15.15,15,22.09,22.84a287.17,287.17,0,0,1,19.3,24.16,341.24,341.24,0,0,1,30,50.05l.79,1.55.72,1.58,1.44,3.14c.94,2.09,1.93,4.15,2.81,6.23l2.51,6.25L808.8,555c.39,1,.73,2.08,1.1,3.12l2.15,6.17c.37,1,.68,2,1,3.07l.91,3.07c.59,2,1.23,4,1.77,6.06l1.48,6A227.32,227.32,0,0,1,823.32,627,241.84,241.84,0,0,1,822,662.8c-1.06,10.17-2.69,18.44-3.92,24.66a282.32,282.32,0,0,1-9.88,35.23,298.31,298.31,0,0,1-12.74,30.91c-4.59,9.51-9.21,18.33-14,26.26l-1.73,3L778,785.72l-3.45,5.54c-2.34,3.55-4.57,7-6.77,10.15-4.42,6.36-8.57,12-12.3,16.73l-5.27,6.59-4.57,5.37-2,2.26-1.76,1.93q-1.64,1.8-2.79,3c-1.52,1.59-2.37,2.37-2.47,2.28s.57-1.07,1.94-2.88,3.49-4.39,6.08-7.84C749.93,822,757.43,812,766,799c2.08-3.28,4.3-6.7,6.51-10.34s4.5-7.43,6.7-11.46q6.82-12,13.38-26.17c1.06-2.37,2.2-4.74,3.23-7.2l3.12-7.46c2-5.08,4-10.27,5.8-15.67A292.34,292.34,0,0,0,814.12,686.64Z" style="fill:url(#linear-gradient-15)"/><path d="M739.36,650c.52-2.06,1.32-4.8,2-8.22s1.74-7.41,2.49-12c.4-2.29.87-4.71,1.29-7.26l1.11-8,.29-2.11.22-2.16.44-4.45c.14-1.51.32-3,.43-4.59l.28-4.75a262.14,262.14,0,0,0-.93-41.93l-.27-2.79-.37-2.79-.75-5.61c-.23-1.88-.61-3.74-.92-5.63s-.61-3.77-1-5.65l-1.17-5.64c-.2-.94-.38-1.89-.6-2.82l-.68-2.81-1.37-5.61-1.55-5.56a272.56,272.56,0,0,0-15.87-42.08,267.22,267.22,0,0,0-19.66-34.4c-3.27-4.92-6.59-9.3-9.61-13.26s-6-7.34-8.54-10.2l-1.86-2.06-.45-.5a1.5,1.5,0,0,1-.3-.4l-.18-.29-.64-1.08L679,401.57c-1.32-2.18-2.34-3.71-2.92-4.59-.8-1.19-1.6-2.35-2.36-3.45a1,1,0,0,1,.3-1.27.94.94,0,0,1,1.3.14c.77,1.07,1.59,2.24,2.43,3.46.65,1,1.75,2.59,3.14,4.85l2.31,3.82.64,1a.24.24,0,0,0,.09.11l.22.24.46.5,1.92,2.1a222.87,222.87,0,0,1,18.55,23.67,269.68,269.68,0,0,1,20,34.53A274,274,0,0,1,741.32,509l1.6,5.59,1.42,5.64.71,2.82.62,2.84,1.22,5.67c.39,1.89.69,3.79,1,5.68s.72,3.77,1,5.66l.8,5.65.39,2.81.29,2.81a264.72,264.72,0,0,1,1.26,42.32,258,258,0,0,1-3.87,33.84C747,635,746,639,745.29,642.53s-1.51,6.33-2.06,8.47l-1.66,6.3-1.86,6-1.8,5.72c-.63,1.85-1.27,3.64-1.9,5.38-2.54,6.94-5.14,13-7.49,17.84-4.71,9.79-8.32,15.14-8.77,14.89s2.33-6.26,6.35-16.34c2-5,4.28-11.11,6.57-18,.57-1.72,1.15-3.49,1.71-5.31l1.66-5.6,1.74-5.82Z" style="fill:url(#linear-gradient-16)"/><path d="M716.89,368.69c-2.35-1.89-5.54-4.37-9.35-7.54L701.31,356c-2.24-1.86-4.58-3.92-7.09-6.07a404.29,404.29,0,0,1-34.4-33.24,292.74,292.74,0,0,1-35.56-48c-1.31-2.31-2.66-4.62-4-7l-3.62-7.22-.91-1.81c-.29-.61-.55-1.24-.82-1.86l-1.63-3.74-1.63-3.75c-.51-1.26-1-2.55-1.45-3.83l-1.44-3.84c-.49-1.28-1-2.56-1.36-3.88L605,224l-2.1-8c-.37-1.32-.66-2.66-.94-4l-.85-4a223.53,223.53,0,0,1-4.1-32.31,249.74,249.74,0,0,1,.42-31.43A279.77,279.77,0,0,1,601.11,115c1.69-9.27,3.71-18,5.86-26.11A361.71,361.71,0,0,1,620.25,49c4.07-10.17,7.26-17,8.51-19.69.86-1.85,1.72-3.65,2.56-5.35a1,1,0,0,1,1.25-.35,1,1,0,0,1,.51,1.2c-.79,1.65-1.65,3.47-2.51,5.34C629.22,33,626,40,622,50.24a363.43,363.43,0,0,0-13,39.91A298,298,0,0,0,600,145a250.51,250.51,0,0,0-.18,31,222.27,222.27,0,0,0,4.27,31.68l.86,3.94.43,2,.52,1.95,2.11,7.79,2.48,7.67c.38,1.29.88,2.53,1.36,3.79l1.43,3.75c.49,1.25.93,2.51,1.45,3.74l1.62,3.66,1.61,3.65c.27.6.52,1.22.82,1.81l.9,1.77,3.58,7,3.91,6.79a290.31,290.31,0,0,0,35.21,47,402,402,0,0,0,34.17,32.77c2.51,2.13,4.85,4.18,7.09,6l6.26,5.13c3.82,3.17,7.07,5.68,9.47,7.62l26.81,21.21c8.08,6.44,15.15,12.25,20.91,17.2l7.67,6.72c2.2,2,4,3.78,5.55,5.22,3,2.89,4.51,4.56,4.33,4.76s-2.1-1.14-5.47-3.73L765,405.83l-21.46-16.5C735.35,383.09,726.32,376.21,716.89,368.69Z" style="fill:url(#linear-gradient-17)"/><path d="M925.73,401.72c-.5-1.87-1-4.07-1.73-6.54s-1.49-5.25-2.42-8.28l-1.51-4.73c-.52-1.65-1.07-3.36-1.71-5.1l-4-11.24-2.17-6.14-2.5-6.4-2.62-6.71c-.92-2.28-1.75-4.64-2.8-7L898,325c-2.29-5-4.76-10.1-7.25-15.38l-.94-2-1-2-2.06-4-4.19-8.06c-.69-1.37-1.45-2.71-2.22-4.05l-2.34-4-4.68-8.24-5.08-8.21-2.57-4.15c-.43-.69-.85-1.4-1.3-2.08l-1.38-2c-3.7-5.45-7.31-11.08-11.36-16.47-2-2.72-4-5.49-6-8.21l-6.3-8.15c-1.06-1.35-2.1-2.72-3.19-4.05l-3.32-4-6.69-8-7-7.79c-1.17-1.29-2.3-2.62-3.5-3.88l-3.59-3.8c-2.4-2.53-4.77-5.09-7.2-7.59l-7.37-7.42c-2.43-2.49-4.95-4.89-7.45-7.3s-5-4.83-7.5-7.19l-15.09-14c-10-9.2-19.77-18.32-29.12-27.29-18.7-17.93-35.79-35.19-50-51s-25.56-30.19-32.86-42a104.24,104.24,0,0,1-8-15.28,54.94,54.94,0,0,1-3-9.2,36.36,36.36,0,0,1-1-7.28,1,1,0,0,0-1-.84.91.91,0,0,0-1,.85V1a37.31,37.31,0,0,0,1,7.67,57.38,57.38,0,0,0,3.22,9.94,107.1,107.1,0,0,0,8.33,15.83,230.52,230.52,0,0,0,14,19.82c5.57,7.13,12,14.72,19.12,22.68,14.24,15.91,31.27,33.23,49.86,51.19,9.29,9,19,18.12,28.92,27.33l14.93,14,7.39,7.17c2.47,2.39,4.94,4.79,7.34,7.27l7.26,7.38,7.09,7.55,3.54,3.78c1.16,1.27,2.29,2.58,3.44,3.86l6.83,7.73,6.57,7.89,3.27,3.93c1.07,1.33,2.09,2.68,3.14,4l6.21,8c2,2.7,3.94,5.44,5.9,8.14,4,5.34,7.52,10.92,11.16,16.31,1.85,2.67,3.46,5.48,5.15,8.2l5,8.13,4.6,8.16c1.49,2.71,3.07,5.33,4.45,8l4.11,8,2,3.92c.68,1.3,1.34,2.59,1.93,3.9a545.2,545.2,0,0,1,23.28,55.87L914.51,378l.9,2.58.79,2.5,1.5,4.72c.93,3,1.68,5.8,2.41,8.28s1.23,4.7,1.74,6.6l.73,2.83.65,2.83,1.29,5.58c.73,3.71,1.57,7.32,2.16,10.9l1,5.29.8,5.19c.57,3.41.93,6.76,1.38,10,1.6,13,2.24,24.61,2.54,34.24.52,19.29-.2,30.75.45,30.8h0c.25,0,.71-2.93,1.26-8.34s1-13.29,1.09-23.12A307.49,307.49,0,0,0,925.73,401.72Z" style="fill:url(#linear-gradient-18)"/><path d="M577.29,723c1.42-.52,3-1.31,4.85-2.12l6.14-2.78,7.21-3.68,2-1,2-1.14,4.19-2.4c2.91-1.58,5.82-3.54,8.93-5.5s6.22-4.24,9.51-6.53c1.66-1.13,3.26-2.4,4.9-3.69l5-3.91,5-4.28c1.68-1.45,3.42-2.9,5-4.51l5-4.78c1.69-1.63,3.29-3.39,5-5.11l2.51-2.62c.84-.88,1.61-1.83,2.43-2.74l4.88-5.61a242.24,242.24,0,0,0,18-25.16,239.39,239.39,0,0,0,14.82-28.69,234.94,234.94,0,0,0,10.5-31.1,232.14,232.14,0,0,0,5.68-32.06c.41-5.35.94-10.64,1-15.9.23-5.25.11-10.45,0-15.57a236.67,236.67,0,0,0-2.93-29.45c-.69-4.68-1.68-9.19-2.58-13.59l-1.55-6.44c-.48-2.12-1.14-4.16-1.69-6.19l-.85-3c-.29-1-.62-2-.93-2.93l-1.83-5.67-2-5.37-1-2.59-1-2.49-2-4.8c-.67-1.54-1.37-3-2-4.46s-1.27-2.85-1.93-4.17l-1.93-3.83a211.15,211.15,0,0,0-10.73-18.7l-3.29-5a1,1,0,0,1,.15-1.11l.43-.16h-.49l.45-.16a.93.93,0,0,1,1.06.28l3.36,5a212.54,212.54,0,0,1,11.2,19.34,218.69,218.69,0,0,1,15.71,39.84c1.24,4.07,2.22,8.36,3.31,12.75l1.4,6.74c.25,1.14.46,2.29.65,3.45l.59,3.51a248.2,248.2,0,0,1,3.05,29.66l.18,7.79v3.94l-.09,4c0,5.3-.55,10.65-.91,16a219.8,219.8,0,0,1-49,118.39l-4.91,5.71c-.82.93-1.6,1.89-2.44,2.79l-2.53,2.66c-1.69,1.75-3.31,3.53-5,5.21l-5,4.93c-.85.79-1.65,1.62-2.51,2.37l-2.57,2.24-5,4.37-5.07,4c-1.67,1.3-3.27,2.63-5,3.78l-4.88,3.48c-.8.56-1.58,1.14-2.37,1.68L615,707.49c-3.17,2-6.11,4-9.08,5.66l-4.27,2.46-2,1.17c-.67.37-1.36.71-2,1.05l-7.39,3.79c-2.3,1.09-4.43,2-6.32,2.89s-3.55,1.67-5,2.21a205.44,205.44,0,0,1-33.27,10.63c-2.58.56-5.07,1.13-7.5,1.63L531,740.15l-3.35.54-3.24.36-6.06.64c-1.92.24-3.76.29-5.49.38l-4.87.22c-3,.18-5.62,0-7.73,0-4.22-.13-6.5-.34-6.5-.62s2.36-.57,6.64-.92c2.14-.18,4.76-.3,7.8-.7l4.87-.53,2.66-.28c.91-.1,1.84-.27,2.8-.41,3.81-.62,8-1.07,12.49-2l6.94-1.36,7.31-1.78A231.31,231.31,0,0,0,577.29,723Z" style="fill:url(#linear-gradient-19)"/><path d="M351.94,263c1-2.74,2.18-6,3.6-9.69s3.21-7.86,5.47-12.36a162.23,162.23,0,0,1,19.1-30.7A152.53,152.53,0,0,1,415,177.78c1.84-1.25,3.77-2.43,5.74-3.6l1.49-.86.54-.31.19-.1.32-.17h.09c.12,0,0,0-.06-.07h-.1l-.42-.09q-3.41-.72-6.93-1.23a126.12,126.12,0,0,0-29.7-.78,112.84,112.84,0,0,0-26.45,5.73,102,102,0,0,0-13.72,6c-4.56,2.42-9.26,5.06-14,7.77s-9.53,5.59-14.28,8.68c-1.2.76-2.38,1.55-3.56,2.35s-2.36,1.61-3.52,2.45a76.69,76.69,0,0,0-6.73,5.32c-.5.48-1,1-1.48,1.46l-.35.37-.39.47c-.09.15-.25.22-.3.42h-.17l-.09,0-.19.1-.69.37a3,3,0,0,1-.64.26c-.27.07-.56.33-.86.12l-1.51-.56-2.09-.74c-2.8-1-5.65-1.88-8.52-2.77Q278,205.69,269,203.64l-.79-.18-.85-.2a190.45,190.45,0,0,0-29.58-4.16,132,132,0,0,0-30.22,2.23c-5,.87-10,2-15,3.22s-9.91,2.68-14.8,4.23A239.93,239.93,0,0,0,149.18,220,209.57,209.57,0,0,0,99,252.6a177.19,177.19,0,0,0-19.89,20.65c-1.53,1.77-2.89,3.67-4.3,5.51s-2.71,3.75-4,5.63L66.89,290c-1.28,1.87-2.6,3.69-3.75,5.61l-7,11.19L49.8,317.89c-1.07,1.8-2,3.64-3,5.46L44,328.78c-.92,1.79-1.88,3.53-2.74,5.3l-2.54,5.26c-3.43,6.89-6.32,13.63-9.14,20-2.65,6.39-5.18,12.39-7.29,18.05s-4,10.9-5.76,15.66-3.11,9.09-4.27,12.91l-1.66,5.29-1.32,4.46c-.81,2.68-1.38,4.79-1.79,6.25-1,3.42-1.84,6.8-2.62,10a1,1,0,0,1-1.15.61A.92.92,0,0,1,3,431.48v0c.76-3.15,1.62-6.58,2.6-10.08.43-1.6,1-3.84,1.88-6.64l1.36-4.63,1.69-5.44c.59-2,1.27-4,2-6.22s1.48-4.52,2.33-6.95c1.73-4.84,3.57-10.18,5.8-15.87S25.3,363.85,28,357.41l4.35-9.84c.73-1.69,1.52-3.38,2.35-5.08l2.48-5.17L39.67,332l2.77-5.32,2.82-5.43c.48-.91.94-1.84,1.45-2.75l1.55-2.73c2.09-3.65,4.15-7.4,6.37-11.14l7-11.26c.58-1,1.22-1.89,1.86-2.82l1.92-2.81,3.89-5.67,2-2.86,2.11-2.8,2.13-2.81c.72-.93,1.49-1.83,2.24-2.75A181,181,0,0,1,97.91,250a204.59,204.59,0,0,1,23.81-18,230.67,230.67,0,0,1,26.75-14.8,240,240,0,0,1,58.82-18.93c5.09-.9,10.2-1.62,15.34-2.05,1.28-.11,2.57-.21,3.86-.27s2.58-.12,3.87-.14c2.58,0,5.14.08,7.7.13a194.48,194.48,0,0,1,30,4.12l.86.2.81.18q9.07,2,17.83,4.67c2.91.89,5.79,1.8,8.64,2.78l2.13.75.62.22c.11,0,.13.06.18,0l.1-.14.28-.34.41-.44c.54-.61,1.11-1.11,1.67-1.66a78.53,78.53,0,0,1,7-5.58c1.19-.86,2.38-1.71,3.59-2.51s2.4-1.63,3.61-2.4c4.81-3.15,9.64-6,14.39-8.81s9.43-5.39,14.09-7.89a104.82,104.82,0,0,1,14.19-6.25,116.45,116.45,0,0,1,27.36-6,129.84,129.84,0,0,1,30.39.7q3.62.51,7.13,1.23c.35.07,1.77.37,2.79.62s2.17.53,3.13.83l2.93.87,1.45.44.3.1.16,0H434l-.85.38-3.37,1.53-.84.38c-.28.13-.57.26-.77.37l-1.33.7-1.33.69-.66.35-.32.17-.18.1-1.43.83c-1,.54-1.88,1.13-2.81,1.7s-1.84,1.16-2.73,1.76a148.58,148.58,0,0,0-33.92,31.52,159.38,159.38,0,0,0-18.71,30c-2.22,4.44-3.86,8.6-5.41,12.24s-2.62,6.94-3.6,9.7a232.16,232.16,0,0,0-8.08,30A198.75,198.75,0,0,0,344,322.27a127.54,127.54,0,0,0,.92,25.09l.47,2.85c.15.94.3,1.87.54,2.79.44,1.83.8,3.64,1.32,5.37s.92,3.45,1.46,5.1,1,3.27,1.55,4.83A274.52,274.52,0,0,0,362,397.06c3.09,6.56,4.88,10.07,4.63,10.22s-2.53-3.27-6.14-9.81a212.22,212.22,0,0,1-13.21-29c-1.15-3.19-2.27-6.57-3.3-10.15-.52-1.79-1-3.65-1.44-5.52s-.73-3.87-1.11-5.87a131.29,131.29,0,0,1-1.09-25.76,189.56,189.56,0,0,1,3.59-28.37A227.44,227.44,0,0,1,351.94,263Z" style="fill:url(#linear-gradient-20)"/><g style="opacity:0.25"><path d="M915.07,657.63l2.85-6.3,4-9.2,4.75-11.72,2.52-6.71c.86-2.32,1.8-4.7,2.62-7.19,1.7-5,3.56-10.18,5.18-15.68.82-2.75,1.77-5.52,2.53-8.38l2.36-8.69c.85-2.92,1.46-5.92,2.17-8.93l1-4.53c.36-1.51.71-3,1-4.57l1.74-9.24.43-2.32.34-2.33.69-4.66c1-6.19,1.55-12.42,2.24-18.53.44-6.13,1-12.15,1.12-18,.46-11.7.34-22.7-.22-32.32a283.63,283.63,0,0,0-4.08-36.28c-.21-1.15-.43-2.28-.65-3.34a1,1,0,0,1,.77-1,.92.92,0,0,1,1.14.63h0c.23,1,.48,2.2.7,3.38a287,287,0,0,1,4.51,36.94c.13,2.42.32,4.92.4,7.5l.24,8c0,5.44.12,11.14-.13,17-.09,5.88-.58,11.93-1,18.08-.64,6.13-1.12,12.39-2.08,18.62l-.64,4.68-.32,2.34-.42,2.33-1.66,9.3c-.25,1.55-.6,3.08-.94,4.6l-1,4.56c-.69,3-1.28,6.05-2.1,9l-2.29,8.75c-.36,1.45-.79,2.86-1.21,4.26l-1.25,4.18-1.23,4.1-.61,2-.66,2-2.57,7.7a445.76,445.76,0,0,1-16.62,41.7c-11.91,26.19-23.65,43.64-24.6,43S903.6,682.92,915.07,657.63Z" style="fill:#fff"/></g><g style="opacity:0.25"><path d="M779.41,865.32c5-3,16.85-10,31.16-20.3l5.49-4,5.63-4.28,2.9-2.2,2.88-2.32,5.87-4.75,5.84-5c2-1.69,4-3.39,5.82-5.18s3.73-3.64,5.59-5.48,3.59-3.81,5.27-5.82a140,140,0,0,0,9.53-12.29,147.13,147.13,0,0,0,8-12.74,169.73,169.73,0,0,0,11.32-24.49A158.72,158.72,0,0,0,892.63,727c.15-1,.3-1.91.41-2.81a1,1,0,0,1,1.07-.74.92.92,0,0,1,.87,1v0c-.1.9-.23,1.88-.38,2.88a161.08,161.08,0,0,1-7.79,30.28,171.81,171.81,0,0,1-11.21,24.91,151.5,151.5,0,0,1-8,13,143.71,143.71,0,0,1-9.54,12.57c-1.68,2.06-3.51,4-5.29,6a78.84,78.84,0,0,1-5.63,5.64c-1.95,1.79-3.87,3.58-5.82,5.3l-5.81,5.12L829.67,835l-2.86,2.37-2.89,2.24L818.3,844c-1.85,1.4-3.7,2.72-5.48,4-14.29,10.46-26.22,17.71-31.39,20.8-20.72,12.39-37.24,18.66-37.67,17.61-.2-.47,3.73-2.72,10.19-6.37S769.43,871.27,779.41,865.32Z" style="fill:#fff"/></g><g style="opacity:0.25"><path d="M518.09,981.82l6.73-.27,9.74-.6c7.4-.51,16.5-1.28,26.66-2.52,1.27-.15,2.56-.27,3.86-.46l3.94-.57,8.15-1.18c2.77-.39,5.56-1,8.4-1.46s5.73-1,8.63-1.6l8.75-1.93,4.43-1c1.47-.35,2.93-.77,4.41-1.16l8.85-2.37c.74-.2,1.48-.38,2.21-.61l2.18-.7,4.36-1.41c2.9-1,5.82-1.82,8.68-2.85l8.49-3.14,4.19-1.56,4.1-1.67,8-3.29a270.77,270.77,0,0,0,28.13-14,118.17,118.17,0,0,0,19.1-13.55,49.59,49.59,0,0,0,8-8.69c.3-.46.61-.92.89-1.37a10.55,10.55,0,0,0,.72-1.36,1.05,1.05,0,0,1,1.22-.39c.55.15.71.64.56,1.2a8.18,8.18,0,0,1-.78,1.53,11.59,11.59,0,0,1-1,1.51,52.49,52.49,0,0,1-8.44,9.36,124.32,124.32,0,0,1-19.42,14,279.54,279.54,0,0,1-28.23,14.4l-8,3.37-4.09,1.72-4.19,1.6-8.45,3.2c-2.86,1-5.79,2-8.7,2.94l-4.38,1.46-2.19.73-2.22.63-8.87,2.47c-1.48.4-2.94.84-4.42,1.2l-4.43,1-8.77,2c-2.9.63-5.8,1.13-8.65,1.68s-5.65,1.13-8.42,1.55L569.66,981c-2.67.42-5.28.83-7.83,1.11-10.2,1.33-19.35,2.18-26.82,2.76l-9.87.67-6.89.3c-28,1.17-48.35-1.16-48.24-2.29S491.06,983,518.09,981.82Z" style="fill:#fff"/></g><path d="M155.86,160.77l-1.92-3.17c-.67-1.32-1.53-2.79-2.33-4.54A76.5,76.5,0,0,1,147,139.64,117.38,117.38,0,0,1,144,120q-.21-2.84-.31-5.89v-2.17h0l-.09.09-.09.1-.45.5c-1.5,1.68-3,3.43-4.56,5.24-4.08,4.77-8.43,10.15-12.83,16s-8.84,12.16-13,18.82c-2.14,3.3-4.08,6.77-6.06,10.21l-2.78,5.28c-.48.87-.9,1.77-1.31,2.67l-1.25,2.7a150.27,150.27,0,0,0-8,21.95c-2,7.28-3.66,14.35-4.93,20.92s-2.16,12.65-2.85,18c-1.33,10.61-1.78,18.1-1.91,20.49l-.16,3.35a1,1,0,0,1-1,.83.93.93,0,0,1-1-.85v0c0-1.06.07-2.21.12-3.39.12-2.63.5-10.29,1.76-21,.64-5.37,1.53-11.49,2.71-18.13s2.79-13.77,4.77-21.13a149.36,149.36,0,0,1,7.78-22.29l1.24-2.75.62-1.38.69-1.35,2.76-5.38c2-3.5,3.9-7,6-10.38,4.15-6.77,8.54-13.19,12.93-19.11s8.7-11.4,12.77-16.27c1.54-1.83,3.05-3.6,4.55-5.3l.68-.77,1.06-1.17,2.11-2.32,2.07-2.23,1-1.11.25-.26.12-.12v1c-.06,2.15-.18,4.38-.16,6.33V114q.1,2.94.33,5.7a113.79,113.79,0,0,0,3,18.89A72.43,72.43,0,0,0,155,151.33c.34.85.79,1.57,1.15,2.28l1.05,2,1.9,3.13c3.67,5.91,7.49,11.2,11,15.9s6.66,8.8,9.31,12.2c5.3,6.8,8.45,10.86,8,11.24s-4.4-3.19-10.36-9.65c-3-3.23-6.43-7.2-10.1-11.82A169.38,169.38,0,0,1,155.86,160.77Z" style="fill:url(#linear-gradient-21)"/><path d="M205.1,584.1c-.35-1.58-.67-3.73-1.13-6.35-.25-1.31-.43-2.74-.61-4.3l-.6-5a142.7,142.7,0,0,1,.09-25.65A151.74,151.74,0,0,1,209,511.5a99.91,99.91,0,0,1,6.59-16,81.94,81.94,0,0,1,22.32-26.87l3.43-2.59c1.14-.85,2.35-1.59,3.51-2.38l1.75-1.16c.59-.37,1.2-.71,1.79-1.07l3.56-2.09a81.56,81.56,0,0,1,28.77-8.82,122.24,122.24,0,0,1,22.47-.45c5.84.42,9.8,1.07,11.38,1.32,1.08.18,2.13.37,3.13.58a1,1,0,0,1-.39,1.92c-.94-.18-2-.35-3.06-.52-1.69-.25-5.7-.85-11.5-1.19a119.36,119.36,0,0,0-22.12.74A78.89,78.89,0,0,0,253,461.85c-2.26,1.39-4.63,2.69-6.85,4.28-1.11.78-2.29,1.49-3.37,2.35L239.51,471a78.82,78.82,0,0,0-21.08,26,97.19,97.19,0,0,0-6.17,15.5A148.72,148.72,0,0,0,206.55,543a139.8,139.8,0,0,0,.09,24.89l.61,4.86c.19,1.52.36,2.93.61,4.21.47,2.57.79,4.7,1.14,6.28,1.31,6.35,2.86,12.2,4.4,17.41s3.11,9.75,4.52,13.49c2.73,7.52,4.67,11.87,4.17,12.15s-3.37-3.86-6.85-11.32a132.29,132.29,0,0,1-5.42-13.49c-.86-2.62-1.78-5.38-2.53-8.31S205.8,587.26,205.1,584.1Z" style="fill:url(#linear-gradient-22)"/></g></g></g></g></svg>
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/themes/images/aboutdebugging-firefox-beta.svg
+++ /dev/null
@@ -1,1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 961 984"><defs><radialGradient id="radial-gradient" cx="-14492.05" cy="9293.61" fx="-14520.816138719447" r="450.88" gradientTransform="matrix(0.76, 0.03, 0.05, -1.12, 11486.51, 11147.86)" gradientUnits="userSpaceOnUse"><stop offset="0.05" stop-color="#ffea00"/><stop offset="0.12" stop-color="#ffde00"/><stop offset="0.25" stop-color="#ffbf00"/><stop offset="0.43" stop-color="#ff8e00"/><stop offset="0.77" stop-color="#ff272d"/><stop offset="0.87" stop-color="#e0255a"/><stop offset="0.95" stop-color="#cc2477"/><stop offset="1" stop-color="#c42482"/></radialGradient><radialGradient id="radial-gradient-2" cx="-7586.92" cy="8863.48" r="791.23" gradientTransform="matrix(1.23, 0, 0, -1.23, 9957.22, 11055.45)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00ccda"/><stop offset="0.22" stop-color="#0083ff"/><stop offset="0.26" stop-color="#007af9"/><stop offset="0.33" stop-color="#0060e8"/><stop offset="0.33" stop-color="#005fe7"/><stop offset="0.44" stop-color="#2639ad"/><stop offset="0.52" stop-color="#401e84"/><stop offset="0.57" stop-color="#4a1475"/></radialGradient><linearGradient id="linear-gradient" x1="540.64" y1="254.8" x2="349.2" y2="881.03" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000f43" stop-opacity="0.4"/><stop offset="0.48" stop-color="#001962" stop-opacity="0.17"/><stop offset="1" stop-color="#002079" stop-opacity="0"/></linearGradient><radialGradient id="radial-gradient-3" cx="-8337.18" cy="7467.65" r="266.89" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.12, 10764.8)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffea00"/><stop offset="0.5" stop-color="#ff272d"/><stop offset="1" stop-color="#c42482"/></radialGradient><radialGradient id="radial-gradient-4" cx="-8361.33" cy="7723.56" r="445.68" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.12, 10764.8)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffe900"/><stop offset="0.16" stop-color="#ffaf0e"/><stop offset="0.32" stop-color="#ff7a1b"/><stop offset="0.47" stop-color="#ff4e26"/><stop offset="0.62" stop-color="#ff2c2e"/><stop offset="0.76" stop-color="#ff1434"/><stop offset="0.89" stop-color="#ff0538"/><stop offset="1" stop-color="#ff0039"/></radialGradient><radialGradient id="radial-gradient-5" cx="-8298.29" cy="7310.42" r="408.96" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.12, 10764.8)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff272d"/><stop offset="0.5" stop-color="#c42482"/><stop offset="0.99" stop-color="#620700"/></radialGradient><radialGradient id="radial-gradient-6" cx="715.19" cy="589.96" fx="743.1665035759797" fy="576.1323859732546" r="782.18" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0.16" stop-color="#ffea00"/><stop offset="0.23" stop-color="#ffde00"/><stop offset="0.37" stop-color="#ffbf00"/><stop offset="0.54" stop-color="#ff8e00"/><stop offset="0.76" stop-color="#ff272d"/><stop offset="0.8" stop-color="#f92433"/><stop offset="0.84" stop-color="#e91c45"/><stop offset="0.89" stop-color="#cf0e62"/><stop offset="0.94" stop-color="#b5007f"/></radialGradient><radialGradient id="radial-gradient-7" cx="656.34" cy="982.71" r="923.62" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0.28" stop-color="#ffea00"/><stop offset="0.4" stop-color="#fd0"/><stop offset="0.63" stop-color="#ffba00"/><stop offset="0.86" stop-color="#ff9100"/><stop offset="0.93" stop-color="#ff6711"/><stop offset="0.99" stop-color="#ff4a1d"/></radialGradient><linearGradient id="linear-gradient-2" x1="-9022.89" y1="7636.68" x2="-8738.53" y2="7709.17" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.12, 10764.8)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c42482" stop-opacity="0.5"/><stop offset="0.47" stop-color="#ff272d" stop-opacity="0.5"/><stop offset="0.49" stop-color="#ff2c2c" stop-opacity="0.51"/><stop offset="0.68" stop-color="#ff7a1a" stop-opacity="0.72"/><stop offset="0.83" stop-color="#ffb20d" stop-opacity="0.87"/><stop offset="0.94" stop-color="#ffd605" stop-opacity="0.96"/><stop offset="1" stop-color="#ffe302"/></linearGradient><linearGradient id="linear-gradient-3" x1="188.87" y1="2080.93" x2="134.3" y2="2220.78" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, -250.06, 2305.85)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#891551" stop-opacity="0.6"/><stop offset="1" stop-color="#c42482" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-4" x1="-38.43" y1="277.74" x2="55.68" y2="170.86" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.07, 745.44)" gradientUnits="userSpaceOnUse"><stop offset="0.01" stop-color="#891551" stop-opacity="0.5"/><stop offset="0.48" stop-color="#ff272d" stop-opacity="0.5"/><stop offset="1" stop-color="#ff272d" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-5" x1="142.43" y1="93.37" x2="142.5" y2="168.15" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.07, 745.44)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c42482"/><stop offset="0.08" stop-color="#c42482" stop-opacity="0.81"/><stop offset="0.21" stop-color="#c42482" stop-opacity="0.57"/><stop offset="0.33" stop-color="#c42482" stop-opacity="0.36"/><stop offset="0.45" stop-color="#c42482" stop-opacity="0.2"/><stop offset="0.56" stop-color="#c42482" stop-opacity="0.09"/><stop offset="0.67" stop-color="#c42482" stop-opacity="0.02"/><stop offset="0.77" stop-color="#c42482" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-6" x1="620.52" y1="947.88" x2="926.18" y2="264.39" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff14f"/><stop offset="0.27" stop-color="#ffee4c"/><stop offset="0.45" stop-color="#ffe643"/><stop offset="0.61" stop-color="#ffd834"/><stop offset="0.76" stop-color="#ffc41e"/><stop offset="0.89" stop-color="#ffab02"/><stop offset="0.9" stop-color="#ffa900"/><stop offset="0.95" stop-color="#ffa000"/><stop offset="1" stop-color="#ff9100"/></linearGradient><linearGradient id="linear-gradient-7" x1="680.88" y1="554.79" x2="536.1" y2="166.04" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff8e00"/><stop offset="0.04" stop-color="#ff8e00" stop-opacity="0.86"/><stop offset="0.08" stop-color="#ff8e00" stop-opacity="0.73"/><stop offset="0.13" stop-color="#ff8e00" stop-opacity="0.63"/><stop offset="0.18" stop-color="#ff8e00" stop-opacity="0.56"/><stop offset="0.23" stop-color="#ff8e00" stop-opacity="0.51"/><stop offset="0.28" stop-color="#ff8e00" stop-opacity="0.5"/><stop offset="0.39" stop-color="#ff8e00" stop-opacity="0.48"/><stop offset="0.52" stop-color="#ff8e00" stop-opacity="0.42"/><stop offset="0.68" stop-color="#ff8e00" stop-opacity="0.31"/><stop offset="0.84" stop-color="#ff8e00" stop-opacity="0.17"/><stop offset="1" stop-color="#ff8e00" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-8" x1="348" y1="163" x2="949" y2="163" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#04fcee"/><stop offset="1" stop-color="#23e832"/></linearGradient></defs><title>firefox-logo-beta</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="Layer_2-2" data-name="Layer 2"><g id="BETA"><path d="M770.28,91.56c-23.94,27.88-35.09,90.64-10.81,154.25s61.49,49.8,84.7,114.68c30.62,85.6,16.37,200.59,16.37,200.59s36.81,106.6,62.47-6.64C979.79,341.74,770.28,143.94,770.28,91.56Z" style="fill:url(#radial-gradient)"/><path id="_Path_" data-name=" Path " d="M478.07,974.64c245.24,0,443.9-199.74,443.9-446s-198.66-446-443.66-446S34.65,282.32,34.65,528.61C34.18,775.14,233.07,974.64,478.07,974.64Z" style="fill:url(#radial-gradient-2)"/><path d="M810.67,803.64a245.54,245.54,0,0,1-30.12,18.18,707.66,707.66,0,0,0,38.3-63c9.46-10.47,18.12-20.65,25.19-31.65,3.43-5.41,7.31-12.08,11.41-19.82,24.92-44.9,52.41-117.57,53.18-192.21v-5.65a257.26,257.26,0,0,0-5.72-55.75c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.36,2,.66,4,1,6,5.1,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.38,2.09-151.6,0,0-4.19-25.38-35.38-102.44-18-44.35-49.83-80.72-78-107.21-24.69-30.55-47.11-51-59.48-64.06-25.82-27.19-36.64-47.57-41.08-60.87-3.86-1.93-53.14-49.8-57-51.63-21.51,33.35-89.16,137.68-57,235.15,14.58,44.17,51.46,90,90.06,115.74,1.7,1.93,23,25,33.09,77.15,10.45,53.85,5,95.86-16.54,158C641.75,681.23,577,735.11,516.31,740.62c-129.67,11.78-177.14-65.11-177.14-65.11C385.5,694,436.73,690.16,467.89,671c31.4-19.43,50.39-33.83,65.81-28.15C548.86,648.43,561,632,550.1,615a78.5,78.5,0,0,0-79.4-34.57c-31.43,5.11-60.22,30-101.41,5.89a82.13,82.13,0,0,1-7.73-5.06c-2.71-1.78,8.83,2.72,6.13.69-8-4.36-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.14-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.19.9-.15,1.36-.34,4.66,2.25,15,8.1,20.4,11.67,7.08,5,9.33,9.43,9.33,9.43s1.86-1,.49-5.37c-.51-1.78-2.65-7.45-9.66-13.18h.44A82.16,82.16,0,0,1,374.41,478c2-7.18,5.53-14.67,4.74-28.09-.47-9.43-.25-11.87-1.92-15.51-1.48-3.13.84-4.35,3.42-1.1a32.35,32.35,0,0,0-2.21-7.4v-.25c3.22-11.23,68.24-40.46,73-43.87A67.59,67.59,0,0,0,470.57,361c3.62-5.76,6.34-13.84,7-26.11.35-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.52-26.82-1.1-2.59-2.21-4.94-3.33-7.28a57.68,57.68,0,0,1-2.56-8.43c10.75-30.88,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.19-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.13a10.84,10.84,0,0,1,.84-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.29,44.29,0,0,0,.27-5.4,84.17,84.17,0,0,0-13.19,13.82l-.25.22c-37.35-15-70.23-16-98-9.27-6.08-6.12-9.06-1.65-22.91-32.07-.94-1.84.73,1.81,0,0-2.27-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.62,53.89-.18.58,17.15-4.9,0,0-6,1.71-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.23,7.38-11.75,15-19.75,27.64-22.77,34.21-15.2,26.18-31.93,67-48.15,131.55A333,333,0,0,1,75.2,398.36c-13.49,34.27-26.53,88.08-29.14,170.95a484.57,484.57,0,0,1,12.53-50.66A473.24,473.24,0,0,0,93.33,719.71c9.33,22.82,24.76,57.46,51,95.4C226.9,902,343.31,956,472.21,956,606.79,956,727.64,897.13,810.67,803.64Z" style="fill:url(#linear-gradient)"/><path d="M711.1,866.71c162.87-18.86,235-186.7,142.38-190C769.85,674,634,875.61,711.1,866.71Z" style="fill:url(#radial-gradient-3)"/><path d="M865.21,642.42c112-65.21,82.84-206.08,82.84-206.08s-43.25,50.24-72.63,130.32C846.4,646,797.84,681.81,865.21,642.42Z" style="fill:url(#radial-gradient-4)"/><path d="M509.47,950.06C665.7,999.91,800,876.84,717.21,835.74,642,798.68,435.32,926.49,509.47,950.06Z" style="fill:url(#radial-gradient-5)"/><path d="M876.85,702.23c3.8-5.36,8.94-22.53,13.48-30.21,27.58-44.52,27.78-80,27.78-80.83C934.76,508,933.25,474,923,411.14c-8.25-50.6-44.32-123.09-75.57-158-32.2-36-9.52-24.25-40.69-50.52-27.33-30.29-53.83-60.29-68.26-72.36C634.22,43.09,636.57,24.58,638.58,21.42c-.34.37-.84.92-1.47,1.64C635.87,18.14,635,14,635,14s-57,57-69,152c-7.83,62,15.38,126.68,49,168a381.62,381.62,0,0,0,59,58h0c25.4,36.48,39.38,81.49,39.38,129.91,0,121.25-98.34,219.53-219.65,219.53a220.81,220.81,0,0,1-49.14-5.51C387.36,725,354.3,696.12,337.82,676.51c-9.45-11.23-13.46-19.42-13.46-19.42,51.28,18.37,108,14.53,142.46-4.52,34.75-19.26,55.78-33.54,72.84-27.91,16.82,5.6,30.21-10.67,18.2-27.54-11.77-16.84-42.4-41-87.88-34.29-34.79,5.07-66.66,29.76-112.24,5.85a97.34,97.34,0,0,1-8.55-5c-3-1.77,9.76,2.69,6.78.68-8.87-4.32-24.57-13.73-28.64-17.07-.68-.56,6.88,2.16,6.21,1.6-42.63-31.45-37.3-52.69-36-66,1.07-10.66,8.81-24.32,21.86-29.86,6.3,3.08,10.22,5.44,10.22,5.44s-2.69-4.92-4.14-7.52c.51-.19,1-.14,1.5-.34,5.17,2.24,16.58,8,22.59,11.57,7.83,4.95,10.32,9.36,10.32,9.36s2.06-1,.54-5.33c-.56-1.77-2.93-7.39-10.68-13.06l.48.05a89.38,89.38,0,0,1,13.13,8.17c2.19-7.12,6.12-14.56,5.26-27.86-.53-9.35-.29-11.78-2.13-15.39-1.64-3.1.93-4.31,3.79-1.08a30.4,30.4,0,0,0-2.45-7.35v-.24c3.57-11.14,75.53-40.12,80.77-43.51a70.24,70.24,0,0,0,21.17-20.63c4-5.72,7-13.73,7.75-25.9.25-5.48-1.44-9.81-20.49-14-11.44-2.49-29.14-4.91-56.44-7.48-19.9-1.75-31.57-14.67-38.21-26.6-1.21-2.56-2.44-4.89-3.68-7.22a53.41,53.41,0,0,1-2.83-8.36c11.9-30.62,31.89-56.5,61.28-76.06,1.6-1.31-6.4.33-4.8-1,1.87-1.53,14.06-5.93,16.37-6.92,2.81-1.19-12.05-6.84-25.16-5.47-13.36,1.35-16.2,2.78-23.33,5.49,3-2.64,12.37-6.1,10.16-6.08-14.4,2-32.29,9.48-47.59,18a9.59,9.59,0,0,1,.92-4.31c-7.13,2.71-24.64,13.68-29.73,22.95a38.21,38.21,0,0,0,.29-5.35,89,89,0,0,0-14.6,13.7l-.27.22C258.14,196,221.75,195,191,201.72c-6.73-6.06-17.56-15.22-32.89-45.4-1-1.81-1.6,3.76-2.4,2-6-13.81-9.55-36.44-9-52,0,0-12.32,5.61-22.52,29.06-1.89,4.21-3.1,6.54-4.32,8.86-.55.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.37,12.62-1.39,4-3.33,6.27-4.57,11.28l-.29.46c-.09-1.47.37-6.08,0-5.13A236.91,236.91,0,0,0,95.34,186c-5.49,18-11.88,42.61-12.89,74.57-.25,2.42,0,5.13-.25,7.31-13,14.84-21.86,27.4-25.2,33.92-16.81,26-35.33,66.44-53.28,130.46a319.29,319.29,0,0,1,28.53-50C17.32,416.25,2.89,469.62,0,551.8a436.92,436.92,0,0,1,13.87-50.24C11.29,556.36,17.68,624.3,52.32,701c20.57,45,67.92,136.6,183.62,208h0s39.36,29.3,107,51.26c5,1.81,10.06,3.6,15.23,5.33-1.62-.65-3.19-1.34-4.71-2A485.2,485.2,0,0,0,492.27,984c175.18.15,226.85-70.2,226.85-70.2l-.52.38q3.72-3.49,7.15-7.25C698.11,933,635,934.76,611.45,932.87c40.22-11.81,66.69-21.8,118.17-41.52q9-3.35,18.48-7.64c.68-.3,1.37-.62,2-.94,1.25-.58,2.49-1.13,3.75-1.74a348.86,348.86,0,0,0,70.26-44c51.71-41.29,63-81.55,68.83-108.09-.82,2.54-3.37,8.47-5.17,12.31-13.31,28.49-42.84,46-74.91,61a689.15,689.15,0,0,0,42.39-62.44C865.77,729.39,869,713.15,876.85,702.23Z" style="fill:url(#radial-gradient-6)"/><path d="M813.92,801c21.08-23.24,40-49.82,54.35-80,36.9-77.58,94-206.58,49-341.3C881.77,273.22,833,215,771.11,158.12,670.56,65.76,642.48,24.52,642.48,0c0,0-116.09,129.41-65.74,264.38s153.46,130,221.68,270.88c80.27,165.74-64.95,346.61-185,397.23,7.35-1.63,267-60.38,280.61-208.88C893.68,726.34,887.83,767.41,813.92,801Z" style="fill:url(#radial-gradient-7)"/><path d="M477.59,319.37c.4-8.77-4.15-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.63,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.63-2.13,2.39-2.91,13.86-14.43,71.93-36.42,77.39-39.54C453.69,363.16,476.58,346.44,477.59,319.37Z" style="fill:url(#linear-gradient-2)"/><path d="M158.31,156.47c-1-1.82-1.6,3.76-2.4,2-5.95-13.81-9.57-36.2-8.72-52,0,0-12.31,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.86-.56.68,1.27-7.7,1-7.24-1.77,3-6.35,7.19-8.34,12.38-1.65,4.24-3.35,6.51-4.62,11.77-.38,1.43.4-6.32.06-5.38C84.72,201.68,80.19,271,82.69,268,133.17,214.14,191,201.36,191,201.36c-6.15-4.53-19.52-17.62-32.7-44.89Z" style="fill:url(#linear-gradient-3)"/><path d="M349.84,720.1c-69.72-29.77-149-71.75-146-167.13C207.92,427.35,321,452.18,321,452.18c-4.27,1-15.68,9.16-19.72,17.82-4.27,10.82-12.07,35.27,11.55,60.89,37.09,40.2-76.2,95.36,98.66,199.57,4.41,2.4-41-1.43-61.64-10.36Z" style="fill:url(#linear-gradient-4)"/><path d="M325.07,657.5c49.45,17.21,107,14.19,141.53-4.85,23.08-12.86,52.7-33.44,70.92-28.36-15.78-6.23-27.73-9.15-42.1-9.86a69.59,69.59,0,0,1-8.05-.32,136,136,0,0,0-15.76.86c-8.89.82-18.76,6.44-27.73,5.54-.49,0,8.7-3.78,7.95-3.61-4.75,1-9.91,1.21-15.37,1.88-3.47.39-6.45.82-9.89,1-103,8.74-190-55.81-190-55.81-7.41,25,33.17,74.3,88.52,93.57Z" style="fill:url(#linear-gradient-5)"/><path d="M813.74,801.65c104.16-102.27,156.86-226.59,134.58-366,0,0,8.91,71.5-24.85,144.63,16.22-71.4,18.1-160.12-25-252C841,205.64,746.45,141.11,710.35,114.19,655.66,73.4,633,31.87,632.57,23.3c-16.34,33.47-65.76,148.2-5.31,247,56.64,92.57,145.87,120,208.33,205C950.67,631.67,813.74,801.65,813.74,801.65Z" style="fill:url(#linear-gradient-6)"/><path d="M798.81,535.55C762.41,460.35,717,427.55,674,392c5,7,6.23,9.47,9,14,37.83,40.32,93.61,138.66,53.11,262.11C659.88,900.48,355,791.06,323,760.32,335.93,894.81,561,959.16,707.6,872,791,793,858.47,658.79,798.81,535.55Z" style="fill:url(#linear-gradient-7)"/><image width="625" height="290" transform="translate(336 680)" xlink:href="data:image/png;base64,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" style="opacity:0.5;isolation:isolate"/><path d="M881,954H348V756a68,68,0,0,1,68-68H949V886A68,68,0,0,1,881,954Z" style="fill:url(#linear-gradient-8)"/><path d="M531.35,855.62c0,33.13-26.38,43.38-63,43.38H423V748.36h39.46c38.8,0,62.35,10.9,62.35,38.37,0,18.75-13.52,29.43-27.91,32.48C514.12,822.48,531.35,830.55,531.35,855.62Zm-79.57-86.11v40.76h17.65c15.7,0,25.95-7,25.95-21.14,0-15.26-10.47-19.62-30.09-19.62Zm49.48,85c0-18.1-12.86-24.2-29.65-24.2H451.78V877.4h16.78c19,0,32.7-3.91,32.7-22.87Z" style="fill:#002d3e"/><path d="M643.37,769.72H587.78V811.8h48.39v21.36H587.78v44.26h59.51V899H559V748.36h87.42Z" style="fill:#002d3e"/><path d="M771.78,771.25H732.54V899h-29V771.25H663V748.36H774.83Z" style="fill:#002d3e"/><path d="M854.16,864.12H804.24L794.87,899H765l46.87-150.64H847.4L894.06,899H863.54Zm-5.66-21.8-19.41-71.94-19.18,71.94Z" style="fill:#002d3e"/></g></g></g></g></svg>
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/themes/images/aboutdebugging-firefox-nightly.svg
+++ /dev/null
@@ -1,1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 953.37 984"><defs><linearGradient id="linear-gradient" x1="-14706.28" y1="9250.14" x2="-14443.04" y2="9250.14" gradientTransform="matrix(0.76, 0.03, 0.05, -1.12, 11485.47, 11148)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0083ff"/><stop offset="0.1" stop-color="#0092f8"/><stop offset="0.31" stop-color="#00abeb"/><stop offset="0.52" stop-color="#00bee1"/><stop offset="0.75" stop-color="#00c8dc"/><stop offset="1" stop-color="#00ccda"/></linearGradient><radialGradient id="radial-gradient" cx="-7588.66" cy="8866.53" r="791.23" gradientTransform="matrix(1.23, 0, 0, -1.22, 9958.21, 11048.11)" gradientUnits="userSpaceOnUse"><stop offset="0.02" stop-color="#005fe7"/><stop offset="0.18" stop-color="#0042b4"/><stop offset="0.32" stop-color="#002989"/><stop offset="0.4" stop-color="#002079"/><stop offset="0.47" stop-color="#131d78"/><stop offset="0.66" stop-color="#3b1676"/><stop offset="0.75" stop-color="#4a1475"/></radialGradient><linearGradient id="linear-gradient-2" x1="539.64" y1="254.8" x2="348.2" y2="881.03" gradientTransform="matrix(1, 0, 0, -1, 1, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000f43" stop-opacity="0.4"/><stop offset="0.48" stop-color="#001962" stop-opacity="0.17"/><stop offset="1" stop-color="#002079" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-3" x1="540.64" y1="254.8" x2="349.2" y2="881.03" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" xlink:href="#linear-gradient-2"/><linearGradient id="linear-gradient-4" x1="-8367.12" y1="7348.87" x2="-8482.36" y2="7357.76" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10241.06, 10765.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#812cc9"/><stop offset="1" stop-color="#005fe7"/></linearGradient><linearGradient id="linear-gradient-5" x1="-8449.89" y1="7496.97" x2="-8341.94" y2="7609.09" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10241.06, 10765.32)" gradientUnits="userSpaceOnUse"><stop offset="0.05" stop-color="#005fe7"/><stop offset="0.18" stop-color="#065de6"/><stop offset="0.35" stop-color="#1856e1"/><stop offset="0.56" stop-color="#354adb"/><stop offset="0.78" stop-color="#5d3ad1"/><stop offset="0.95" stop-color="#812cc9"/></linearGradient><linearGradient id="linear-gradient-6" x1="-8653.41" y1="7245.3" x2="-8422.52" y2="7244.76" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10241.06, 10765.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#002079"/><stop offset="0.99" stop-color="#a238ff"/></linearGradient><radialGradient id="radial-gradient-2" cx="644.11" cy="599.83" fx="785.0454815336918" fy="470.6889181532662" r="793.95" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0.2" stop-color="#00fdff"/><stop offset="0.26" stop-color="#0af1ff"/><stop offset="0.37" stop-color="#23d2ff"/><stop offset="0.52" stop-color="#4da0ff"/><stop offset="0.69" stop-color="#855bff"/><stop offset="0.77" stop-color="#a238ff"/><stop offset="0.81" stop-color="#a738fd"/><stop offset="0.86" stop-color="#b539f9"/><stop offset="0.9" stop-color="#cd39f1"/><stop offset="0.96" stop-color="#ee3ae6"/><stop offset="0.98" stop-color="#ff3be0"/></radialGradient><linearGradient id="linear-gradient-7" x1="-7458.97" y1="9093.17" x2="-7531.06" y2="8282.84" gradientTransform="matrix(1.23, 0, 0, -1.22, 9958.21, 11048.11)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00ec00"/><stop offset="0.1" stop-color="#00e244"/><stop offset="0.22" stop-color="#00d694"/><stop offset="0.31" stop-color="#00cfc7"/><stop offset="0.35" stop-color="#00ccda"/><stop offset="0.42" stop-color="#0bc2dd" stop-opacity="0.92"/><stop offset="0.57" stop-color="#29a7e4" stop-opacity="0.72"/><stop offset="0.77" stop-color="#597df0" stop-opacity="0.4"/><stop offset="1" stop-color="#9448ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-8" x1="-8926.61" y1="7680.53" x2="-8790.14" y2="7680.53" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10241.06, 10765.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#005fe7"/><stop offset="0.46" stop-color="#0071f3" stop-opacity="0.51"/><stop offset="0.83" stop-color="#007efc" stop-opacity="0.14"/><stop offset="1" stop-color="#0083ff" stop-opacity="0"/></linearGradient><radialGradient id="radial-gradient-3" cx="-8914.62" cy="7721.05" r="165.97" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10241.06, 10765.32)" gradientUnits="userSpaceOnUse"><stop offset="0.63" stop-color="#ffe302" stop-opacity="0"/><stop offset="0.67" stop-color="#ffe302" stop-opacity="0.05"/><stop offset="0.75" stop-color="#ffe302" stop-opacity="0.19"/><stop offset="0.86" stop-color="#ffe302" stop-opacity="0.4"/><stop offset="0.99" stop-color="#ffe302" stop-opacity="0.7"/></radialGradient><linearGradient id="linear-gradient-9" x1="214.02" y1="2032.47" x2="96.19" y2="2284.31" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, -250.1, 2306.29)" gradientUnits="userSpaceOnUse"><stop offset="0.19" stop-color="#4a1475" stop-opacity="0.5"/><stop offset="0.62" stop-color="#2277ac" stop-opacity="0.23"/><stop offset="0.94" stop-color="#00ccda" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-10" x1="-38.44" y1="278.18" x2="55.67" y2="171.29" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.04, 745.87)" gradientUnits="userSpaceOnUse"><stop offset="0.01" stop-color="#002079" stop-opacity="0.5"/><stop offset="1" stop-color="#0083ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-11" x1="142.45" y1="96.25" x2="142.5" y2="149.68" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.04, 745.87)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#4a1475" stop-opacity="0.9"/><stop offset="0.18" stop-color="#6720a2" stop-opacity="0.6"/><stop offset="0.38" stop-color="#812acb" stop-opacity="0.34"/><stop offset="0.57" stop-color="#9332e8" stop-opacity="0.15"/><stop offset="0.76" stop-color="#9e36f9" stop-opacity="0.04"/><stop offset="0.93" stop-color="#a238ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-12" x1="620.52" y1="947.88" x2="926.18" y2="264.39" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00ec00" stop-opacity="0"/><stop offset="0.28" stop-color="#00dc6d" stop-opacity="0.5"/><stop offset="0.5" stop-color="#00d1bb" stop-opacity="0.86"/><stop offset="0.6" stop-color="#00ccda"/><stop offset="0.68" stop-color="#04c9db"/><stop offset="0.75" stop-color="#0fc1df"/><stop offset="0.83" stop-color="#23b2e6"/><stop offset="0.9" stop-color="#3e9ef0"/><stop offset="0.98" stop-color="#6184fc"/><stop offset="0.99" stop-color="#6680fe"/></linearGradient><linearGradient id="linear-gradient-13" x1="680.88" y1="554.79" x2="536.1" y2="166.04" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0083ff"/><stop offset="0.04" stop-color="#0083ff" stop-opacity="0.92"/><stop offset="0.14" stop-color="#0083ff" stop-opacity="0.71"/><stop offset="0.26" stop-color="#0083ff" stop-opacity="0.52"/><stop offset="0.37" stop-color="#0083ff" stop-opacity="0.36"/><stop offset="0.49" stop-color="#0083ff" stop-opacity="0.23"/><stop offset="0.61" stop-color="#0083ff" stop-opacity="0.13"/><stop offset="0.73" stop-color="#0083ff" stop-opacity="0.06"/><stop offset="0.86" stop-color="#0083ff" stop-opacity="0.01"/><stop offset="1" stop-color="#0083ff" stop-opacity="0"/></linearGradient></defs><title>firefox-logo-nightly</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="Layer_2-2" data-name="Layer 2"><g id="Firefox"><path d="M770.28,91.56c-23.95,27.88-35.1,90.64-10.82,154.26s61.5,49.8,84.7,114.67c30.62,85.6,16.37,200.59,16.37,200.59s36.81,106.61,62.47-6.63C979.79,341.74,770.28,143.94,770.28,91.56Z" style="fill:url(#linear-gradient)"/><path id="_Path_" data-name=" Path " d="M476.92,972.83c245.24,0,443.9-199.74,443.9-446s-198.66-446-443.66-446S33.5,280.51,33.5,526.8C33,773.33,231.92,972.83,476.92,972.83Z" style="fill:url(#radial-gradient)"/><path d="M810.67,803.64a246.8,246.8,0,0,1-30.12,18.18,705.31,705.31,0,0,0,38.3-63c9.46-10.47,18.13-20.65,25.19-31.65,3.44-5.41,7.31-12.08,11.42-19.82,24.92-44.9,52.4-117.56,53.18-192.2v-5.66a257.25,257.25,0,0,0-5.71-55.75c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.37,2,.66,4,1,6,5.09,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.39,2.09-151.6,0,0-4.19-25.38-35.38-102.44-18-44.35-49.83-80.72-78-107.21-24.69-30.55-47.11-51-59.47-64.06C689.72,126,678.9,105.61,674.45,92.31c-3.85-1.93-53.14-49.81-57.05-51.63-21.51,33.35-89.16,137.67-57,235.15,14.58,44.17,51.47,90,90.07,115.74,1.69,1.94,23,25,33.09,77.16,10.45,53.85,5,95.86-16.54,158C641.73,681.24,577,735.12,516.3,740.63c-129.67,11.78-177.15-65.11-177.15-65.11C385.49,694,436.72,690.17,467.87,671c31.4-19.43,50.39-33.83,65.81-28.15C548.86,648.43,561,632,550.1,615a78.5,78.5,0,0,0-79.4-34.57c-31.43,5.11-60.23,30-101.41,5.89a86.29,86.29,0,0,1-7.73-5.06c-2.71-1.79,8.83,2.72,6.13.69-8-4.35-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.13-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.2.9-.15,1.36-.34,4.66,2.25,15,8.1,20.41,11.67,7.07,5,9.33,9.44,9.33,9.44s1.86-1,.48-5.37c-.5-1.78-2.65-7.45-9.65-13.17h.44A81.61,81.61,0,0,1,374.42,478c2-7.18,5.53-14.68,4.75-28.09-.48-9.43-.26-11.87-1.92-15.51-1.49-3.13.83-4.35,3.42-1.1a32.5,32.5,0,0,0-2.21-7.4v-.24c3.23-11.24,68.25-40.46,73-43.88A67.2,67.2,0,0,0,470.59,361c3.62-5.76,6.34-13.85,7-26.11.36-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.53-26.82-1.09-2.59-2.21-4.94-3.33-7.28a57.68,57.68,0,0,1-2.56-8.43c10.75-30.87,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.2-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.12a10.66,10.66,0,0,1,.83-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.29,44.29,0,0,0,.27-5.4,84.17,84.17,0,0,0-13.19,13.82l-.24.22c-37.36-15-70.23-16-98.05-9.28-6.09-6.11-9.06-1.64-22.91-32.07-.94-1.83.72,1.81,0,0-2.28-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.63,53.89-.18.59,17.16-4.9,0,0-6,1.72-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.22,7.38-11.75,15-19.75,27.64-22.78,34.21-15.19,26.18-31.93,67-48.15,131.55A334.82,334.82,0,0,1,75.2,398.36C61.71,432.63,48.67,486.44,46.07,569.3A482.08,482.08,0,0,1,58.6,518.64,473,473,0,0,0,93.33,719.71c9.33,22.82,24.76,57.46,51,95.4C226.9,902,343.31,956,472.21,956,606.79,956,727.64,897.13,810.67,803.64Z" style="fill:url(#linear-gradient-2)"/><path d="M810.67,803.64a246.8,246.8,0,0,1-30.12,18.18,705.31,705.31,0,0,0,38.3-63c9.46-10.47,18.13-20.65,25.19-31.65,3.44-5.41,7.31-12.08,11.42-19.82,24.92-44.9,52.4-117.56,53.18-192.2v-5.66a257.25,257.25,0,0,0-5.71-55.75c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.37,2,.66,4,1,6,5.09,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.39,2.09-151.6,0,0-4.19-25.38-35.38-102.44-18-44.35-49.83-80.72-78-107.21-24.69-30.55-47.11-51-59.47-64.06C689.72,126,678.9,105.61,674.45,92.31c-3.85-1.93-53.14-49.81-57.05-51.63-21.51,33.35-89.16,137.67-57,235.15,14.58,44.17,51.47,90,90.07,115.74,1.69,1.94,23,25,33.09,77.16,10.45,53.85,5,95.86-16.54,158C641.73,681.24,577,735.12,516.3,740.63c-129.67,11.78-177.15-65.11-177.15-65.11C385.49,694,436.72,690.17,467.87,671c31.4-19.43,50.39-33.83,65.81-28.15C548.86,648.43,561,632,550.1,615a78.5,78.5,0,0,0-79.4-34.57c-31.43,5.11-60.23,30-101.41,5.89a86.29,86.29,0,0,1-7.73-5.06c-2.71-1.79,8.83,2.72,6.13.69-8-4.35-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.13-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.2.9-.15,1.36-.34,4.66,2.25,15,8.1,20.41,11.67,7.07,5,9.33,9.44,9.33,9.44s1.86-1,.48-5.37c-.5-1.78-2.65-7.45-9.65-13.17h.44A81.61,81.61,0,0,1,374.42,478c2-7.18,5.53-14.68,4.75-28.09-.48-9.43-.26-11.87-1.92-15.51-1.49-3.13.83-4.35,3.42-1.1a32.5,32.5,0,0,0-2.21-7.4v-.24c3.23-11.24,68.25-40.46,73-43.88A67.2,67.2,0,0,0,470.59,361c3.62-5.76,6.34-13.85,7-26.11.36-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.53-26.82-1.09-2.59-2.21-4.94-3.33-7.28a57.68,57.68,0,0,1-2.56-8.43c10.75-30.87,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.2-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.12a10.66,10.66,0,0,1,.83-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.29,44.29,0,0,0,.27-5.4,84.17,84.17,0,0,0-13.19,13.82l-.24.22c-37.36-15-70.23-16-98.05-9.28-6.09-6.11-9.06-1.64-22.91-32.07-.94-1.83.72,1.81,0,0-2.28-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.63,53.89-.18.59,17.16-4.9,0,0-6,1.72-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.22,7.38-11.75,15-19.75,27.64-22.78,34.21-15.19,26.18-31.93,67-48.15,131.55A334.82,334.82,0,0,1,75.2,398.36C61.71,432.63,48.67,486.44,46.07,569.3A482.08,482.08,0,0,1,58.6,518.64,473,473,0,0,0,93.33,719.71c9.33,22.82,24.76,57.46,51,95.4C226.9,902,343.31,956,472.21,956,606.79,956,727.64,897.13,810.67,803.64Z" style="fill:url(#linear-gradient-3)"/><path d="M711.1,866.71c162.87-18.86,235-186.7,142.38-190C769.85,674,634,875.61,711.1,866.71Z" style="fill:url(#linear-gradient-4)"/><path d="M865.21,642.42C977.26,577.21,948,436.34,948,436.34s-43.25,50.24-72.62,130.32C846.4,646,797.84,681.81,865.21,642.42Z" style="fill:url(#linear-gradient-5)"/><path d="M509.47,950.06C665.7,999.91,800,876.84,717.21,835.74,642,798.68,435.32,926.49,509.47,950.06Z" style="fill:url(#linear-gradient-6)"/><path d="M638.58,21.42l.53-.57A1.7,1.7,0,0,0,638.58,21.42ZM876.85,702.23c3.8-5.36,8.94-22.53,13.48-30.21,27.58-44.52,27.78-80,27.78-80.84,16.66-83.22,15.15-117.2,4.9-180-8.25-50.6-44.32-123.09-75.57-158-32.2-36-9.51-24.25-40.69-50.52-27.33-30.29-53.82-60.29-68.25-72.36C634.22,43.09,636.57,24.58,638.58,21.42c-.34.37-.84.92-1.47,1.64C635.87,18.14,635,14,635,14s-57,57-69,152c-7.83,62,15.38,126.68,49,168a381.62,381.62,0,0,0,59,58h0c25.4,36.48,39.38,81.49,39.38,129.91,0,121.24-98.34,219.53-219.65,219.53a220.14,220.14,0,0,1-49.13-5.52c-57.24-10.92-90.3-39.8-106.78-59.41-9.45-11.23-13.46-19.42-13.46-19.42,51.28,18.37,108,14.53,142.47-4.52,34.75-19.26,55.77-33.55,72.84-27.92,16.82,5.61,30.21-10.67,18.2-27.54-11.77-16.85-42.4-41-87.88-34.29-34.79,5.07-66.66,29.76-112.24,5.84a97.34,97.34,0,0,1-8.55-5c-3-1.77,9.77,2.69,6.79.68-8.87-4.32-24.57-13.73-28.64-17.07-.68-.56,6.88,2.16,6.2,1.6-42.62-31.45-37.3-52.69-36-66,1.07-10.66,8.81-24.32,21.86-29.86,6.3,3.08,10.23,5.43,10.23,5.43s-2.69-4.92-4.14-7.51c.51-.19,1-.15,1.5-.34,5.16,2.23,16.58,8,22.59,11.57,7.83,4.95,10.32,9.36,10.32,9.36s2.06-1,.54-5.33c-.56-1.77-2.93-7.39-10.68-13.07h.48a91.65,91.65,0,0,1,13.13,8.17c2.19-7.12,6.12-14.56,5.25-27.86-.53-9.35-.28-11.78-2.12-15.39-1.65-3.1.92-4.31,3.78-1.09a29.73,29.73,0,0,0-2.44-7.34v-.24c3.57-11.14,75.53-40.12,80.77-43.51a70.24,70.24,0,0,0,21.17-20.63c4-5.72,7-13.73,7.75-25.89.25-5.48-1.44-9.82-20.5-14-11.44-2.49-29.14-4.91-56.43-7.47-19.9-1.76-31.58-14.68-38.21-26.6-1.21-2.57-2.45-4.9-3.68-7.22a53.41,53.41,0,0,1-2.83-8.36,158.47,158.47,0,0,1,61.28-76.06c1.6-1.31-6.4.33-4.8-1,1.87-1.52,14.06-5.93,16.37-6.92,2.81-1.19-12-6.84-25.16-5.47-13.36,1.35-16.19,2.78-23.32,5.49,3-2.64,12.37-6.1,10.16-6.08-14.4,2-32.3,9.48-47.6,18a9.72,9.72,0,0,1,.92-4.31c-7.13,2.71-24.64,13.67-29.73,23a39.79,39.79,0,0,0,.29-5.35,88.55,88.55,0,0,0-14.6,13.7l-.27.22C258.14,196,221.75,195,191,201.72c-6.74-6.06-17.57-15.23-32.89-45.4-1-1.82-1.6,3.75-2.4,2-6-13.81-9.55-36.44-9-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.87-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.37,12.62-1.38,4-3.32,6.27-4.56,11.29l-.29.46c-.1-1.48.37-6.08,0-5.14A235.4,235.4,0,0,0,95.34,186c-5.49,18-11.88,42.61-12.89,74.57-.24,2.42,0,5.14-.25,7.32-13,14.83-21.86,27.39-25.2,33.91-16.81,26-35.33,66.44-53.29,130.46a319.35,319.35,0,0,1,28.54-50C17.32,416.25,2.89,469.62,0,551.8a436.92,436.92,0,0,1,13.87-50.24C11.29,556.36,17.68,624.3,52.32,701c20.57,45,67.92,136.6,183.62,208h0s39.36,29.3,107,51.26c5,1.81,10.06,3.6,15.23,5.33q-2.43-1-4.71-2A484.9,484.9,0,0,0,492.27,984c175.18.15,226.85-70.2,226.85-70.2l-.51.38q3.71-3.49,7.14-7.26c-27.64,26.08-90.75,27.84-114.3,26,40.22-11.81,66.69-21.81,118.17-41.52q9-3.36,18.48-7.64l2-.94c1.25-.58,2.49-1.13,3.75-1.74a349.3,349.3,0,0,0,70.26-44c51.7-41.3,63-81.56,68.83-108.1-.82,2.54-3.37,8.47-5.17,12.32-13.31,28.48-42.84,46-74.91,61a689.05,689.05,0,0,0,42.38-62.44C865.77,729.39,869,713.15,876.85,702.23Z" style="fill:url(#radial-gradient-2)"/><path d="M813.92,801c21.08-23.24,40-49.82,54.35-80,36.9-77.58,94-206.58,49-341.31C881.77,273.22,833,215,771.11,158.12,670.56,65.76,642.48,24.52,642.48,0c0,0-116.09,129.41-65.74,264.38s153.46,130,221.68,270.87c80.27,165.74-64.95,346.61-185,397.24,7.35-1.63,267-60.38,280.61-208.88C893.68,726.34,887.83,767.41,813.92,801Z" style="fill:url(#linear-gradient-7)"/><path d="M477.59,319.37c.39-8.77-4.16-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.64,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.64-2.13,2.39-2.91,13.86-14.43,71.94-36.42,77.39-39.54C453.69,363.16,476.58,346.44,477.59,319.37Z" style="fill:url(#linear-gradient-8)"/><path d="M477.59,319.37c.39-8.77-4.16-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.64,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.64-2.13,2.39-2.91,13.86-14.43,71.94-36.42,77.39-39.54C453.69,363.16,476.58,346.44,477.59,319.37Z" style="opacity:0.5;isolation:isolate;fill:url(#radial-gradient-3)"/><path d="M158.31,156.47c-1-1.82-1.6,3.75-2.4,2-6-13.81-9.58-36.2-8.72-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.86-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.35,12.38-1.65,4.24-3.35,6.52-4.61,11.77-.39,1.43.39-6.32,0-5.38C84.72,201.68,80.19,271,82.69,268,133.17,214.14,191,201.36,191,201.36c-6.15-4.53-19.53-17.63-32.7-44.89Z" style="fill:url(#linear-gradient-9)"/><path d="M349.84,720.1c-69.72-29.77-149-71.75-146-167.14C207.92,427.35,321,452.18,321,452.18c-4.27,1-15.68,9.16-19.72,17.82-4.27,10.83-12.07,35.28,11.55,60.9,37.09,40.19-76.2,95.36,98.66,199.57,4.41,2.4-41-1.43-61.64-10.36Z" style="fill:url(#linear-gradient-10)"/><path d="M325.07,657.5c49.44,17.21,107,14.19,141.52-4.86,23.09-12.85,52.7-33.43,70.92-28.35-15.78-6.24-27.73-9.15-42.1-9.86-2.45,0-5.38,0-8-.32a136,136,0,0,0-15.76.86c-8.9.82-18.77,6.43-27.74,5.53-.48,0,8.7-3.77,8-3.61-4.75,1-9.92,1.21-15.37,1.88-3.47.39-6.45.82-9.89,1-103,8.73-190-55.81-190-55.81-7.41,25,33.17,74.3,88.52,93.57Z" style="opacity:0.5;isolation:isolate;fill:url(#linear-gradient-11)"/><path d="M813.74,801.65c104.16-102.27,156.86-226.58,134.58-366,0,0,8.9,71.5-24.85,144.63,16.21-71.39,18.1-160.11-25-252C841,205.64,746.45,141.11,710.35,114.19,655.66,73.4,633,31.87,632.57,23.3c-16.34,33.48-65.77,148.2-5.31,247,56.64,92.56,145.86,120,208.33,205C950.67,631.67,813.74,801.65,813.74,801.65Z" style="fill:url(#linear-gradient-12)"/><path d="M798.81,535.55C762.41,460.35,717,427.55,674,392c5,7,6.23,9.47,9,14,37.83,40.32,93.61,138.66,53.11,262.11C659.88,900.48,355,791.06,323,760.32,335.93,894.81,561,959.16,707.6,872,791,793,858.47,658.79,798.81,535.55Z" style="fill:url(#linear-gradient-13)"/></g></g></g></g></svg>
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/themes/images/aboutdebugging-firefox-release.svg
+++ /dev/null
@@ -1,1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 953.37 984"><defs><radialGradient id="radial-gradient" cx="-14491.11" cy="9293.72" fx="-14519.875714136173" r="450.88" gradientTransform="matrix(0.76, 0.03, 0.05, -1.12, 11485.79, 11147.95)" gradientUnits="userSpaceOnUse"><stop offset="0.1" stop-color="#ffea00"/><stop offset="0.17" stop-color="#ffde00"/><stop offset="0.28" stop-color="#ffbf00"/><stop offset="0.43" stop-color="#ff8e00"/><stop offset="0.77" stop-color="#ff272d"/><stop offset="0.87" stop-color="#e0255a"/><stop offset="0.95" stop-color="#cc2477"/><stop offset="1" stop-color="#c42482"/></radialGradient><radialGradient id="radial-gradient-2" cx="-7587.48" cy="8863.48" r="791.23" gradientTransform="matrix(1.23, 0, 0, -1.23, 9957.91, 11055.45)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00ccda"/><stop offset="0.22" stop-color="#0083ff"/><stop offset="0.26" stop-color="#007af9"/><stop offset="0.33" stop-color="#0060e8"/><stop offset="0.33" stop-color="#005fe7"/><stop offset="0.44" stop-color="#2639ad"/><stop offset="0.52" stop-color="#401e84"/><stop offset="0.57" stop-color="#4a1475"/></radialGradient><linearGradient id="linear-gradient" x1="540.64" y1="254.8" x2="349.2" y2="881.03" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000f43" stop-opacity="0.4"/><stop offset="0.48" stop-color="#001962" stop-opacity="0.17"/><stop offset="1" stop-color="#002079" stop-opacity="0"/></linearGradient><radialGradient id="radial-gradient-3" cx="-8337.74" cy="7467.89" r="266.89" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.78, 10765.16)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffea00"/><stop offset="0.5" stop-color="#ff272d"/><stop offset="1" stop-color="#c42482"/></radialGradient><radialGradient id="radial-gradient-4" cx="-8361.89" cy="7723.8" r="445.68" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.78, 10765.16)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffe900"/><stop offset="0.16" stop-color="#ffaf0e"/><stop offset="0.32" stop-color="#ff7a1b"/><stop offset="0.47" stop-color="#ff4e26"/><stop offset="0.62" stop-color="#ff2c2e"/><stop offset="0.76" stop-color="#ff1434"/><stop offset="0.89" stop-color="#ff0538"/><stop offset="1" stop-color="#ff0039"/></radialGradient><radialGradient id="radial-gradient-5" cx="-8298.85" cy="7310.66" r="408.96" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.78, 10765.16)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff272d"/><stop offset="0.5" stop-color="#c42482"/><stop offset="0.99" stop-color="#620700"/></radialGradient><radialGradient id="radial-gradient-6" cx="715.19" cy="589.96" fx="743.1665035759834" fy="576.1323859732546" r="782.18" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0.16" stop-color="#ffea00"/><stop offset="0.23" stop-color="#ffde00"/><stop offset="0.37" stop-color="#ffbf00"/><stop offset="0.54" stop-color="#ff8e00"/><stop offset="0.76" stop-color="#ff272d"/><stop offset="0.8" stop-color="#f92433"/><stop offset="0.84" stop-color="#e91c45"/><stop offset="0.89" stop-color="#cf0e62"/><stop offset="0.94" stop-color="#b5007f"/></radialGradient><radialGradient id="radial-gradient-7" cx="670.34" cy="952.71" r="891.45" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0.28" stop-color="#ffea00"/><stop offset="0.4" stop-color="#fd0"/><stop offset="0.63" stop-color="#ffba00"/><stop offset="0.86" stop-color="#ff9100"/><stop offset="0.93" stop-color="#ff6711"/><stop offset="0.99" stop-color="#ff4a1d"/></radialGradient><linearGradient id="linear-gradient-2" x1="-9023.45" y1="7636.92" x2="-8716.42" y2="7715.18" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.78, 10765.16)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c42482" stop-opacity="0.5"/><stop offset="0.47" stop-color="#ff272d" stop-opacity="0.5"/><stop offset="0.49" stop-color="#ff2c2c" stop-opacity="0.51"/><stop offset="0.68" stop-color="#ff7a1a" stop-opacity="0.72"/><stop offset="0.83" stop-color="#ffb20d" stop-opacity="0.87"/><stop offset="0.94" stop-color="#ffd605" stop-opacity="0.96"/><stop offset="1" stop-color="#ffe302"/></linearGradient><linearGradient id="linear-gradient-3" x1="188.87" y1="2081.23" x2="134.3" y2="2221.08" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, -250.09, 2306.15)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#891551" stop-opacity="0.6"/><stop offset="1" stop-color="#c42482" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-4" x1="-38.43" y1="278.04" x2="55.68" y2="171.16" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.04, 745.74)" gradientUnits="userSpaceOnUse"><stop offset="0.01" stop-color="#891551" stop-opacity="0.5"/><stop offset="0.48" stop-color="#ff272d" stop-opacity="0.5"/><stop offset="1" stop-color="#ff272d" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-5" x1="142.46" y1="93.68" x2="142.53" y2="168.46" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.04, 745.74)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c42482"/><stop offset="0.08" stop-color="#c42482" stop-opacity="0.81"/><stop offset="0.21" stop-color="#c42482" stop-opacity="0.57"/><stop offset="0.33" stop-color="#c42482" stop-opacity="0.36"/><stop offset="0.45" stop-color="#c42482" stop-opacity="0.2"/><stop offset="0.56" stop-color="#c42482" stop-opacity="0.09"/><stop offset="0.67" stop-color="#c42482" stop-opacity="0.02"/><stop offset="0.77" stop-color="#c42482" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-6" x1="620.52" y1="947.88" x2="926.18" y2="264.39" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff14f"/><stop offset="0.27" stop-color="#ffee4c"/><stop offset="0.45" stop-color="#ffe643"/><stop offset="0.61" stop-color="#ffd834"/><stop offset="0.76" stop-color="#ffc41e"/><stop offset="0.89" stop-color="#ffab02"/><stop offset="0.9" stop-color="#ffa900"/><stop offset="0.95" stop-color="#ffa000"/><stop offset="1" stop-color="#ff9100"/></linearGradient><linearGradient id="linear-gradient-7" x1="680.88" y1="554.79" x2="536.1" y2="166.04" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff8e00"/><stop offset="0.04" stop-color="#ff8e00" stop-opacity="0.86"/><stop offset="0.08" stop-color="#ff8e00" stop-opacity="0.73"/><stop offset="0.13" stop-color="#ff8e00" stop-opacity="0.63"/><stop offset="0.18" stop-color="#ff8e00" stop-opacity="0.56"/><stop offset="0.23" stop-color="#ff8e00" stop-opacity="0.51"/><stop offset="0.28" stop-color="#ff8e00" stop-opacity="0.5"/><stop offset="0.39" stop-color="#ff8e00" stop-opacity="0.48"/><stop offset="0.52" stop-color="#ff8e00" stop-opacity="0.42"/><stop offset="0.68" stop-color="#ff8e00" stop-opacity="0.31"/><stop offset="0.84" stop-color="#ff8e00" stop-opacity="0.17"/><stop offset="1" stop-color="#ff8e00" stop-opacity="0"/></linearGradient></defs><title>firefox-logo</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="Layer_2-2" data-name="Layer 2"><g id="Firefox_-_Large" data-name="Firefox - Large"><path d="M770.28,91.56c-23.95,27.88-35.1,90.64-10.82,154.26s61.5,49.8,84.7,114.67c30.62,85.6,16.37,200.59,16.37,200.59s36.81,106.61,62.47-6.63C979.79,341.74,770.28,143.94,770.28,91.56Z" style="fill:url(#radial-gradient)"/><path id="_Path_" data-name=" Path " d="M478.07,974.64c245.24,0,443.9-199.74,443.9-446s-198.66-446-443.66-446S34.65,282.32,34.65,528.61C34.18,775.14,233.07,974.64,478.07,974.64Z" style="fill:url(#radial-gradient-2)"/><path d="M810.67,803.64a246.8,246.8,0,0,1-30.12,18.18,705.31,705.31,0,0,0,38.3-63c9.46-10.47,18.13-20.65,25.19-31.65,3.44-5.41,7.31-12.08,11.42-19.82,24.92-44.9,52.4-117.56,53.18-192.2v-5.66a257.25,257.25,0,0,0-5.71-55.75c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.37,2,.66,4,1,6,5.09,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.39,2.09-151.6,0,0-4.19-25.38-35.38-102.44-18-44.35-49.83-80.72-78-107.21-24.69-30.55-47.11-51-59.47-64.06C689.72,126,678.9,105.61,674.45,92.31c-3.85-1.93-53.14-49.81-57.05-51.63-21.51,33.35-89.16,137.67-57,235.15,14.58,44.17,51.47,90,90.07,115.74,1.69,1.94,23,25,33.09,77.16,10.45,53.85,5,95.86-16.54,158C641.73,681.24,577,735.12,516.3,740.63c-129.67,11.78-177.15-65.11-177.15-65.11C385.49,694,436.72,690.17,467.87,671c31.4-19.43,50.39-33.83,65.81-28.15C548.86,648.43,561,632,550.1,615a78.5,78.5,0,0,0-79.4-34.57c-31.43,5.11-60.23,30-101.41,5.89a86.29,86.29,0,0,1-7.73-5.06c-2.71-1.79,8.83,2.72,6.13.69-8-4.35-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.13-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.2.9-.15,1.36-.34,4.66,2.25,15,8.1,20.41,11.67,7.07,5,9.33,9.44,9.33,9.44s1.86-1,.48-5.37c-.5-1.78-2.65-7.45-9.65-13.17h.44A81.61,81.61,0,0,1,374.42,478c2-7.18,5.53-14.68,4.75-28.09-.48-9.43-.26-11.87-1.92-15.51-1.49-3.13.83-4.35,3.42-1.1a32.5,32.5,0,0,0-2.21-7.4v-.24c3.23-11.24,68.25-40.46,73-43.88A67.2,67.2,0,0,0,470.59,361c3.62-5.76,6.34-13.85,7-26.11.36-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.53-26.82-1.09-2.59-2.21-4.94-3.33-7.28a57.68,57.68,0,0,1-2.56-8.43c10.75-30.87,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.2-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.12a10.66,10.66,0,0,1,.83-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.29,44.29,0,0,0,.27-5.4,84.17,84.17,0,0,0-13.19,13.82l-.24.22c-37.36-15-70.23-16-98.05-9.28-6.09-6.11-9.06-1.64-22.91-32.07-.94-1.83.72,1.81,0,0-2.28-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.63,53.89-.18.59,17.16-4.9,0,0-6,1.72-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.22,7.38-11.75,15-19.75,27.64-22.78,34.21-15.19,26.18-31.93,67-48.15,131.55A334.82,334.82,0,0,1,75.2,398.36C61.71,432.63,48.67,486.44,46.07,569.3A482.08,482.08,0,0,1,58.6,518.64,473,473,0,0,0,93.33,719.71c9.33,22.82,24.76,57.46,51,95.4C226.9,902,343.31,956,472.21,956,606.79,956,727.64,897.13,810.67,803.64Z" style="fill:url(#linear-gradient)"/><path d="M711.1,866.71c162.87-18.86,235-186.7,142.38-190C769.85,674,634,875.61,711.1,866.71Z" style="fill:url(#radial-gradient-3)"/><path d="M865.21,642.42C977.26,577.21,948,436.34,948,436.34s-43.25,50.24-72.62,130.32C846.4,646,797.84,681.81,865.21,642.42Z" style="fill:url(#radial-gradient-4)"/><path d="M509.47,950.06C665.7,999.91,800,876.84,717.21,835.74,642,798.68,435.32,926.49,509.47,950.06Z" style="fill:url(#radial-gradient-5)"/><path d="M876.85,702.23c3.8-5.36,8.94-22.53,13.48-30.21,27.58-44.52,27.78-80,27.78-80.84,16.66-83.22,15.15-117.2,4.9-180-8.25-50.6-44.32-123.09-75.57-158-32.2-36-9.51-24.25-40.69-50.52-27.33-30.29-53.82-60.29-68.25-72.36C634.22,43.09,636.57,24.58,638.58,21.42c-.34.37-.84.92-1.47,1.64C635.87,18.14,635,14,635,14s-57,57-69,152c-7.83,62,15.38,126.68,49,168a381.62,381.62,0,0,0,59,58h0c25.4,36.48,39.38,81.49,39.38,129.91,0,121.24-98.34,219.53-219.65,219.53a220.14,220.14,0,0,1-49.13-5.52c-57.24-10.92-90.3-39.8-106.78-59.41-9.45-11.23-13.46-19.42-13.46-19.42,51.28,18.37,108,14.53,142.47-4.52,34.75-19.26,55.77-33.55,72.84-27.92,16.82,5.61,30.21-10.67,18.2-27.54-11.77-16.85-42.4-41-87.88-34.29-34.79,5.07-66.66,29.76-112.24,5.84a97.34,97.34,0,0,1-8.55-5c-3-1.77,9.77,2.69,6.79.68-8.87-4.32-24.57-13.73-28.64-17.07-.68-.56,6.88,2.16,6.2,1.6-42.62-31.45-37.3-52.69-36-66,1.07-10.66,8.81-24.32,21.86-29.86,6.3,3.08,10.23,5.43,10.23,5.43s-2.69-4.92-4.14-7.51c.51-.19,1-.15,1.5-.34,5.16,2.23,16.58,8,22.59,11.57,7.83,4.95,10.32,9.36,10.32,9.36s2.06-1,.54-5.33c-.56-1.77-2.93-7.39-10.68-13.07h.48a91.65,91.65,0,0,1,13.13,8.17c2.19-7.12,6.12-14.56,5.25-27.86-.53-9.35-.28-11.78-2.12-15.39-1.65-3.1.92-4.31,3.78-1.09a29.73,29.73,0,0,0-2.44-7.34v-.24c3.57-11.14,75.53-40.12,80.77-43.51a70.24,70.24,0,0,0,21.17-20.63c4-5.72,7-13.73,7.75-25.89.25-5.48-1.44-9.82-20.5-14-11.44-2.49-29.14-4.91-56.43-7.47-19.9-1.76-31.58-14.68-38.21-26.6-1.21-2.57-2.45-4.9-3.68-7.22a53.41,53.41,0,0,1-2.83-8.36,158.47,158.47,0,0,1,61.28-76.06c1.6-1.31-6.4.33-4.8-1,1.87-1.52,14.06-5.93,16.37-6.92,2.81-1.19-12-6.84-25.16-5.47-13.36,1.35-16.19,2.78-23.32,5.49,3-2.64,12.37-6.1,10.16-6.08-14.4,2-32.3,9.48-47.6,18a9.72,9.72,0,0,1,.92-4.31c-7.13,2.71-24.64,13.67-29.73,23a39.79,39.79,0,0,0,.29-5.35,88.55,88.55,0,0,0-14.6,13.7l-.27.22C258.14,196,221.75,195,191,201.72c-6.74-6.06-17.57-15.23-32.89-45.4-1-1.82-1.6,3.75-2.4,2-6-13.81-9.55-36.44-9-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.87-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.37,12.62-1.38,4-3.32,6.27-4.56,11.29l-.29.46c-.1-1.48.37-6.08,0-5.14A235.4,235.4,0,0,0,95.34,186c-5.49,18-11.88,42.61-12.89,74.57-.24,2.42,0,5.14-.25,7.32-13,14.83-21.86,27.39-25.2,33.91-16.81,26-35.33,66.44-53.29,130.46a319.35,319.35,0,0,1,28.54-50C17.32,416.25,2.89,469.62,0,551.8a436.92,436.92,0,0,1,13.87-50.24C11.29,556.36,17.68,624.3,52.32,701c20.57,45,67.92,136.6,183.62,208h0s39.36,29.3,107,51.26c5,1.81,10.06,3.6,15.23,5.33q-2.43-1-4.71-2A484.9,484.9,0,0,0,492.27,984c175.18.15,226.85-70.2,226.85-70.2l-.51.38q3.71-3.49,7.14-7.26c-27.64,26.08-90.75,27.84-114.3,26,40.22-11.81,66.69-21.81,118.17-41.52q9-3.36,18.48-7.64l2-.94c1.25-.58,2.49-1.13,3.75-1.74a349.3,349.3,0,0,0,70.26-44c51.7-41.3,63-81.56,68.83-108.1-.82,2.54-3.37,8.47-5.17,12.32-13.31,28.48-42.84,46-74.91,61a689.05,689.05,0,0,0,42.38-62.44C865.77,729.39,869,713.15,876.85,702.23Z" style="fill:url(#radial-gradient-6)"/><path d="M813.92,801c21.08-23.24,40-49.82,54.35-80,36.9-77.58,94-206.58,49-341.31C881.77,273.22,833,215,771.11,158.12,670.56,65.76,642.48,24.52,642.48,0c0,0-116.09,129.41-65.74,264.38s153.46,130,221.68,270.87c80.27,165.74-64.95,346.61-185,397.24,7.35-1.63,267-60.38,280.61-208.88C893.68,726.34,887.83,767.41,813.92,801Z" style="fill:url(#radial-gradient-7)"/><path d="M477.59,319.37c.39-8.77-4.16-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.64,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.64-2.13,2.39-2.91,13.86-14.43,71.94-36.42,77.39-39.54C453.69,363.16,476.58,346.44,477.59,319.37Z" style="fill:url(#linear-gradient-2)"/><path d="M158.31,156.47c-1-1.82-1.6,3.75-2.4,2-6-13.81-9.58-36.2-8.72-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.86-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.35,12.38-1.65,4.24-3.35,6.52-4.61,11.77-.39,1.43.39-6.32,0-5.38C84.72,201.68,80.19,271,82.69,268,133.17,214.14,191,201.36,191,201.36c-6.15-4.53-19.53-17.63-32.7-44.89Z" style="fill:url(#linear-gradient-3)"/><path d="M349.84,720.1c-69.72-29.77-149-71.75-146-167.14C207.92,427.35,321,452.18,321,452.18c-4.27,1-15.68,9.16-19.72,17.82-4.27,10.83-12.07,35.28,11.55,60.9,37.09,40.19-76.2,95.36,98.66,199.57,4.41,2.4-41-1.43-61.64-10.36Z" style="fill:url(#linear-gradient-4)"/><path d="M325.07,657.5c49.44,17.21,107,14.19,141.52-4.86,23.09-12.85,52.7-33.43,70.92-28.35-15.78-6.24-27.73-9.15-42.1-9.86-2.45,0-5.38,0-8-.32a136,136,0,0,0-15.76.86c-8.9.82-18.77,6.43-27.74,5.53-.48,0,8.7-3.77,8-3.61-4.75,1-9.92,1.21-15.37,1.88-3.47.39-6.45.82-9.89,1-103,8.73-190-55.81-190-55.81-7.41,25,33.17,74.3,88.52,93.57Z" style="fill:url(#linear-gradient-5)"/><path d="M813.74,801.65c104.16-102.27,156.86-226.58,134.58-366,0,0,8.9,71.5-24.85,144.63,16.21-71.39,18.1-160.11-25-252C841,205.64,746.45,141.11,710.35,114.19,655.66,73.4,633,31.87,632.57,23.3c-16.34,33.48-65.77,148.2-5.31,247,56.64,92.56,145.86,120,208.33,205C950.67,631.67,813.74,801.65,813.74,801.65Z" style="fill:url(#linear-gradient-6)"/><path d="M798.81,535.55C762.41,460.35,717,427.55,674,392c5,7,6.23,9.47,9,14,37.83,40.32,93.61,138.66,53.11,262.11C659.88,900.48,355,791.06,323,760.32,335.93,894.81,561,959.16,707.6,872,791,793,858.47,658.79,798.81,535.55Z" style="fill:url(#linear-gradient-7)"/></g></g></g></g></svg>
\ No newline at end of file
deleted file mode 100644
--- a/devtools/server/actor-registry.js
+++ /dev/null
@@ -1,412 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-var Services = require("Services");
-var { Ci } = require("chrome");
-var gRegisteredModules = Object.create(null);
-
-const ActorRegistry = {
-  // Map of global actor names to actor constructors.
-  globalActorFactories: {},
-  // Map of target-scoped actor names to actor constructors.
-  targetScopedActorFactories: {},
-  init(connections) {
-    this._connections = connections;
-  },
-
-  /**
-   * Register a CommonJS module with the debugger server.
-   * @param id string
-   *        The ID of a CommonJS module.
-   *        The actor is going to be registered immediately, but loaded only
-   *        when a client starts sending packets to an actor with the same id.
-   *
-   * @param options object
-   *        An object with 3 mandatory attributes:
-   *        - prefix (string):
-   *          The prefix of an actor is used to compute:
-   *          - the `actorID` of each new actor instance (ex: prefix1).
-   *            (See ActorPool.addActor)
-   *          - the actor name in the listTabs request. Sending a listTabs
-   *            request to the root actor returns actor IDs. IDs are in
-   *            dictionaries, with actor names as keys and actor IDs as values.
-   *            The actor name is the prefix to which the "Actor" string is
-   *            appended. So for an actor with the `console` prefix, the actor
-   *            name will be `consoleActor`.
-   *        - constructor (string):
-   *          the name of the exported symbol to be used as the actor
-   *          constructor.
-   *        - type (a dictionary of booleans with following attribute names):
-   *          - "global"
-   *            registers a global actor instance, if true.
-   *            A global actor has the root actor as its parent.
-   *          - "target"
-   *            registers a target-scoped actor instance, if true.
-   *            A new actor will be created for each target, such as a tab.
-   */
-  registerModule(id, options) {
-    if (id in gRegisteredModules) {
-      return;
-    }
-
-    if (!options) {
-      throw new Error("ActorRegistry.registerModule requires an options argument");
-    }
-    const {prefix, constructor, type} = options;
-    if (typeof (prefix) !== "string") {
-      throw new Error(`Lazy actor definition for '${id}' requires a string ` +
-                      `'prefix' option.`);
-    }
-    if (typeof (constructor) !== "string") {
-      throw new Error(`Lazy actor definition for '${id}' requires a string ` +
-                      `'constructor' option.`);
-    }
-    if (!("global" in type) && !("target" in type)) {
-      throw new Error(`Lazy actor definition for '${id}' requires a dictionary ` +
-                      `'type' option whose attributes can be 'global' or 'target'.`);
-    }
-    const name = prefix + "Actor";
-    const mod = {
-      id,
-      prefix,
-      constructorName: constructor,
-      type,
-      globalActor: type.global,
-      targetScopedActor: type.target
-    };
-    gRegisteredModules[id] = mod;
-    if (mod.targetScopedActor) {
-      this.addTargetScopedActor(mod, name);
-    }
-    if (mod.globalActor) {
-      this.addGlobalActor(mod, name);
-    }
-  },
-
-  /**
-   * Unregister a previously-loaded CommonJS module from the debugger server.
-   */
-  unregisterModule(id) {
-    const mod = gRegisteredModules[id];
-    if (!mod) {
-      throw new Error("Tried to unregister a module that was not previously registered.");
-    }
-
-    // Lazy actors
-    if (mod.targetScopedActor) {
-      this.removeTargetScopedActor(mod);
-    }
-    if (mod.globalActor) {
-      this.removeGlobalActor(mod);
-    }
-
-    delete gRegisteredModules[id];
-  },
-
-  /**
-   * Install Firefox-specific actors.
-   *
-   * /!\ Be careful when adding a new actor, especially global actors.
-   * Any new global actor will be exposed and returned by the root actor.
-   */
-  addBrowserActors() {
-    this.registerModule("devtools/server/actors/preference", {
-      prefix: "preference",
-      constructor: "PreferenceActor",
-      type: { global: true }
-    });
-    this.registerModule("devtools/server/actors/actor-registry", {
-      prefix: "actorRegistry",
-      constructor: "ActorRegistryActor",
-      type: { global: true }
-    });
-    this.registerModule("devtools/server/actors/addon/addons", {
-      prefix: "addons",
-      constructor: "AddonsActor",
-      type: { global: true }
-    });
-    this.registerModule("devtools/server/actors/device", {
-      prefix: "device",
-      constructor: "DeviceActor",
-      type: { global: true }
-    });
-    this.registerModule("devtools/server/actors/heap-snapshot-file", {
-      prefix: "heapSnapshotFile",
-      constructor: "HeapSnapshotFileActor",
-      type: { global: true }
-    });
-    // Always register this as a global module, even while there is a pref turning
-    // on and off the other performance actor. This actor shouldn't conflict with
-    // the other one. These are also lazily loaded so there shouldn't be a performance
-    // impact.
-    this.registerModule("devtools/server/actors/perf", {
-      prefix: "perf",
-      constructor: "PerfActor",
-      type: { global: true }
-    });
-  },
-
-  /**
-   * Install target-scoped actors.
-   */
-  addTargetScopedActors() {
-    this.registerModule("devtools/server/actors/webconsole", {
-      prefix: "console",
-      constructor: "WebConsoleActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/inspector/inspector", {
-      prefix: "inspector",
-      constructor: "InspectorActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/canvas", {
-      prefix: "canvas",
-      constructor: "CanvasActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/webgl", {
-      prefix: "webgl",
-      constructor: "WebGLActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/webaudio", {
-      prefix: "webaudio",
-      constructor: "WebAudioActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/stylesheets", {
-      prefix: "styleSheets",
-      constructor: "StyleSheetsActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/storage", {
-      prefix: "storage",
-      constructor: "StorageActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/memory", {
-      prefix: "memory",
-      constructor: "MemoryActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/framerate", {
-      prefix: "framerate",
-      constructor: "FramerateActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/reflow", {
-      prefix: "reflow",
-      constructor: "ReflowActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/css-properties", {
-      prefix: "cssProperties",
-      constructor: "CssPropertiesActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/csscoverage", {
-      prefix: "cssUsage",
-      constructor: "CSSUsageActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/timeline", {
-      prefix: "timeline",
-      constructor: "TimelineActor",
-      type: { target: true }
-    });
-    if ("nsIProfiler" in Ci &&
-        !Services.prefs.getBoolPref("devtools.performance.new-panel-enabled", false)) {
-      this.registerModule("devtools/server/actors/performance", {
-        prefix: "performance",
-        constructor: "PerformanceActor",
-        type: { target: true }
-      });
-    }
-    this.registerModule("devtools/server/actors/animation", {
-      prefix: "animations",
-      constructor: "AnimationsActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/promises", {
-      prefix: "promises",
-      constructor: "PromisesActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/emulation", {
-      prefix: "emulation",
-      constructor: "EmulationActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/addon/webextension-inspected-window", {
-      prefix: "webExtensionInspectedWindow",
-      constructor: "WebExtensionInspectedWindowActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/accessibility", {
-      prefix: "accessibility",
-      constructor: "AccessibilityActor",
-      type: { target: true }
-    });
-    this.registerModule("devtools/server/actors/screenshot", {
-      prefix: "screenshot",
-      constructor: "ScreenshotActor",
-      type: { target: true }
-    });
-  },
-
-  /**
-   * Registers handlers for new target-scoped request types defined dynamically.
-   *
-   * Note that the name or actorPrefix of the request type is not allowed to clash with
-   * existing protocol packet properties, like 'title', 'url' or 'actor', since that would
-   * break the protocol.
-   *
-   * @param options object
-   *        - constructorName: (required)
-   *          name of actor constructor, which is also used when removing the actor.
-   *        One of the following:
-   *          - id:
-   *            module ID that contains the actor
-   *          - constructorFun:
-   *            a function to construct the actor
-   * @param name string
-   *        The name of the new request type.
-   */
-  addTargetScopedActor(options, name) {
-    if (!name) {
-      throw Error("addTargetScopedActor requires the `name` argument");
-    }
-    if (["title", "url", "actor"].includes(name)) {
-      throw Error(name + " is not allowed");
-    }
-    if (this.targetScopedActorFactories.hasOwnProperty(name)) {
-      throw Error(name + " already exists");
-    }
-    this.targetScopedActorFactories[name] = { options, name };
-  },
-
-  /**
-   * Unregisters the handler for the specified target-scoped request type.
-   *
-   * When unregistering an existing target-scoped actor, we remove the actor factory as
-   * well as all existing instances of the actor.
-   *
-   * @param actor object, string
-   *        In case of object:
-   *          The `actor` object being given to related addTargetScopedActor call.
-   *        In case of string:
-   *          The `name` string being given to related addTargetScopedActor call.
-   */
-  removeTargetScopedActor(actorOrName) {
-    let name;
-    if (typeof actorOrName == "string") {
-      name = actorOrName;
-    } else {
-      const actor = actorOrName;
-      for (const factoryName in this.targetScopedActorFactories) {
-        const handler = this.targetScopedActorFactories[factoryName];
-        if ((handler.options.constructorName == actor.name) ||
-            (handler.options.id == actor.id)) {
-          name = factoryName;
-          break;
-        }
-      }
-    }
-    if (!name) {
-      return;
-    }
-    delete this.targetScopedActorFactories[name];
-    for (const connID of Object.getOwnPropertyNames(this._connections)) {
-      // DebuggerServerConnection in child process don't have rootActor
-      if (this._connections[connID].rootActor) {
-        this._connections[connID].rootActor.removeActorByName(name);
-      }
-    }
-  },
-
-  /**
-   * Registers handlers for new browser-scoped request types defined dynamically.
-   *
-   * Note that the name or actorPrefix of the request type is not allowed to clash with
-   * existing protocol packet properties, like 'from', 'tabs' or 'selected', since that
-   * would break the protocol.
-   *
-   * @param options object
-   *        - constructorName: (required)
-   *          name of actor constructor, which is also used when removing the actor.
-   *        One of the following:
-   *          - id:
-   *            module ID that contains the actor
-   *          - constructorFun:
-   *            a function to construct the actor
-   * @param name string
-   *        The name of the new request type.
-   */
-  addGlobalActor(options, name) {
-    if (!name) {
-      throw Error("addGlobalActor requires the `name` argument");
-    }
-    if (["from", "tabs", "selected"].includes(name)) {
-      throw Error(name + " is not allowed");
-    }
-    if (this.globalActorFactories.hasOwnProperty(name)) {
-      throw Error(name + " already exists");
-    }
-    this.globalActorFactories[name] = { options, name };
-  },
-
-  /**
-   * Unregisters the handler for the specified browser-scoped request type.
-   *
-   * When unregistering an existing global actor, we remove the actor factory as well as
-   * all existing instances of the actor.
-   *
-   * @param actor object, string
-   *        In case of object:
-   *          The `actor` object being given to related addGlobalActor call.
-   *        In case of string:
-   *          The `name` string being given to related addGlobalActor call.
-   */
-  removeGlobalActor(actorOrName) {
-    let name;
-    if (typeof actorOrName == "string") {
-      name = actorOrName;
-    } else {
-      const actor = actorOrName;
-      for (const factoryName in this.globalActorFactories) {
-        const handler = this.globalActorFactories[factoryName];
-        if ((handler.options.constructorName == actor.name) ||
-            (handler.options.id == actor.id)) {
-          name = factoryName;
-          break;
-        }
-      }
-    }
-    if (!name) {
-      return;
-    }
-    delete this.globalActorFactories[name];
-    for (const connID of Object.getOwnPropertyNames(this._connections)) {
-      // DebuggerServerConnection in child process don't have rootActor
-      if (this._connections[connID].rootActor) {
-        this._connections[connID].rootActor.removeActorByName(name);
-      }
-    }
-  },
-
-  destroy() {
-    for (const id of Object.getOwnPropertyNames(gRegisteredModules)) {
-      this.unregisterModule(id);
-    }
-    gRegisteredModules = Object.create(null);
-
-    this.globalActorFactories = {};
-    this.targetScopedActorFactories = {};
-  },
-};
-
-exports.ActorRegistry = ActorRegistry;
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -606,27 +606,33 @@ MediaFormatReader::DecoderFactory::DoCre
         &mOwner->OnTrackWaitingForKeyProducer()
       });
       break;
     }
 
     case TrackType::kVideoTrack: {
       // Decoders use the layers backend to decide if they can use hardware decoding,
       // so specify LAYERS_NONE if we want to forcibly disable it.
+      using Option = CreateDecoderParams::Option;
+      using OptionSet = CreateDecoderParams::OptionSet;
+
       aData.mDecoder = platform->CreateDecoder(
         { *ownerData.GetCurrentInfo()->GetAsVideoInfo(),
           ownerData.mTaskQueue,
           mOwner->mKnowsCompositor,
           mOwner->GetImageContainer(),
           mOwner->mCrashHelper,
           CreateDecoderParams::UseNullDecoder(ownerData.mIsNullDecode),
           &result,
           TrackType::kVideoTrack,
           &mOwner->OnTrackWaitingForKeyProducer(),
-          CreateDecoderParams::VideoFrameRate(ownerData.mMeanRate.Mean()) });
+          CreateDecoderParams::VideoFrameRate(ownerData.mMeanRate.Mean()),
+          OptionSet(ownerData.mHardwareDecodingDisabled
+                      ? Option::HardwareDecoderNotAllowed
+                      : Option::Default) });
       break;
     }
 
     default:
       break;
   }
 
   if (aData.mDecoder) {
@@ -2226,16 +2232,19 @@ MediaFormatReader::HandleDemuxedSamples(
       }
 
       // If flushing is required, it will clear our array of queued samples.
       // So we may need to make a copy.
       samples = decoder.mQueuedSamples;
       if (!recyclable) {
         LOG("Decoder does not support recycling, recreate decoder.");
         ShutdownDecoder(aTrack);
+        // We're going to be using a new decoder following the change of content
+        // We can attempt to use hardware decoding again.
+        decoder.mHardwareDecodingDisabled = false;
       } else if (decoder.HasWaitingPromise()) {
         decoder.Flush();
       }
     }
 
     LOG("%s stream id has changed from:%d to:%d.",
         TrackTypeToStr(aTrack),
         decoder.mLastStreamSourceID,
@@ -2578,24 +2587,35 @@ MediaFormatReader::Update(TrackType aTra
       DrainDecoder(aTrack);
     }
     return;
   }
 
   if (decoder.mError && !decoder.HasFatalError()) {
     MOZ_RELEASE_ASSERT(!decoder.HasInternalSeekPending(),
                        "No error can occur while an internal seek is pending");
+
+    nsCString error;
+    bool firstFrameDecodingFailedWithHardware =
+      decoder.mFirstFrameTime &&
+      decoder.mError.ref() == NS_ERROR_DOM_MEDIA_DECODE_ERR &&
+      decoder.mDecoder && decoder.mDecoder->IsHardwareAccelerated(error) &&
+      !decoder.mHardwareDecodingDisabled;
     bool needsNewDecoder =
-      decoder.mError.ref() == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER;
+      decoder.mError.ref() == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER ||
+      firstFrameDecodingFailedWithHardware;
     if (!needsNewDecoder &&
         ++decoder.mNumOfConsecutiveError > decoder.mMaxConsecutiveError) {
       DDLOG(DDLogCategory::Log, "too_many_decode_errors", decoder.mError.ref());
       NotifyError(aTrack, decoder.mError.ref());
       return;
     }
+    if (firstFrameDecodingFailedWithHardware) {
+      decoder.mHardwareDecodingDisabled = true;
+    }
     decoder.mError.reset();
 
     LOG("%s decoded error count %d", TrackTypeToStr(aTrack),
         decoder.mNumOfConsecutiveError);
 
     if (needsNewDecoder) {
       LOG("Error: Need new decoder");
       ShutdownDecoder(aTrack);
--- a/dom/media/MediaFormatReader.h
+++ b/dom/media/MediaFormatReader.h
@@ -381,16 +381,17 @@ private:
       , mNumSamplesInput(0)
       , mNumSamplesOutput(0)
       , mNumSamplesOutputTotal(0)
       , mNumSamplesSkippedTotal(0)
       , mSizeOfQueue(0)
       , mIsHardwareAccelerated(false)
       , mLastStreamSourceID(UINT32_MAX)
       , mIsNullDecode(false)
+      , mHardwareDecodingDisabled(false)
     {
       DecoderDoctorLogger::LogConstruction("MediaFormatReader::DecoderData",
                                            this);
     }
 
     ~DecoderData()
     {
       DecoderDoctorLogger::LogDestruction("MediaFormatReader::DecoderData",
@@ -617,16 +618,17 @@ private:
     UniquePtr<TrackInfo> mOriginalInfo;
     // Written exclusively on the TaskQueue, can be read on MDSM's TaskQueue.
     // Must be read with parent's mutex held.
     UniquePtr<TrackInfo> mWorkingInfo;
     RefPtr<TrackInfoSharedPtr> mInfo;
     Maybe<media::TimeUnit> mFirstDemuxedSampleTime;
     // Use NullDecoderModule or not.
     bool mIsNullDecode;
+    bool mHardwareDecodingDisabled;
 
     class
     {
     public:
       float Mean() const { return mMean; }
 
       void Update(const media::TimeUnit& aValue)
       {
--- a/dom/media/ipc/PVideoDecoderManager.ipdl
+++ b/dom/media/ipc/PVideoDecoderManager.ipdl
@@ -18,17 +18,17 @@ sync protocol PVideoDecoderManager
   manages PVideoDecoder;
 parent:
   // aBlacklistedD3D11Driver and aBlacklistedD3D9Driver are used to read back the blacklisted driver information
   // from GPU process to content process.
   // We should have added a new sync method to read back this information but, in that way, we also introduce one
   // more sync IPC call.
   // Considering that this information is only used for telemetry usage in bug 1393392 and should be removed once
   // we have collected enough data, we add these two return values here for convenience.
-  sync PVideoDecoder(VideoInfo info, float framerate, TextureFactoryIdentifier identifier)
+  sync PVideoDecoder(VideoInfo info, float framerate, bool disallowHWDecoder, TextureFactoryIdentifier identifier)
          returns (bool success,
                   nsCString aBlacklistedD3D11Driver,
                   nsCString aBlacklistedD3D9Driver,
                   nsCString aErrorDescription);
 
   sync Readback(SurfaceDescriptorGPUVideo sd) returns (SurfaceDescriptor aResult);
 
   async DeallocateSurfaceDescriptorGPUVideo(SurfaceDescriptorGPUVideo sd);
--- a/dom/media/ipc/RemoteVideoDecoder.cpp
+++ b/dom/media/ipc/RemoteVideoDecoder.cpp
@@ -187,16 +187,18 @@ RemoteDecoderModule::CreateVideoDecoder(
   VideoDecoderManagerChild::GetManagerThread()->Dispatch(
     NS_NewRunnableFunction(
       "dom::RemoteDecoderModule::CreateVideoDecoder",
       [&]() {
         AutoCompleteTask complete(&task);
         result = object->mActor->InitIPDL(
           aParams.VideoConfig(),
           aParams.mRate.mValue,
+          aParams.mOptions.contains(
+            CreateDecoderParams::Option::HardwareDecoderNotAllowed),
           aParams.mKnowsCompositor->GetTextureFactoryIdentifier());
       }),
     NS_DISPATCH_NORMAL);
   task.Wait();
 
   if (NS_FAILED(result)) {
     if (aParams.mError) {
       *aParams.mError = result;
--- a/dom/media/ipc/VideoDecoderChild.cpp
+++ b/dom/media/ipc/VideoDecoderChild.cpp
@@ -172,16 +172,17 @@ VideoDecoderChild::ActorDestroy(ActorDes
                                 mBlacklistedD3D11Driver,
                                 mBlacklistedD3D9Driver);
 #endif // XP_WIN
 }
 
 MediaResult
 VideoDecoderChild::InitIPDL(const VideoInfo& aVideoInfo,
                             float aFramerate,
+                            bool aDisallowHWDecoder,
                             const layers::TextureFactoryIdentifier& aIdentifier)
 {
   RefPtr<VideoDecoderManagerChild> manager =
     VideoDecoderManagerChild::GetSingleton();
 
   // The manager isn't available because VideoDecoderManagerChild has been
   // initialized with null end points and we don't want to decode video on GPU
   // process anymore. Return false here so that we can fallback to other PDMs.
@@ -201,16 +202,17 @@ VideoDecoderChild::InitIPDL(const VideoI
   }
 
   mIPDLSelfRef = this;
   bool success = false;
   nsCString errorDescription;
   if (manager->SendPVideoDecoderConstructor(this,
                                             aVideoInfo,
                                             aFramerate,
+                                            aDisallowHWDecoder,
                                             aIdentifier,
                                             &success,
                                             &mBlacklistedD3D11Driver,
                                             &mBlacklistedD3D9Driver,
                                             &errorDescription)) {
     mCanSend = true;
   }
 
--- a/dom/media/ipc/VideoDecoderChild.h
+++ b/dom/media/ipc/VideoDecoderChild.h
@@ -46,16 +46,17 @@ public:
   bool IsHardwareAccelerated(nsACString& aFailureReason) const;
   nsCString GetDescriptionName() const;
   void SetSeekThreshold(const media::TimeUnit& aTime);
   MediaDataDecoder::ConversionRequired NeedsConversion() const;
 
   MOZ_IS_CLASS_INIT
   MediaResult InitIPDL(const VideoInfo& aVideoInfo,
                        float aFramerate,
+                       bool aDisallowHWDecoder,
                        const layers::TextureFactoryIdentifier& aIdentifier);
   void DestroyIPDL();
 
   // Called from IPDL when our actor has been destroyed
   void IPDLActorDestroyed();
 
   VideoDecoderManagerChild* GetManager();
 
--- a/dom/media/ipc/VideoDecoderManagerChild.cpp
+++ b/dom/media/ipc/VideoDecoderManagerChild.cpp
@@ -113,16 +113,17 @@ VideoDecoderManagerChild::GetManagerThre
 VideoDecoderManagerChild::GetManagerAbstractThread()
 {
   return sVideoDecoderChildAbstractThread;
 }
 
 PVideoDecoderChild*
 VideoDecoderManagerChild::AllocPVideoDecoderChild(const VideoInfo& aVideoInfo,
                                                   const float& aFramerate,
+                                                  const bool& aDisallowHWDecoder,
                                                   const layers::TextureFactoryIdentifier& aIdentifier,
                                                   bool* aSuccess,
                                                   nsCString* /* not used */,
                                                   nsCString* /* not used */,
                                                   nsCString* /* not used */)
 {
   return new VideoDecoderChild();
 }
--- a/dom/media/ipc/VideoDecoderManagerChild.h
+++ b/dom/media/ipc/VideoDecoderManagerChild.h
@@ -67,16 +67,17 @@ protected:
 
   void ActorDestroy(ActorDestroyReason aWhy) override;
   void DeallocPVideoDecoderManagerChild() override;
 
   void HandleFatalError(const char* aMsg) const override;
 
   PVideoDecoderChild* AllocPVideoDecoderChild(const VideoInfo& aVideoInfo,
                                               const float& aFramerate,
+                                              const bool& aDisallowHWDecoder,
                                               const layers::TextureFactoryIdentifier& aIdentifier,
                                               bool* aSuccess,
                                               nsCString* aBlacklistedD3D11Driver,
                                               nsCString* aBlacklistedD3D9Driver,
                                               nsCString* aErrorDescription) override;
   bool DeallocPVideoDecoderChild(PVideoDecoderChild* actor) override;
 
 private:
--- a/dom/media/ipc/VideoDecoderManagerParent.cpp
+++ b/dom/media/ipc/VideoDecoderManagerParent.cpp
@@ -198,28 +198,29 @@ void
 VideoDecoderManagerParent::ActorDestroy(mozilla::ipc::IProtocol::ActorDestroyReason)
 {
   mThreadHolder = nullptr;
 }
 
 PVideoDecoderParent*
 VideoDecoderManagerParent::AllocPVideoDecoderParent(const VideoInfo& aVideoInfo,
                                                     const float& aFramerate,
+                                                    const bool& aDisallowHWDecoder,
                                                     const layers::TextureFactoryIdentifier& aIdentifier,
                                                     bool* aSuccess,
                                                     nsCString* aBlacklistedD3D11Driver,
                                                     nsCString* aBlacklistedD3D9Driver,
                                                     nsCString* aErrorDescription)
 {
   RefPtr<TaskQueue> decodeTaskQueue = new TaskQueue(
     GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER),
     "VideoDecoderParent::mDecodeTaskQueue");
 
   auto* parent = new VideoDecoderParent(
-    this, aVideoInfo, aFramerate, aIdentifier,
+    this, aVideoInfo, aFramerate, aDisallowHWDecoder, aIdentifier,
     sManagerTaskQueue, decodeTaskQueue, aSuccess, aErrorDescription);
 
 #ifdef XP_WIN
   *aBlacklistedD3D11Driver = GetFoundD3D11BlacklistedDLL();
   *aBlacklistedD3D9Driver = GetFoundD3D9BlacklistedDLL();
 #endif // XP_WIN
 
   return parent;
--- a/dom/media/ipc/VideoDecoderManagerParent.h
+++ b/dom/media/ipc/VideoDecoderManagerParent.h
@@ -28,16 +28,17 @@ public:
 
   static void ShutdownVideoBridge();
 
   bool OnManagerThread();
 
 protected:
   PVideoDecoderParent* AllocPVideoDecoderParent(const VideoInfo& aVideoInfo,
                                                 const float& aFramerate,
+                                                const bool& aDisallowHWDecoder,
                                                 const layers::TextureFactoryIdentifier& aIdentifier,
                                                 bool* aSuccess,
                                                 nsCString* aBlacklistedD3D11Driver,
                                                 nsCString* aBlacklistedD3D9Driver,
                                                 nsCString* aErrorDescription) override;
   bool DeallocPVideoDecoderParent(PVideoDecoderParent* actor) override;
 
   mozilla::ipc::IPCResult RecvReadback(const SurfaceDescriptorGPUVideo& aSD, SurfaceDescriptor* aResult) override;
--- a/dom/media/ipc/VideoDecoderParent.cpp
+++ b/dom/media/ipc/VideoDecoderParent.cpp
@@ -40,16 +40,17 @@ public:
   }
 private:
   virtual ~KnowsCompositorVideo() = default;
 };
 
 VideoDecoderParent::VideoDecoderParent(VideoDecoderManagerParent* aParent,
                                        const VideoInfo& aVideoInfo,
                                        float aFramerate,
+                                       bool aDisallowHWDecoder,
                                        const layers::TextureFactoryIdentifier& aIdentifier,
                                        TaskQueue* aManagerTaskQueue,
                                        TaskQueue* aDecodeTaskQueue,
                                        bool* aSuccess,
                                        nsCString* aErrorDescription)
   : mParent(aParent)
   , mManagerTaskQueue(aManagerTaskQueue)
   , mDecodeTaskQueue(aDecodeTaskQueue)
@@ -62,27 +63,32 @@ VideoDecoderParent::VideoDecoderParent(V
   // explictly destroys us. There may still be refs held by
   // tasks, but no new ones should be added after we're
   // destroyed.
   mIPDLSelfRef = this;
 
   mKnowsCompositor->IdentifyTextureHost(aIdentifier);
 
 #ifdef XP_WIN
+  using Option = CreateDecoderParams::Option;
+  using OptionSet = CreateDecoderParams::OptionSet;
+
   // TODO: Ideally we wouldn't hardcode the WMF PDM, and we'd use the normal PDM
   // factory logic for picking a decoder.
   WMFDecoderModule::Init();
   RefPtr<WMFDecoderModule> pdm(new WMFDecoderModule());
   pdm->Startup();
 
   CreateDecoderParams params(aVideoInfo);
   params.mTaskQueue = mDecodeTaskQueue;
   params.mKnowsCompositor = mKnowsCompositor;
   params.mImageContainer = new layers::ImageContainer();
   params.mRate = CreateDecoderParams::VideoFrameRate(aFramerate);
+  params.mOptions = OptionSet(
+    aDisallowHWDecoder ? Option::HardwareDecoderNotAllowed : Option::Default);
   MediaResult error(NS_OK);
   params.mError = &error;
 
   mDecoder = pdm->CreateVideoDecoder(params);
 
   if (NS_FAILED(error)) {
     MOZ_ASSERT(aErrorDescription);
     *aErrorDescription = error.Description();
--- a/dom/media/ipc/VideoDecoderParent.h
+++ b/dom/media/ipc/VideoDecoderParent.h
@@ -24,16 +24,17 @@ class VideoDecoderParent final : public 
 public:
   // We refcount this class since the task queue can have runnables
   // that reference us.
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoDecoderParent)
 
   VideoDecoderParent(VideoDecoderManagerParent* aParent,
                      const VideoInfo& aVideoInfo,
                      float aFramerate,
+                     bool aDisallowHWDecoder,
                      const layers::TextureFactoryIdentifier& aIdentifier,
                      TaskQueue* aManagerTaskQueue,
                      TaskQueue* aDecodeTaskQueue,
                      bool* aSuccess,
                      nsCString* aErrorDescription);
 
   void Destroy();
 
--- a/dom/media/platforms/PlatformDecoderModule.h
+++ b/dom/media/platforms/PlatformDecoderModule.h
@@ -45,16 +45,17 @@ static LazyLogModule sPDMLog("PlatformDe
 struct MOZ_STACK_CLASS CreateDecoderParams final
 {
   explicit CreateDecoderParams(const TrackInfo& aConfig) : mConfig(aConfig) { }
 
   enum class Option
   {
     Default,
     LowLatency,
+    HardwareDecoderNotAllowed,
   };
   using OptionSet = EnumSet<Option>;
 
   struct UseNullDecoder
   {
     UseNullDecoder() = default;
     explicit UseNullDecoder(bool aUseNullDecoder) : mUse(aUseNullDecoder) { }
     bool mUse = false;
--- a/dom/media/platforms/agnostic/VPXDecoder.cpp
+++ b/dom/media/platforms/agnostic/VPXDecoder.cpp
@@ -1,15 +1,16 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim:set ts=2 sw=2 sts=2 et cindent: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "VPXDecoder.h"
+#include "BitReader.h"
 #include "TimeUnits.h"
 #include "gfx2DGlue.h"
 #include "mozilla/PodOperations.h"
 #include "mozilla/SyncRunnable.h"
 #include "ImageContainer.h"
 #include "nsError.h"
 #include "prsystem.h"
 
@@ -332,10 +333,38 @@ VPXDecoder::GetFrameSize(Span<const uint
   if (aCodec == Codec::VP8) {
     vpx_codec_peek_stream_info(vpx_codec_vp8_dx(), aBuffer.Elements(), aBuffer.Length(), &si);
   } else if (aCodec == Codec::VP9) {
     vpx_codec_peek_stream_info(vpx_codec_vp9_dx(), aBuffer.Elements(), aBuffer.Length(), &si);
   }
 
   return gfx::IntSize(si.w, si.h);
 }
+
+/* static */
+int
+VPXDecoder::GetVP9Profile(Span<const uint8_t> aBuffer)
+{
+  if (aBuffer.Length() < 2) {
+    // Can't be good.
+    return -1;
+  }
+  BitReader br(aBuffer.Elements(), aBuffer.Length() * 8);
+
+  uint32_t frameMarker = br.ReadBits(2); // frame_marker
+  if (frameMarker != 2) {
+    // That's not a valid vp9 header.
+    return -1;
+  }
+  uint32_t profile = br.ReadBits(1); // profile_low_bit
+  profile |= br.ReadBits(1) << 1; // profile_high_bit
+  if (profile == 3) {
+    profile += br.ReadBits(1); // reserved_zero
+    if (profile > 3) {
+      // reserved_zero wasn't zero.
+      return -1;
+    }
+  }
+  return profile;
+}
+
 } // namespace mozilla
 #undef LOG
--- a/dom/media/platforms/agnostic/VPXDecoder.h
+++ b/dom/media/platforms/agnostic/VPXDecoder.h
@@ -51,16 +51,20 @@ public:
   static bool IsVP9(const nsACString& aMimeType);
 
   // Return true if a sample is a keyframe for the specified codec.
   static bool IsKeyframe(Span<const uint8_t> aBuffer, Codec aCodec);
 
   // Return the frame dimensions for a sample for the specified codec.
   static gfx::IntSize GetFrameSize(Span<const uint8_t> aBuffer, Codec aCodec);
 
+  // Return the VP9 profile as per https://www.webmproject.org/vp9/profiles/
+  // Return negative value if error.
+  static int GetVP9Profile(Span<const uint8_t> aBuffer);
+
 private:
   ~VPXDecoder();
   RefPtr<DecodePromise> ProcessDecode(MediaRawData* aSample);
   MediaResult DecodeAlpha(vpx_image_t** aImgAlpha, const MediaRawData* aSample);
 
   const RefPtr<layers::ImageContainer> mImageContainer;
   RefPtr<layers::KnowsCompositor> mImageAllocator;
   const RefPtr<TaskQueue> mTaskQueue;
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
@@ -12,19 +12,20 @@
 #include "VPXDecoder.h"
 #include "mozilla/layers/KnowsCompositor.h"
 
 #include "libavutil/pixfmt.h"
 #if LIBAVCODEC_VERSION_MAJOR < 54
 #define AVPixelFormat PixelFormat
 #define AV_PIX_FMT_YUV420P PIX_FMT_YUV420P
 #define AV_PIX_FMT_YUVJ420P PIX_FMT_YUVJ420P
+#define AV_PIX_FMT_YUV420P10LE PIX_FMT_YUV420P10LE
 #define AV_PIX_FMT_YUV422P PIX_FMT_YUV422P
+#define AV_PIX_FMT_YUV422P10LE PIX_FMT_YUV422P10LE
 #define AV_PIX_FMT_YUV444P PIX_FMT_YUV444P
-#define AV_PIX_FMT_YUV420P10LE PIX_FMT_YUV420P10LE
 #define AV_PIX_FMT_YUV444P10LE PIX_FMT_YUV444P10LE
 #define AV_PIX_FMT_NONE PIX_FMT_NONE
 #endif
 #include "mozilla/PodOperations.h"
 #include "mozilla/TaskQueue.h"
 #include "nsThreadUtils.h"
 #include "prsystem.h"
 
@@ -43,35 +44,44 @@ using media::TimeUnit;
  * only non-HW accelerated format supported by FFmpeg's H264 and VP9 decoder.
  */
 static AVPixelFormat
 ChoosePixelFormat(AVCodecContext* aCodecContext, const AVPixelFormat* aFormats)
 {
   FFMPEG_LOG("Choosing FFmpeg pixel format for video decoding.");
   for (; *aFormats > -1; aFormats++) {
     switch (*aFormats) {
-      case AV_PIX_FMT_YUV444P:
-        FFMPEG_LOG("Requesting pixel format YUV444P.");
-        return AV_PIX_FMT_YUV444P;
-      case AV_PIX_FMT_YUV422P:
-        FFMPEG_LOG("Requesting pixel format YUV422P.");
-        return AV_PIX_FMT_YUV422P;
       case AV_PIX_FMT_YUV420P:
         FFMPEG_LOG("Requesting pixel format YUV420P.");
         return AV_PIX_FMT_YUV420P;
       case AV_PIX_FMT_YUVJ420P:
         FFMPEG_LOG("Requesting pixel format YUVJ420P.");
         return AV_PIX_FMT_YUVJ420P;
       case AV_PIX_FMT_YUV420P10LE:
         FFMPEG_LOG("Requesting pixel format YUV420P10LE.");
         return AV_PIX_FMT_YUV420P10LE;
+      case AV_PIX_FMT_YUV422P:
+        FFMPEG_LOG("Requesting pixel format YUV422P.");
+        return AV_PIX_FMT_YUV422P;
+      case AV_PIX_FMT_YUV422P10LE:
+        FFMPEG_LOG("Requesting pixel format YUV422P10LE.");
+        return AV_PIX_FMT_YUV422P10LE;
+      case AV_PIX_FMT_YUV444P:
+        FFMPEG_LOG("Requesting pixel format YUV444P.");
+        return AV_PIX_FMT_YUV444P;
       case AV_PIX_FMT_YUV444P10LE:
         FFMPEG_LOG("Requesting pixel format YUV444P10LE.");
         return AV_PIX_FMT_YUV444P10LE;
 #if LIBAVCODEC_VERSION_MAJOR >= 57
+      case AV_PIX_FMT_YUV420P12LE:
+        FFMPEG_LOG("Requesting pixel format YUV420P12LE.");
+        return AV_PIX_FMT_YUV420P12LE;
+      case AV_PIX_FMT_YUV422P12LE:
+        FFMPEG_LOG("Requesting pixel format YUV422P12LE.");
+        return AV_PIX_FMT_YUV422P12LE;
       case AV_PIX_FMT_YUV444P12LE:
         FFMPEG_LOG("Requesting pixel format YUV444P12LE.");
         return AV_PIX_FMT_YUV444P12LE;
 #endif
       default:
         break;
     }
   }
@@ -270,39 +280,56 @@ FFmpegVideoDecoder<LIBAV_VER>::DoDecode(
   b.mPlanes[1].mOffset = b.mPlanes[1].mSkip = 0;
   b.mPlanes[2].mOffset = b.mPlanes[2].mSkip = 0;
 
   b.mPlanes[0].mWidth = mFrame->width;
   b.mPlanes[0].mHeight = mFrame->height;
   if (mCodecContext->pix_fmt == AV_PIX_FMT_YUV444P ||
       mCodecContext->pix_fmt == AV_PIX_FMT_YUV444P10LE
 #if LIBAVCODEC_VERSION_MAJOR >= 57
-      ||
-      mCodecContext->pix_fmt == AV_PIX_FMT_YUV444P12LE
+      || mCodecContext->pix_fmt == AV_PIX_FMT_YUV444P12LE
 #endif
-      ) {
+  ) {
     b.mPlanes[1].mWidth = b.mPlanes[2].mWidth = mFrame->width;
     b.mPlanes[1].mHeight = b.mPlanes[2].mHeight = mFrame->height;
     if (mCodecContext->pix_fmt == AV_PIX_FMT_YUV444P10LE) {
       b.mColorDepth = gfx::ColorDepth::COLOR_10;
     }
 #if LIBAVCODEC_VERSION_MAJOR >= 57
     else if (mCodecContext->pix_fmt == AV_PIX_FMT_YUV444P12LE) {
       b.mColorDepth = gfx::ColorDepth::COLOR_12;
     }
 #endif
-  } else if (mCodecContext->pix_fmt == AV_PIX_FMT_YUV422P) {
+  } else if (mCodecContext->pix_fmt == AV_PIX_FMT_YUV422P ||
+             mCodecContext->pix_fmt == AV_PIX_FMT_YUV422P10LE
+#if LIBAVCODEC_VERSION_MAJOR >= 57
+             || mCodecContext->pix_fmt == AV_PIX_FMT_YUV422P12LE
+#endif
+  ) {
     b.mPlanes[1].mWidth = b.mPlanes[2].mWidth = (mFrame->width + 1) >> 1;
     b.mPlanes[1].mHeight = b.mPlanes[2].mHeight = mFrame->height;
+    if (mCodecContext->pix_fmt == AV_PIX_FMT_YUV422P10LE) {
+      b.mColorDepth = gfx::ColorDepth::COLOR_10;
+    }
+#if LIBAVCODEC_VERSION_MAJOR >= 57
+    else if (mCodecContext->pix_fmt == AV_PIX_FMT_YUV422P12LE) {
+      b.mColorDepth = gfx::ColorDepth::COLOR_12;
+    }
+#endif
   } else {
     b.mPlanes[1].mWidth = b.mPlanes[2].mWidth = (mFrame->width + 1) >> 1;
     b.mPlanes[1].mHeight = b.mPlanes[2].mHeight = (mFrame->height + 1) >> 1;
     if (mCodecContext->pix_fmt == AV_PIX_FMT_YUV420P10LE) {
       b.mColorDepth = gfx::ColorDepth::COLOR_10;
     }
+#if LIBAVCODEC_VERSION_MAJOR >= 57
+    else if (mCodecContext->pix_fmt == AV_PIX_FMT_YUV420P12LE) {
+      b.mColorDepth = gfx::ColorDepth::COLOR_12;
+    }
+#endif
   }
   if (mLib->av_frame_get_colorspace) {
     switch (mLib->av_frame_get_colorspace(mFrame)) {
       case AVCOL_SPC_BT709:
         b.mYUVColorSpace = YUVColorSpace::BT709;
         break;
       case AVCOL_SPC_SMPTE170M:
       case AVCOL_SPC_BT470BG:
--- a/dom/media/platforms/wmf/WMFDecoderModule.cpp
+++ b/dom/media/platforms/wmf/WMFDecoderModule.cpp
@@ -95,22 +95,23 @@ already_AddRefed<MediaDataDecoder>
 WMFDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
 {
   if (aParams.mOptions.contains(CreateDecoderParams::Option::LowLatency)) {
     // Latency on Windows is bad. Let's not attempt to decode with WMF decoders
     // when low latency is required.
     return nullptr;
   }
 
-  nsAutoPtr<WMFVideoMFTManager> manager(
-    new WMFVideoMFTManager(aParams.VideoConfig(),
-                           aParams.mKnowsCompositor,
-                           aParams.mImageContainer,
-                           aParams.mRate.mValue,
-                           sDXVAEnabled));
+  nsAutoPtr<WMFVideoMFTManager> manager(new WMFVideoMFTManager(
+    aParams.VideoConfig(),
+    aParams.mKnowsCompositor,
+    aParams.mImageContainer,
+    aParams.mRate.mValue,
+    sDXVAEnabled && !aParams.mOptions.contains(
+                      CreateDecoderParams::Option::HardwareDecoderNotAllowed)));
 
   MediaResult result = manager->Init();
   if (NS_FAILED(result)) {
     if (aParams.mError) {
       *aParams.mError = result;
     }
     return nullptr;
   }
--- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
+++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
@@ -769,16 +769,26 @@ WMFVideoMFTManager::Input(MediaRawData* 
     return E_FAIL;
   }
 
   if (!mDecoder) {
     // This can happen during shutdown.
     return E_FAIL;
   }
 
+  if (mStreamType == VP9 && aSample->mKeyframe) {
+    // Check the VP9 profile. the VP9 MFT can only handle correctly profile 0
+    // and 2 (yuv420 8/10/12 bits)
+    int profile =
+      VPXDecoder::GetVP9Profile(MakeSpan(aSample->Data(), aSample->Size()));
+    if (profile != 0 && profile != 2) {
+      return E_FAIL;
+    }
+  }
+
   RefPtr<IMFSample> inputSample;
   HRESULT hr = mDecoder->CreateInputSample(aSample->Data(),
                                            uint32_t(aSample->Size()),
                                            aSample->mTime.ToMicroseconds(),
                                            &inputSample);
   NS_ENSURE_TRUE(SUCCEEDED(hr) && inputSample != nullptr, hr);
 
   mLastDuration = aSample->mDuration;
--- a/js/src/builtin/ReflectParse.cpp
+++ b/js/src/builtin/ReflectParse.cpp
@@ -1688,18 +1688,19 @@ NodeBuilder::metaProperty(HandleValue me
                    dst);
 }
 
 bool
 NodeBuilder::callImportExpression(HandleValue ident, HandleValue arg, TokenPos* pos,
                                   MutableHandleValue dst)
 {
     RootedValue cb(cx, callbacks[AST_CALL_IMPORT]);
-    if (!cb.isNull())
+    if (!cb.isNull()) {
         return callback(cb, arg, pos, dst);
+    }
 
     return newNode(AST_CALL_IMPORT, pos,
                    "ident", ident,
                    "arg", arg,
                    dst);
 }
 
 bool
--- a/js/src/builtin/TestingFunctions.cpp
+++ b/js/src/builtin/TestingFunctions.cpp
@@ -652,18 +652,19 @@ WasmCachingIsSupported(JSContext* cx, un
 
 static bool
 WasmThreadsSupported(JSContext* cx, unsigned argc, Value* vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
 #ifdef ENABLE_WASM_THREAD_OPS
     bool isSupported = wasm::HasSupport(cx);
 # ifdef ENABLE_WASM_CRANELIFT
-    if (cx->options().wasmForceCranelift())
+    if (cx->options().wasmForceCranelift()) {
         isSupported = false;
+    }
 # endif
 #else
     bool isSupported = false;
 #endif
     args.rval().setBoolean(isSupported);
     return true;
 }
 
@@ -682,35 +683,37 @@ WasmSaturatingTruncationSupported(JSCont
 
 static bool
 WasmBulkMemSupported(JSContext* cx, unsigned argc, Value* vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
 #ifdef ENABLE_WASM_BULKMEM_OPS
     bool isSupported = true;
 # ifdef ENABLE_WASM_CRANELIFT
-    if (cx->options().wasmForceCranelift())
+    if (cx->options().wasmForceCranelift()) {
         isSupported = false;
+    }
 # endif
 #else
     bool isSupported = false;
 #endif
     args.rval().setBoolean(isSupported);
     return true;
 }
 
 static bool
 WasmGcEnabled(JSContext* cx, unsigned argc, Value* vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
 #ifdef ENABLE_WASM_GC
     bool isSupported = cx->options().wasmBaseline() && cx->options().wasmGc();
 # ifdef ENABLE_WASM_CRANELIFT
-    if (cx->options().wasmForceCranelift())
+    if (cx->options().wasmForceCranelift()) {
         isSupported = false;
+    }
 # endif
 #else
     bool isSupported = false;
 #endif
     args.rval().setBoolean(isSupported);
     return true;
 }
 
@@ -1939,18 +1942,19 @@ RunIterativeFailureTest(JSContext* cx, c
             }
 
             // Note that it is possible that the function throws an exception
             // unconnected to the simulated failure, in which case we ignore
             // it. More correct would be to have the caller pass some kind of
             // exception specification and to check the exception against it.
 
             if (!failureWasSimulated && cx->isExceptionPending()) {
-                if (!cx->getPendingException(&exception))
+                if (!cx->getPendingException(&exception)) {
                     return false;
+                }
             }
             cx->clearPendingException();
             simulator.cleanup(cx);
 
             gc::FinishGC(cx);
 
             // Some tests create a new compartment or zone on every
             // iteration. Our GC is triggered by GC allocations and not by
--- a/js/src/ctypes/CTypes.cpp
+++ b/js/src/ctypes/CTypes.cpp
@@ -1078,39 +1078,42 @@ static void
 BuildTypeSource(JSContext* cx, JSObject* typeObj_, bool makeShort,
                 AutoString& result);
 
 static JS::UniqueChars
 TypeSourceForError(JSContext* cx, JSObject* typeObj)
 {
   AutoString source;
   BuildTypeSource(cx, typeObj, true, source);
-  if (!source)
+  if (!source) {
     return nullptr;
+  }
   return EncodeUTF8(cx, source);
 }
 
 static JS::UniqueChars
 FunctionTypeSourceForError(JSContext* cx, HandleObject funObj)
 {
   AutoString funSource;
   BuildFunctionTypeSource(cx, funObj, funSource);
-  if (!funSource)
+  if (!funSource) {
     return nullptr;
+  }
   return EncodeUTF8(cx, funSource);
 }
 
 static JS::UniqueChars
 ConversionPositionForError(JSContext* cx, ConversionType convType, HandleObject funObj,
                            unsigned argIndex)
 {
   AutoString posSource;
   BuildConversionPosition(cx, convType, funObj, argIndex, posSource);
-  if (!posSource)
+  if (!posSource) {
     return nullptr;
+  }
   return EncodeUTF8(cx, posSource);
 }
 
 class IndexCString final
 {
     char indexStr[21]; // space for UINT64_MAX plus terminating null
     static_assert(sizeof(size_t) <= 8, "index array too small");
 
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -741,18 +741,19 @@ TraceBinParser(JSTracer* trc, JS::AutoGC
 {
     static_cast<BinASTParserBase*>(parser)->trace(trc);
 }
 
 template<typename Tok>
 void
 BinASTParser<Tok>::doTrace(JSTracer* trc)
 {
-    if (tokenizer_)
+    if (tokenizer_) {
         tokenizer_->traceMetadata(trc);
+    }
 }
 
 // Force class instantiation.
 // This ensures that the symbols are built, without having to export all our
 // code (and its baggage of #include and macros) in the header.
 template class BinASTParser<BinTokenReaderMultipart>;
 template class BinASTParser<BinTokenReaderTester>;
 
--- a/js/src/frontend/BytecodeCompiler.cpp
+++ b/js/src/frontend/BytecodeCompiler.cpp
@@ -671,18 +671,19 @@ frontend::CompileGlobalBinASTScript(JSCo
     frontend::UsedNameTracker usedNames(cx);
 
     RootedScriptSourceObject sourceObj(cx, CreateScriptSourceObject(cx, options));
 
     if (!sourceObj) {
         return nullptr;
     }
 
-    if (!sourceObj->source()->setBinASTSourceCopy(cx, src, len))
+    if (!sourceObj->source()->setBinASTSourceCopy(cx, src, len)) {
         return nullptr;
+    }
 
     RootedScript script(cx, JSScript::Create(cx, options, sourceObj, 0, len, 0, len));
 
     if (!script) {
         return nullptr;
     }
 
     Directives directives(options.strictOption);
@@ -949,44 +950,50 @@ frontend::CompileLazyBinASTFunction(JSCo
     UsedNameTracker usedNames(cx);
 
     RootedScriptSourceObject sourceObj(cx, &lazy->sourceObject());
     MOZ_ASSERT(sourceObj);
 
     RootedScript script(cx, JSScript::Create(cx, options, sourceObj, lazy->sourceStart(), lazy->sourceEnd(),
                                              lazy->sourceStart(), lazy->sourceEnd()));
 
-    if (!script)
+    if (!script) {
         return false;
+    }
 
-    if (lazy->hasBeenCloned())
+    if (lazy->hasBeenCloned()) {
         script->setHasBeenCloned();
+    }
 
     frontend::BinASTParser<BinTokenReaderMultipart> parser(cx, cx->tempLifoAlloc(),
                                                            usedNames, options, sourceObj,
                                                            lazy);
 
     auto parsed = parser.parseLazyFunction(lazy->scriptSource(), lazy->sourceStart());
 
-    if (parsed.isErr())
+    if (parsed.isErr()) {
         return false;
+    }
 
     ParseNode *pn = parsed.unwrap();
 
     BytecodeEmitter bce(nullptr, &parser, pn->as<CodeNode>().funbox(), script,
                         lazy, pn->pn_pos, BytecodeEmitter::LazyFunction);
 
-    if (!bce.init())
+    if (!bce.init()) {
         return false;
+    }
 
-    if (!bce.emitFunctionScript(&pn->as<CodeNode>(), BytecodeEmitter::TopLevelFunction::Yes))
+    if (!bce.emitFunctionScript(&pn->as<CodeNode>(), BytecodeEmitter::TopLevelFunction::Yes)) {
         return false;
+    }
 
-    if (!NameFunctions(cx, pn))
+    if (!NameFunctions(cx, pn)) {
         return false;
+    }
 
     return script;
 }
 
 #endif // JS_BUILD_BINAST
 
 bool
 frontend::CompileStandaloneFunction(JSContext* cx, MutableHandleFunction fun,
--- a/js/src/fuzz-tests/testStructuredCloneReader.cpp
+++ b/js/src/fuzz-tests/testStructuredCloneReader.cpp
@@ -70,18 +70,19 @@ testStructuredCloneReaderFuzz(const uint
           further memory-related problems.
 
        Tests show that this also doesn't cause a serious performance penalty.
     */
     mozilla::Maybe<JSAutoStructuredCloneBuffer> clonebufOut;
     JS::CloneDataPolicy policy;
 
     clonebufOut.emplace(scope, nullptr, nullptr);
-    if (!clonebufOut->write(gCx, deserialized, UndefinedHandleValue, policy))
+    if (!clonebufOut->write(gCx, deserialized, UndefinedHandleValue, policy)) {
         return 0;
+    }
 
     return 0;
 }
 
 MOZ_FUZZING_INTERFACE_RAW(
     testStructuredCloneReaderInit,
     testStructuredCloneReaderFuzz,
     StructuredCloneReader
--- a/js/src/fuzz-tests/tests.cpp
+++ b/js/src/fuzz-tests/tests.cpp
@@ -42,47 +42,52 @@ static JSObject*
 jsfuzz_createGlobal(JSContext* cx, JSPrincipals* principals)
 {
     /* Create the global object. */
     JS::RootedObject newGlobal(cx);
     JS::RealmOptions options;
     options.creationOptions().setStreamsEnabled(true);
     newGlobal = JS_NewGlobalObject(cx, getGlobalClass(), principals, JS::FireOnNewGlobalHook,
                                    options);
-    if (!newGlobal)
+    if (!newGlobal) {
         return nullptr;
+    }
 
     JSAutoRealm ar(cx, newGlobal);
 
     // Populate the global object with the standard globals like Object and
     // Array.
-    if (!JS::InitRealmStandardClasses(cx))
+    if (!JS::InitRealmStandardClasses(cx)) {
         return nullptr;
+    }
 
     return newGlobal;
 }
 
 static bool
 jsfuzz_init(JSContext** cx, JS::PersistentRootedObject* global)
 {
     *cx = JS_NewContext(8L * 1024 * 1024);
-    if (!*cx)
+    if (!*cx) {
         return false;
+    }
 
     const size_t MAX_STACK_SIZE = 500000;
 
     JS_SetNativeStackQuota(*cx, MAX_STACK_SIZE);
 
     js::UseInternalJobQueues(*cx);
-    if (!JS::InitSelfHostedCode(*cx))
+    if (!JS::InitSelfHostedCode(*cx)) {
         return false;
+    }
     global->init(*cx);
     *global = jsfuzz_createGlobal(*cx, nullptr);
-    if (!*global)
+    if (!*global) {
         return false;
+    }
     JS::EnterRealm(*cx, *global);
     return true;
 }
 
 static void
 jsfuzz_uninit(JSContext* cx)
 {
     if (cx) {
--- a/js/src/gc/GC.cpp
+++ b/js/src/gc/GC.cpp
@@ -4281,18 +4281,19 @@ GCRuntime::purgeRuntime()
         cache->purge();
     }
 
     MOZ_ASSERT(unmarkGrayStack.empty());
     unmarkGrayStack.clearAndFree();
 
     // If we're the main runtime, tell helper threads to free their unused
     // memory when they are next idle.
-    if (!rt->parentRuntime)
+    if (!rt->parentRuntime) {
         HelperThreadState().triggerFreeUnusedMemory();
+    }
 }
 
 bool
 GCRuntime::shouldPreserveJITCode(Realm* realm, const TimeStamp &currentTime,
                                  JS::gcreason::Reason reason, bool canAllocateMoreCode)
 {
     static const auto oneSecond = TimeDuration::FromSeconds(1);
 
--- a/js/src/gdb/gdb-tests.cpp
+++ b/js/src/gdb/gdb-tests.cpp
@@ -32,26 +32,28 @@ void
 usePointer(const void* ptr) {
     dontOptimizeMeAway++;
 }
 
 template<typename T>
 static inline T*
 checkPtr(T* ptr)
 {
-  if (! ptr)
+  if (! ptr) {
     abort();
+  }
   return ptr;
 }
 
 static void
 checkBool(bool success)
 {
-  if (! success)
+  if (! success) {
     abort();
+  }
 }
 
 /* The warning reporter callback. */
 void reportWarning(JSContext* cx, JSErrorReport* report)
 {
     fprintf(stderr, "%s:%u: %s\n",
             report->filename ? report->filename : "<no filename>",
             (unsigned int) report->lineno,
--- a/js/src/gdb/tests/test-unwind.cpp
+++ b/js/src/gdb/tests/test-unwind.cpp
@@ -26,18 +26,19 @@ static const JSFunctionSpecWithHelp unwi
 "  Test function for test-unwind."),
     JS_FS_HELP_END
 };
 
 FRAGMENT(unwind, simple) {
     using namespace JS;
 
     JS::Rooted<JSObject*> global(cx, JS::CurrentGlobalOrNull(cx));
-    if (!JS_DefineFunctionsWithHelp(cx, global, unwind_functions))
+    if (!JS_DefineFunctionsWithHelp(cx, global, unwind_functions)) {
         return;
+    }
 
     // baseline-eager.
     uint32_t saveThreshold = js::jit::JitOptions.baselineWarmUpThreshold;
     js::jit::JitOptions.baselineWarmUpThreshold = 0;
 
     int line0 = __LINE__;
     const char* bytes = "\n"
         "function unwindFunctionInner() {\n"
--- a/js/src/jit/CacheIR.cpp
+++ b/js/src/jit/CacheIR.cpp
@@ -5848,18 +5848,19 @@ BinaryArithIRGenerator::tryAttachStub()
         return true;
     }
 
     // String x Object
     if (tryAttachStringObjectConcat()) {
         return true;
     }
 
-    if (tryAttachStringNumberConcat())
+    if (tryAttachStringNumberConcat()) {
         return true;
+    }
 
 
     trackAttached(IRGenerator::NotAttached);
     return false;
 }
 
 bool
 BinaryArithIRGenerator::tryAttachBitwise()
@@ -6052,18 +6053,19 @@ BinaryArithIRGenerator::tryAttachInt32()
     return true;
 }
 
 
 bool
 BinaryArithIRGenerator::tryAttachStringNumberConcat()
 {
     // Only Addition
-    if (op_ != JSOP_ADD)
-        return false;
+    if (op_ != JSOP_ADD) {
+        return false;
+    }
 
     if (!(lhs_.isString() && rhs_.isNumber()) &&
         !(lhs_.isNumber() && rhs_.isString()))
     {
         return false;
     }
 
     ValOperandId lhsId(writer.setInputOperandId(0));
--- a/js/src/jit/CacheIRCompiler.cpp
+++ b/js/src/jit/CacheIRCompiler.cpp
@@ -4042,18 +4042,19 @@ CacheIRCompiler::emitLoadObject()
 }
 
 bool
 CacheIRCompiler::emitCallInt32ToString() {
     Register input = allocator.useRegister(masm, reader.int32OperandId());
     Register result = allocator.defineRegister(masm, reader.stringOperandId());
 
     FailurePath* failure;
-    if (!addFailurePath(&failure))
+    if (!addFailurePath(&failure)) {
         return false;
+    }
 
     LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(), liveVolatileFloatRegs());
     volatileRegs.takeUnchecked(result);
     masm.PushRegsInMask(volatileRegs);
 
     masm.setupUnalignedABICall(result);
     masm.loadJSContext(result);
     masm.passABIArg(result);
@@ -4071,18 +4072,19 @@ bool
 CacheIRCompiler::emitCallNumberToString() {
     // Float register must be preserved. The BinaryArith ICs use
     // the fact that baseline has them available, as well as fixed temps on
     // LBinaryCache.
     allocator.ensureDoubleRegister(masm, reader.valOperandId(), FloatReg0);
     Register result = allocator.defineRegister(masm, reader.stringOperandId());
 
     FailurePath* failure;
-    if (!addFailurePath(&failure))
+    if (!addFailurePath(&failure)) {
         return false;
+    }
 
     LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(), liveVolatileFloatRegs());
     volatileRegs.takeUnchecked(result);
     volatileRegs.addUnchecked(FloatReg0);
     masm.PushRegsInMask(volatileRegs);
 
     masm.setupUnalignedABICall(result);
     masm.loadJSContext(result);
--- a/js/src/jit/IonOptimizationLevels.cpp
+++ b/js/src/jit/IonOptimizationLevels.cpp
@@ -12,16 +12,17 @@
 using namespace js;
 using namespace js::jit;
 
 namespace js {
 namespace jit {
 
 const OptimizationLevelInfo IonOptimizations;
 
+// Duplicated in all.js - ensure both match.
 const uint32_t OptimizationInfo::CompilerWarmupThreshold = 1000;
 const uint32_t OptimizationInfo::CompilerSmallFunctionWarmupThreshold = CompilerWarmupThreshold;
 
 void
 OptimizationInfo::initNormalOptimizationInfo()
 {
     level_ = OptimizationLevel::Normal;
 
--- a/js/src/jit/JitOptions.cpp
+++ b/js/src/jit/JitOptions.cpp
@@ -153,24 +153,26 @@ DefaultJitOptions::DefaultJitOptions()
     // Toggles whether functions may be entered at loop headers.
     SET_DEFAULT(osr, true);
 
     // Whether to enable extra code to perform dynamic validations.
     SET_DEFAULT(runExtraChecks, false);
 
     // How many invocations or loop iterations are needed before functions
     // are compiled with the baseline compiler.
+    // Duplicated in all.js - ensure both match.
     SET_DEFAULT(baselineWarmUpThreshold, 10);
 
     // Number of exception bailouts (resuming into catch/finally block) before
     // we invalidate and forbid Ion compilation.
     SET_DEFAULT(exceptionBailoutThreshold, 10);
 
     // Number of bailouts without invalidation before we set
     // JSScript::hadFrequentBailouts and invalidate.
+    // Duplicated in all.js - ensure both match.
     SET_DEFAULT(frequentBailoutThreshold, 10);
 
     // Whether to run all debug checks in debug builds.
     // Disabling might make it more enjoyable to run JS in debug builds.
     SET_DEFAULT(fullDebugChecks, true);
 
     // How many actual arguments are accepted on the C stack.
     SET_DEFAULT(maxStackArgs, 4096);
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -6515,16 +6515,23 @@ JS_SetGlobalJitCompilerOption(JSContext*
         if (value == 1) {
             JS::ContextOptionsRef(cx).setIon(true);
             JitSpew(js::jit::JitSpew_IonScripts, "Enable ion");
         } else if (value == 0) {
             JS::ContextOptionsRef(cx).setIon(false);
             JitSpew(js::jit::JitSpew_IonScripts, "Disable ion");
         }
         break;
+        case JSJITCOMPILER_ION_FREQUENT_BAILOUT_THRESHOLD:
+            if (value == uint32_t(-1)) {
+                jit::DefaultJitOptions defaultValues;
+                value = defaultValues.frequentBailoutThreshold;
+            }
+            jit::JitOptions.frequentBailoutThreshold = value;
+        break;
       case JSJITCOMPILER_BASELINE_ENABLE:
         if (value == 1) {
             JS::ContextOptionsRef(cx).setBaseline(true);
             ReleaseAllJITCode(rt->defaultFreeOp());
             JitSpew(js::jit::JitSpew_BaselineScripts, "Enable baseline");
         } else if (value == 0) {
             JS::ContextOptionsRef(cx).setBaseline(false);
             ReleaseAllJITCode(rt->defaultFreeOp());
@@ -6607,16 +6614,19 @@ JS_GetGlobalJitCompilerOption(JSContext*
         *valueOut = jit::JitOptions.forceInlineCaches;
         break;
       case JSJITCOMPILER_ION_CHECK_RANGE_ANALYSIS:
         *valueOut = jit::JitOptions.checkRangeAnalysis;
         break;
       case JSJITCOMPILER_ION_ENABLE:
         *valueOut = JS::ContextOptionsRef(cx).ion();
         break;
+      case JSJITCOMPILER_ION_FREQUENT_BAILOUT_THRESHOLD:
+        *valueOut = jit::JitOptions.frequentBailoutThreshold;
+        break;
       case JSJITCOMPILER_BASELINE_ENABLE:
         *valueOut = JS::ContextOptionsRef(cx).baseline();
         break;
       case JSJITCOMPILER_OFFTHREAD_COMPILATION_ENABLE:
         *valueOut = rt->canUseOffthreadIonCompilation();
         break;
       case JSJITCOMPILER_WASM_FOLD_OFFSETS:
         *valueOut = jit::JitOptions.wasmFoldOffsets ? 1 : 0;
--- a/js/src/jsapi.h
+++ b/js/src/jsapi.h
@@ -4455,16 +4455,17 @@ JS_SetOffthreadIonCompilationEnabled(JSC
 
 #define JIT_COMPILER_OPTIONS(Register)                                      \
     Register(BASELINE_WARMUP_TRIGGER, "baseline.warmup.trigger")            \
     Register(ION_WARMUP_TRIGGER, "ion.warmup.trigger")                      \
     Register(ION_GVN_ENABLE, "ion.gvn.enable")                              \
     Register(ION_FORCE_IC, "ion.forceinlineCaches")                         \
     Register(ION_ENABLE, "ion.enable")                                      \
     Register(ION_CHECK_RANGE_ANALYSIS, "ion.check-range-analysis")          \
+    Register(ION_FREQUENT_BAILOUT_THRESHOLD, "ion.frequent-bailout-threshold") \
     Register(BASELINE_ENABLE, "baseline.enable")                            \
     Register(OFFTHREAD_COMPILATION_ENABLE, "offthread-compilation.enable")  \
     Register(FULL_DEBUG_CHECKS, "jit.full-debug-checks")                    \
     Register(JUMP_THRESHOLD, "jump-threshold")                              \
     Register(TRACK_OPTIMIZATIONS, "jit.track-optimizations")                \
     Register(ENABLE_TRACELOGGER, "jit.enable-tracelogger")                  \
     Register(SIMULATOR_ALWAYS_INTERRUPT, "simulator.always-interrupt")      \
     Register(SPECTRE_INDEX_MASKING, "spectre.index-masking")                \
--- a/js/src/shell/js.cpp
+++ b/js/src/shell/js.cpp
@@ -4395,36 +4395,38 @@ SetJitCompilerOption(JSContext* cx, unsi
     // races.
     if (workerThreadsLock) {
         ReportUsageErrorASCII(cx, callee,
                               "Can't set JIT options when there are worker threads.");
         return false;
     }
 
     JSFlatString* strArg = JS_FlattenString(cx, args[0].toString());
-    if (!strArg)
-        return false;
+    if (!strArg) {
+        return false;
+    }
 
 #define JIT_COMPILER_MATCH(key, string)                 \
     else if (JS_FlatStringEqualsAscii(strArg, string))  \
         opt = JSJITCOMPILER_ ## key;
 
     JSJitCompilerOption opt = JSJITCOMPILER_NOT_AN_OPTION;
     if (false) {}
     JIT_COMPILER_OPTIONS(JIT_COMPILER_MATCH);
 #undef JIT_COMPILER_MATCH
 
     if (opt == JSJITCOMPILER_NOT_AN_OPTION) {
         ReportUsageErrorASCII(cx, callee, "First argument does not name a valid option (see jsapi.h).");
         return false;
     }
 
     int32_t number = args[1].toInt32();
-    if (number < 0)
+    if (number < 0) {
         number = -1;
+    }
 
     // Throw if disabling the JITs and there's JIT code on the stack, to avoid
     // assertion failures.
     if ((opt == JSJITCOMPILER_BASELINE_ENABLE || opt == JSJITCOMPILER_ION_ENABLE) &&
         number == 0)
     {
         js::jit::JitActivationIterator iter(cx);
         if (!iter.done()) {
@@ -4803,18 +4805,19 @@ ParseBinASTData(JSContext* cx, uint8_t* 
 {
     MOZ_ASSERT(globalsc);
 
     // Note: We need to keep `reader` alive as long as we can use `parsed`.
     BinASTParser<Tok> reader(cx, cx->tempLifoAlloc(), usedNames, options, sourceObj);
 
     JS::Result<ParseNode*> parsed = reader.parse(globalsc, buf_data, buf_length);
 
-    if (parsed.isErr())
-        return false;
+    if (parsed.isErr()) {
+        return false;
+    }
 
 #ifdef DEBUG
     Fprinter out(stderr);
     DumpParseTree(parsed.unwrap(), out);
 #endif
 
     return true;
 }
--- a/js/src/vm/DateTime.cpp
+++ b/js/src/vm/DateTime.cpp
@@ -672,37 +672,40 @@ ReadTimeZoneLink(const char* tz)
     constexpr size_t PathMax = 4096;
 #endif
     static_assert(PathMax > 0, "PathMax should be larger than zero");
 
     char linkName[PathMax];
     constexpr size_t linkNameLen = mozilla::ArrayLength(linkName) - 1; // -1 to null-terminate.
 
     // Return if the TZ value is too large.
-    if (std::strlen(tz) > linkNameLen)
+    if (std::strlen(tz) > linkNameLen) {
         return icu::UnicodeString();
+    }
 
     std::strcpy(linkName, tz);
 
     char linkTarget[PathMax];
     constexpr size_t linkTargetLen = mozilla::ArrayLength(linkTarget) - 1; // -1 to null-terminate.
 
     uint32_t depth = 0;
 
     // Search until we find "/zoneinfo/" in the link name.
     const char* timeZoneWithZoneInfo;
     while (!(timeZoneWithZoneInfo = std::strstr(linkName, ZoneInfoPath))) {
         // Return if the symlink nesting is too deep.
-        if (++depth > FollowDepthLimit)
+        if (++depth > FollowDepthLimit) {
             return icu::UnicodeString();
+        }
 
         // Return on error or if the result was truncated.
         ssize_t slen = readlink(linkName, linkTarget, linkTargetLen);
-        if (slen < 0 || size_t(slen) >= linkTargetLen)
+        if (slen < 0 || size_t(slen) >= linkTargetLen) {
             return icu::UnicodeString();
+        }
 
         // Ensure linkTarget is null-terminated. (readlink may not necessarily
         // null-terminate the string.)
         size_t len = size_t(slen);
         linkTarget[len] = '\0';
 
         // If the target is absolute, continue with that.
         if (linkTarget[0] == '/') {
@@ -720,18 +723,19 @@ ReadTimeZoneLink(const char* tz)
             std::strcpy(linkName, linkTarget);
             continue;
         }
 
         // Remove everything after the final path separator in linkName.
         separator[1] = '\0';
 
         // Return if the concatenated path name is too large.
-        if (std::strlen(linkName) + len > linkNameLen)
+        if (std::strlen(linkName) + len > linkNameLen) {
             return icu::UnicodeString();
+        }
 
         // Keep it simple and just concatenate the path names.
         std::strcat(linkName, linkTarget);
     }
 
     const char* timeZone = timeZoneWithZoneInfo + ZoneInfoPathLength;
     size_t timeZoneLen = std::strlen(timeZone);
 
@@ -739,22 +743,24 @@ ReadTimeZoneLink(const char* tz)
     // legacy time zone names.
     // See <https://github.com/eggert/tz/blob/master/theory.html>.
     for (size_t i = 0; i < timeZoneLen; i++) {
         char c = timeZone[i];
 
         // According to theory.html, '.' is allowed in time zone ids, but the
         // accompanying zic.c file doesn't allow it. Assume the source file is
         // correct and disallow '.' here, too.
-        if (mozilla::IsAsciiAlphanumeric(c) || c == '_' || c == '-' || c == '+')
+        if (mozilla::IsAsciiAlphanumeric(c) || c == '_' || c == '-' || c == '+') {
             continue;
+        }
 
         // Reject leading, trailing, or consecutive '/' characters.
-        if (c == '/' && i > 0 && i + 1 < timeZoneLen && timeZone[i + 1] != '/')
+        if (c == '/' && i > 0 && i + 1 < timeZoneLen && timeZone[i + 1] != '/') {
             continue;
+        }
 
         return icu::UnicodeString();
     }
 
     return icu::UnicodeString(timeZone, timeZoneLen, US_INV);
 }
 #endif /* ENABLE_INTL_API && defined(ICU_TZ_HAS_RECREATE_DEFAULT) */
 
@@ -782,18 +788,19 @@ js::ResyncICUDefaultTimeZone()
             }
 #else
             // The TZ environment variable allows both absolute and
             // relative paths, optionally beginning with a colon (':').
             // (Relative paths, without the colon, are just Olson time
             // zone names.)  We need to handle absolute paths ourselves,
             // including handling that they might be symlinks.
             // <https://unicode-org.atlassian.net/browse/ICU-13694>
-            if (const char* tzlink = TZContainsAbsolutePath(tz))
+            if (const char* tzlink = TZContainsAbsolutePath(tz)) {
                 tzid.setTo(ReadTimeZoneLink(tzlink));
+            }
 #endif /* defined(XP_WIN) */
 
             if (!tzid.isEmpty()) {
                 mozilla::UniquePtr<icu::TimeZone> newTimeZone(icu::TimeZone::createTimeZone(tzid));
                 MOZ_ASSERT(newTimeZone);
                 if (*newTimeZone != icu::TimeZone::getUnknown()) {
                     // adoptDefault() takes ownership of the time zone.
                     icu::TimeZone::adoptDefault(newTimeZone.release());
--- a/js/src/vm/Debugger.cpp
+++ b/js/src/vm/Debugger.cpp
@@ -5049,22 +5049,24 @@ class MOZ_STACK_CLASS Debugger::SourceQu
                                     ZoneAllocPolicy>;
 
     SourceQuery(JSContext* cx, Debugger* dbg)
       : QueryBase(cx, dbg),
         sources(cx, SourceSet(cx->zone()))
     {}
 
     bool findSources() {
-        if (!matchAllDebuggeeGlobals())
-            return false;
+        if (!matchAllDebuggeeGlobals()) {
+            return false;
+        }
 
         Realm* singletonRealm = nullptr;
-        if (realms.count() == 1)
+        if (realms.count() == 1) {
             singletonRealm = realms.all().front();
+        }
 
         // Search each realm for debuggee scripts.
         MOZ_ASSERT(sources.empty());
         oom = false;
         IterateScripts(cx, singletonRealm, this, considerScript);
         IterateLazyScripts(cx, singletonRealm, this, considerLazyScript);
         if (oom) {
             ReportOutOfMemory(cx);
@@ -5101,53 +5103,63 @@ class MOZ_STACK_CLASS Debugger::SourceQu
 
     static void considerLazyScript(JSRuntime* rt, void* data, LazyScript* lazyScript,
                                    const JS::AutoRequireNoGC& nogc) {
         SourceQuery* self = static_cast<SourceQuery*>(data);
         self->consider(lazyScript, nogc);
     }
 
     void consider(JSScript* script, const JS::AutoRequireNoGC& nogc) {
-        if (oom || script->selfHosted())
+        if (oom || script->selfHosted()) {
             return;
+        }
         Realm* realm = script->realm();
-        if (!realms.has(realm))
+        if (!realms.has(realm)) {
             return;
-
-        if (!script->sourceObject())
+        }
+
+        if (!script->sourceObject()) {
             return;
+        }
 
         ScriptSourceObject* source =
             &UncheckedUnwrap(script->sourceObject())->as<ScriptSourceObject>();
-        if (!sources.put(source))
+        if (!sources.put(source)) {
             oom = true;
+        }
     }
 
     void consider(LazyScript* lazyScript, const JS::AutoRequireNoGC& nogc) {
-        if (oom)
+        if (oom) {
             return;
+        }
         Realm* realm = lazyScript->realm();
-        if (!realms.has(realm))
+        if (!realms.has(realm)) {
             return;
+        }
 
         // If the script is already delazified, it should already be handled.
-        if (lazyScript->maybeScript())
+        if (lazyScript->maybeScript()) {
             return;
+        }
 
         ScriptSourceObject* source = &lazyScript->sourceObject();
-        if (!sources.put(source))
+        if (!sources.put(source)) {
             oom = true;
+        }
     }
 
     void consider(WasmInstanceObject* instanceObject) {
-        if (oom)
+        if (oom) {
             return;
-
-        if (!sources.put(instanceObject))
+        }
+
+        if (!sources.put(instanceObject)) {
             oom = true;
+        }
     }
 };
 
 static inline DebuggerSourceReferent
 AsSourceReferent(JSObject* obj)
 {
     if (obj->is<ScriptSourceObject>()) {
         return AsVariant(&obj->as<ScriptSourceObject>());
@@ -5161,34 +5173,37 @@ Debugger::findSources(JSContext* cx, uns
     THIS_DEBUGGER(cx, argc, vp, "findSources", args, dbg);
 
     if (gc::GCRuntime::temporaryAbortIfWasmGc(cx)) {
         JS_ReportErrorASCII(cx, "API temporarily unavailable under wasm gc");
         return false;
     }
 
     SourceQuery query(cx, dbg);
-    if (!query.findSources())
-        return false;
+    if (!query.findSources()) {
+        return false;
+    }
 
     Handle<SourceQuery::SourceSet> sources(query.foundSources());
 
     size_t resultLength = sources.count();
     RootedArrayObject result(cx, NewDenseFullyAllocatedArray(cx, resultLength));
-    if (!result)
-        return false;
+    if (!result) {
+        return false;
+    }
 
     result->ensureDenseInitializedLength(cx, 0, resultLength);
 
     size_t i = 0;
     for (auto iter = sources.get().iter(); !iter.done(); iter.next()) {
         Rooted<DebuggerSourceReferent> sourceReferent(cx, AsSourceReferent(iter.get()));
         RootedObject sourceObject(cx, dbg->wrapVariantReferent(cx, sourceReferent));
-        if (!sourceObject)
-            return false;
+        if (!sourceObject) {
+            return false;
+        }
         result->setDenseElement(i, ObjectValue(*sourceObject));
         i++;
     }
 
     args.rval().setObject(*result);
     return true;
 }
 
--- a/js/src/vm/HelperThreads.cpp
+++ b/js/src/vm/HelperThreads.cpp
@@ -925,18 +925,19 @@ js::StartOffThreadDecodeMultiScripts(JSC
 
 #if defined(JS_BUILD_BINAST)
 
 bool
 js::StartOffThreadDecodeBinAST(JSContext* cx, const ReadOnlyCompileOptions& options,
                                const uint8_t* buf, size_t length,
                                JS::OffThreadCompileCallback callback, void *callbackData)
 {
-    if (!cx->runtime()->binast().ensureBinTablesInitialized(cx))
+    if (!cx->runtime()->binast().ensureBinTablesInitialized(cx)) {
         return false;
+    }
 
     auto task = cx->make_unique<BinASTDecodeTask>(cx, buf, length, callback, callbackData);
     if (!task || !StartOffThreadParseTask(cx, task.get(), options)) {
         return false;
     }
 
     Unused << task.release();
     return true;
@@ -1238,22 +1239,24 @@ GlobalHelperThreadState::checkTaskThread
     }
 
     return true;
 }
 
 void
 GlobalHelperThreadState::triggerFreeUnusedMemory()
 {
-    if (!CanUseExtraThreads())
+    if (!CanUseExtraThreads()) {
         return;
+    }
 
     AutoLockHelperThreadState lock;
-    for (auto& thread : *threads)
+    for (auto& thread : *threads) {
         thread.shouldFreeUnusedMemory = true;
+    }
     notifyAll(PRODUCER, lock);
 }
 
 struct MOZ_RAII AutoSetContextRuntime
 {
     explicit AutoSetContextRuntime(JSRuntime* rt) {
         TlsContext.get()->setRuntime(rt);
     }
--- a/js/src/vm/JSFunction.cpp
+++ b/js/src/vm/JSFunction.cpp
@@ -1800,18 +1800,19 @@ JSFunction::createScriptForLazilyInterpr
 #endif /*JS_BUILD_BINAST */
         } else {
             MOZ_ASSERT(lazy->scriptSource()->hasSourceText());
 
             // Parse and compile the script from source.
             UncompressedSourceCache::AutoHoldEntry holder;
             ScriptSource::PinnedChars chars(cx, lazy->scriptSource(), holder,
                                             lazy->sourceStart(), lazyLength);
-            if (!chars.get())
+            if (!chars.get()) {
                 return false;
+            }
 
             if (!frontend::CompileLazyFunction(cx, lazy, chars.get(), lazyLength)) {
 		// The frontend shouldn't fail after linking the function and the
 		// non-lazy script together.
                 MOZ_ASSERT(fun->isInterpretedLazy());
                 MOZ_ASSERT(fun->lazyScript() == lazy);
                 MOZ_ASSERT(!lazy->hasScript());
                 return false;
--- a/js/src/vm/TypeInference.cpp
+++ b/js/src/vm/TypeInference.cpp
@@ -4754,18 +4754,19 @@ void
 ObjectGroup::sweep(const AutoSweepObjectGroup& sweep)
 {
     MOZ_ASSERT(generation() != zoneFromAnyThread()->types.generation);
     setGeneration(zone()->types.generation);
 
     AssertGCStateForSweep(zone());
 
     Maybe<AutoClearTypeInferenceStateOnOOM> clearStateOnOOM;
-    if (!zone()->types.isSweepingTypes())
+    if (!zone()->types.isSweepingTypes()) {
         clearStateOnOOM.emplace(zone());
+    }
 
     AutoTouchingGrayThings tgt;
 
     if (auto* layout = maybeUnboxedLayout(sweep)) {
         // Remove unboxed layouts that are about to be finalized from the
         // realm wide list while we are still on the main thread.
         ObjectGroup* group = this;
         if (IsAboutToBeFinalizedUnbarriered(&group)) {
@@ -4881,18 +4882,19 @@ ObjectGroup::sweep(const AutoSweepObject
 JSScript::sweepTypes(const js::AutoSweepTypeScript& sweep)
 {
     MOZ_ASSERT(typesGeneration() != zone()->types.generation);
     setTypesGeneration(zone()->types.generation);
 
     AssertGCStateForSweep(zone());
 
     Maybe<AutoClearTypeInferenceStateOnOOM> clearStateOnOOM;
-    if (!zone()->types.isSweepingTypes())
+    if (!zone()->types.isSweepingTypes()) {
         clearStateOnOOM.emplace(zone());
+    }
 
     TypeZone& types = zone()->types;
 
     // Sweep the inlinedCompilations Vector.
     {
         RecompileInfoVector& inlinedCompilations = types_->inlinedCompilations();
         size_t dest = 0;
         for (size_t i = 0; i < inlinedCompilations.length(); i++) {
--- a/js/src/wasm/WasmCompile.cpp
+++ b/js/src/wasm/WasmCompile.cpp
@@ -545,18 +545,19 @@ wasm::CompileBuffer(const CompileArgs& a
     }
 
 #ifdef ENABLE_WASM_CRANELIFT
     if (compilerEnv.tier() == Tier::Optimized &&
         compilerEnv.optimizedBackend() == OptimizedBackend::Cranelift)
     {
         // At the moment, Cranelift performs no validation, so validate
         // explicitly.
-        if (!ValidateForCranelift(bytecode, error))
+        if (!ValidateForCranelift(bytecode, error)) {
            return nullptr;
+        }
     }
 #endif
 
     ModuleGenerator mg(args, &env, nullptr, error);
     if (!mg.init()) {
         return nullptr;
     }
 
--- a/js/src/wasm/WasmCraneliftCompile.cpp
+++ b/js/src/wasm/WasmCraneliftCompile.cpp
@@ -53,40 +53,44 @@ static bool
 GenerateCraneliftCode(WasmMacroAssembler& masm, const CraneliftCompiledFunc& func,
                       const FuncTypeIdDesc& funcTypeId, uint32_t lineOrBytecode,
                       FuncOffsets* offsets)
 {
     wasm::GenerateFunctionPrologue(masm, funcTypeId, mozilla::Nothing(), offsets);
 
     // Omit the check when framePushed is small and we know there's no
     // recursion.
-    if (func.framePushed < MAX_UNCHECKED_LEAF_FRAME_SIZE && !func.containsCalls)
+    if (func.framePushed < MAX_UNCHECKED_LEAF_FRAME_SIZE && !func.containsCalls) {
         masm.reserveStack(func.framePushed);
-    else
+    } else {
         masm.wasmReserveStackChecked(func.framePushed, BytecodeOffset(lineOrBytecode));
+    }
     MOZ_ASSERT(masm.framePushed() == func.framePushed);
 
     uint32_t funcBase = masm.currentOffset();
-    if (!masm.appendRawCode(func.code, func.codeSize))
+    if (!masm.appendRawCode(func.code, func.codeSize)) {
         return false;
+    }
 
     wasm::GenerateFunctionEpilogue(masm, func.framePushed, offsets);
 
     masm.flush();
-    if (masm.oom())
+    if (masm.oom()) {
         return false;
+    }
     offsets->end = masm.currentOffset();
 
     for (size_t i = 0; i < func.numMetadata; i++) {
         const CraneliftMetadataEntry& metadata = func.metadatas[i];
 
         CheckedInt<size_t> offset = funcBase;
         offset += metadata.offset;
-        if (!offset.isValid())
+        if (!offset.isValid()) {
             return false;
+        }
 
 #ifdef DEBUG
         CheckedInt<uint32_t> checkedBytecodeOffset = lineOrBytecode;
         checkedBytecodeOffset += metadata.srcLoc;
         MOZ_ASSERT(checkedBytecodeOffset.isValid());
 #endif
         uint32_t bytecodeOffset = lineOrBytecode + metadata.srcLoc;
 
@@ -141,18 +145,19 @@ class AutoCranelift
       : env_(env),
         compiler_(nullptr)
     {}
     bool init() {
         compiler_ = cranelift_compiler_create(&staticEnv_, &env_);
         return !!compiler_;
     }
     ~AutoCranelift() {
-        if (compiler_)
+        if (compiler_) {
             cranelift_compiler_destroy(compiler_);
+        }
     }
     operator CraneliftCompiler*() { return compiler_; }
 };
 
 CraneliftFuncCompileInput::CraneliftFuncCompileInput(const FuncCompileInput& func)
   : bytecode(func.begin),
     bytecodeSize(func.end - func.begin),
     index(func.index)
@@ -272,52 +277,57 @@ wasm::CraneliftCompileFunctions(const Mo
                                 const FuncCompileInputVector& inputs,
                                 CompiledCode* code,
                                 UniqueChars* error)
 {
     MOZ_ASSERT(env.tier() == Tier::Optimized);
     MOZ_ASSERT(env.optimizedBackend() == OptimizedBackend::Cranelift);
 
     AutoCranelift compiler(env);
-    if (!compiler.init())
+    if (!compiler.init()) {
         return false;
+    }
 
     TempAllocator alloc(&lifo);
     JitContext jitContext(&alloc);
     WasmMacroAssembler masm(alloc);
     MOZ_ASSERT(IsCompilingWasm());
 
     // Swap in already-allocated empty vectors to avoid malloc/free.
     MOZ_ASSERT(code->empty());
-    if (!code->swap(masm))
+    if (!code->swap(masm)) {
         return false;
+    }
 
     for (const FuncCompileInput& func : inputs) {
         CraneliftFuncCompileInput clifInput(func);
 
         CraneliftCompiledFunc clifFunc;
         if (!cranelift_compile_function(compiler, &clifInput, &clifFunc)) {
             *error = JS_smprintf("Cranelift error in clifFunc #%u", clifInput.index);
             return false;
         }
 
         uint32_t lineOrBytecode = func.lineOrBytecode;
         const FuncTypeIdDesc& funcTypeId = env.funcTypes[clifInput.index]->id;
 
         FuncOffsets offsets;
-        if (!GenerateCraneliftCode(masm, clifFunc, funcTypeId, lineOrBytecode, &offsets))
+        if (!GenerateCraneliftCode(masm, clifFunc, funcTypeId, lineOrBytecode, &offsets)) {
             return false;
+        }
 
-        if (!code->codeRanges.emplaceBack(func.index, func.lineOrBytecode, offsets))
+        if (!code->codeRanges.emplaceBack(func.index, func.lineOrBytecode, offsets)) {
             return false;
+        }
     }
 
     masm.finish();
-    if (masm.oom())
+    if (masm.oom()) {
         return false;
+    }
 
     return code->swap(masm);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 //
 // Callbacks from Rust to C++.
 
@@ -418,18 +428,19 @@ funcType_numArgs(const FuncTypeWithId* f
 {
     return funcType->args().length();
 }
 
 const BD_ValType*
 funcType_args(const FuncTypeWithId* funcType)
 {
 #ifdef DEBUG
-    for (ValType valType : funcType->args())
+    for (ValType valType : funcType->args()) {
         MOZ_ASSERT(IsCraneliftCompatible(TypeCode(valType.code())));
+    }
 #endif
     static_assert(sizeof(BD_ValType) == sizeof(ValType), "update BD_ValType");
     return (const BD_ValType*)&funcType->args()[0];
 }
 
 TypeCode
 funcType_retType(const FuncTypeWithId* funcType)
 {
--- a/js/src/wasm/WasmGenerator.cpp
+++ b/js/src/wasm/WasmGenerator.cpp
@@ -951,18 +951,19 @@ ModuleGenerator::finishCodeTier()
 
     if (!linkCompiledCode(stubCode)) {
         return nullptr;
     }
 
     // All functions and stubs have been compiled.  Perform module-end
     // validation.
 
-    if (!deferredValidationState_.lock()->performDeferredValidation(*env_, error_))
+    if (!deferredValidationState_.lock()->performDeferredValidation(*env_, error_)) {
         return nullptr;
+    }
 
     // Finish linking and metadata.
 
     if (!finishCodegen()) {
         return nullptr;
     }
 
     if (!finishMetadataTier()) {
--- a/js/src/wasm/WasmInstance.cpp
+++ b/js/src/wasm/WasmInstance.cpp
@@ -458,18 +458,19 @@ Instance::memDrop(Instance* instance, ui
 /* static */ int32_t
 Instance::memFill(Instance* instance, uint32_t byteOffset, uint32_t value, uint32_t len)
 {
     WasmMemoryObject* mem = instance->memory();
     uint32_t memLen = mem->volatileMemoryLength();
 
     if (len == 0) {
         // Even though the length is zero, we must check for a valid offset.
-        if (byteOffset < memLen)
+        if (byteOffset < memLen) {
             return 0;
+        }
     } else {
         // Here, we know that |len - 1| cannot underflow.
         CheckedU32 highestOffset = CheckedU32(byteOffset) + CheckedU32(len - 1);
         if (highestOffset.isValid() &&
             highestOffset.value() < memLen)
         {
             ArrayBufferObjectMaybeShared& arrBuf = mem->buffer();
             uint8_t* rawBuf = arrBuf.dataPointerEither().unwrap();
@@ -541,36 +542,39 @@ Instance::memInit(Instance* instance, ui
 Instance::tableCopy(Instance* instance, uint32_t dstOffset, uint32_t srcOffset, uint32_t len)
 {
     const SharedTable& table = instance->tables()[0];
     uint32_t tableLen = table->length();
 
     if (len == 0) {
         // Even though the number of items to copy is zero, we must check
         // for valid offsets.
-        if (dstOffset < tableLen && srcOffset < tableLen)
+        if (dstOffset < tableLen && srcOffset < tableLen) {
             return 0;
+        }
     } else {
         // Here, we know that |len - 1| cannot underflow.
         CheckedU32 lenMinus1 = CheckedU32(len - 1);
         CheckedU32 highestDstOffset = CheckedU32(dstOffset) + lenMinus1;
         CheckedU32 highestSrcOffset = CheckedU32(srcOffset) + lenMinus1;
         if (highestDstOffset.isValid() &&
             highestSrcOffset.isValid() &&
             highestDstOffset.value() < tableLen &&
             highestSrcOffset.value() < tableLen)
         {
             // Actually do the copy, taking care to handle overlapping cases
             // correctly.
             if (dstOffset > srcOffset) {
-                for (uint32_t i = len; i > 0; i--)
+                for (uint32_t i = len; i > 0; i--) {
                     table->copy(dstOffset + (i - 1), srcOffset + (i - 1));
+                }
             } else if (dstOffset < srcOffset) {
-                for (uint32_t i = 0; i < len; i++)
+                for (uint32_t i = 0; i < len; i++) {
                     table->copy(dstOffset + i, srcOffset + i);
+                }
             }
 
             return 0;
         }
     }
 
     JS_ReportErrorNumberASCII(TlsContext.get(), GetErrorMessage, nullptr, JSMSG_WASM_OUT_OF_BOUNDS);
     return -1;
--- a/js/src/wasm/WasmIonCompile.cpp
+++ b/js/src/wasm/WasmIonCompile.cpp
@@ -3128,53 +3128,64 @@ EmitMemFill(FunctionCompiler& f)
     return true;
 }
 
 static bool
 EmitMemOrTableInit(FunctionCompiler& f, bool isMem)
 {
     uint32_t segIndexVal = 0;
     MDefinition* dstOff, *srcOff, *len;
-    if (!f.iter().readMemOrTableInit(isMem, &segIndexVal, &dstOff, &srcOff, &len))
+    if (!f.iter().readMemOrTableInit(isMem, &segIndexVal, &dstOff, &srcOff, &len)) {
         return false;
-
-    if (f.inDeadCode())
+    }
+
+    if (f.inDeadCode()) {
         return false;
+    }
 
     uint32_t lineOrBytecode = f.readCallSiteLineOrBytecode();
 
     CallCompileState args(f, lineOrBytecode);
-    if (!f.startCall(&args))
+    if (!f.startCall(&args)) {
         return false;
-
-    if (!f.passInstance(&args))
+    }
+
+    if (!f.passInstance(&args)) {
         return false;
-
-    if (!f.passArg(dstOff, ValType::I32, &args))
+    }
+
+    if (!f.passArg(dstOff, ValType::I32, &args)) {
         return false;
-    if (!f.passArg(srcOff, ValType::I32, &args))
+    }
+    if (!f.passArg(srcOff, ValType::I32, &args)) {
         return false;
-    if (!f.passArg(len, ValType::I32, &args))
+    }
+    if (!f.passArg(len, ValType::I32, &args)) {
         return false;
+    }
 
     MDefinition* segIndex = f.constant(Int32Value(int32_t(segIndexVal)), MIRType::Int32);
-    if (!f.passArg(segIndex, ValType::I32, &args))
+    if (!f.passArg(segIndex, ValType::I32, &args)) {
         return false;
-
-    if (!f.finishCall(&args))
+    }
+
+    if (!f.finishCall(&args)) {
         return false;
+    }
 
     SymbolicAddress callee = isMem ? SymbolicAddress::MemInit
                                    : SymbolicAddress::TableInit;
     MDefinition* ret;
-    if (!f.builtinInstanceMethodCall(callee, args, ValType::I32, &ret))
+    if (!f.builtinInstanceMethodCall(callee, args, ValType::I32, &ret)) {
         return false;
-
-    if (!f.checkI32NegativeMeansFailedResult(ret))
+    }
+
+    if (!f.checkI32NegativeMeansFailedResult(ret)) {
         return false;
+    }
 
     return true;
 }
 #endif // ENABLE_WASM_BULKMEM_OPS
 
 static bool
 EmitBodyExprs(FunctionCompiler& f)
 {
--- a/js/src/wasm/WasmModule.cpp
+++ b/js/src/wasm/WasmModule.cpp
@@ -574,34 +574,36 @@ Module::initSegments(JSContext* cx,
 {
     Instance& instance = instanceObj->instance();
     const SharedTableVector& tables = instance.tables();
 
     // Perform all error checks up front so that this function does not perform
     // partial initialization if an error is reported.
 
     for (const ElemSegment* seg : elemSegments_) {
-        if (!seg->active())
+        if (!seg->active()) {
             continue;
+        }
 
         uint32_t tableLength = tables[seg->tableIndex]->length();
         uint32_t offset = EvaluateInitExpr(globalImportValues, seg->offset());
 
         if (offset > tableLength || tableLength - offset < seg->length()) {
             JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_FIT,
                                      "elem", "table");
             return false;
         }
     }
 
     if (memoryObj) {
         uint32_t memoryLength = memoryObj->volatileMemoryLength();
         for (const DataSegment* seg : dataSegments_) {
-            if (!seg->active())
+            if (!seg->active()) {
                 continue;
+            }
 
             uint32_t offset = EvaluateInitExpr(globalImportValues, seg->offset());
 
             if (offset > memoryLength || memoryLength - offset < seg->bytes.length()) {
                 JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_FIT,
                                          "data", "memory");
                 return false;
             }
@@ -619,18 +621,19 @@ Module::initSegments(JSContext* cx,
             instance.initElems(*seg, offset, 0, seg->length());
         }
     }
 
     if (memoryObj) {
         uint8_t* memoryBase = memoryObj->buffer().dataPointerEither().unwrap(/* memcpy */);
 
         for (const DataSegment* seg : dataSegments_) {
-            if (!seg->active())
+            if (!seg->active()) {
                 continue;
+            }
 
             // But apply active segments right now.
             uint32_t offset = EvaluateInitExpr(globalImportValues, seg->offset());
             memcpy(memoryBase + offset, seg->bytes.begin(), seg->bytes.length());
         }
     } else {
         MOZ_ASSERT(dataSegments_.empty());
     }
--- a/js/src/wasm/WasmOpIter.h
+++ b/js/src/wasm/WasmOpIter.h
@@ -2072,34 +2072,38 @@ OpIter<Policy>::readMemOrTableCopy(bool 
 
 template <typename Policy>
 inline bool
 OpIter<Policy>::readMemOrTableDrop(bool isMem, uint32_t* segIndex)
 {
     MOZ_ASSERT(Classify(op_) == OpKind::MemOrTableDrop);
 
     if (isMem) {
-        if (!env_.usesMemory())
+        if (!env_.usesMemory()) {
             return fail("can't touch memory without memory");
+        }
     } else {
-        if (env_.tables.length() == 0)
+        if (env_.tables.length() == 0) {
             return fail("can't table.drop without a table");
+        }
     }
 
-    if (!readVarU32(segIndex))
+    if (!readVarU32(segIndex)) {
         return false;
+    }
 
     if (isMem) {
         // We can't range-check *segIndex at this point since we don't yet
         // know how many data segments the module has.  So note the index, but
         // defer the actual check for now.
         dvs_.lock()->notifyDataSegmentIndex(*segIndex, d_.currentOffset());
      } else {
-        if (*segIndex >= env_.elemSegments.length())
+        if (*segIndex >= env_.elemSegments.length()) {
             return fail("table.drop index out of range");
+        }
     }
 
     return true;
 }
 
 template <typename Policy>
 inline bool
 OpIter<Policy>::readMemFill(Value* start, Value* val, Value* len)
@@ -2128,41 +2132,48 @@ OpIter<Policy>::readMemFill(Value* start
 template <typename Policy>
 inline bool
 OpIter<Policy>::readMemOrTableInit(bool isMem, uint32_t* segIndex,
                                    Value* dst, Value* src, Value* len)
 {
     MOZ_ASSERT(Classify(op_) == OpKind::MemOrTableInit);
 
     if (isMem) {
-        if (!env_.usesMemory())
+        if (!env_.usesMemory()) {
             return fail("can't touch memory without memory");
+        }
     } else {
-        if (env_.tables.length() == 0)
+        if (env_.tables.length() == 0) {
             return fail("can't table.init without a table");
+        }
     }
 
-    if (!popWithType(ValType::I32, len))
+    if (!popWithType(ValType::I32, len)) {
         return false;
-
-    if (!popWithType(ValType::I32, src))
+    }
+
+    if (!popWithType(ValType::I32, src)) {
         return false;
-
-    if (!popWithType(ValType::I32, dst))
+    }
+
+    if (!popWithType(ValType::I32, dst)) {
         return false;
-
-    if (!readVarU32(segIndex))
+    }
+
+    if (!readVarU32(segIndex)) {
         return false;
+    }
 
     if (isMem) {
         // Same comment as for readMemOrTableDrop.
         dvs_.lock()->notifyDataSegmentIndex(*segIndex, d_.currentOffset());
     } else {
-        if (*segIndex >= env_.elemSegments.length())
+        if (*segIndex >= env_.elemSegments.length()) {
             return fail("table.init index out of range");
+        }
     }
 
     return true;
 }
 
 template <typename Policy>
 inline bool
 OpIter<Policy>::readStructTypeIndex(uint32_t* typeIndex)
--- a/js/src/wasm/WasmTable.cpp
+++ b/js/src/wasm/WasmTable.cpp
@@ -145,18 +145,19 @@ Table::setNull(uint32_t index)
     elem.tls = nullptr;
 }
 
 void
 Table::copy(uint32_t dstIndex, uint32_t srcIndex)
 {
     if (external_) {
         ExternalTableElem& dst = externalArray()[dstIndex];
-        if (dst.tls)
+        if (dst.tls) {
             JSObject::writeBarrierPre(dst.tls->instance->objectUnbarriered());
+        }
 
         ExternalTableElem& src = externalArray()[srcIndex];
         dst.code = src.code;
         dst.tls = src.tls;
 
         if (dst.tls) {
             MOZ_ASSERT(dst.code);
             MOZ_ASSERT(dst.tls->instance->objectUnbarriered()->isTenured(),
--- a/js/src/wasm/WasmTextToBinary.cpp
+++ b/js/src/wasm/WasmTextToBinary.cpp
@@ -3557,18 +3557,19 @@ ParseMemOrTableCopy(WasmParseContext& c,
 
     return new(c.lifo) AstMemOrTableCopy(isMem, dest, src, len);
 }
 
 static AstMemOrTableDrop*
 ParseMemOrTableDrop(WasmParseContext& c, bool isMem)
 {
     WasmToken segIndexTok;
-    if (!c.ts.getIf(WasmToken::Index, &segIndexTok))
+    if (!c.ts.getIf(WasmToken::Index, &segIndexTok)) {
         return nullptr;
+    }
 
     return new(c.lifo) AstMemOrTableDrop(isMem, segIndexTok.index());
 }
 
 static AstMemFill*
 ParseMemFill(WasmParseContext& c, bool inParens)
 {
     AstExpr* start = ParseExpr(c, inParens);
@@ -3588,30 +3589,34 @@ ParseMemFill(WasmParseContext& c, bool i
 
     return new(c.lifo) AstMemFill(start, val, len);
 }
 
 static AstMemOrTableInit*
 ParseMemOrTableInit(WasmParseContext& c, bool inParens, bool isMem)
 {
     WasmToken segIndexTok;
-    if (!c.ts.getIf(WasmToken::Index, &segIndexTok))
+    if (!c.ts.getIf(WasmToken::Index, &segIndexTok)) {
         return nullptr;
+    }
 
     AstExpr* dst = ParseExpr(c, inParens);
-    if (!dst)
+    if (!dst) {
         return nullptr;
+    }
 
     AstExpr* src = ParseExpr(c, inParens);
-    if (!src)
+    if (!src) {
         return nullptr;
+    }
 
     AstExpr* len = ParseExpr(c, inParens);
-    if (!len)
+    if (!len) {
         return nullptr;
+    }
 
     return new(c.lifo) AstMemOrTableInit(isMem, segIndexTok.index(), dst, src, len);
 }
 #endif
 
 #ifdef ENABLE_WASM_GC
 static AstExpr*
 ParseStructNew(WasmParseContext& c, bool inParens)
@@ -4223,18 +4228,19 @@ ParseInitializerExpressionOrPassive(Wasm
 #ifdef ENABLE_WASM_BULKMEM_OPS
     if (c.ts.getIf(WasmToken::Passive)) {
         *maybeInitExpr = nullptr;
         return true;
     }
 #endif
 
     AstExpr* initExpr = ParseInitializerExpression(c);
-    if (!initExpr)
-        return false;
+    if (!initExpr) {
+        return false;
+    }
 
     *maybeInitExpr = initExpr;
     return true;
 }
 
 static AstDataSegment*
 ParseDataSegment(WasmParseContext& c)
 {
@@ -7005,25 +7011,29 @@ EncodeCodeSection(Encoder& e, Uint32Vect
 
 static bool
 EncodeDestinationOffsetOrFlags(Encoder& e, AstExpr* offsetIfActive)
 {
     if (offsetIfActive) {
         // In the MVP, the following VarU32 is the table or linear memory
         // index and it must be zero.  In the bulk-mem-ops proposal, it is
         // repurposed as a flag field.
-        if (!e.writeVarU32(uint32_t(InitializerKind::Active)))
+        if (!e.writeVarU32(uint32_t(InitializerKind::Active))) {
             return false;
-        if (!EncodeExpr(e, *offsetIfActive))
+        }
+        if (!EncodeExpr(e, *offsetIfActive)) {
             return false;
-        if (!e.writeOp(Op::End))
+        }
+        if (!e.writeOp(Op::End)) {
             return false;
+        }
     } else {
-        if (!e.writeVarU32(uint32_t(InitializerKind::Passive)))
+        if (!e.writeVarU32(uint32_t(InitializerKind::Passive))) {
             return false;
+        }
     }
 
     return true;
 }
 
 static bool
 EncodeDataSegment(Encoder& e, const AstDataSegment& segment)
 {
--- a/js/xpconnect/src/XPCJSContext.cpp
+++ b/js/xpconnect/src/XPCJSContext.cpp
@@ -817,16 +817,17 @@ ReloadPrefsCallback(const char* pref, XP
                                                  "baselinejit.unsafe_eager_compilation");
     bool useIonEager = Preferences::GetBool(JS_OPTIONS_DOT_STR "ion.unsafe_eager_compilation");
 #ifdef DEBUG
     bool fullJitDebugChecks = Preferences::GetBool(JS_OPTIONS_DOT_STR "jit.full_debug_checks");
 #endif
 
     int32_t baselineThreshold = Preferences::GetInt(JS_OPTIONS_DOT_STR "baselinejit.threshold", -1);
     int32_t ionThreshold = Preferences::GetInt(JS_OPTIONS_DOT_STR "ion.threshold", -1);
+    int32_t ionFrequentBailoutThreshold = Preferences::GetInt(JS_OPTIONS_DOT_STR "ion.frequent_bailout_threshold", -1);
 
     sDiscardSystemSource = Preferences::GetBool(JS_OPTIONS_DOT_STR "discardSystemSource");
 
     bool useAsyncStack = Preferences::GetBool(JS_OPTIONS_DOT_STR "asyncstack");
 
     bool throwOnDebuggeeWouldRun = Preferences::GetBool(JS_OPTIONS_DOT_STR
                                                         "throw_on_debuggee_would_run");
 
@@ -901,16 +902,19 @@ ReloadPrefsCallback(const char* pref, XP
     }
 
     JS_SetParallelParsingEnabled(cx, parallelParsing);
     JS_SetOffthreadIonCompilationEnabled(cx, offthreadIonCompilation);
     JS_SetGlobalJitCompilerOption(cx, JSJITCOMPILER_BASELINE_WARMUP_TRIGGER,
                                   useBaselineEager ? 0 : baselineThreshold);
     JS_SetGlobalJitCompilerOption(cx, JSJITCOMPILER_ION_WARMUP_TRIGGER,
                                   useIonEager ? 0 : ionThreshold);
+    JS_SetGlobalJitCompilerOption(cx, JSJITCOMPILER_ION_FREQUENT_BAILOUT_THRESHOLD,
+                                  ionFrequentBailoutThreshold);
+
 #ifdef DEBUG
     JS_SetGlobalJitCompilerOption(cx, JSJITCOMPILER_FULL_DEBUG_CHECKS, fullJitDebugChecks);
 #endif
 
     JS_SetGlobalJitCompilerOption(cx, JSJITCOMPILER_SPECTRE_INDEX_MASKING, spectreIndexMasking);
     JS_SetGlobalJitCompilerOption(cx, JSJITCOMPILER_SPECTRE_OBJECT_MITIGATIONS_BARRIERS,
                                   spectreObjectMitigationsBarriers);
     JS_SetGlobalJitCompilerOption(cx, JSJITCOMPILER_SPECTRE_OBJECT_MITIGATIONS_MISC,
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -218,17 +218,17 @@ pref("dom.keyboardevent.dispatch_during_
 pref("dom.keyboardevent.keypress.dispatch_non_printable_keys_only_system_group_in_content", true);
 // Blacklist of domains of web apps which are not aware of strict keypress
 // dispatching behavior.  This is comma separated list.  If you need to match
 // all sub-domains, you can specify it as "*.example.com".  Additionally, you
 // can limit the path.  E.g., "example.com/foo" means "example.com/foo*".  So,
 // if you need to limit under a directory, the path should end with "/" like
 // "example.com/foo/".  Note that this cannot limit port number for now.
 pref("dom.keyboardevent.keypress.hack.dispatch_non_printable_keys",
-     "*.etherpad.org/p/,etherpad.wikimedia.org/p/,board.net/p/,pad.riseup.net/p/,*.sandstorm.io,factor.cc/pad/,*.etherpad.fr/p/,piratenpad.de/p/,notes.typo3.org/p/,etherpad.net/p/,*.framapad.org/p/,pad.ouvaton.coop/,pad.systemli.org/p/,pad.lqdn.fr/p/,public.etherpad-mozilla.org/p/,*.cloudron.me/p/,pad.aquilenet.fr/p/,free.primarypad.com/p/,pad.ondesk.work/p/,demo.maadix.org/etherpad/pads/,medium.com/p/");
+     "medium.com/p/");
 #else
 pref("dom.keyboardevent.keypress.dispatch_non_printable_keys_only_system_group_in_content", false);
 #endif
 
 // Whether the WebMIDI API is enabled
 pref("dom.webmidi.enabled", false);
 
 // Whether to enable the JavaScript start-up cache. This causes one of the first
@@ -1405,17 +1405,23 @@ pref("dom.webcomponents.shadowdom.enable
 pref("dom.webcomponents.customelements.enabled", true);
 
 pref("javascript.enabled",                  true);
 pref("javascript.options.strict",           false);
 #ifdef DEBUG
 pref("javascript.options.strict.debug",     false);
 #endif
 pref("javascript.options.baselinejit",      true);
+//Duplicated in JitOptions - ensure both match.
+pref("javascript.options.baselinejit.threshold", 10);
 pref("javascript.options.ion",              true);
+//Duplicated in JitOptions - ensure both match.
+pref("javascript.options.ion.threshold",    1000);
+//Duplicated in JitOptions - ensure both match.
+pref("javascript.options.ion.frequent_bailout_threshold", 10);
 pref("javascript.options.asmjs",            true);
 pref("javascript.options.wasm",             true);
 pref("javascript.options.wasm_ionjit",      true);
 pref("javascript.options.wasm_baselinejit", true);
 #ifdef ENABLE_WASM_CRANELIFT
 pref("javascript.options.wasm_cranelift",   false);
 #endif
 #ifdef ENABLE_WASM_GC
--- a/netwerk/base/nsBaseChannel.h
+++ b/netwerk/base/nsBaseChannel.h
@@ -182,25 +182,16 @@ public:
     return mPumpingData || mWaitingOnAsyncRedirect;
  }
 
   // Helper function for querying the channel's notification callbacks.
   template <class T> void GetCallback(nsCOMPtr<T> &result) {
     GetInterface(NS_GET_TEMPLATE_IID(T), getter_AddRefs(result));
   }
 
-  // Helper function for calling QueryInterface on this.
-  nsQueryInterface do_QueryInterface() {
-    return nsQueryInterface(static_cast<nsIChannel *>(this));
-  }
-  // MSVC needs this:
-  nsQueryInterface do_QueryInterface(nsISupports *obj) {
-    return nsQueryInterface(obj);
-  }
-
   // If a subclass does not want to feed transport-layer progress events to the
   // base channel via nsITransportEventSink, then it may set this flag to cause
   // the base channel to synthesize progress events when it receives data from
   // the content stream.  By default, progress events are not synthesized.
   void EnableSynthesizedProgressEvents(bool enable) {
     mSynthProgressEvents = enable;
   }
 
--- a/netwerk/base/nsPACMan.cpp
+++ b/netwerk/base/nsPACMan.cpp
@@ -90,17 +90,17 @@ GetNetworkProxyTypeFromPref(int32_t* typ
   *type = 0;
   nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
 
   if (!prefs) {
     LOG(("Failed to get a preference service object"));
     return NS_ERROR_FACTORY_NOT_REGISTERED;
   }
   nsresult rv = prefs->GetIntPref("network.proxy.type", type);
-  if (!NS_SUCCEEDED(rv)) {
+  if (NS_FAILED(rv)) {
     LOG(("Failed to retrieve network.proxy.type from prefs"));
     return rv;
   }
   LOG(("network.proxy.type pref retrieved: %d\n", *type));
   return NS_OK;
 }
 
 //-----------------------------------------------------------------------------
@@ -559,18 +559,21 @@ nsPACMan::LoadPACFromURI(const nsACStrin
 
   // if we're on the main thread here so we can get hold of prefs,
   // we check that we have WPAD preffed on if we're auto-detecting
   if (mAutoDetect && NS_IsMainThread()) {
     nsresult rv = GetNetworkProxyTypeFromPref(&mProxyConfigType);
     if (NS_FAILED(rv)) {
       return rv;
     }
-    MOZ_RELEASE_ASSERT(mProxyConfigType == nsIProtocolProxyService::PROXYCONFIG_WPAD,
-            "WPAD is being executed when not selected by user");
+    if (mProxyConfigType != nsIProtocolProxyService::PROXYCONFIG_WPAD) {
+      LOG(("LoadPACFromURI - Aborting WPAD autodetection because the pref "
+           "doesn't match anymore"));
+      return NS_BINDING_ABORTED;
+    }
   }
   // Since we might get called from nsProtocolProxyService::Init, we need to
   // post an event back to the main thread before we try to use the IO service.
   //
   // But, we need to flag ourselves as loading, so that we queue up any PAC
   // queries the enter between now and when we actually load the PAC file.
 
   if (!mLoadPending) {
@@ -605,18 +608,21 @@ nsPACMan::GetPACFromDHCP(nsACString &aSp
   return rv;
 }
 
 nsresult
 nsPACMan::ConfigureWPAD(nsACString &aSpec)
 {
   MOZ_ASSERT(!NS_IsMainThread(), "wrong thread");
 
-  MOZ_RELEASE_ASSERT(mProxyConfigType == nsIProtocolProxyService::PROXYCONFIG_WPAD,
-            "WPAD is being executed when not selected by user");
+  if (mProxyConfigType != nsIProtocolProxyService::PROXYCONFIG_WPAD) {
+    LOG(("ConfigureWPAD - Aborting WPAD autodetection because the pref "
+         "doesn't match anymore"));
+    return NS_BINDING_ABORTED;
+  }
 
   aSpec.Truncate();
   if (mWPADOverDHCPEnabled) {
     GetPACFromDHCP(aSpec);
   }
 
   if (aSpec.IsEmpty()) {
     // We diverge from the WPAD spec here in that we don't walk the
@@ -646,17 +652,17 @@ nsPACMan::StartLoading()
   // CancelExistingLoad was called...
   if (!mLoader) {
     PostCancelPendingQ(NS_ERROR_ABORT);
     return;
   }
 
   if (mAutoDetect) {
     nsresult rv = GetNetworkProxyTypeFromPref(&mProxyConfigType);
-    if (!NS_SUCCEEDED(rv)) {
+    if (NS_FAILED(rv)) {
       NS_WARNING("Could not retrieve Network Proxy Type pref when auto-detecting proxy. Halting.");
       return;
     }
     RefPtr<ExecutePACThreadAction> wpadConfigurer =
       new ExecutePACThreadAction(this);
     wpadConfigurer->ConfigureWPAD();
     DispatchToPAC(wpadConfigurer.forget());
   } else {
--- a/toolkit/content/widgets/datetimebox.xml
+++ b/toolkit/content/widgets/datetimebox.xml
@@ -14,18 +14,16 @@
    xmlns:html="http://www.w3.org/1999/xhtml"
    xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    xmlns:xbl="http://www.mozilla.org/xbl">
 
   <binding id="date-input"
            simpleScopeChain="true"
            extends="chrome://global/content/bindings/datetimebox.xml#datetime-input-base">
     <resources>
-      <stylesheet src="chrome://global/content/textbox.css"/>
-      <stylesheet src="chrome://global/skin/textbox.css"/>
       <stylesheet src="chrome://global/content/bindings/datetimebox.css"/>
     </resources>
 
     <implementation>
       <constructor>
       <![CDATA[
         /* eslint-disable no-multi-spaces */
         this.mYearPlaceHolder = ]]>"&date.year.placeholder;"<![CDATA[;
@@ -428,18 +426,16 @@
 
     </implementation>
   </binding>
 
   <binding id="time-input"
            simpleScopeChain="true"
            extends="chrome://global/content/bindings/datetimebox.xml#datetime-input-base">
     <resources>
-      <stylesheet src="chrome://global/content/textbox.css"/>
-      <stylesheet src="chrome://global/skin/textbox.css"/>
       <stylesheet src="chrome://global/content/bindings/datetimebox.css"/>
     </resources>
 
     <implementation>
       <property name="kMsPerSecond" readonly="true" onget="return 1000;" />
       <property name="kMsPerMinute" readonly="true" onget="return (60 * 1000);" />
 
       <constructor>
@@ -1195,18 +1191,16 @@
         </body>
       </method>
     </implementation>
   </binding>
 
   <binding id="datetime-input-base"
            simpleScopeChain="true">
     <resources>
-      <stylesheet src="chrome://global/content/textbox.css"/>
-      <stylesheet src="chrome://global/skin/textbox.css"/>
       <stylesheet src="chrome://global/content/bindings/datetimebox.css"/>
     </resources>
 
     <content>
       <html:div class="datetime-input-box-wrapper" anonid="input-box-wrapper"
                 xbl:inherits="context,disabled,readonly" role="presentation">
         <html:span class="datetime-input-edit-wrapper"
                    anonid="edit-wrapper">
--- a/widget/cocoa/nsDragService.mm
+++ b/widget/cocoa/nsDragService.mm
@@ -321,19 +321,16 @@ nsDragService::InvokeDragSessionImpl(nsI
 
     for (uint32_t j = 0; j < count; j++) {
       nsCOMPtr<nsITransferable> currentTransferable =
         do_QueryElementAt(aTransferableArray, j);
       if (!currentTransferable) {
         return NS_ERROR_FAILURE;
       }
 
-      // Assign a principal:
-      currentTransferable->SetRequestingPrincipal(mSourceNode->NodePrincipal());
-
       // Transform the transferable to an NSDictionary
       NSDictionary* pasteboardOutputDict =
         nsClipboard::PasteboardDictFromTransferable(currentTransferable);
       if (!pasteboardOutputDict) {
         return NS_ERROR_FAILURE;
       }
 
       // write everything out to the general pasteboard
--- a/widget/gtk/mozgtk/mozgtk.c
+++ b/widget/gtk/mozgtk/mozgtk.c
@@ -20,16 +20,17 @@ STUB(gdk_display_get_pointer)
 STUB(gdk_display_get_window_at_pointer)
 STUB(gdk_display_manager_get)
 STUB(gdk_display_manager_set_default_display)
 STUB(gdk_display_open)
 STUB(gdk_display_sync)
 STUB(gdk_display_warp_pointer)
 STUB(gdk_drag_context_get_actions)
 STUB(gdk_drag_context_get_dest_window)
+STUB(gdk_drag_context_get_source_window)
 STUB(gdk_drag_context_list_targets)
 STUB(gdk_drag_status)
 STUB(gdk_error_trap_pop)
 STUB(gdk_error_trap_push)
 STUB(gdk_event_copy)
 STUB(gdk_event_free)
 STUB(gdk_event_get_axis)
 STUB(gdk_event_get_time)
@@ -49,16 +50,17 @@ STUB(gdk_keymap_have_bidi_layouts)
 STUB(gdk_keymap_translate_keyboard_state)
 STUB(gdk_keyval_name)
 STUB(gdk_keyval_to_unicode)
 STUB(gdk_pango_context_get)
 STUB(gdk_pointer_grab)
 STUB(gdk_pointer_ungrab)
 STUB(gdk_property_change)
 STUB(gdk_property_get)
+STUB(gdk_property_delete)
 STUB(gdk_screen_get_default)
 STUB(gdk_screen_get_display)
 STUB(gdk_screen_get_font_options)
 STUB(gdk_screen_get_height)
 STUB(gdk_screen_get_height_mm)
 STUB(gdk_screen_get_n_monitors)
 STUB(gdk_screen_get_monitor_at_window)
 STUB(gdk_screen_get_monitor_geometry)
--- a/widget/gtk/nsDragService.cpp
+++ b/widget/gtk/nsDragService.cpp
@@ -4,16 +4,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsDragService.h"
 #include "nsArrayUtils.h"
 #include "nsIObserverService.h"
 #include "nsWidgetsCID.h"
 #include "nsWindow.h"
+#include "nsSystemInfo.h"
 #include "nsIServiceManager.h"
 #include "nsXPCOM.h"
 #include "nsISupportsPrimitives.h"
 #include "nsIIOService.h"
 #include "nsIFileURL.h"
 #include "nsNetUtil.h"
 #include "mozilla/Logging.h"
 #include "nsTArray.h"
@@ -44,16 +45,18 @@
 #include "nsArrayUtils.h"
 #ifdef MOZ_WAYLAND
 #include "nsClipboardWayland.h"
 #endif
 
 using namespace mozilla;
 using namespace mozilla::gfx;
 
+#define NS_SYSTEMINFO_CONTRACTID "@mozilla.org/system-info;1"
+
 // This sets how opaque the drag image is
 #define DRAG_IMAGE_ALPHA_LEVEL 0.5
 
 // These values are copied from GtkDragResult (rather than using GtkDragResult
 // directly) so that this code can be compiled against versions of GTK+ that
 // do not have GtkDragResult.
 // GtkDragResult is available from GTK+ version 2.12.
 enum {
@@ -68,16 +71,17 @@ static LazyLogModule sDragLm("nsDragServ
 static guint sMotionEventTimerID;
 static GdkEvent *sMotionEvent;
 static GtkWidget *sGrabWidget;
 
 static const char gMimeListType[] = "application/x-moz-internal-item-list";
 static const char gMozUrlType[] = "_NETSCAPE_URL";
 static const char gTextUriListType[] = "text/uri-list";
 static const char gTextPlainUTF8Type[] = "text/plain;charset=utf-8";
+static const char gXdndDirectSaveType[] = "XdndDirectSave0";
 
 static void
 invisibleSourceDragBegin(GtkWidget        *aWidget,
                          GdkDragContext   *aContext,
                          gpointer          aData);
 
 static void
 invisibleSourceDragEnd(GtkWidget        *aWidget,
@@ -1406,16 +1410,27 @@ nsDragService::GetSourceList(void)
                              (GtkTargetEntry *)g_malloc(sizeof(GtkTargetEntry));
                             urlTarget->target = g_strdup(gMozUrlType);
                             urlTarget->flags = 0;
                             MOZ_LOG(sDragLm, LogLevel::Debug,
                                    ("automatically adding target %s\n",
                                     urlTarget->target));
                             targetArray.AppendElement(urlTarget);
                         }
+                        // XdndDirectSave
+                        else if (flavorStr.EqualsLiteral(kFilePromiseMime)) {
+                            GtkTargetEntry *directsaveTarget =
+                             (GtkTargetEntry *)g_malloc(sizeof(GtkTargetEntry));
+                            directsaveTarget->target = g_strdup(gXdndDirectSaveType);
+                            directsaveTarget->flags = 0;
+                            MOZ_LOG(sDragLm, LogLevel::Debug,
+                                   ("automatically adding target %s\n",
+                                    directsaveTarget->target));
+                            targetArray.AppendElement(directsaveTarget);
+                        }
                     }
                 } // foreach flavor in item
             } // if valid flavor list
         } // if item is a transferable
     } // if it is a single item drag
 
     // get all the elements that we created.
     targetCount = targetArray.Length();
@@ -1445,16 +1460,20 @@ nsDragService::GetSourceList(void)
 
 void
 nsDragService::SourceEndDragSession(GdkDragContext *aContext,
                                     gint            aResult)
 {
     // this just releases the list of data items that we provide
     mSourceDataItems = nullptr;
 
+    // Remove this property, if it exists, to satisfy the Direct Save Protocol.
+    GdkAtom property = gdk_atom_intern(gXdndDirectSaveType, FALSE);
+    gdk_property_delete(gdk_drag_context_get_source_window(aContext), property);
+
     if (!mDoingDrag || mScheduledTask == eDragTaskSourceEnd)
         // EndDragSession() was already called on drop
         // or SourceEndDragSession on drag-failed
         return;
 
     if (mEndDragPoint.x < 0) {
         // We don't have a drag end point, so guess
         gint x, y;
@@ -1650,26 +1669,126 @@ nsDragService::SourceDataGet(GtkWidget  
             needToDoConversionToPlainText = true;
         }
         // if someone was asking for text/uri-list we need to convert to
         // plain text.
         else if (mimeFlavor.EqualsLiteral(gTextUriListType)) {
             actualFlavor = gTextUriListType;
             needToDoConversionToPlainText = true;
         }
-        else
+        // Someone is asking for the special Direct Save Protocol type.
+        else if (mimeFlavor.EqualsLiteral(gXdndDirectSaveType)) {
+            // Indicate failure by default.
+            gtk_selection_data_set(aSelectionData, target, 8, (guchar *)"E", 1);
+
+            GdkAtom property = gdk_atom_intern(gXdndDirectSaveType, FALSE);
+            GdkAtom type = gdk_atom_intern(kTextMime, FALSE);
+
+            guchar *data;
+            gint length;
+            if (!gdk_property_get(gdk_drag_context_get_source_window(aContext),
+                                  property, type, 0, INT32_MAX,
+                                  FALSE, nullptr, nullptr,
+                                  &length, &data)) {
+                return;
+            }
+
+            // Zero-terminate the string.
+            data = (guchar *)g_realloc(data, length + 1);
+            if (!data)
+                return;
+            data[length] = '\0';
+
+            gchar *hostname;
+            char *gfullpath = g_filename_from_uri((const gchar *)data, &hostname, nullptr);
+            g_free(data);
+            if (!gfullpath)
+                return;
+
+            nsCString fullpath(gfullpath);
+            g_free(gfullpath);
+
+            MOZ_LOG(sDragLm, LogLevel::Debug, ("XdndDirectSave filepath is %s\n",
+                                               fullpath.get()));
+
+            // If there is no hostname in the URI, NULL will be stored.
+            // We should not accept uris with from a different host.
+            if (hostname) {
+                nsCOMPtr<nsIPropertyBag2> infoService = do_GetService(NS_SYSTEMINFO_CONTRACTID);
+                if (!infoService)
+                    return;
+
+                nsAutoCString host;
+                if (NS_SUCCEEDED(infoService->GetPropertyAsACString(
+                        NS_LITERAL_STRING("host"), host))) {
+                    if (!host.Equals(hostname)) {
+                        MOZ_LOG(sDragLm, LogLevel::Debug,
+                                ("ignored drag because of different host.\n"));
+
+                        // Special error code "F" for this case.
+                        gtk_selection_data_set(aSelectionData, target, 8,
+                                               (guchar *)"F", 1);
+                        g_free(hostname);
+                        return;
+                    }
+                }
+
+                g_free(hostname);
+            }
+
+            nsCOMPtr<nsIFile> file;
+            if (NS_FAILED(NS_NewNativeLocalFile(fullpath, false,
+                                                getter_AddRefs(file)))) {
+                return;
+            }
+
+            // We have to split the path into a directory and filename,
+            // because our internal file-promise API is based on these.
+
+            nsCOMPtr<nsIFile> directory;
+            file->GetParent(getter_AddRefs(directory));
+
+            item->SetTransferData(kFilePromiseDirectoryMime, directory,
+                                  sizeof(nsIFile*));
+
+            nsCOMPtr<nsISupportsString> filenamePrimitive =
+                do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID);
+            if (!filenamePrimitive)
+                return;
+
+            nsAutoString leafName;
+            file->GetLeafName(leafName);
+            filenamePrimitive->SetData(leafName);
+
+            item->SetTransferData(kFilePromiseDestFilename, filenamePrimitive,
+                                  leafName.Length() * sizeof(PRUnichar));
+
+            // Request a different type in GetTransferData.
+            actualFlavor = kFilePromiseMime;
+        } else {
             actualFlavor = mimeFlavor.get();
+        }
 
         uint32_t tmpDataLen = 0;
         void    *tmpData = nullptr;
         nsresult rv;
         nsCOMPtr<nsISupports> data;
         rv = item->GetTransferData(actualFlavor,
                                    getter_AddRefs(data),
                                    &tmpDataLen);
+
+        if (strcmp(actualFlavor, kFilePromiseMime) == 0) {
+            if (NS_SUCCEEDED(rv)) {
+                // Indicate success.
+                gtk_selection_data_set(aSelectionData, target, 8,
+                                       (guchar *)"S", 1);
+            }
+            return;
+        }
+
         if (NS_SUCCEEDED(rv)) {
             nsPrimitiveHelpers::CreateDataFromPrimitive(
                 nsDependentCString(actualFlavor), data, &tmpData, tmpDataLen);
             // if required, do the extra work to convert unicode to plain
             // text and replace the output values with the plain text.
             if (needToDoConversionToPlainText) {
                 char* plainTextData = nullptr;
                 char16_t* castedUnicode = reinterpret_cast<char16_t*>
@@ -1704,16 +1823,66 @@ nsDragService::SourceDataGet(GtkWidget  
                                        8, (guchar *)uriList, length);
                 g_free(uriList);
                 return;
             }
         }
     }
 }
 
+void
+nsDragService::SourceBeginDrag(GdkDragContext *aContext)
+{
+    nsCOMPtr<nsITransferable> transferable =
+        do_QueryElementAt(mSourceDataItems, 0);
+    if (!transferable)
+        return;
+
+    nsCOMPtr<nsIArray> flavorList;
+    nsresult rv = transferable->FlavorsTransferableCanImport(getter_AddRefs(flavorList));
+    NS_ENSURE_SUCCESS(rv,);
+
+    uint32_t length;
+    flavorList->GetLength(&length);
+
+    for (uint32_t i = 0; i < length; ++i) {
+        nsCOMPtr<nsISupportsCString> currentFlavor =
+            do_QueryElementAt(flavorList, i);
+        if (!currentFlavor)
+            return;
+
+        nsCString flavorStr;
+        currentFlavor->ToString(getter_Copies(flavorStr));
+        if (flavorStr.EqualsLiteral(kFilePromiseDestFilename)) {
+            nsCOMPtr<nsISupports> data;
+            uint32_t dataSize = 0;
+            transferable->GetTransferData(kFilePromiseDestFilename,
+                                          getter_AddRefs(data), &dataSize);
+            nsCOMPtr<nsISupportsString> fileName = do_QueryInterface(data);
+            if (!fileName)
+                return;
+
+            nsAutoString fileNameStr;
+            fileName->GetData(fileNameStr);
+
+            nsCString fileNameCStr;
+            CopyUTF16toUTF8(fileNameStr, fileNameCStr);
+
+            GdkAtom property = gdk_atom_intern(gXdndDirectSaveType, FALSE);
+            GdkAtom type = gdk_atom_intern(kTextMime, FALSE);
+
+            gdk_property_change(gdk_drag_context_get_source_window(aContext),
+                                property, type,
+                                8, GDK_PROP_MODE_REPLACE,
+                                (const guchar*)fileNameCStr.get(),
+                                fileNameCStr.Length());
+        }
+    }
+}
+
 void nsDragService::SetDragIcon(GdkDragContext* aContext)
 {
     if (!mHasImage && !mSelection)
         return;
 
     LayoutDeviceIntRect dragRect;
     nsPresContext* pc;
     RefPtr<SourceSurface> surface;
@@ -1763,16 +1932,17 @@ void nsDragService::SetDragIcon(GdkDragC
 static void
 invisibleSourceDragBegin(GtkWidget        *aWidget,
                          GdkDragContext   *aContext,
                          gpointer          aData)
 {
     MOZ_LOG(sDragLm, LogLevel::Debug, ("invisibleSourceDragBegin"));
     nsDragService *dragService = (nsDragService *)aData;
 
+    dragService->SourceBeginDrag(aContext);
     dragService->SetDragIcon(aContext);
 }
 
 static void
 invisibleSourceDragDataGet(GtkWidget        *aWidget,
                            GdkDragContext   *aContext,
                            GtkSelectionData *aSelectionData,
                            guint             aInfo,
--- a/widget/gtk/nsDragService.h
+++ b/widget/gtk/nsDragService.h
@@ -121,16 +121,18 @@ public:
     // invisible widget.
     void           SourceEndDragSession(GdkDragContext *aContext,
                                         gint            aResult);
     void           SourceDataGet(GtkWidget        *widget,
                                  GdkDragContext   *context,
                                  GtkSelectionData *selection_data,
                                  guint32           aTime);
 
+    void SourceBeginDrag(GdkDragContext *aContext);
+
     // set the drag icon during drag-begin
     void SetDragIcon(GdkDragContext* aContext);
 
 protected:
     virtual ~nsDragService();
 
 private:
 
--- a/widget/nsBaseDragService.cpp
+++ b/widget/nsBaseDragService.cpp
@@ -1,16 +1,17 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsBaseDragService.h"
 #include "nsITransferable.h"
 
+#include "nsArrayUtils.h"
 #include "nsIServiceManager.h"
 #include "nsITransferable.h"
 #include "nsSize.h"
 #include "nsXPCOM.h"
 #include "nsISupportsPrimitives.h"
 #include "nsCOMPtr.h"
 #include "nsIInterfaceRequestorUtils.h"
 #include "nsIFrame.h"
@@ -253,16 +254,27 @@ nsBaseDragService::InvokeDragSession(nsI
   mEndDragPoint = LayoutDeviceIntPoint(0, 0);
 
   // When the mouse goes down, the selection code starts a mouse
   // capture. However, this gets in the way of determining drag
   // feedback for things like trees because the event coordinates
   // are in the wrong coord system, so turn off mouse capture.
   nsIPresShell::ClearMouseCapture(nullptr);
 
+  uint32_t length = 0;
+  mozilla::Unused << aTransferableArray->GetLength(&length);
+  for (uint32_t i = 0; i < length; ++i) {
+    nsCOMPtr<nsITransferable> trans = do_QueryElementAt(aTransferableArray, i);
+    if (trans) {
+      // Set the requestingPrincipal on the transferable.
+      trans->SetRequestingPrincipal(mSourceNode->NodePrincipal());
+      trans->SetContentPolicyType(mContentPolicyType);
+    }
+  }
+
   nsresult rv = InvokeDragSessionImpl(aTransferableArray,
                                       mRegion, aActionType);
 
   if (NS_FAILED(rv)) {
     // Set mDoingDrag so that EndDragSession cleans up and sends the dragend event
     // after the aborted drag.
     mDoingDrag = true;
     EndDragSession(true, 0);
--- a/widget/windows/InputDeviceUtils.cpp
+++ b/widget/windows/InputDeviceUtils.cpp
@@ -5,16 +5,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "InputDeviceUtils.h"
 
 #define INITGUID
 #include <dbt.h>
 #include <hidclass.h>
 #include <ntddmou.h>
+#include <setupapi.h>
 
 namespace mozilla {
 namespace widget {
 
 HDEVNOTIFY
 InputDeviceUtils::RegisterNotification(HWND aHwnd)
 {
   DEV_BROADCAST_DEVICEINTERFACE filter = {};
@@ -32,10 +33,37 @@ void
 InputDeviceUtils::UnregisterNotification(HDEVNOTIFY aHandle)
 {
   if (!aHandle) {
     return;
   }
   UnregisterDeviceNotification(aHandle);
 }
 
+DWORD
+InputDeviceUtils::CountMouseDevices()
+{
+  HDEVINFO hdev = SetupDiGetClassDevs(&GUID_DEVINTERFACE_MOUSE,
+                                      nullptr,
+                                      nullptr,
+                                      DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
+  if (hdev == INVALID_HANDLE_VALUE) {
+    return 0;
+  }
+
+  DWORD count = 0;
+  SP_INTERFACE_DEVICE_DATA info = {};
+  info.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
+  while (SetupDiEnumDeviceInterfaces(hdev,
+                                     nullptr,
+                                     &GUID_DEVINTERFACE_MOUSE,
+                                     count,
+                                     &info)) {
+    if (info.Flags & SPINT_ACTIVE) {
+      count++;
+    }
+  }
+  SetupDiDestroyDeviceInfoList(hdev);
+  return count;
+}
+
 } // namespace widget
 } // namespace mozilla
--- a/widget/windows/InputDeviceUtils.h
+++ b/widget/windows/InputDeviceUtils.h
@@ -11,13 +11,16 @@
 
 namespace mozilla {
 namespace widget {
 
 class InputDeviceUtils {
 public:
   static HDEVNOTIFY RegisterNotification(HWND aHwnd);
   static void UnregisterNotification(HDEVNOTIFY aHandle);
+
+  // Returns the number of mouse type devices connected to this system.
+  static DWORD CountMouseDevices();
 };
 
 } // namespace widget
 } // namespace mozilla
 #endif // mozilla_widget_InputDeviceUtils_h__
--- a/widget/windows/WinUtils.cpp
+++ b/widget/windows/WinUtils.cpp
@@ -8,16 +8,17 @@
 
 #include <knownfolders.h>
 #include <winioctl.h>
 
 #include "gfxPlatform.h"
 #include "gfxUtils.h"
 #include "nsWindow.h"
 #include "nsWindowDefs.h"
+#include "InputDeviceUtils.h"
 #include "KeyboardLayout.h"
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/BackgroundHangMonitor.h"
 #include "mozilla/dom/MouseEventBinding.h"
 #include "mozilla/gfx/2D.h"
 #include "mozilla/gfx/DataSurfaceHelpers.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/RefPtr.h"
@@ -1992,29 +1993,48 @@ IsTabletDevice()
     return !GetSystemMetrics(SM_CONVERTIBLESLATEMODE);
   }
   return false;
 }
 
 static bool
 IsMousePresent()
 {
-  return ::GetSystemMetrics(SM_MOUSEPRESENT);
+  if (!::GetSystemMetrics(SM_MOUSEPRESENT)) {
+    return false;
+  }
+
+  DWORD count = InputDeviceUtils::CountMouseDevices();
+  if (!count) {
+    return false;
+  }
+
+  // If there is a mouse device and if this machine is a tablet or has a
+  // digitizer, that's counted as the mouse device.
+  // FIXME: Bug 1495938:  We should drop this heuristic way once we find out a
+  // reliable way to tell there is no mouse or not.
+  if (count == 1 &&
+      (WinUtils::IsTouchDeviceSupportPresent() ||
+       IsTabletDevice())) {
+    return false;
+  }
+
+  return true;
 }
 
 /* static */
 PointerCapabilities
 WinUtils::GetPrimaryPointerCapabilities()
 {
   if (IsTabletDevice()) {
     return PointerCapabilities::Coarse;
   }
 
   if (IsMousePresent()) {
-    return PointerCapabilities::Fine|
+    return PointerCapabilities::Fine |
            PointerCapabilities::Hover;
   }
 
   if (IsTouchDeviceSupportPresent()) {
     return PointerCapabilities::Coarse;
   }
 
   return PointerCapabilities::None;
--- a/widget/windows/nsDragService.cpp
+++ b/widget/windows/nsDragService.cpp
@@ -193,38 +193,32 @@ nsDragService::InvokeDragSessionImpl(nsI
     nsDataObjCollection * dataObjCollection = new nsDataObjCollection();
     if (!dataObjCollection)
       return NS_ERROR_OUT_OF_MEMORY;
     itemToDrag = dataObjCollection;
     for (uint32_t i=0; i<numItemsToDrag; ++i) {
       nsCOMPtr<nsITransferable> trans =
           do_QueryElementAt(anArrayTransferables, i);
       if (trans) {
-        // set the requestingPrincipal on the transferable
-        trans->SetRequestingPrincipal(mSourceNode->NodePrincipal());
-        trans->SetContentPolicyType(mContentPolicyType);
         RefPtr<IDataObject> dataObj;
         rv = nsClipboard::CreateNativeDataObject(trans,
                                                  getter_AddRefs(dataObj), uri);
         NS_ENSURE_SUCCESS(rv, rv);
         // Add the flavors to the collection object too
         rv = nsClipboard::SetupNativeDataObject(trans, dataObjCollection);
         NS_ENSURE_SUCCESS(rv, rv);
 
         dataObjCollection->AddDataObject(dataObj);
       }
     }
   } // if dragging multiple items
   else {
     nsCOMPtr<nsITransferable> trans =
         do_QueryElementAt(anArrayTransferables, 0);
     if (trans) {
-      // set the requestingPrincipal on the transferable
-      trans->SetRequestingPrincipal(mSourceNode->NodePrincipal());
-      trans->SetContentPolicyType(mContentPolicyType);
       rv = nsClipboard::CreateNativeDataObject(trans,
                                                getter_AddRefs(itemToDrag),
                                                uri);
       NS_ENSURE_SUCCESS(rv, rv);
     }
   } // else dragging a single object
 
   // Create a drag image if support is available