Merge autoland to central, a=merge
authorWes Kocher <wkocher@mozilla.com>
Fri, 01 Sep 2017 14:59:17 -0700
changeset 378238 73e8f351b28ffc30e8077be21ce7298f4648ca5a
parent 378165 d1292636950a4ac1bb818cf05b113e3fcd6babe1 (current diff)
parent 378237 d98a26d6f1c734658a3829c0c1898b889cf16155 (diff)
child 378292 5278dfcf5eb9f58eaf06ad1ce67e7fd4aba34772
push id32426
push userkwierso@gmail.com
push dateFri, 01 Sep 2017 21:59:36 +0000
treeherdermozilla-central@73e8f351b28f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone57.0a1
first release with
nightly mac
73e8f351b28f / 57.0a1 / 20170901220209 / files
nightly win32
73e8f351b28f / 57.0a1 / 20170901220209 / files
nightly win64
73e8f351b28f / 57.0a1 / 20170901220209 / files
nightly linux32
nightly linux64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly mac
nightly win32
nightly win64
Merge autoland to central, a=merge MozReview-Commit-ID: 6ipD9ZUDi4q
--- a/.eslintignore
+++ b/.eslintignore
@@ -170,16 +170,17 @@ devtools/client/debugger/test/mochitest/
 devtools/client/debugger/test/mochitest/code_math.min.js
 devtools/client/debugger/test/mochitest/code_math_bogus_map.js
 devtools/client/debugger/test/mochitest/code_ugly*
 devtools/client/debugger/test/mochitest/code_worker-source-map.js
 devtools/client/framework/test/code_ugly*
 devtools/client/inspector/markup/test/events_bundle.js
 devtools/client/netmonitor/test/xhr_bundle.js
 devtools/client/webconsole/new-console-output/test/mochitest/code_bundle_nosource.js
+devtools/client/webconsole/new-console-output/test/mochitest/code_bundle_invalidmap.js
 devtools/server/tests/unit/babel_and_browserify_script_with_source_map.js
 devtools/server/tests/unit/setBreakpoint*
 devtools/server/tests/unit/sourcemapped.js
 
 # dom/ exclusions
 dom/animation/**
 dom/archivereader/**
 dom/asmjscache/**
--- a/.taskcluster.yml
+++ b/.taskcluster.yml
@@ -67,68 +67,68 @@ tasks:
       env:
         # checkout-gecko uses these to check out the source; the inputs
         # to `mach taskgraph decision` are all on the command line.
         GECKO_BASE_REPOSITORY: 'https://hg.mozilla.org/mozilla-unified'
         GECKO_HEAD_REPOSITORY: '${repoUrl}'
         GECKO_HEAD_REF: '${push.revision}'
         GECKO_HEAD_REV: '${push.revision}'
         GECKO_COMMIT_MSG: '${push.comment}'
-        HG_STORE_PATH: /home/worker/checkouts/hg-store
-        TASKCLUSTER_CACHES: /home/worker/checkouts
+        HG_STORE_PATH: /builds/worker/checkouts/hg-store
+        TASKCLUSTER_CACHES: /builds/worker/checkouts
 
       cache:
-        level-${repository.level}-checkouts-sparse-v1: /home/worker/checkouts
+        level-${repository.level}-checkouts-sparse-v1: /builds/worker/checkouts
 
       features:
         taskclusterProxy: true
         chainOfTrust: true
 
       # Note: This task is built server side without the context or tooling that
       # exist in tree so we must hard code the hash
       # XXX Changing this will break Chain of Trust without an associated puppet and
       # scriptworker patch!
-      image: 'taskcluster/decision:0.1.10@sha256:c5451ee6c655b3d97d4baa3b0e29a5115f23e0991d4f7f36d2a8f793076d6854'
+      image: 'taskcluster/decision:2.0.0@sha256:4039fd878e5700b326d4a636e28c595c053fbcb53909c1db84ad1f513cf644ef'
 
       maxRunTime: 1800
 
       # TODO use mozilla-unified for the base repository once the tc-vcs
       # tar.gz archives are created or tc-vcs isn't being used.
       command:
-        - /home/worker/bin/run-task
-        - '--vcs-checkout=/home/worker/checkouts/gecko'
+        - /builds/worker/bin/run-task
+        - '--vcs-checkout=/builds/worker/checkouts/gecko'
         - '--sparse-profile=build/sparse-profiles/taskgraph'
         - '--'
         - bash
         - -cx
         - $let:
             extraArgs: {$if: 'tasks_for == "hg-push"', then: '', else: '${cron.quoted_args}'}
           # NOTE: the explicit reference to mozilla-central below is required because android-stuff
           # still uses tc-vcs, which does not support mozilla-unified
           # https://bugzilla.mozilla.org/show_bug.cgi?id=1383973
           in: >
-            cd /home/worker/checkouts/gecko &&
-            ln -s /home/worker/artifacts artifacts &&
+            cd /builds/worker/checkouts/gecko &&
+            ln -s /builds/worker/artifacts artifacts &&
             ./mach --log-no-times taskgraph decision
             --pushlog-id='${push.pushlog_id}'
             --pushdate='${push.pushdate}'
             --project='${repository.project}'
             --message="$GECKO_COMMIT_MSG"
             --owner='${ownerEmail}'
             --level='${repository.level}'
             --base-repository='https://hg.mozilla.org/mozilla-central'
             --head-repository="$GECKO_HEAD_REPOSITORY"
             --head-ref="$GECKO_HEAD_REF"
             --head-rev="$GECKO_HEAD_REV"
             ${extraArgs}
 
       artifacts:
         'public':
           type: 'directory'
-          path: '/home/worker/artifacts'
+          path: '/builds/worker/artifacts'
           expires: {$fromNow: '1 year'}
 
     extra:
       treeherder:
         $merge:
           - machine:
               platform: gecko-decision
           - $if: 'tasks_for == "hg-push"'
--- a/browser/base/content/browser-pageActions.js
+++ b/browser/base/content/browser-pageActions.js
@@ -216,16 +216,21 @@ var BrowserPageActions = {
     panelNode.setAttribute("actionID", action.id);
     panelNode.setAttribute("role", "group");
     panelNode.setAttribute("type", "arrow");
     panelNode.setAttribute("flip", "slide");
     panelNode.setAttribute("noautofocus", "true");
     panelNode.setAttribute("tabspecific", "true");
     panelNode.setAttribute("photon", "true");
 
+    // For tests.
+    if (this._disableActivatedActionPanelAnimation) {
+      panelNode.setAttribute("animate", "false");
+    }
+
     let panelViewNode = null;
     let iframeNode = null;
 
     if (action.subview) {
       let multiViewNode = document.createElement("photonpanelmultiview");
       panelViewNode = this._makePanelViewNodeForAction(action, true);
       multiViewNode.appendChild(panelViewNode);
       panelNode.appendChild(multiViewNode);
@@ -801,30 +806,34 @@ BrowserPageActions.sendToDevice = {
   },
 
   onShowingSubview(panelViewNode) {
     let browser = gBrowser.selectedBrowser;
     let url = browser.currentURI.spec;
     let title = browser.contentTitle;
 
     let bodyNode = panelViewNode.firstChild;
+    let panelNode = panelViewNode.closest("panel");
 
     // This is on top because it also clears the device list between state
     // changes.
     gSync.populateSendTabToDevicesMenu(bodyNode, url, title, (clientId, name, clientType) => {
       if (!name) {
         return document.createElement("toolbarseparator");
       }
       let item = document.createElement("toolbarbutton");
       item.classList.add("pageAction-sendToDevice-device", "subviewbutton");
       if (clientId) {
         item.classList.add("subviewbutton-iconic");
       }
       item.setAttribute("tooltiptext", name);
       item.addEventListener("command", event => {
+        if (panelNode) {
+          panelNode.hidePopup();
+        }
         // There are items in the subview that don't represent devices: "Sign
         // in", "Learn about Sync", etc.  Device items will be .sendtab-target.
         if (event.target.classList.contains("sendtab-target")) {
           BrowserPageActionFeedback.show("sendToDevice", event);
         }
       });
       return item;
     });
--- a/browser/base/content/browser-sync.js
+++ b/browser/base/content/browser-sync.js
@@ -335,17 +335,16 @@ var gSync = {
 
   _appendSendTabDeviceList(fragment, createDeviceNodeFn, url, title) {
     const onTargetDeviceCommand = (event) => {
       let clients = event.target.getAttribute("clientId") ?
         [event.target.getAttribute("clientId")] :
         this.remoteClients.map(client => client.id);
 
       clients.forEach(clientId => this.sendTabToDevice(url, clientId, title));
-      BrowserPageActions.panelNode.hidePopup();
     }
 
     function addTargetDevice(clientId, name, clientType) {
       const targetDevice = createDeviceNodeFn(clientId, name, clientType);
       targetDevice.addEventListener("command", onTargetDeviceCommand, true);
       targetDevice.classList.add("sync-menuitem", "sendtab-target");
       targetDevice.setAttribute("clientId", clientId);
       targetDevice.setAttribute("clientType", clientType);
@@ -370,49 +369,45 @@ var gSync = {
     }
   },
 
   _appendSendTabSingleDevice(fragment, createDeviceNodeFn) {
     const noDevices = this.fxaStrings.GetStringFromName("sendTabToDevice.singledevice.status");
     const learnMore = this.fxaStrings.GetStringFromName("sendTabToDevice.singledevice");
     this._appendSendTabInfoItems(fragment, createDeviceNodeFn, noDevices, learnMore, () => {
       this.openSendToDevicePromo();
-      BrowserPageActions.panelNode.hidePopup();
     });
   },
 
   _appendSendTabVerify(fragment, createDeviceNodeFn) {
     const notVerified = this.fxaStrings.GetStringFromName("sendTabToDevice.verify.status");
     const verifyAccount = this.fxaStrings.GetStringFromName("sendTabToDevice.verify");
     this._appendSendTabInfoItems(fragment, createDeviceNodeFn, notVerified, verifyAccount, () => {
       this.openPrefs("sendtab");
-      BrowserPageActions.panelNode.hidePopup();
     });
   },
 
   _appendSendTabUnconfigured(fragment, createDeviceNodeFn) {
     const notConnected = this.fxaStrings.GetStringFromName("sendTabToDevice.unconfigured.status");
     const learnMore = this.fxaStrings.GetStringFromName("sendTabToDevice.unconfigured");
     this._appendSendTabInfoItems(fragment, createDeviceNodeFn, notConnected, learnMore, () => {
       this.openSendToDevicePromo();
-      BrowserPageActions.panelNode.hidePopup();
     });
 
     // Now add a 'sign in to sync' item above the 'learn more' item.
     const signInToSync = this.fxaStrings.GetStringFromName("sendTabToDevice.signintosync");
     let signInItem = createDeviceNodeFn(null, signInToSync, null);
     signInItem.classList.add("sync-menuitem");
     signInItem.setAttribute("label", signInToSync);
     // Show an icon if opened in the page action panel:
     if (signInItem.classList.contains("subviewbutton")) {
       signInItem.classList.add("subviewbutton-iconic", "signintosync");
     }
     signInItem.addEventListener("command", () => {
       this.openPrefs("sendtab");
-      BrowserPageActions.panelNode.hidePopup();
     });
     fragment.insertBefore(signInItem, fragment.lastChild);
   },
 
   _appendSendTabInfoItems(fragment, createDeviceNodeFn, statusLabel, actionLabel, actionCommand) {
     const status = createDeviceNodeFn(null, statusLabel, null);
     status.setAttribute("label", statusLabel);
     status.setAttribute("disabled", true);
--- a/browser/base/content/test/urlbar/browser_page_action_menu.js
+++ b/browser/base/content/test/urlbar/browser_page_action_menu.js
@@ -457,16 +457,116 @@ add_task(async function sendToDevice_dev
     let hiddenPromise = promisePageActionPanelHidden();
     BrowserPageActions.panelNode.hidePopup();
     await hiddenPromise;
 
     cleanUp();
   });
 });
 
+add_task(async function sendToDevice_inUrlbar() {
+  // Open a tab that's sendable.
+  await BrowserTestUtils.withNewTab("http://example.com/", async () => {
+    await promiseSyncReady();
+    const sandbox = sinon.sandbox.create();
+    sandbox.stub(gSync, "syncReady").get(() => true);
+    sandbox.stub(Weave.Service.clientsEngine, "lastSync").get(() => Date.now());
+    sandbox.stub(UIState, "get").returns({ status: UIState.STATUS_SIGNED_IN });
+    sandbox.stub(gSync, "isSendableURI").returns(true);
+    sandbox.stub(gSync, "remoteClients").get(() => mockRemoteClients);
+
+    let cleanUp = () => {
+      sandbox.restore();
+    };
+    registerCleanupFunction(cleanUp);
+
+    // Disable the activated-action panel animation when it opens.  Otherwise
+    // it's necessary to wait a moment before trying to click the device menu
+    // item below.
+    BrowserPageActions._disableActivatedActionPanelAnimation = true;
+
+    // Add Send to Device to the urlbar.
+    let action = PageActions.actionForID("sendToDevice");
+    action.shownInUrlbar = true;
+
+    // Click it to open its panel.
+    let urlbarButton = document.getElementById(
+      BrowserPageActions._urlbarButtonNodeIDForActionID(action.id)
+    );
+    Assert.ok(!urlbarButton.disabled);
+    let panelPromise =
+      promisePanelShown(BrowserPageActions._activatedActionPanelID);
+    EventUtils.synthesizeMouseAtCenter(urlbarButton, {});
+    await panelPromise;
+
+    // The devices should be shown in the subview.
+    let expectedItems = [
+      {
+        id: "pageAction-urlbar-sendToDevice-notReady",
+        display: "none",
+        disabled: true,
+      },
+    ];
+    for (let client of mockRemoteClients) {
+      expectedItems.push({
+        attrs: {
+          clientId: client.id,
+          label: client.name,
+          clientType: client.type,
+        },
+      });
+    }
+    expectedItems.push(
+      null,
+      {
+        attrs: {
+          label: "Send to All Devices"
+        }
+      }
+    );
+    checkSendToDeviceItems(expectedItems, true);
+
+    // Get the first device menu item in the panel.
+    let bodyID =
+      BrowserPageActions._panelViewNodeIDForActionID("sendToDevice", true) +
+      "-body";
+    let body = document.getElementById(bodyID);
+    let deviceMenuItem = body.querySelector(".sendtab-target");
+    Assert.notEqual(deviceMenuItem, null);
+
+    // For good measure, wait until it's visible.
+    let dwu = window.QueryInterface(Ci.nsIInterfaceRequestor)
+                    .getInterface(Ci.nsIDOMWindowUtils);
+    await BrowserTestUtils.waitForCondition(() => {
+      let bounds = dwu.getBoundsWithoutFlushing(deviceMenuItem);
+      return bounds.height > 0 && bounds.width > 0;
+    }, "Waiting for first device menu item to appear");
+
+    // Click it, which should cause the panel to close.
+    let hiddenPromise =
+      promisePanelHidden(BrowserPageActions._activatedActionPanelID);
+    EventUtils.synthesizeMouseAtCenter(deviceMenuItem, {});
+    info("Waiting for Send to Device panel to close after clicking a device");
+    await hiddenPromise;
+
+    // And then the "Sent!" notification panel should open and close by itself
+    // after a moment.
+    info("Waiting for the Sent! notification panel to open");
+    await promisePanelShown(BrowserPageActionFeedback.panelNode.id);
+    info("Waiting for the Sent! notification panel to close");
+    await promisePanelHidden(BrowserPageActionFeedback.panelNode.id);
+
+    // Remove Send to Device from the urlbar.
+    action.shownInUrlbar = false;
+    BrowserPageActions._disableActivatedActionPanelAnimation = false;
+
+    cleanUp();
+  });
+});
+
 add_task(async function contextMenu() {
   // Open an actionable page so that the main page action button appears.
   let url = "http://example.com/";
   await BrowserTestUtils.withNewTab(url, async () => {
     // Open the panel and then open the context menu on the bookmark button.
     await promisePageActionPanelOpen();
     let bookmarkButton = document.getElementById("pageAction-panel-bookmark");
     let contextMenuPromise = promisePanelShown("pageActionPanelContextMenu");
@@ -572,19 +672,21 @@ function promiseSyncReady() {
                   .getService(Components.interfaces.nsISupports)
                   .wrappedJSObject;
   return service.whenLoaded().then(() => {
     UIState.isReady();
     return UIState.refresh();
   });
 }
 
-function checkSendToDeviceItems(expectedItems) {
-  let body =
-    document.getElementById("pageAction-panel-sendToDevice-subview-body");
+function checkSendToDeviceItems(expectedItems, forUrlbar = false) {
+  let bodyID =
+    BrowserPageActions._panelViewNodeIDForActionID("sendToDevice", forUrlbar) +
+    "-body";
+  let body = document.getElementById(bodyID);
   Assert.equal(body.childNodes.length, expectedItems.length);
   for (let i = 0; i < expectedItems.length; i++) {
     let expected = expectedItems[i];
     let actual = body.childNodes[i];
     if (!expected) {
       Assert.equal(actual.localName, "toolbarseparator");
       continue;
     }
--- a/browser/components/migration/tests/browser/browser.ini
+++ b/browser/components/migration/tests/browser/browser.ini
@@ -1,3 +1,8 @@
+[DEFAULT]
+prefs =
+    browser.newtabpage.activity-stream.enabled=false
+    browser.newtabpage.preload=false
+
 [browser_undo_notification.js]
 [browser_undo_notification_wording.js]
 [browser_undo_notification_multiple_dismissal.js]
--- a/browser/components/migration/tests/browser/browser_undo_notification.js
+++ b/browser/components/migration/tests/browser/browser_undo_notification.js
@@ -14,25 +14,16 @@ const kExpectedNotificationId = "automig
 add_task(async function autoMigrationUndoNotificationShows() {
   let getNotification = browser =>
     gBrowser.getNotificationBox(browser).getNotificationWithValue(kExpectedNotificationId);
 
   scope.AutoMigrate.canUndo = () => true;
   let undoCalled;
   scope.AutoMigrate.undo = () => { undoCalled = true };
 
-  // Disable preloaded activity-stream about:newtab for this test to only run on
-  // the tiles version
-  await SpecialPowers.pushPrefEnv({set: [
-    ["browser.newtabpage.activity-stream.enabled", false],
-    ["browser.newtab.preload", false]
-  ]});
-  // Open and close about:newtab to remove any preloaded activity-stream version
-  await BrowserTestUtils.removeTab(await BrowserTestUtils.openNewForegroundTab(gBrowser));
-
   for (let url of ["about:newtab", "about:home"]) {
     undoCalled = false;
     // Can't use pushPrefEnv because of bug 1323779
     Services.prefs.setCharPref("browser.migrate.automigrate.browser", "someunknownbrowser");
     let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url, false);
     let browser = tab.linkedBrowser;
     if (!getNotification(browser)) {
       info(`Notification for ${url} not immediately present, waiting for it.`);
--- a/browser/components/nsBrowserContentHandler.js
+++ b/browser/components/nsBrowserContentHandler.js
@@ -11,16 +11,18 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
                                   "resource://gre/modules/PrivateBrowsingUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow",
                                   "resource:///modules/RecentWindow.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "ShellService",
                                   "resource:///modules/ShellService.jsm");
 XPCOMUtils.defineLazyServiceGetter(this, "WindowsUIUtils",
                                    "@mozilla.org/windows-ui-utils;1", "nsIWindowsUIUtils");
+XPCOMUtils.defineLazyModuleGetter(this, "UpdatePing",
+                                  "resource://gre/modules/UpdatePing.jsm");
 
 const nsISupports            = Components.interfaces.nsISupports;
 
 const nsIBrowserDOMWindow    = Components.interfaces.nsIBrowserDOMWindow;
 const nsIBrowserHandler      = Components.interfaces.nsIBrowserHandler;
 const nsIBrowserHistory      = Components.interfaces.nsIBrowserHistory;
 const nsIChannel             = Components.interfaces.nsIChannel;
 const nsICommandLine         = Components.interfaces.nsICommandLine;
@@ -486,16 +488,17 @@ nsBrowserContentHandler.prototype = {
     var willRestoreSession = false;
     try {
       // Read the old value of homepage_override.mstone before
       // needHomepageOverride updates it, so that we can later add it to the
       // URL if we do end up showing an overridePage. This makes it possible
       // to have the overridePage's content vary depending on the version we're
       // upgrading from.
       let old_mstone = Services.prefs.getCharPref("browser.startup.homepage_override.mstone", "unknown");
+      let old_buildId = Services.prefs.getCharPref("browser.startup.homepage_override.buildID", "unknown");
       override = needHomepageOverride(prefb);
       if (override != OVERRIDE_NONE) {
         switch (override) {
           case OVERRIDE_NEW_PROFILE:
             // New profile.
             overridePage = Services.urlFormatter.formatURLPref("startup.homepage_welcome_url");
             additionalPage = Services.urlFormatter.formatURLPref("startup.homepage_welcome_url.additional");
             // Turn on 'later run' pages for new profiles.
@@ -507,21 +510,30 @@ nsBrowserContentHandler.prototype = {
             // into account because that requires waiting for the session file
             // to be read. If a crash occurs after updating, before restarting,
             // we may open the startPage in addition to restoring the session.
             var ss = Components.classes["@mozilla.org/browser/sessionstartup;1"]
                                .getService(Components.interfaces.nsISessionStartup);
             willRestoreSession = ss.isAutomaticRestoreEnabled();
 
             overridePage = Services.urlFormatter.formatURLPref("startup.homepage_override_url");
-            if (prefb.prefHasUserValue("app.update.postupdate"))
+            if (prefb.prefHasUserValue("app.update.postupdate")) {
               overridePage = getPostUpdateOverridePage(overridePage);
+              // Send the update ping to signal that the update was successful.
+              UpdatePing.handleUpdateSuccess(old_mstone, old_buildId);
+            }
 
             overridePage = overridePage.replace("%OLD_VERSION%", old_mstone);
             break;
+          case OVERRIDE_NEW_BUILD_ID:
+            if (prefb.prefHasUserValue("app.update.postupdate")) {
+              // Send the update ping to signal that the update was successful.
+              UpdatePing.handleUpdateSuccess(old_mstone, old_buildId);
+            }
+            break;
         }
       }
     } catch (ex) {}
 
     // formatURLPref might return "about:blank" if getting the pref fails
     if (overridePage == "about:blank")
       overridePage = "";
 
--- a/browser/extensions/formautofill/FormAutofillParent.jsm
+++ b/browser/extensions/formautofill/FormAutofillParent.jsm
@@ -412,19 +412,26 @@ FormAutofillParent.prototype = {
   },
 
   async _onCreditCardSubmit(creditCard, target) {
     // We'll show the credit card doorhanger if:
     //   - User applys autofill and changed
     //   - User fills form manually
     if (creditCard.guid &&
         Object.keys(creditCard.record).every(key => creditCard.untouchedFields.includes(key))) {
+      // Add probe to record credit card autofill(without modification).
+      Services.telemetry.scalarAdd("formautofill.creditCards.fill_type_autofill", 1);
       return;
     }
 
+    // Add the probe to record credit card manual filling or autofill but modified case.
+    let ccScalar = creditCard.guid ? "formautofill.creditCards.fill_type_autofill_modified" :
+                                     "formautofill.creditCards.fill_type_manual";
+    Services.telemetry.scalarAdd(ccScalar, 1);
+
     let state = await FormAutofillDoorhanger.show(target, "creditCard");
     if (state == "cancel") {
       return;
     }
 
     if (state == "disable") {
       Services.prefs.setBoolPref("extensions.formautofill.creditCards.enabled", false);
       return;
--- a/browser/themes/shared/compacttheme.inc.css
+++ b/browser/themes/shared/compacttheme.inc.css
@@ -46,16 +46,17 @@
   --chrome-nav-buttons-background: #ffffff; /* --theme-body-background */
   --chrome-nav-buttons-hover-background: #DADBDB;
   --chrome-nav-bar-controls-border-color: #ccc;
   --chrome-selection-color: #f5f7fa;
   --chrome-selection-background-color: #4c9ed9;
 }
 
 .toolbarbutton-animatable-box[brighttext],
+toolbar[brighttext] .toolbarbutton-animatable-box,
 toolbar[brighttext] .toolbarbutton-1 {
   fill: rgba(249, 249, 250, .7);
 }
 
 #urlbar ::-moz-selection,
 #navigator-toolbox .searchbar-textbox ::-moz-selection,
 .browserContainer > findbar ::-moz-selection {
   background-color: var(--chrome-selection-background-color);
--- a/browser/themes/shared/icons/reload-to-stop.svg
+++ b/browser/themes/shared/icons/reload-to-stop.svg
@@ -1,894 +1,187 @@
-<!-- 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/. -->
-<svg xmlns="http://www.w3.org/2000/svg" width="468" height="20" fill="context-fill">
-  <svg x="0">
-    <defs>
-      <mask id="d" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.27 18.622) scale(7.36624)"/>
-      </mask>
-      <mask id="c" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
-      </mask>
-      <filter id="a" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="b" mask-type="alpha">
-        <g filter="url(#a)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.975 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#b)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.86 -0.19 6.833 -3.473 6.642 -7.331C15.794 5.79 12.513 2.816 8.654 3.006A6.997 6.997 0 0 0 2.821 6.711a6.954 6.954 0 0 0 -0.517 5.332A1 1 0 1 0 4.217 11.46a5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#c)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#d)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="18">
-    <defs>
-      <mask id="h" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.255 18.622) scale(7.27821)"/>
-      </mask>
-      <mask id="g" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
-      </mask>
-      <filter id="e" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="f" mask-type="alpha">
-        <g filter="url(#e)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.975 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#f)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.86 -0.19 6.833 -3.473 6.642 -7.331C15.794 5.79 12.513 2.816 8.654 3.006A6.997 6.997 0 0 0 2.821 6.711a6.954 6.954 0 0 0 -0.517 5.332A1 1 0 1 0 4.217 11.46a5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#g)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#h)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="36">
-    <defs>
-      <mask id="l" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.236 18.622) scale(7.1563)"/>
-      </mask>
-      <mask id="k" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
-      </mask>
-      <filter id="i" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="j" mask-type="alpha">
-        <g filter="url(#i)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.975 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#j)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.86 -0.19 6.833 -3.473 6.642 -7.331C15.794 5.79 12.513 2.816 8.654 3.006A6.997 6.997 0 0 0 2.821 6.71a6.954 6.954 0 0 0 -0.517 5.333A1 1 0 1 0 4.217 11.46a5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#k)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#l)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="54">
-    <defs>
-      <mask id="p" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.21 18.622) scale(6.99309)"/>
-      </mask>
-      <mask id="o" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.151 1.705) scale(7.47405)"/>
-      </mask>
-      <filter id="m" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="n" mask-type="alpha">
-        <g filter="url(#m)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.975 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#n)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.833 -3.473 6.642 -7.331C15.794 5.79 12.513 2.816 8.654 3.006A6.997 6.997 0 0 0 2.821 6.71a6.954 6.954 0 0 0 -0.517 5.333A1 1 0 1 0 4.217 11.46a5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#o)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#p)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="72">
-    <defs>
-      <mask id="t" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.177 18.622) scale(6.7782)"/>
-      </mask>
-      <mask id="s" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.148 1.705) scale(7.45544)"/>
-      </mask>
-      <filter id="q" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="r" mask-type="alpha">
-        <g filter="url(#q)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.975 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#r)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.832 -3.473 6.642 -7.331C15.794 5.79 12.514 2.816 8.654 3.006A6.997 6.997 0 0 0 2.821 6.71a6.954 6.954 0 0 0 -0.517 5.333A1 1 0 1 0 4.217 11.46a5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#s)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#t)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="90">
-    <defs>
-      <mask id="x" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.133 18.622) scale(6.49626)"/>
-      </mask>
-      <mask id="w" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.142 1.705) scale(7.4152)"/>
-      </mask>
-      <filter id="u" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="v" mask-type="alpha">
-        <g filter="url(#u)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#v)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.832 -3.473 6.642 -7.33C15.794 5.79 12.514 2.815 8.654 3.005A6.997 6.997 0 0 0 2.821 6.71a6.954 6.954 0 0 0 -0.517 5.333 1 1 0 1 0 1.913 -0.584 5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#w)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#x)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="108">
-    <defs>
-      <mask id="B" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.075 18.622) scale(6.1231)"/>
-      </mask>
-      <mask id="A" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.132 1.705) scale(7.34989)"/>
-      </mask>
-      <filter id="y" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="z" mask-type="alpha">
-        <g filter="url(#y)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#z)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.832 -3.473 6.642 -7.33C15.794 5.79 12.514 2.815 8.654 3.005A6.997 6.997 0 0 0 2.821 6.71a6.954 6.954 0 0 0 -0.517 5.333 1 1 0 1 0 1.913 -0.584 5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#A)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#B)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="126">
-    <defs>
-      <mask id="F" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.996 18.622) scale(5.61712)"/>
-      </mask>
-      <mask id="E" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.117 1.705) scale(7.2551)"/>
-      </mask>
-      <filter id="C" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="D" mask-type="alpha">
-        <g filter="url(#C)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#D)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.832 -3.473 6.642 -7.33C15.794 5.79 12.514 2.815 8.654 3.005A6.997 6.997 0 0 0 2.821 6.71a6.954 6.954 0 0 0 -0.517 5.333 1 1 0 1 0 1.913 -0.584 5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#E)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#F)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="144">
-    <defs>
-      <mask id="J" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.884 18.622) scale(4.89783)"/>
-      </mask>
-      <mask id="I" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.097 1.705) scale(7.12503)"/>
-      </mask>
-      <filter id="G" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="H" mask-type="alpha">
-        <g filter="url(#G)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#H)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.832 -3.473 6.642 -7.33C15.794 5.79 12.514 2.815 8.654 3.005A6.997 6.997 0 0 0 2.821 6.71a6.954 6.954 0 0 0 -0.517 5.333 1 1 0 1 0 1.913 -0.584 5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#I)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#J)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="162">
-    <defs>
-      <mask id="N" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.711 18.622) scale(3.7902)"/>
-      </mask>
-      <mask id="M" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.07 1.705) scale(6.95173)"/>
-      </mask>
-      <filter id="K" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="L" mask-type="alpha">
-        <g filter="url(#K)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#L)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.832 -3.473 6.642 -7.33C15.794 5.79 12.514 2.815 8.654 3.005A6.997 6.997 0 0 0 2.821 6.71a6.954 6.954 0 0 0 -0.517 5.333 1 1 0 1 0 1.913 -0.584 5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#M)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#N)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="180">
-    <defs>
-      <mask id="R" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.454 18.622) scale(2.13915)"/>
-      </mask>
-      <mask id="Q" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.034 1.705) scale(6.72397)"/>
-      </mask>
-      <filter id="O" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="P" mask-type="alpha">
-        <g filter="url(#O)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#P)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.832 -3.473 6.642 -7.33C15.794 5.79 12.514 2.815 8.654 3.005A6.997 6.997 0 0 0 2.822 6.71a6.954 6.954 0 0 0 -0.517 5.333 1 1 0 1 0 1.913 -0.584 5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#Q)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#R)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="198">
-    <defs>
-      <mask id="V" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.276 18.622) scale(1.00203)"/>
-      </mask>
-      <mask id="U" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.987 1.705) scale(6.42492)"/>
-      </mask>
-      <filter id="S" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="T" mask-type="alpha">
-        <g filter="url(#S)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#T)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.832 -3.473 6.642 -7.33C15.794 5.79 12.514 2.815 8.654 3.005A6.997 6.997 0 0 0 2.822 6.71a6.954 6.954 0 0 0 -0.517 5.333 1 1 0 1 0 1.913 -0.584 5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#U)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#V)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="216">
-    <defs>
-      <mask id="Z" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.216 18.622) scale(.61358)"/>
-      </mask>
-      <mask id="Y" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.925 1.705) scale(6.02764)"/>
-      </mask>
-      <filter id="W" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="X" mask-type="alpha">
-        <g filter="url(#W)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#X)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.832 -3.473 6.642 -7.33C15.794 5.79 12.514 2.815 8.654 3.005A6.997 6.997 0 0 0 2.822 6.71a6.954 6.954 0 0 0 -0.517 5.333 1 1 0 1 0 1.913 -0.584 5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#Y)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#Z)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="234">
-    <defs>
-      <mask id="ad" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="ac" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.84 1.705) scale(5.48475)"/>
-      </mask>
-      <filter id="aa" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="ab" mask-type="alpha">
-        <g filter="url(#aa)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#ab)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.859 -0.19 6.832 -3.472 6.642 -7.33C15.794 5.79 12.514 2.817 8.654 3.006A6.997 6.997 0 0 0 2.822 6.71a6.954 6.954 0 0 0 -0.517 5.333A1 1 0 1 0 4.217 11.46a5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#ac)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#ad)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="252">
-    <defs>
-      <mask id="ah" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="ag" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.718 1.705) scale(4.70182)"/>
-      </mask>
-      <filter id="ae" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="af" mask-type="alpha">
-        <g filter="url(#ae)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#af)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.858 -0.19 6.832 -3.472 6.642 -7.33C15.794 5.79 12.514 2.817 8.654 3.006A6.997 6.997 0 0 0 2.822 6.71a6.954 6.954 0 0 0 -0.517 5.333A1 1 0 1 0 4.217 11.46a5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#ag)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#ah)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="270">
-    <defs>
-      <mask id="al" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="ak" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.527 1.705) scale(3.47447)"/>
-      </mask>
-      <filter id="ai" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aj" mask-type="alpha">
-        <g filter="url(#ai)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#aj)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.858 -0.19 6.832 -3.472 6.642 -7.33C15.794 5.79 12.514 2.817 8.654 3.006A6.997 6.997 0 0 0 2.822 6.71a6.954 6.954 0 0 0 -0.517 5.333A1 1 0 1 0 4.217 11.46a5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#ak)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#al)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="288">
-    <defs>
-      <mask id="ap" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="ao" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.267 1.705) scale(1.80625)"/>
-      </mask>
-      <filter id="am" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="an" mask-type="alpha">
-        <g filter="url(#am)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.974 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#an)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.858 -0.19 6.832 -3.472 6.642 -7.33C15.794 5.79 12.514 2.817 8.654 3.006A6.997 6.997 0 0 0 2.822 6.71a6.954 6.954 0 0 0 -0.517 5.333A1 1 0 1 0 4.217 11.46a5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#ao)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#ap)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="306">
-    <defs>
-      <mask id="at" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="as" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.122 1.705) scale(.87602)"/>
-      </mask>
-      <filter id="aq" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="ar" mask-type="alpha">
-        <g filter="url(#aq)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".111">
-      <path fill-opacity="1" d="M7.268 15.294l0.269 -0.092a0.111 0.111 0 0 0 -0.073 -0.21l-0.526 0.181a0.111 0.111 0 0 0 -0.069 0.142l0.182 0.525a0.111 0.111 0 0 0 0.21 -0.072L7.173 15.513" opacity="1"/>
-    </g>
-    <g mask="url(#ar)" opacity=".066">
-      <path fill-opacity="1" d="M6.148 16.38c3.527 1.576 7.664 -0.007 9.24 -3.533C16.963 9.319 15.382 5.183 11.855 3.607A6.997 6.997 0 0 0 4.978 4.27 6.954 6.954 0 0 0 2.104 8.793a1 1 0 1 0 1.97 0.345 5.02 5.02 0 1 1 2.352 5.113" opacity="1"/>
-    </g>
-    <g mask="url(#as)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#at)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="324">
-    <defs>
-      <mask id="ax" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="aw" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.075 1.705) scale(.57983)"/>
-      </mask>
-      <filter id="au" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="av" mask-type="alpha">
-        <g filter="url(#au)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".231">
-      <path fill-opacity="1" d="M4.934 13.615l0.584 0.08A0.231 0.231 0 0 0 5.58 13.236L4.436 13.082a0.231 0.231 0 0 0 -0.26 0.198L4.02 14.424a0.231 0.231 0 0 0 0.457 0.062l0.075 -0.554" opacity="1"/>
-    </g>
-    <g mask="url(#av)" opacity=".186">
-      <path fill-opacity="1" d="M3.416 14.202c2.324 3.086 6.71 3.704 9.796 1.38 3.086 -2.323 3.705 -6.708 1.381 -9.795A6.997 6.997 0 0 0 8.253 3.04 6.954 6.954 0 0 0 3.55 5.606a1 1 0 1 0 1.557 1.255A5.02 5.02 0 1 1 4.69 12.473" opacity="1"/>
-    </g>
-    <g mask="url(#aw)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#ax)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="342">
-    <defs>
-      <mask id="aB" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="aA" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="ay" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="az" mask-type="alpha">
-        <g filter="url(#ay)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".351">
-      <path fill-opacity="1" d="M3.778 11.038l0.737 0.506a0.35 0.35 0 0 0 0.397 -0.578L3.468 9.973a0.35 0.35 0 0 0 -0.488 0.09l-0.993 1.445a0.35 0.35 0 0 0 0.578 0.397l0.48 -0.699" opacity="1"/>
-    </g>
-    <g mask="url(#az)" opacity=".322">
-      <path fill-opacity="1" d="M2.08 10.974c0.54 3.826 4.079 6.49 7.904 5.95s6.489 -4.078 5.95 -7.903A6.997 6.997 0 0 0 11.715 3.548 6.954 6.954 0 0 0 6.357 3.518 1 1 0 1 0 7.112 5.37a5.02 5.02 0 1 1 -3.081 4.71" opacity="1"/>
-    </g>
-    <g mask="url(#aA)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aB)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="360">
-    <defs>
-      <mask id="aF" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="aE" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="aC" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aD" mask-type="alpha">
-        <g filter="url(#aC)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".47">
-      <path fill-opacity="1" d="M4.073 8.272L4.65 9.323A0.47 0.47 0 0 0 5.474 8.872L4.345 6.81A0.47 0.47 0 0 0 3.707 6.623L1.645 7.752a0.47 0.47 0 0 0 0.451 0.825L3.094 8.03" opacity="1"/>
-    </g>
-    <g mask="url(#aD)" opacity=".464">
-      <path fill-opacity="1" d="M2.473 7.503c-1.38 3.61 0.429 7.653 4.037 9.032 3.608 1.38 7.652 -0.427 9.031 -4.036A6.997 6.997 0 0 0 14.5 5.669 6.954 6.954 0 0 0 9.825 3.048 1 1 0 1 0 9.59 5.034a5.02 5.02 0 1 1 -4.976 2.63" opacity="1"/>
-    </g>
-    <g mask="url(#aE)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aF)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="378">
-    <defs>
-      <mask id="aJ" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="aI" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="aG" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aH" mask-type="alpha">
-        <g filter="url(#aG)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".59">
-      <path fill-opacity="1" d="M5.703 6.065l0.05 1.503a0.59 0.59 0 0 0 1.179 -0.04L6.834 4.583A0.59 0.59 0 0 0 6.225 4.012L3.278 4.109a0.59 0.59 0 0 0 0.04 1.18L4.741 5.24" opacity="1"/>
-    </g>
-    <g mask="url(#aH)" opacity=".607">
-      <path fill-opacity="1" d="M4.497 4.656C1.543 7.146 1.168 11.56 3.658 14.513c2.49 2.954 6.903 3.33 9.857 0.84A6.997 6.997 0 0 0 15.908 8.87 6.954 6.954 0 0 0 13.087 4.316 1 1 0 1 0 11.92 5.94 5.02 5.02 0 1 1 6.292 5.833" opacity="1"/>
-    </g>
-    <g mask="url(#aI)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aJ)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="396">
-    <defs>
-      <mask id="aN" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="aM" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="aK" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aL" mask-type="alpha">
-        <g filter="url(#aK)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".709">
-      <path fill-opacity="1" d="M8.198 5.001l-0.761 1.64a0.71 0.71 0 0 0 1.287 0.597l1.493 -3.217A0.71 0.71 0 0 0 9.872 3.08L6.655 1.586A0.71 0.71 0 0 0 6.058 2.873l1.556 0.722" opacity="1"/>
-    </g>
-    <g mask="url(#aL)" opacity=".747">
-      <path fill-opacity="1" d="M7.646 3.145C3.856 3.894 1.392 7.575 2.14 11.364c0.75 3.79 4.429 6.254 8.219 5.505a6.997 6.997 0 0 0 5.232 -4.514 6.954 6.954 0 0 0 -0.265 -5.35A1 1 0 1 0 13.52 7.86 5.02 5.02 0 1 1 8.648 5.043" opacity="1"/>
-    </g>
-    <g mask="url(#aM)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aN)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="414">
-    <defs>
-      <mask id="aR" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="aQ" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="aO" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aP" mask-type="alpha">
-        <g filter="url(#aO)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".829">
-      <path fill-opacity="1" d="M10.865 5.35L9.207 6.66a0.83 0.83 0 0 0 1.027 1.3l3.253 -2.57a0.83 0.83 0 0 0 0.136 -1.164l-2.57 -3.252a0.83 0.83 0 0 0 -1.3 1.028l1.243 1.573" opacity="1"/>
-    </g>
-    <g mask="url(#aP)" opacity=".877">
-      <path fill-opacity="1" d="M11.133 3.346C7.453 2.166 3.516 4.195 2.338 7.873c-1.179 3.68 0.848 7.617 4.527 8.796a6.997 6.997 0 0 0 6.763 -1.417 6.954 6.954 0 0 0 2.358 -4.811A1 1 0 1 0 13.99 10.315a5.02 5.02 0 1 1 -2.9 -4.823" opacity="1"/>
-    </g>
-    <g mask="url(#aQ)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aR)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="432">
-    <defs>
-      <mask id="aV" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="aU" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="aS" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aT" mask-type="alpha">
-        <g filter="url(#aS)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".949">
-      <path fill-opacity="1" d="M12.97 6.998L10.6 7.48a0.949 0.949 0 0 0 0.38 1.86l4.647 -0.948a0.949 0.949 0 0 0 0.74 -1.118L15.42 2.626a0.949 0.949 0 0 0 -1.859 0.379l0.458 2.247" opacity="1"/>
-    </g>
-    <g mask="url(#aT)" opacity=".981">
-      <path fill-opacity="1" d="M14.087 5.21C11.438 2.396 7.011 2.265 4.2 4.914 1.387 7.564 1.255 11.99 3.904 14.803a6.997 6.997 0 0 0 6.604 2.033A6.954 6.954 0 0 0 14.9 13.767a1 1 0 1 0 -1.685 -1.076A5.02 5.02 0 1 1 13.01 7.067" opacity="1"/>
-    </g>
-    <g mask="url(#aU)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aV)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="450">
-    <defs>
-      <mask id="aZ" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="aY" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="aW" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aX" mask-type="alpha">
-        <g filter="url(#aW)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <path fill-opacity="1" d="M13.548 7.997l-2.549 0.001a1 1 0 0 0 0.001 2l5 -0.003a1 1 0 0 0 0.999 -1l-0.003 -5a1 1 0 0 0 -2 0.002l0.002 2.417" opacity="1"/>
-    <g mask="url(#aX)">
-      <path fill-opacity="1" d="M14.998 6.414C13.015 3.098 8.719 2.02 5.404 4.002 2.088 5.985 1.008 10.28 2.991 13.596A6.997 6.997 0 0 0 9.004 17a6.954 6.954 0 0 0 4.95 -2.053 1 1 0 1 0 -1.415 -1.413 5.02 5.02 0 1 1 1.01 -5.537" opacity="1"/>
-    </g>
-    <g mask="url(#aY)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aZ)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="468">
-    <defs>
-      <mask id="bd" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.27 18.622) scale(7.36624)"/>
-      </mask>
-      <mask id="bc" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
-      </mask>
-      <filter id="ba" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="bb" mask-type="alpha">
-        <g filter="url(#ba)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path display="none"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.975 15.617" opacity="1"/>
-    </g>
-    <g mask="url(#bb)" opacity="0">
-      <path fill-opacity="1" d="M9.342 16.98c3.86 -0.19 6.833 -3.473 6.642 -7.331C15.794 5.79 12.513 2.816 8.654 3.006A6.997 6.997 0 0 0 2.821 6.711a6.954 6.954 0 0 0 -0.517 5.332A1 1 0 1 0 4.217 11.46a5.02 5.02 0 1 1 4.41 3.496" opacity="1"/>
-    </g>
-    <g mask="url(#bc)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#bd)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-</svg>
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="468" height="20" fill="context-fill">
+  <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z"/>
+  <svg x="18">
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z"/>
+  </svg>
+  <svg x="36">
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z"/>
+  </svg>
+  <svg x="54">
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z"/>
+  </svg>
+  <svg x="72">
+    <defs>
+      <mask id="a" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(1.177 18.622) scale(6.7782)"/>
+      </mask>
+    </defs>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#a)"/>
+  </svg>
+  <svg x="90">
+    <defs>
+      <mask id="b" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(1.133 18.622) scale(6.49626)"/>
+      </mask>
+    </defs>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#b)"/>
+  </svg>
+  <svg x="108">
+    <defs>
+      <mask id="c" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(1.075 18.622) scale(6.1231)"/>
+      </mask>
+    </defs>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#c)"/>
+  </svg>
+  <svg x="126">
+    <defs>
+      <mask id="d" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(.996 18.622) scale(5.61712)"/>
+      </mask>
+    </defs>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#d)"/>
+  </svg>
+  <svg x="144">
+    <defs>
+      <mask id="J" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(.884 18.622) scale(4.89783)"/>
+      </mask>
+      <mask id="I" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(1.097 1.705) scale(7.12503)"/>
+      </mask>
+    </defs>
+    <g mask="url(#I)">
+      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39l-5.293 -5.293"/>
+      <path d="M10.973 10.558l-7.266 -7.265a1 1 0 0 0 -1.414 0.024 1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
+    </g>
+    <path d="M7.687 9.906l-5.394 5.387a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l5.394 -5.387m1.212 -1.232l5.393 -5.381a0.999 0.999 0 0 0 -0.024 -1.414 1.001 1.001 0 0 0 -1.39 0l-5.393 5.381" mask="url(#J)"/>
+  </svg>
+  <svg x="162">
+    <defs>
+      <mask id="g" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(.71 18.622) scale(3.7902)"/>
+      </mask>
+      <mask id="f" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(1.07 1.705) scale(6.95173)"/>
+      </mask>
+    </defs>
+    <g mask="url(#f)">
+      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39l-5.293 -5.293"/>
+      <path d="M10.973 10.558l-7.266 -7.265a1 1 0 0 0 -1.414 0.024 1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
+    </g>
+    <path d="M7.687 9.906l-5.394 5.387a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l5.394 -5.387m1.212 -1.232l5.393 -5.381a0.999 0.999 0 0 0 -0.024 -1.414 1.001 1.001 0 0 0 -1.39 0l-5.393 5.381" mask="url(#g)"/>
+  </svg>
+  <svg x="180">
+    <defs>
+      <mask id="i" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(.454 18.622) scale(2.13915)"/>
+      </mask>
+      <mask id="h" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(1.034 1.705) scale(6.72397)"/>
+      </mask>
+    </defs>
+    <g mask="url(#h)">
+      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39l-5.293 -5.293"/>
+      <path d="M10.973 10.558l-7.266 -7.265a1 1 0 0 0 -1.414 0.024 1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
+    </g>
+    <path d="M7.687 9.906l-5.394 5.387a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l5.394 -5.387m1.212 -1.232l5.393 -5.381a0.999 0.999 0 0 0 -0.024 -1.414 1.001 1.001 0 0 0 -1.39 0l-5.393 5.381" mask="url(#i)"/>
+  </svg>
+  <svg x="198">
+    <defs>
+      <mask id="j" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(.987 1.705) scale(6.42492)"/>
+      </mask>
+    </defs>
+    <g mask="url(#j)">
+      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39l-5.293 -5.293"/>
+      <path d="M10.973 10.558l-7.266 -7.265a1 1 0 0 0 -1.414 0.024 1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
+    </g>
+  </svg>
+  <svg x="216">
+    <defs>
+      <mask id="k" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(.925 1.705) scale(6.02764)"/>
+      </mask>
+    </defs>
+    <g mask="url(#k)">
+      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39l-5.293 -5.293"/>
+      <path d="M10.973 10.558l-7.266 -7.265a1 1 0 0 0 -1.414 0.024 1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
+    </g>
+  </svg>
+  <svg x="234">
+    <defs>
+      <mask id="l" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(.84 1.705) scale(5.48475)"/>
+      </mask>
+    </defs>
+    <g mask="url(#l)">
+      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39l-5.293 -5.293"/>
+      <path d="M10.973 10.558l-7.266 -7.265a1 1 0 0 0 -1.414 0.024 1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
+    </g>
+  </svg>
+  <svg x="252">
+    <defs>
+      <mask id="m" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(.718 1.705) scale(4.70182)"/>
+      </mask>
+    </defs>
+    <g mask="url(#m)">
+      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39l-5.293 -5.293"/>
+      <path d="M10.973 10.558l-7.266 -7.265a1 1 0 0 0 -1.414 0.024 1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
+    </g>
+  </svg>
+  <svg x="270">
+    <defs>
+      <mask id="n" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(.527 1.705) scale(3.47447)"/>
+      </mask>
+    </defs>
+    <path d="M10.973 10.558l-7.266 -7.265a1 1 0 0 0 -1.414 0.024 1.001 1.001 0 0 0 0 1.39l7.266 7.265" mask="url(#n)"/>
+  </svg>
+  <svg x="288">
+    <defs>
+      <mask id="o" mask-type="alpha" fill="#fff">
+        <path d="M0 -2.906a2.907 2.907 0 0 1 2.906 2.906 2.907 2.907 0 0 1 -2.906 2.906 2.907 2.907 0 0 1 -2.906 -2.906 2.907 2.907 0 0 1 2.906 -2.906z" transform="translate(.267 1.705) scale(1.80625)"/>
+      </mask>
+    </defs>
+    <path d="M10.973 10.558l-7.266 -7.265a1 1 0 0 0 -1.414 0.024 1.001 1.001 0 0 0 0 1.39l7.266 7.265" mask="url(#o)"/>
+  </svg>
+  <svg x="306">
+    <path d="M6.148 16.38c3.527 1.576 7.664 -0.007 9.24 -3.533 1.576 -3.528 -0.005 -7.664 -3.532 -9.24a6.997 6.997 0 0 0 -6.878 0.664 6.954 6.954 0 0 0 -2.874 4.522 1 1 0 1 0 1.97 0.345 5.02 5.02 0 1 1 2.352 5.113" opacity=".066"/>
+  </svg>
+  <svg x="324">
+    <path d="M4.934 13.615l0.584 0.08a0.231 0.231 0 0 0 0.062 -0.458l-1.144 -0.155a0.231 0.231 0 0 0 -0.26 0.198l-0.155 1.144a0.231 0.231 0 0 0 0.457 0.062l0.075 -0.554" opacity=".231"/>
+    <path d="M3.416 14.202c2.324 3.086 6.71 3.704 9.796 1.38 3.086 -2.323 3.705 -6.708 1.381 -9.795a6.997 6.997 0 0 0 -6.34 -2.747 6.954 6.954 0 0 0 -4.703 2.566 1 1 0 1 0 1.557 1.255 5.02 5.02 0 1 1 -0.417 5.612" opacity=".186"/>
+  </svg>
+  <svg x="342">
+    <path d="M3.778 11.038l0.737 0.506a0.35 0.35 0 0 0 0.397 -0.578l-1.444 -0.993a0.35 0.35 0 0 0 -0.488 0.09l-0.993 1.445a0.35 0.35 0 0 0 0.578 0.397l0.48 -0.699" opacity=".351"/>
+    <path d="M2.08 10.974c0.54 3.826 4.079 6.49 7.904 5.95s6.489 -4.078 5.95 -7.903a6.997 6.997 0 0 0 -4.219 -5.473 6.954 6.954 0 0 0 -5.358 -0.03 1 1 0 1 0 0.755 1.852 5.02 5.02 0 1 1 -3.081 4.71" opacity=".322"/>
+  </svg>
+  <svg x="360">
+    <path d="M4.073 8.272l0.576 1.051a0.47 0.47 0 0 0 0.825 -0.451l-1.129 -2.062a0.47 0.47 0 0 0 -0.638 -0.187l-2.062 1.129a0.47 0.47 0 0 0 0.451 0.825l0.998 -0.546" opacity=".47"/>
+    <path d="M2.473 7.503c-1.38 3.61 0.429 7.653 4.037 9.032 3.608 1.38 7.652 -0.427 9.031 -4.036a6.997 6.997 0 0 0 -1.042 -6.83 6.954 6.954 0 0 0 -4.674 -2.62 1 1 0 1 0 -0.236 1.986 5.02 5.02 0 1 1 -4.976 2.63" opacity=".464"/>
+  </svg>
+  <svg x="378">
+    <path d="M5.703 6.065l0.05 1.503a0.59 0.59 0 0 0 1.179 -0.04l-0.098 -2.946a0.59 0.59 0 0 0 -0.609 -0.57l-2.947 0.097a0.59 0.59 0 0 0 0.04 1.18l1.424 -0.048" opacity=".59"/>
+    <path d="M4.497 4.656c-2.954 2.49 -3.329 6.904 -0.839 9.857 2.49 2.954 6.903 3.33 9.857 0.84a6.997 6.997 0 0 0 2.393 -6.482 6.954 6.954 0 0 0 -2.821 -4.555 1 1 0 1 0 -1.167 1.624 5.02 5.02 0 1 1 -5.627 -0.107" opacity=".607"/>
+  </svg>
+  <svg x="396">
+    <path d="M8.198 5.001l-0.761 1.64a0.71 0.71 0 0 0 1.287 0.597l1.493 -3.217a0.71 0.71 0 0 0 -0.345 -0.942l-3.217 -1.493a0.71 0.71 0 0 0 -0.597 1.287l1.556 0.722" opacity=".709"/>
+    <path d="M7.646 3.145c-3.79 0.749 -6.254 4.43 -5.505 8.219 0.75 3.79 4.429 6.254 8.219 5.505a6.997 6.997 0 0 0 5.232 -4.514 6.954 6.954 0 0 0 -0.265 -5.35 1 1 0 1 0 -1.807 0.856 5.02 5.02 0 1 1 -4.872 -2.817" opacity=".747"/>
+  </svg>
+  <svg x="414">
+    <path d="M10.865 5.35l-1.658 1.31a0.83 0.83 0 0 0 1.027 1.3l3.253 -2.57a0.83 0.83 0 0 0 0.136 -1.164l-2.57 -3.252a0.83 0.83 0 0 0 -1.3 1.028l1.243 1.573" opacity=".829"/>
+    <path d="M11.133 3.346c-3.68 -1.18 -7.617 0.849 -8.795 4.527 -1.179 3.68 0.848 7.617 4.527 8.796a6.997 6.997 0 0 0 6.763 -1.417 6.954 6.954 0 0 0 2.358 -4.811 1 1 0 1 0 -1.996 -0.126 5.02 5.02 0 1 1 -2.9 -4.823" opacity=".877"/>
+  </svg>
+  <svg x="432">
+    <path d="M12.97 6.998l-2.37 0.482a0.949 0.949 0 0 0 0.38 1.86l4.647 -0.948a0.949 0.949 0 0 0 0.74 -1.118l-0.947 -4.648a0.949 0.949 0 0 0 -1.859 0.379l0.458 2.247" opacity=".949"/>
+    <path d="M14.087 5.21c-2.649 -2.813 -7.076 -2.944 -9.887 -0.295 -2.813 2.649 -2.945 7.075 -0.296 9.888a6.997 6.997 0 0 0 6.604 2.033 6.954 6.954 0 0 0 4.392 -3.069 1 1 0 1 0 -1.685 -1.076 5.02 5.02 0 1 1 -0.204 -5.624" opacity=".981"/>
+  </svg>
+  <svg x="450">
+    <path d="M13.548 7.997l-2.549 0.001a1 1 0 0 0 0.001 2l5 -0.003a1 1 0 0 0 0.999 -1l-0.003 -5a1 1 0 0 0 -2 0.002l0.002 2.417"/>
+    <path d="M14.998 6.414c-1.983 -3.316 -6.279 -4.395 -9.594 -2.412 -3.316 1.983 -4.396 6.278 -2.413 9.594a6.997 6.997 0 0 0 6.013 3.404 6.954 6.954 0 0 0 4.95 -2.053 1 1 0 1 0 -1.415 -1.413 5.02 5.02 0 1 1 1.01 -5.537"/>
+  </svg>
+</svg>
--- a/browser/themes/shared/icons/stop-to-reload.svg
+++ b/browser/themes/shared/icons/stop-to-reload.svg
@@ -1,883 +1,272 @@
-<!-- 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/. -->
-<svg xmlns="http://www.w3.org/2000/svg" width="468" height="20" fill="context-fill">
-  <svg x="0">
-    <defs>
-      <mask id="d" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="c" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="a" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="b" mask-type="alpha">
-        <g filter="url(#a)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-        </g>
-      </mask>
-    </defs>
-    <path d="M13.549 8H11a1 1 0 0 0 0 2h5a1 1 0 0 0 1 -1V4a1 1 0 0 0 -2 0v2.418"/>
-    <g mask="url(#b)">
-      <path d="M15 6.418C13.019 3.101 8.724 2.019 5.408 4c-3.317 1.981 -4.4 6.275 -2.419 9.592A6.997 6.997 0 0 0 9 17a6.954 6.954 0 0 0 4.95 -2.05 1 1 0 1 0 -1.414 -1.414A5.02 5.02 0 1 1 13.549 8"/>
-    </g>
-    <g mask="url(#c)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#d)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="18">
-    <defs>
-      <mask id="h" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="g" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="e" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="f" mask-type="alpha">
-        <g filter="url(#e)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-        </g>
-      </mask>
-    </defs>
-    <path d="M13.735 8.606l-1.72 -0.78a0.741 0.741 0 0 0 -0.611 1.349l3.372 1.53a0.741 0.741 0 0 0 0.98 -0.368l1.531 -3.373A0.741 0.741 0 0 0 15.938 6.352l-0.74 1.631"/>
-    <g mask="url(#f)">
-      <path d="M15.91 8.954C15.33 5.134 11.763 2.508 7.944 3.087 4.125 3.666 1.498 7.231 2.077 11.051a6.997 6.997 0 0 0 4.275 5.429 6.954 6.954 0 0 0 5.357 -0.025A1 1 0 1 0 10.935 14.61a5.02 5.02 0 1 1 3.032 -4.74"/>
-    </g>
-    <g mask="url(#g)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#h)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="36">
-    <defs>
-      <mask id="l" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="k" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="i" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="j" mask-type="alpha">
-        <g filter="url(#i)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-        </g>
-      </mask>
-    </defs>
-    <path d="M14.088 9.318l-0.89 -0.845a0.482 0.482 0 0 0 -0.663 0.699l1.747 1.657a0.482 0.482 0 0 0 0.68 -0.018L16.62 9.064A0.482 0.482 0 0 0 15.921 8.402l-0.802 0.844"/>
-    <g mask="url(#j)">
-      <path d="M15.791 11.646C16.701 7.891 14.393 4.11 10.64 3.202 6.884 2.292 3.103 4.598 2.194 8.353a6.997 6.997 0 0 0 1.903 6.643A6.954 6.954 0 0 0 9.066 17 1 1 0 1 0 9.047 15a5.02 5.02 0 1 1 4.6 -3.242"/>
-    </g>
-    <g mask="url(#k)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#l)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="54">
-    <defs>
-      <mask id="p" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="o" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="m" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="n" mask-type="alpha">
-        <g filter="url(#m)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-0.533 9.56 6.45 8.28l5.112 -5.842L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <path d="M14.43 10.23L14.115 9.76a0.222 0.222 0 0 0 -0.37 0.247l0.618 0.923a0.222 0.222 0 0 0 0.308 0.062l0.924 -0.618a0.222 0.222 0 0 0 -0.247 -0.37l-0.447 0.3"/>
-    <g mask="url(#n)">
-      <path d="M14.664 14.093C16.926 10.961 16.22 6.59 13.089 4.327 9.957 2.065 5.585 2.77 3.323 5.901A6.997 6.997 0 0 0 2.57 12.77a6.954 6.954 0 0 0 3.842 3.735 1 1 0 1 0 0.74 -1.858 5.02 5.02 0 1 1 5.485 -1.26"/>
-    </g>
-    <g mask="url(#o)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#p)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="72">
-    <defs>
-      <mask id="t" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="s" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="q" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="r" mask-type="alpha">
-        <g filter="url(#q)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-3.768 7.437s8.523 1.248 8.575 1.078C4.86 8.345 11.625 2.301 11.625 2.301L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".716">
-      <path d="M14.552 11.293" opacity="1"/>
-    </g>
-    <g mask="url(#r)" opacity=".943">
-      <path d="M12.694 15.932c3.28 -2.043 4.28 -6.358 2.237 -9.636C12.888 3.016 8.575 2.015 5.296 4.058A6.997 6.997 0 0 0 2 10.132a6.954 6.954 0 0 0 2.143 4.91 1 1 0 1 0 1.387 -1.44 5.02 5.02 0 1 1 5.554 0.909" opacity="1"/>
-    </g>
-    <g mask="url(#s)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#t)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="90">
-    <defs>
-      <mask id="x" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="w" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="u" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="v" mask-type="alpha">
-        <g filter="url(#u)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-7.003 5.314S3.06 9.09 3.165 8.75C3.269 8.41 11.689 2.164 11.689 2.164L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".19">
-      <path d="M14.13 12.487" opacity="1"/>
-    </g>
-    <g mask="url(#v)" opacity=".749">
-      <path d="M10.175 16.888c3.809 -0.65 6.368 -4.265 5.717 -8.073C15.242 5.007 11.628 2.447 7.819 3.098A6.997 6.997 0 0 0 2.472 7.474a6.954 6.954 0 0 0 0.125 5.356 1 1 0 1 0 1.829 -0.808 5.02 5.02 0 1 1 4.797 2.943" opacity="1"/>
-    </g>
-    <g mask="url(#w)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#x)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="108">
-    <defs>
-      <mask id="B" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="A" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.083 1.705) scale(.63042)"/>
-      </mask>
-      <filter id="y" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="z" mask-type="alpha">
-        <g filter="url(#y)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625l-9.176 10.816S1.365 9.495 1.522 8.985c0.157 -0.51 10.23 -6.959 10.23 -6.959L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity=".003">
-      <path fill-opacity="1" d="M13.455 13.557" opacity="1"/>
-    </g>
-    <g mask="url(#z)" opacity=".485">
-      <path d="M7.482 16.821c3.771 0.839 7.508 -1.54 8.346 -5.31C16.667 7.739 14.29 4.003 10.518 3.164A6.997 6.997 0 0 0 3.913 5.192a6.954 6.954 0 0 0 -1.91 5.005 1 1 0 1 0 1.999 -0.056A5.02 5.02 0 1 1 7.33 14.68" opacity="1"/>
-    </g>
-    <g mask="url(#A)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#B)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="126">
-    <defs>
-      <mask id="F" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="E" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.144 1.705) scale(1.01976)"/>
-      </mask>
-      <filter id="C" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="D" mask-type="alpha">
-        <g filter="url(#C)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625l-12.412 8.693S-0.33 9.9 -0.12 9.22C0.09 8.54 11.816 1.89 11.816 1.89L-1.062 -7.626z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M12.56 14.453" opacity="1"/>
-    </g>
-    <g mask="url(#D)" opacity=".256">
-      <path fill-opacity="1" d="M5.014 15.74c3.174 2.203 7.532 1.415 9.735 -1.758C16.952 10.808 16.166 6.45 12.992 4.247A6.997 6.997 0 0 0 6.11 3.624 6.954 6.954 0 0 0 2.448 7.535 1 1 0 1 0 4.32 8.24a5.02 5.02 0 1 1 1.363 5.46" opacity="1"/>
-    </g>
-    <g mask="url(#E)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#F)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="144">
-    <defs>
-      <mask id="J" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="I" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.31 1.705) scale(2.08788)"/>
-      </mask>
-      <filter id="G" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="H" mask-type="alpha">
-        <g filter="url(#G)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625l-15.647 6.57s14.684 11.36 14.946 10.51C-1.501 8.605 11.879 1.752 11.879 1.752L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M11.49 15.128" opacity="1"/>
-    </g>
-    <g mask="url(#H)" opacity=".104">
-      <path fill-opacity="1" d="M3.139 13.805c2.104 3.24 6.437 4.16 9.676 2.056 3.24 -2.104 4.161 -6.436 2.057 -9.676A6.997 6.997 0 0 0 8.737 3.005 6.954 6.954 0 0 0 3.867 5.24 1 1 0 1 0 5.333 6.6 5.02 5.02 0 1 1 4.53 12.17" opacity="1"/>
-    </g>
-    <g mask="url(#I)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#J)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="162">
-    <defs>
-      <mask id="N" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="M" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.556 1.705) scale(3.66295)"/>
-      </mask>
-      <filter id="K" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="L" mask-type="alpha">
-        <g filter="url(#K)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625l-16.992 2.574s14.041 16.217 14.355 15.197C-3.385 9.126 11.942 1.615 11.942 1.615l-13.004 -9.24z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M10.297 15.551" opacity="1"/>
-    </g>
-    <g mask="url(#L)" opacity=".023">
-      <path fill-opacity="1" d="M2.135 11.305c0.722 3.795 4.384 6.286 8.179 5.563 3.796 -0.721 6.287 -4.383 5.565 -8.178A6.997 6.997 0 0 0 11.403 3.425 6.954 6.954 0 0 0 6.05 3.652a1 1 0 1 0 0.843 1.813A5.02 5.02 0 1 1 4.04 10.317" opacity="1"/>
-    </g>
-    <g mask="url(#M)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#N)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="180">
-    <defs>
-      <mask id="R" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="Q" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.728 1.705) scale(4.76569)"/>
-      </mask>
-      <filter id="O" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="P" mask-type="alpha">
-        <g filter="url(#O)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625l-15.87 5.508S0.623 10.795 0.99 9.605C1.356 8.415 12.005 1.478 12.005 1.478L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#P)" opacity="0">
-      <path fill-opacity="1" d="M2.152 8.61c-0.768 3.787 1.68 7.478 5.466 8.245 3.786 0.768 7.478 -1.679 8.245 -5.465A6.997 6.997 0 0 0 13.712 4.823 6.954 6.954 0 0 0 8.672 3.007a1 1 0 1 0 0.094 1.997A5.02 5.02 0 1 1 4.29 8.417" opacity="1"/>
-    </g>
-    <g mask="url(#Q)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#R)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="198">
-    <defs>
-      <mask id="V" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="U" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.842 1.705) scale(5.49114)"/>
-      </mask>
-      <filter id="S" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="T" mask-type="alpha">
-        <g filter="url(#S)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-15.81 0.818S5.26 10.425 5.679 9.064c0.418 -1.36 6.39 -7.724 6.39 -7.724L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#T)" opacity="0">
-      <path fill-opacity="1" d="M3.186 6.123c-2.143 3.214 -1.273 7.557 1.941 9.7 3.215 2.143 7.557 1.275 9.7 -1.94A6.997 6.997 0 0 0 15.32 6.991 6.954 6.954 0 0 0 11.341 3.403a1 1 0 1 0 -0.669 1.885A5.02 5.02 0 1 1 5.238 6.752" opacity="1"/>
-    </g>
-    <g mask="url(#U)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#V)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="216">
-    <defs>
-      <mask id="Z" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54158)"/>
-      </mask>
-      <mask id="Y" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.922 1.705) scale(6.00555)"/>
-      </mask>
-      <filter id="W" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="X" mask-type="alpha">
-        <g filter="url(#W)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#X)" opacity="0">
-      <path fill-opacity="1" d="M5.086 4.211c-3.2 2.165 -4.039 6.514 -1.874 9.713 2.165 3.2 6.513 4.04 9.713 1.875A6.997 6.997 0 0 0 15.99 9.605 6.954 6.954 0 0 0 13.663 4.78a1 1 0 1 0 -1.332 1.49A5.02 5.02 0 1 1 6.747 5.57" opacity="1"/>
-    </g>
-    <g mask="url(#Y)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#Z)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="234">
-    <defs>
-      <mask id="ad" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.22 18.622) scale(.64234)"/>
-      </mask>
-      <mask id="ac" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.982 1.705) scale(6.38828)"/>
-      </mask>
-      <filter id="aa" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="ab" mask-type="alpha">
-        <g filter="url(#aa)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#ab)" opacity="0">
-      <path fill-opacity="1" d="M7.567 3.16C3.785 3.955 1.364 7.664 2.157 11.444c0.794 3.781 4.501 6.203 8.282 5.41a6.997 6.997 0 0 0 5.18 -4.574A6.954 6.954 0 0 0 15.292 6.931a1 1 0 1 0 -1.797 0.877A5.02 5.02 0 1 1 8.59 5.048" opacity="1"/>
-    </g>
-    <g mask="url(#ac)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#ad)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="252">
-    <defs>
-      <mask id="ah" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.285 18.622) scale(1.0575)"/>
-      </mask>
-      <mask id="ag" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.027 1.705) scale(6.68062)"/>
-      </mask>
-      <filter id="ae" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="af" mask-type="alpha">
-        <g filter="url(#ae)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#af)" opacity="0">
-      <path fill-opacity="1" d="M7.36 3.207C3.603 4.115 1.295 7.896 2.204 11.65c0.907 3.756 4.687 6.064 8.442 5.156a6.997 6.997 0 0 0 5.038 -4.73 6.954 6.954 0 0 0 -0.49 -5.335 1 1 0 1 0 -1.77 0.93A5.02 5.02 0 1 1 8.44 5.062" opacity="1"/>
-    </g>
-    <g mask="url(#ag)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#ah)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="270">
-    <defs>
-      <mask id="al" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.46 18.622) scale(2.17657)"/>
-      </mask>
-      <mask id="ak" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.062 1.705) scale(6.90661)"/>
-      </mask>
-      <filter id="ai" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aj" mask-type="alpha">
-        <g filter="url(#ai)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#aj)" opacity="0">
-      <path fill-opacity="1" d="M7.153 3.26C3.427 4.283 1.236 8.132 2.258 11.857c1.022 3.726 4.87 5.918 8.595 4.897a6.997 6.997 0 0 0 4.892 -4.88A6.954 6.954 0 0 0 15.094 6.553a1 1 0 1 0 -1.74 0.984A5.02 5.02 0 1 1 8.29 5.082" opacity="1"/>
-    </g>
-    <g mask="url(#ak)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#al)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="288">
-    <defs>
-      <mask id="ap" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.704 18.622) scale(3.74067)"/>
-      </mask>
-      <mask id="ao" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.09 1.705) scale(7.08151)"/>
-      </mask>
-      <filter id="am" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="an" mask-type="alpha">
-        <g filter="url(#am)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#an)" opacity="0">
-      <path fill-opacity="1" d="M6.95 3.32C3.255 4.454 1.182 8.368 2.316 12.06c1.135 3.694 5.048 5.768 8.741 4.633a6.997 6.997 0 0 0 4.74 -5.027A6.954 6.954 0 0 0 14.987 6.37a1 1 0 1 0 -1.71 1.037A5.02 5.02 0 1 1 8.14 5.105" opacity="1"/>
-    </g>
-    <g mask="url(#ao)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#ap)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="306">
-    <defs>
-      <mask id="at" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.871 18.622) scale(4.81527)"/>
-      </mask>
-      <mask id="as" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.11 1.705) scale(7.21565)"/>
-      </mask>
-      <filter id="aq" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="ar" mask-type="alpha">
-        <g filter="url(#aq)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#ar)" opacity="0">
-      <path fill-opacity="1" d="M6.747 3.385C3.09 4.632 1.137 8.607 2.383 12.263c1.247 3.657 5.22 5.61 8.878 4.365a6.997 6.997 0 0 0 4.585 -5.17A6.954 6.954 0 0 0 14.873 6.19a1 1 0 1 0 -1.678 1.088A5.02 5.02 0 1 1 7.992 5.134" opacity="1"/>
-    </g>
-    <g mask="url(#as)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#at)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="324">
-    <defs>
-      <mask id="ax" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.982 18.622) scale(5.52532)"/>
-      </mask>
-      <mask id="aw" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.126 1.705) scale(7.31635)"/>
-      </mask>
-      <filter id="au" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="av" mask-type="alpha">
-        <g filter="url(#au)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#av)" opacity="0">
-      <path fill-opacity="1" d="M6.547 3.457c-3.618 1.357 -5.45 5.39 -4.092 9.006 1.357 3.618 5.389 5.45 9.006 4.093a6.997 6.997 0 0 0 4.427 -5.306A6.954 6.954 0 0 0 14.754 6.013 1 1 0 1 0 13.11 7.152 5.02 5.02 0 1 1 7.844 5.167" opacity="1"/>
-    </g>
-    <g mask="url(#aw)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#ax)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="342">
-    <defs>
-      <mask id="aB" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.06 18.622) scale(6.03058)"/>
-      </mask>
-      <mask id="aA" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.138 1.705) scale(7.38904)"/>
-      </mask>
-      <filter id="ay" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="az" mask-type="alpha">
-        <g filter="url(#ay)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#az)" opacity="0">
-      <path fill-opacity="1" d="M6.349 3.535C2.774 5 1.067 9.088 2.533 12.66 4 16.236 8.085 17.944 11.66 16.478a6.997 6.997 0 0 0 4.262 -5.439A6.954 6.954 0 0 0 14.63 5.84a1 1 0 1 0 -1.608 1.188A5.02 5.02 0 1 1 7.698 5.204" opacity="1"/>
-    </g>
-    <g mask="url(#aA)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aB)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="360">
-    <defs>
-      <mask id="aF" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.12 18.622) scale(6.40725)"/>
-      </mask>
-      <mask id="aE" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.145 1.705) scale(7.43784)"/>
-      </mask>
-      <filter id="aC" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aD" mask-type="alpha">
-        <g filter="url(#aC)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#aD)" opacity="0">
-      <path fill-opacity="1" d="M6.153 3.618C2.625 5.193 1.043 9.33 2.617 12.857c1.575 3.528 5.71 5.111 9.238 3.537a6.997 6.997 0 0 0 4.096 -5.566A6.954 6.954 0 0 0 14.5 5.671a1 1 0 1 0 -1.57 1.237A5.02 5.02 0 1 1 7.553 5.246" opacity="1"/>
-    </g>
-    <g mask="url(#aE)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aF)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="378">
-    <defs>
-      <mask id="aJ" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.164 18.622) scale(6.69524)"/>
-      </mask>
-      <mask id="aI" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.15 1.705) scale(7.46598)"/>
-      </mask>
-      <filter id="aG" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aH" mask-type="alpha">
-        <g filter="url(#aG)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#aH)" opacity="0">
-      <path fill-opacity="1" d="M5.96 3.708C2.482 5.389 1.026 9.572 2.707 13.05c1.681 3.478 5.863 4.935 9.342 3.254a6.997 6.997 0 0 0 3.924 -5.687A6.954 6.954 0 0 0 14.367 5.505 1 1 0 1 0 12.834 6.79 5.02 5.02 0 1 1 7.409 5.292" opacity="1"/>
-    </g>
-    <g mask="url(#aI)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aJ)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="396">
-    <defs>
-      <mask id="aN" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.2 18.622) scale(6.91795)"/>
-      </mask>
-      <mask id="aM" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.151 1.705) scale(7.47602)"/>
-      </mask>
-      <filter id="aK" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aL" mask-type="alpha">
-        <g filter="url(#aK)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#aL)" opacity="0">
-      <path fill-opacity="1" d="M5.77 3.803C2.345 5.59 1.016 9.815 2.803 13.24c1.786 3.425 6.01 4.755 9.436 2.968a6.997 6.997 0 0 0 3.75 -5.804 6.954 6.954 0 0 0 -1.761 -5.06 1 1 0 1 0 -1.493 1.33A5.02 5.02 0 1 1 7.266 5.344" opacity="1"/>
-    </g>
-    <g mask="url(#aM)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aN)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="414">
-    <defs>
-      <mask id="aR" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.226 18.622) scale(7.09027)"/>
-      </mask>
-      <mask id="aQ" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
-      </mask>
-      <filter id="aO" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aP" mask-type="alpha">
-        <g filter="url(#aO)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#aP)" opacity="0">
-      <path fill-opacity="1" d="M5.583 3.904c-3.37 1.89 -4.569 6.154 -2.679 9.523 1.89 3.37 6.152 4.57 9.522 2.68a6.997 6.997 0 0 0 3.571 -5.916A6.954 6.954 0 0 0 14.083 5.187a1 1 0 1 0 -1.452 1.375A5.02 5.02 0 1 1 7.125 5.398" opacity="1"/>
-    </g>
-    <g mask="url(#aQ)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aR)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="432">
-    <defs>
-      <mask id="aV" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.247 18.622) scale(7.2223)"/>
-      </mask>
-      <mask id="aU" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
-      </mask>
-      <filter id="aS" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aT" mask-type="alpha">
-        <g filter="url(#aS)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#aT)" opacity="0">
-      <path fill-opacity="1" d="M5.4 4.011c-3.311 1.991 -4.38 6.29 -2.389 9.6 1.991 3.31 6.289 4.38 9.6 2.389A6.997 6.997 0 0 0 16 9.978 6.954 6.954 0 0 0 13.935 5.035a1 1 0 1 0 -1.41 1.418A5.02 5.02 0 1 1 6.985 5.457" opacity="1"/>
-    </g>
-    <g mask="url(#aU)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aV)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="450">
-    <defs>
-      <mask id="aZ" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.262 18.622) scale(7.32127)"/>
-      </mask>
-      <mask id="aY" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
-      </mask>
-      <filter id="aW" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="aX" mask-type="alpha">
-        <g filter="url(#aW)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <g opacity="0">
-      <path fill-opacity="1" d="M9.978 15.616" opacity="1"/>
-    </g>
-    <g mask="url(#aX)" opacity="0">
-      <path fill-opacity="1" d="M5.219 4.123C1.97 6.214 1.033 10.543 3.124 13.791c2.09 3.249 6.419 4.187 9.667 2.096a6.997 6.997 0 0 0 3.205 -6.122A6.954 6.954 0 0 0 13.781 4.887a1 1 0 1 0 -1.366 1.46A5.02 5.02 0 1 1 6.849 5.52" opacity="1"/>
-    </g>
-    <g mask="url(#aY)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#aZ)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-  <svg x="468">
-    <defs>
-      <mask id="bd" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.204 18.622) scale(.54135)"/>
-      </mask>
-      <mask id="bc" mask-type="alpha">
-        <path d="M0 -2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1 -2.906 0 2.907 2.907 0 0 1 0 -2.906z" transform="translate(.07 1.705) scale(.54135)"/>
-      </mask>
-      <filter id="ba" width="100%" height="100%" x="0%" y="0%" filterUnits="objectBoundingBox">
-        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
-      </filter>
-      <mask id="bb" mask-type="alpha">
-        <g filter="url(#ba)">
-          <path fill="#fff" d="M0 0h18v20H0z" opacity="0"/>
-          <path d="M-1.062 -7.625L-14.689 3.751s24.583 6.303 25.054 4.773c0.471 -1.53 1.767 -7.321 1.767 -7.321L-1.062 -7.625z" display="none" transform="translate(9.425 14.172) scale(.54135)"/>
-        </g>
-      </mask>
-    </defs>
-    <path d="M13.549 8H11a1 1 0 0 0 0 2h5a1 1 0 0 0 1 -1V4a1 1 0 0 0 -2 0v2.418"/>
-    <g mask="url(#bb)">
-      <path d="M15 6.418C13.019 3.101 8.724 2.019 5.408 4c-3.317 1.981 -4.4 6.275 -2.419 9.592A6.997 6.997 0 0 0 9 17a6.954 6.954 0 0 0 4.95 -2.05 1 1 0 1 0 -1.414 -1.414A5.02 5.02 0 1 1 13.549 8"/>
-    </g>
-    <g mask="url(#bc)">
-      <path d="M9 11.413l5.293 5.293a0.999 0.999 0 0 0 1.414 -0.024 1.001 1.001 0 0 0 0 -1.39L10.414 9.999"/>
-      <path d="M10.973 10.558L3.707 3.293A1 1 0 0 0 2.293 3.317a1.001 1.001 0 0 0 0 1.39l7.266 7.265"/>
-    </g>
-    <g mask="url(#bd)">
-      <path d="M9.285 8.301l-6.992 6.992a1 1 0 0 0 -0.025 1.414 1 1 0 0 0 1.439 0l6.992 -6.992"/>
-      <path d="M10.413 10l5.293 -5.293A0.999 0.999 0 0 0 15.682 3.293a1.001 1.001 0 0 0 -1.39 0L8.999 8.586"/>
-    </g>
-  </svg>
-</svg>
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="468" height="20" fill="context-fill">
+  <path d="M13.55 8H11a1 1 0 0 0 0 2h5a1 1 0 0 0 1-1V4a1 1 0 0 0-2 0v2.418"/>
+  <path d="M15 6.418C13.02 3.1 8.724 2.018 5.408 4c-3.317 1.98-4.4 6.275-2.42 9.592A6.997 6.997 0 0 0 9 17a6.954 6.954 0 0 0 4.95-2.05 1 1 0 1 0-1.414-1.414A5.02 5.02 0 1 1 13.55 8"/>
+  <svg x="18">
+    <path d="M13.735 8.606l-1.72-.78a.74.74 0 0 0-.61 1.35l3.37 1.53a.74.74 0 0 0 .98-.37l1.532-3.372a.74.74 0 0 0-1.35-.612l-.74 1.63"/>
+    <path d="M15.91 8.954c-.58-3.82-4.146-6.446-7.965-5.867-3.82.58-6.447 4.144-5.868 7.964a6.997 6.997 0 0 0 4.275 5.43 6.954 6.954 0 0 0 5.357-.025 1 1 0 1 0-.775-1.844 5.02 5.02 0 1 1 3.032-4.74"/>
+  </svg>
+  <svg x="36">
+    <path d="M14.088 9.318l-.89-.845a.482.482 0 0 0-.663.7l1.747 1.656a.482.482 0 0 0 .68-.02l1.657-1.746a.482.482 0 0 0-.7-.662l-.8.844"/>
+    <path d="M15.79 11.646c.91-3.755-1.397-7.536-5.15-8.444-3.756-.91-7.537 1.396-8.446 5.15a6.997 6.997 0 0 0 1.903 6.644A6.954 6.954 0 0 0 9.067 17a1 1 0 1 0-.02-2 5.02 5.02 0 1 1 4.6-3.242"/>
+  </svg>
+  <svg x="54">
+    <path d="M14.43 10.23l-.315-.47a.222.222 0 0 0-.37.247l.618.923a.222.222 0 0 0 .308.062l.925-.618a.222.222 0 0 0-.247-.37l-.447.3"/>
+    <path d="M14.664 14.093c2.262-3.132 1.556-7.504-1.575-9.766C9.956 2.065 5.584 2.77 3.322 5.9a6.997 6.997 0 0 0-.752 6.87 6.954 6.954 0 0 0 3.843 3.735 1 1 0 1 0 .74-1.858 5.02 5.02 0 1 1 5.485-1.26"/>
+  </svg>
+  <svg x="72">
+    <defs>
+      <filter id="a">
+        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="b" mask-type="alpha" fill="#fff">
+        <g filter="url(#a)">
+          <path d="M0 0h18v20H0z" opacity="0"/>
+          <path d="M8.85 10.044l-1.465 8.154s4.614.676 4.642.584c.03-.092 3.69-3.364 3.69-3.364L8.85 10.044z"/>
+        </g>
+      </mask>
+    </defs>
+    <path d="M12.694 15.932c3.28-2.043 4.28-6.358 2.237-9.636-2.042-3.28-6.355-4.28-9.634-2.238A6.997 6.997 0 0 0 2 10.132a6.954 6.954 0 0 0 2.144 4.91 1 1 0 1 0 1.387-1.44 5.02 5.02 0 1 1 5.555.91" mask="url(#b)" opacity=".943"/>
+  </svg>
+  <svg x="90">
+    <defs>
+      <filter id="c">
+        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="d" mask-type="alpha" fill="#fff">
+        <g filter="url(#c)">
+          <path d="M0 0h18v20H0z" opacity="0"/>
+          <path d="M8.85 10.044L5.634 17.05s5.448 2.043 5.504 1.86c.057-.185 4.615-3.567 4.615-3.567l-6.903-5.3z"/>
+        </g>
+      </mask>
+    </defs>
+    <path d="M10.175 16.888c3.81-.65 6.368-4.265 5.717-8.073-.65-3.808-4.264-6.368-8.073-5.717A6.997 6.997 0 0 0 2.47 7.474a6.954 6.954 0 0 0 .125 5.356 1 1 0 1 0 1.83-.808 5.02 5.02 0 1 1 4.796 2.943" mask="url(#d)" opacity=".749"/>
+  </svg>
+  <svg x="108">
+    <defs>
+      <filter id="e">
+        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="f" mask-type="alpha" fill="#fff">
+        <g filter="url(#e)">
+          <path d="M0 0h18v20H0z" opacity="0"/>
+          <path d="M8.85 10.044L3.883 15.9s6.28 3.412 6.366 3.136c.084-.276 5.537-3.767 5.537-3.767L8.85 10.043z"/>
+        </g>
+      </mask>
+    </defs>
+    <path d="M7.482 16.82c3.77.84 7.508-1.54 8.346-5.31.84-3.77-1.538-7.507-5.31-8.346a6.997 6.997 0 0 0-6.605 2.028 6.954 6.954 0 0 0-1.91 5.005 1 1 0 1 0 2-.056 5.02 5.02 0 1 1 3.327 4.54" mask="url(#f)" opacity=".485"/>
+  </svg>
+  <svg x="126">
+    <defs>
+      <filter id="g">
+        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="h" mask-type="alpha" fill="#fff">
+        <g filter="url(#g)">
+          <path d="M0 0h18v20H0z" opacity="0"/>
+          <path d="M8.85 10.044L2.13 14.75s7.116 4.78 7.23 4.413c.113-.368 6.462-3.968 6.462-3.968l-6.972-5.15z"/>
+        </g>
+      </mask>
+    </defs>
+    <path d="M5.014 15.74c3.174 2.203 7.532 1.415 9.735-1.758 2.202-3.174 1.416-7.532-1.758-9.735a6.997 6.997 0 0 0-6.882-.623 6.954 6.954 0 0 0-3.662 3.91 1 1 0 1 0 1.872.705 5.02 5.02 0 1 1 1.363 5.46" mask="url(#h)" opacity=".256"/>
+  </svg>
+  <svg x="144">
+    <defs>
+      <mask id="k" mask-type="alpha" fill="#fff">
+        <path d="M.31-4.362a6.07 6.07 0 0 1 6.067 6.067A6.07 6.07 0 0 1 .31 7.772a6.07 6.07 0 0 1-6.067-6.067A6.07 6.07 0 0 1 .31-4.362z"/>
+      </mask>
+      <filter id="i">
+        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="j" mask-type="alpha" fill="#fff">
+        <g filter="url(#i)">
+          <path d="M0 0h18v20H0z" opacity="0"/>
+          <path d="M8.85 10.044L.38 13.6s7.95 6.15 8.09 5.69c.142-.46 7.386-4.17 7.386-4.17L8.85 10.044z"/>
+        </g>
+      </mask>
+    </defs>
+    <path d="M3.14 13.805c2.103 3.24 6.436 4.16 9.675 2.056 3.24-2.103 4.16-6.435 2.057-9.675a6.997 6.997 0 0 0-6.135-3.18 6.954 6.954 0 0 0-4.87 2.235A1 1 0 1 0 5.333 6.6a5.02 5.02 0 1 1-.804 5.57" mask="url(#j)" opacity=".104"/>
+    <g mask="url(#k)">
+      <path d="M8.12 10.527l6.173 6.18a1 1 0 0 0 1.414-.025 1 1 0 0 0 0-1.39l-6.173-6.18"/>
+      <path d="M9.706 9.268l-6-5.975a1 1 0 0 0-1.413.024 1 1 0 0 0 0 1.39l6 5.975"/>
+    </g>
+  </svg>
+  <svg x="162">
+    <defs>
+      <mask id="n" mask-type="alpha" fill="#fff">
+        <path d="M.556-8.94A10.648 10.648 0 0 1 11.2 1.705 10.648 10.648 0 0 1 .557 12.35 10.648 10.648 0 0 1-10.09 1.705 10.648 10.648 0 0 1 .557-8.94z"/>
+      </mask>
+      <filter id="l">
+        <feColorMatrix color-interpolation-filters="sRGB" type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="m" mask-type="alpha" fill="#fff">
+        <g filter="url(#l)">
+          <path d="M0 0h18v20H0z" opacity="0"/>
+          <path d="M8.85 10.044l-9.2 1.394s7.603 8.78 7.773 8.227c.17-.553 8.467-4.62 8.467-4.62l-7.04-5z"/>
+        </g>
+      </mask>
+    </defs>
+    <path d="M2.135 11.305c.722 3.795 4.384 6.286 8.18 5.563 3.795-.72 6.286-4.383 5.564-8.178a6.997 6.997 0 0 0-4.477-5.265 6.954 6.954 0 0 0-5.353.227 1 1 0 1 0 .843 1.813 5.02 5.02 0 1 1-2.852 4.852" mask="url(#m)" opacity=".023"/>
+    <path d="M9.706 9.268l-6-5.975a1 1 0 0 0-1.413.024 1 1 0 0 0 0 1.39l6 5.975" mask="url(#n)"/>
+  </svg>
+  <svg x="180">
+    <defs>
+      <mask id="o" mask-type="alpha" fill="#fff">
+        <path d="M.728-12.144a13.854 13.854 0 0 1 13.85 13.85A13.854 13.854 0 0 1 .727 15.553a13.854 13.854 0 0 1-13.85-13.85A13.854 13.854 0 0 1 .73-12.143z"/>
+      </mask>
+    </defs>
+    <g mask="url(#o)">
+      <path d="M8.12 10.527l6.173 6.18a1 1 0 0 0 1.414-.025 1 1 0 0 0 0-1.39l-6.173-6.18"/>
+      <path d="M9.706 9.268l-6-5.975a1 1 0 0 0-1.413.024 1 1 0 0 0 0 1.39l6 5.975"/>
+    </g>
+  </svg>
+  <svg x="198">
+    <defs>
+      <mask id="p" mask-type="alpha" fill="#fff">
+        <path d="M.842-14.252A15.963 15.963 0 0 1 16.8 1.705 15.963 15.963 0 0 1 .84 17.662 15.963 15.963 0 0 1-15.115 1.705 15.963 15.963 0 0 1 .842-14.252z"/>
+      </mask>
+    </defs>
+    <g mask="url(#p)">
+      <path d="M8.12 10.527l6.173 6.18a1 1 0 0 0 1.414-.025 1 1 0 0 0 0-1.39l-6.173-6.18"/>
+      <path d="M9.706 9.268l-6-5.975a1 1 0 0 0-1.413.024 1 1 0 0 0 0 1.39l6 5.975"/>
+    </g>
+  </svg>
+  <svg x="216">
+    <defs>
+      <mask id="q" mask-type="alpha" fill="#fff">
+        <path d="M.922-15.747A17.458 17.458 0 0 1 18.374 1.705 17.458 17.458 0 0 1 .922 19.157 17.458 17.458 0 0 1-16.53 1.705 17.458 17.458 0 0 1 .922-15.747z"/>
+      </mask>
+    </defs>
+    <g mask="url(#q)">
+      <path d="M8.12 10.527l6.173 6.18a1 1 0 0 0 1.414-.025 1 1 0 0 0 0-1.39l-6.173-6.18"/>
+      <path d="M9.706 9.268l-6-5.975a1 1 0 0 0-1.413.024 1 1 0 0 0 0 1.39l6 5.975"/>
+    </g>
+  </svg>
+  <svg x="234">
+    <defs>
+      <mask id="r" mask-type="alpha" fill="#fff">
+        <path d="M.982-16.86A18.57 18.57 0 0 1 19.546 1.706 18.57 18.57 0 0 1 .982 20.27 18.57 18.57 0 0 1-17.582 1.704 18.57 18.57 0 0 1 .982-16.86z"/>
+      </mask>
+    </defs>
+    <g mask="url(#r)">
+      <path d="M8.12 10.527l6.173 6.18a1 1 0 0 0 1.414-.025 1 1 0 0 0 0-1.39l-6.173-6.18"/>
+      <path d="M9.706 9.268l-6-5.975a1 1 0 0 0-1.413.024 1 1 0 0 0 0 1.39l6 5.975"/>
+    </g>
+  </svg>
+  <svg x="252">
+    <defs>
+      <mask id="s" mask-type="alpha" fill="#fff">
+        <path d="M1.027-17.71A19.42 19.42 0 0 1 20.44 1.706 19.42 19.42 0 0 1 1.028 21.12 19.42 19.42 0 0 1-18.387 1.704 19.42 19.42 0 0 1 1.027-17.71z"/>
+      </mask>
+    </defs>
+    <g mask="url(#s)">
+      <path d="M8.12 10.527l6.173 6.18a1 1 0 0 0 1.414-.025 1 1 0 0 0 0-1.39l-6.173-6.18"/>
+      <path d="M9.706 9.268l-6-5.975a1 1 0 0 0-1.413.024 1 1 0 0 0 0 1.39l6 5.975"/>
+    </g>
+  </svg>
+  <svg x="270">
+    <defs>
+      <mask id="u" mask-type="alpha" fill="#fff">
+        <path d="M.46 12.297a6.327 6.327 0 0 1 6.325 6.325A6.327 6.327 0 0 1 .46 24.947a6.327 6.327 0 0 1-6.325-6.325A6.327 6.327 0 0 1 .46 12.297z"/>
+      </mask>
+      <mask id="t" mask-type="alpha" fill="#fff">
+        <path d="M1.062-18.366a20.077 20.077 0 0 1 20.07 20.07 20.077 20.077 0 0 1-20.07 20.072 20.077 20.077 0 0 1-20.07-20.07A20.077 20.077 0 0 1 1.06-18.367z"/>
+      </mask>
+    </defs>
+    <g mask="url(#t)">
+      <path d="M8.12 10.527l6.173 6.18a1 1 0 0 0 1.414-.025 1 1 0 0 0 0-1.39l-6.173-6.18"/>
+      <path d="M9.706 9.268l-6-5.975a1 1 0 0 0-1.413.024 1 1 0 0 0 0 1.39l6 5.975"/>
+    </g>
+    <path d="M7.71 9.883l-5.417 5.41a1 1 0 0 0-.025 1.414 1 1 0 0 0 1.44 0l5.417-5.41m1.2-1.152l5.38-5.438a1 1 0 0 0-.023-1.414 1 1 0 0 0-1.39 0L8.912 8.73" mask="url(#u)"/>
+  </svg>
+  <svg x="288">
+    <defs>
+      <mask id="w" mask-type="alpha" fill="#fff">
+        <path d="M.704 7.752a10.874 10.874 0 0 1 10.87 10.87 10.874 10.874 0 0 1-10.87 10.87 10.874 10.874 0 0 1-10.87-10.87A10.874 10.874 0 0 1 .704 7.752z"/>
+      </mask>
+      <mask id="v" mask-type="alpha" fill="#fff">
+        <path d="M1.09-18.874a20.586 20.586 0 0 1 20.58 20.58A20.586 20.586 0 0 1 1.09 22.283a20.586 20.586 0 0 1-20.58-20.58A20.586 20.586 0 0 1 1.09-18.873z"/>
+      </mask>
+    </defs>
+    <g mask="url(#v)">
+      <path d="M8.12 10.527l6.173 6.18a1 1 0 0 0 1.414-.025 1 1 0 0 0 0-1.39l-6.173-6.18"/>
+      <path d="M9.706 9.268l-6-5.975a1 1 0 0 0-1.413.024 1 1 0 0 0 0 1.39l6 5.975"/>
+    </g>
+    <path d="M7.71 9.883l-5.417 5.41a1 1 0 0 0-.025 1.414 1 1 0 0 0 1.44 0l5.417-5.41m1.2-1.152l5.38-5.438a1 1 0 0 0-.023-1.414 1 1 0 0 0-1.39 0L8.912 8.73" mask="url(#w)"/>
+  </svg>
+  <svg x="306">
+    <defs>
+      <mask id="y" mask-type="alpha" fill="#fff">
+        <path d="M.87 4.63A13.998 13.998 0 0 1 14.865 18.62 13.998 13.998 0 0 1 .87 32.615 13.998 13.998 0 0 1-13.12 18.622 13.998 13.998 0 0 1 .87 4.63z"/>
+      </mask>
+      <mask id="x" mask-type="alpha" fill="#fff">
+        <path d="M1.11-19.264a20.976 20.976 0 0 1 20.97 20.97A20.976 20.976 0 0 1 1.11 22.673a20.976 20.976 0 0 1-20.97-20.97A20.976 20.976 0 0 1 1.11-19.263z"/>
+      </mask>
+    </defs>
+    <g mask="url(#x)">
+      <path d="M8.12 10.527l6.173 6.18a1 1 0 0 0 1.414-.025 1 1 0 0 0 0-1.39l-6.173-6.18"/>
+      <path d="M9.706 9.268l-6-5.975a1 1 0 0 0-1.413.024 1 1 0 0 0 0 1.39l6 5.975"/>
+    </g>
+    <path d="M7.71 9.883l-5.417 5.41a1 1 0 0 0-.025 1.414 1 1 0 0 0 1.44 0l5.417-5.41m1.2-1.152l5.38-5.438a1 1 0 0 0-.023-1.414 1 1 0 0 0-1.39 0L8.912 8.73" mask="url(#y)"/>
+  </svg>
+  <svg x="324">
+    <defs>
+      <mask id="z" mask-type="alpha" fill="#fff">
+        <path d="M.982 2.565A16.062 16.062 0 0 1 17.04 18.622 16.062 16.062 0 0 1 .98 34.68 16.062 16.062 0 0 1-15.075 18.62 16.062 16.062 0 0 1 .982 2.565z"/>
+      </mask>
+    </defs>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#z)"/>
+  </svg>
+  <svg x="342">
+    <defs>
+      <mask id="A" mask-type="alpha" fill="#fff">
+        <path d="M1.06 1.097a17.53 17.53 0 0 1 17.525 17.525A17.53 17.53 0 0 1 1.06 36.147a17.53 17.53 0 0 1-17.525-17.525A17.53 17.53 0 0 1 1.06 1.097z"/>
+      </mask>
+    </defs>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#A)"/>
+  </svg>
+  <svg x="360">
+    <defs>
+      <mask id="B" mask-type="alpha" fill="#fff">
+        <path d="M1.12.003a18.626 18.626 0 0 1 18.62 18.62A18.626 18.626 0 0 1 1.12 37.24 18.626 18.626 0 0 1-17.5 18.623 18.626 18.626 0 0 1 1.12.002z"/>
+      </mask>
+    </defs>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#B)"/>
+  </svg>
+  <svg x="378">
+    <defs>
+      <mask id="C" mask-type="alpha" fill="#fff">
+        <path d="M1.164-.834A19.463 19.463 0 0 1 20.62 18.622 19.463 19.463 0 0 1 1.164 38.078a19.463 19.463 0 0 1-19.456-19.456A19.463 19.463 0 0 1 1.164-.834z"/>
+      </mask>
+    </defs>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#C)"/>
+  </svg>
+  <svg x="396">
+    <defs>
+      <mask id="D" mask-type="alpha" fill="#fff">
+        <path d="M1.2-1.482a20.11 20.11 0 0 1 20.104 20.104A20.11 20.11 0 0 1 1.2 38.726a20.11 20.11 0 0 1-20.104-20.104A20.11 20.11 0 0 1 1.2-1.482z"/>
+      </mask>
+    </defs>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#D)"/>
+  </svg>
+  <svg x="414">
+    <defs>
+      <mask id="E" mask-type="alpha" fill="#fff">
+        <path d="M1.226-1.982A20.61 20.61 0 0 1 21.83 18.622 20.61 20.61 0 0 1 1.226 39.226a20.61 20.61 0 0 1-20.604-20.604A20.61 20.61 0 0 1 1.226-1.982z"/>
+      </mask>
+    </defs>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#E)"/>
+  </svg>
+  <svg x="432">
+    <mask id="F" mask-type="alpha" fill="#fff">
+      <path d="M1.15-20.02A21.733 21.733 0 0 1 22.878 1.704 21.733 21.733 0 0 1 1.15 23.43 21.733 21.733 0 0 1-20.574 1.706 21.733 21.733 0 0 1 1.15-20.02z"/>
+    </mask>
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#F)"/>
+  </svg>
+  <svg x="450">
+    <path d="M10.414 10l5.293-5.293a1 1 0 0 0-1.414-1.414L9 8.586 3.707 3.293a1 1 0 0 0-1.414 1.414L7.586 10l-5.293 5.293a1 1 0 1 0 1.414 1.414L9 11.414l5.293 5.293a1 1 0 0 0 1.414-1.414z" mask="url(#F)"/>
+  </svg>
+</svg>
+
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -92,15 +92,8 @@ browser.jar:
 % override chrome://browser/skin/feeds/audioFeedIcon.png              chrome://browser/skin/feeds/feedIcon.png
 % override chrome://browser/skin/feeds/audioFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
 % override chrome://browser/skin/feeds/videoFeedIcon.png              chrome://browser/skin/feeds/feedIcon.png
 % override chrome://browser/skin/feeds/videoFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
 
 % override chrome://browser/skin/privatebrowsing-mask-tabstrip.png    chrome://browser/skin/privatebrowsing-mask-tabstrip-win7.png  os=WINNT osversion<=6.1
 % override chrome://browser/skin/privatebrowsing-mask-titlebar.png    chrome://browser/skin/privatebrowsing-mask-titlebar-win7.png  os=WINNT osversion<=6.1
 % override chrome://browser/skin/toolbarbutton-dropdown-arrow.png     chrome://browser/skin/toolbarbutton-dropdown-arrow-win7.png   os=WINNT osversion<=6.1
-
-% override chrome://browser/skin/tabbrowser/tab-background-start.png     chrome://browser/skin/tabbrowser/tab-background-start-preWin10.png     os=WINNT osversion<=6.3
-% override chrome://browser/skin/tabbrowser/tab-background-start@2x.png  chrome://browser/skin/tabbrowser/tab-background-start-preWin10@2x.png  os=WINNT osversion<=6.3
-% override chrome://browser/skin/tabbrowser/tab-background-middle.png    chrome://browser/skin/tabbrowser/tab-background-middle-preWin10.png    os=WINNT osversion<=6.3
-% override chrome://browser/skin/tabbrowser/tab-background-middle@2x.png chrome://browser/skin/tabbrowser/tab-background-middle-preWin10@2x.png os=WINNT osversion<=6.3
-% override chrome://browser/skin/tabbrowser/tab-background-end.png       chrome://browser/skin/tabbrowser/tab-background-end-preWin10.png       os=WINNT osversion<=6.3
-% override chrome://browser/skin/tabbrowser/tab-background-end@2x.png    chrome://browser/skin/tabbrowser/tab-background-end-preWin10@2x.png    os=WINNT osversion<=6.3
--- a/devtools/client/framework/ToolboxProcess.jsm
+++ b/devtools/client/framework/ToolboxProcess.jsm
@@ -16,16 +16,19 @@ const { XPCOMUtils } = require("resource
 
 XPCOMUtils.defineLazyModuleGetter(this, "Subprocess", "resource://gre/modules/Subprocess.jsm");
 XPCOMUtils.defineLazyGetter(this, "Telemetry", function () {
   return require("devtools/client/shared/telemetry");
 });
 XPCOMUtils.defineLazyGetter(this, "EventEmitter", function () {
   return require("devtools/shared/old-event-emitter");
 });
+XPCOMUtils.defineLazyGetter(this, "system", function () {
+  return require("devtools/shared/system");
+});
 const promise = require("promise");
 const Services = require("Services");
 
 this.EXPORTED_SYMBOLS = ["BrowserToolboxProcess"];
 
 var processes = new Set();
 
 /**
@@ -260,17 +263,17 @@ BrowserToolboxProcess.prototype = {
 
     // During local development, incremental builds can trigger the main process
     // to clear its startup cache with the "flag file" .purgecaches, but this
     // file is removed during app startup time, so we aren't able to know if it
     // was present in order to also clear the child profile's startup cache as
     // well.
     //
     // As an approximation of "isLocalBuild", check for an unofficial build.
-    if (!Services.appinfo.isOfficial) {
+    if (!system.constants.MOZILLA_OFFICIAL) {
       args.push("-purgecaches");
     }
 
     this._dbgProcessPromise = Subprocess.call({
       command,
       arguments: args,
       environmentAppend: true,
       environment: {
--- a/devtools/client/inspector/rules/test/browser.ini
+++ b/devtools/client/inspector/rules/test/browser.ini
@@ -106,17 +106,16 @@ skip-if = e10s && debug # Bug 1250058 - 
 [browser_rules_copy_styles.js]
 subsuite = clipboard
 skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
 [browser_rules_cssom.js]
 [browser_rules_cubicbezier-appears-on-swatch-click.js]
 [browser_rules_cubicbezier-commit-on-ENTER.js]
 [browser_rules_cubicbezier-revert-on-ESC.js]
 [browser_rules_custom.js]
-skip-if = stylo # Bug 1391198
 [browser_rules_cycle-angle.js]
 [browser_rules_cycle-color.js]
 [browser_rules_edit-display-grid-property.js]
 skip-if = (os == "linux") # Bug 1356214
 [browser_rules_edit-property-cancel.js]
 [browser_rules_edit-property-click.js]
 [browser_rules_edit-property-commit.js]
 [browser_rules_edit-property-computed.js]
@@ -126,17 +125,16 @@ skip-if = (os == "linux") # Bug 1356214
 [browser_rules_edit-property-remove_02.js]
 [browser_rules_edit-property-remove_03.js]
 [browser_rules_edit-property_01.js]
 [browser_rules_edit-property_02.js]
 [browser_rules_edit-property_03.js]
 [browser_rules_edit-property_04.js]
 [browser_rules_edit-property_05.js]
 [browser_rules_edit-property_06.js]
-skip-if = stylo # Bug 1391198
 [browser_rules_edit-property_07.js]
 [browser_rules_edit-property_08.js]
 [browser_rules_edit-property_09.js]
 [browser_rules_edit-selector-click.js]
 [browser_rules_edit-selector-click-on-scrollbar.js]
 skip-if = os == "mac" # Bug 1245996 : click on scrollbar not working on OSX
 [browser_rules_edit-selector-commit.js]
 [browser_rules_edit-selector_01.js]
@@ -186,17 +184,16 @@ skip-if = stylo # Bug 1394994
 skip-if = stylo # Bug 1394994
 [browser_rules_keyframeLineNumbers.js]
 skip-if = stylo # Bug 1394994
 [browser_rules_lineNumbers.js]
 [browser_rules_livepreview.js]
 [browser_rules_mark_overridden_01.js]
 [browser_rules_mark_overridden_02.js]
 [browser_rules_mark_overridden_03.js]
-skip-if = stylo # Bug 1391198
 [browser_rules_mark_overridden_04.js]
 [browser_rules_mark_overridden_05.js]
 [browser_rules_mark_overridden_06.js]
 [browser_rules_mark_overridden_07.js]
 [browser_rules_mathml-element.js]
 [browser_rules_media-queries.js]
 [browser_rules_multiple-properties-duplicates.js]
 [browser_rules_multiple-properties-priority.js]
--- a/devtools/client/styleeditor/styleeditor.xul
+++ b/devtools/client/styleeditor/styleeditor.xul
@@ -105,17 +105,16 @@
             <xul:toolbarbutton id="style-editor-options"
                         class="devtools-toolbarbutton devtools-option-toolbarbutton"
                         tooltiptext="&optionsButton.tooltip;"
                         popup="style-editor-options-popup"/>
           </xul:toolbar>
         </xul:box>
         <xul:box id="splitview-resizer-target" class="theme-sidebar splitview-nav-container"
                 persist="height">
-          <div class="devtools-throbber"></div>
           <ol class="splitview-nav" tabindex="0"></ol>
           <div class="splitview-nav placeholder empty">
             <p><strong>&noStyleSheet.label;</strong></p>
             <p>&noStyleSheet-tip-start.label;
               <a href="#"
                 class="style-editor-newButton">&noStyleSheet-tip-action.label;</a>
               &noStyleSheet-tip-end.label;</p>
           </div>
--- a/devtools/client/themes/splitview.css
+++ b/devtools/client/themes/splitview.css
@@ -7,38 +7,41 @@
   --sidemenu-selected-arrow: url(images/item-arrow-dark-ltr.svg);
   --sidemenu-selected-arrow-rtl: url(images/item-arrow-dark-rtl.svg);
 }
 .theme-light {
   --sidemenu-selected-arrow: url(images/item-arrow-ltr.svg);
   --sidemenu-selected-arrow-rtl: url(images/item-arrow-rtl.svg);
 }
 
-.splitview-nav-container .devtools-throbber {
-  display: none;
-  text-align: center;
-}
-
-.loading .splitview-nav-container .devtools-throbber {
-  display: block;
+/* Loading animation */
+@keyframes item-load {
+  0% {
+    transform: scaleY(0) translateY(-100%);
+  }
+  100% {
+    transform: none;
+  }
 }
 
 .splitview-nav {
   list-style: none;
   padding: 0;
   margin: 0;
   background-color: var(--theme-sidebar-background);
 }
 
 .splitview-nav > li {
+  animation: item-load .5s var(--animation-curve);
   padding-inline-end: 8px;
   -moz-box-align: center;
   outline: 0;
   vertical-align: bottom;
   border-bottom: 1px solid rgba(128,128,128,0.15);
+  background: inherit;
 }
 
 .placeholder {
   -moz-box-flex: 1;
   text-align: center;
 }
 
 .splitview-nav > li.splitview-active {
--- a/devtools/client/themes/variables.css
+++ b/devtools/client/themes/variables.css
@@ -238,16 +238,19 @@
   --toolbarbutton-background: rgba(110,120,130,0.1);
   --toolbarbutton-border-color: transparent;
   --toolbarbutton-hover-background: rgba(110,120,130,0.2);
   --toolbarbutton-hover-border-color: var(--toolbarbutton-border-color);
   --toolbarbutton-checked-background: var(--theme-selection-background);
   --toolbarbutton-checked-color: var(--theme-selection-color);
   --toolbarbutton-checked-border-color: var(--toolbarbutton-border-color);
 
+  /* The photon animation curve */
+  --animation-curve: cubic-bezier(.07,.95,0,1);
+
   /* Firefox Colors CSS Variables v1.0.3
    * Colors are taken from: https://github.com/FirefoxUX/design-tokens */
   --magenta-65: #dd00a9;
 
   --blue-50: #0a84ff;
   --blue-55: #0074e8;
   --blue-60: #0060df;
   --blue-70: #003eaa;
--- a/devtools/client/webconsole/local-dev/index.js
+++ b/devtools/client/webconsole/local-dev/index.js
@@ -21,16 +21,19 @@ try {
 
 EventEmitter.decorate(window);
 
 require("../../themes/widgets.css");
 require("../../themes/webconsole.css");
 require("../../themes/components-frame.css");
 require("../../themes/light-theme.css");
 require("../../shared/components/reps/reps.css");
+require("../../shared/components/tabs/tabs.css");
+require("../../shared/components/tabs/tabbar.css");
+require("../../netmonitor/src/assets/styles/netmonitor.css");
 
 pref("devtools.debugger.remote-timeout", 10000);
 pref("devtools.hud.loglimit", 10000);
 pref("devtools.webconsole.filter.error", true);
 pref("devtools.webconsole.filter.warn", true);
 pref("devtools.webconsole.filter.info", true);
 pref("devtools.webconsole.filter.log", true);
 pref("devtools.webconsole.filter.debug", true);
--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
@@ -1,12 +1,14 @@
 [DEFAULT]
 tags = devtools
 subsuite = devtools
 support-files =
+  code_bundle_invalidmap.js
+  code_bundle_invalidmap.js.map
   code_bundle_nosource.js
   code_bundle_nosource.js.map
   head.js
   test-batching.html
   test-console.html
   test-console-filters.html
   test-console-group.html
   test-console-table.html
@@ -54,14 +56,15 @@ skip-if = (os == 'linux' && bits == 32 &
 [browser_webconsole_nodes_select.js]
 [browser_webconsole_object_inspector_entries.js]
 [browser_webconsole_object_inspector.js]
 [browser_webconsole_observer_notifications.js]
 [browser_webconsole_persist.js]
 [browser_webconsole_scroll.js]
 [browser_webconsole_shows_reqs_in_netmonitor.js]
 [browser_webconsole_sourcemap_error.js]
+[browser_webconsole_sourcemap_invalid.js]
 [browser_webconsole_sourcemap_nosource.js]
 [browser_webconsole_stacktrace_location_debugger_link.js]
 [browser_webconsole_stacktrace_location_scratchpad_link.js]
 [browser_webconsole_string.js]
 [browser_webconsole_timestamps.js]
 [browser_webconsole_warn_about_replaced_api.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_invalid.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test that an invalid source map is reported.
+
+const JS_URL = URL_ROOT + "code_bundle_invalidmap.js";
+
+const PAGE_URL = `data:text/html,
+<!doctype html>
+
+<html>
+  <head>
+    <meta charset="utf-8"/>
+    <title>Empty test page to test source map with invalid source map</title>
+  </head>
+
+  <body>
+    <script src="${JS_URL}"></script>
+  </body>
+
+</html>`;
+
+add_task(function* () {
+  yield pushPref("devtools.source-map.client-service.enabled", true);
+
+  const hud = yield openNewTabAndConsole(PAGE_URL);
+
+  const node = yield waitFor(() => findMessage(hud, "Source map error"));
+  ok(node, "source map error is displayed in web console");
+});
new file mode 100644
--- /dev/null
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/code_bundle_invalidmap.js
@@ -0,0 +1,93 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, {
+/******/ 				configurable: false,
+/******/ 				enumerable: true,
+/******/ 				get: getter
+/******/ 			});
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Original source code for the cross-domain source map test.
+// The generated file was made with
+//    webpack --devtool nosources-source-map code_nosource.js code_bundle_nosource.js
+// ... and then the bundle was edited to change the source name.
+
+
+
+function f() {
+  console.log("here");
+}
+
+f();
+
+// Avoid script GC.
+window.f = f;
+
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=code_bundle_invalidmap.js.map
new file mode 100644
--- /dev/null
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/code_bundle_invalidmap.js.map
@@ -0,0 +1,1 @@
+!!!!!!!!!!!!!!!! not a source map !!!!!!!!!!!!!!!!
--- a/devtools/client/webconsole/webpack.config.js
+++ b/devtools/client/webconsole/webpack.config.js
@@ -56,58 +56,83 @@ let webpackConfig = {
   externals: [
     {
       "promise": "var Promise",
     }
   ],
 };
 
 webpackConfig.resolve = {
+  modules: [
+    // Make sure webpack is always looking for modules in
+    // `webconsole/node_modules` directory first.
+    path.resolve(__dirname, "node_modules"), "node_modules"
+  ],
   alias: {
     "Services": "devtools-modules/src/Services",
 
     "devtools/client/webconsole/jsterm": path.join(projectPath, "jsterm-stub"),
     "devtools/client/webconsole/utils": path.join(__dirname, "new-console-output/test/fixtures/WebConsoleUtils"),
     "devtools/client/webconsole/new-console-output": path.join(__dirname, "new-console-output"),
     "devtools/client/webconsole/webconsole-connection-proxy": path.join(__dirname, "webconsole-connection-proxy"),
     "devtools/client/webconsole/webconsole-l10n": path.join(__dirname, "webconsole-l10n"),
 
-    "react": path.join(__dirname, "node_modules/react"),
     "devtools/client/shared/vendor/immutable": "immutable",
     "devtools/client/shared/vendor/react": "react",
     "devtools/client/shared/vendor/react-dom": "react-dom",
     "devtools/client/shared/vendor/react-redux": "react-redux",
     "devtools/client/shared/vendor/redux": "redux",
+    "devtools/client/shared/vendor/reselect": "reselect",
 
     "devtools/client/locales": path.join(__dirname, "../../client/locales/en-US"),
     "toolkit/locales": path.join(__dirname, "../../../toolkit/locales/en-US"),
     "devtools/shared/locales": path.join(__dirname, "../../shared/locales/en-US"),
     "devtools/shim/locales": path.join(__dirname, "../../shared/locales/en-US"),
     "devtools/shared/plural-form": path.join(__dirname, "../../shared/plural-form"),
     "devtools/shared/l10n": path.join(__dirname, "../../shared/l10n"),
     "devtools/shared/system": path.join(projectPath, "system-stub"),
 
     "devtools/client/framework/devtools": path.join(__dirname, "../../client/shims/devtools"),
     "devtools/client/framework/menu": "devtools-modules/src/menu",
     "devtools/client/framework/menu-item": path.join(__dirname, "../../client/framework/menu-item"),
+    "devtools/client/sourceeditor/editor": "devtools-source-editor/src/source-editor",
 
-    "devtools/client/shared/components/reps/reps": path.join(__dirname, "../../client/shared/components/reps/reps"),
     "devtools/client/shared/redux/middleware/thunk": path.join(__dirname, "../../client/shared/redux/middleware/thunk"),
     "devtools/client/shared/redux/middleware/debounce": path.join(__dirname, "../../client/shared/redux/middleware/debounce"),
+
+    "devtools/client/shared/components/reps/reps": path.join(__dirname, "../../client/shared/components/reps/reps"),
     "devtools/client/shared/components/stack-trace": path.join(__dirname, "../../client/shared/components/stack-trace"),
-    "devtools/client/shared/source-utils": path.join(__dirname, "../../client/shared/source-utils"),
+    "devtools/client/shared/components/search-box": path.join(__dirname, "../../client/shared/components/search-box"),
+    "devtools/client/shared/components/splitter/draggable": path.join(__dirname, "../../client/shared/components/splitter/draggable"),
+    "devtools/client/shared/components/splitter/split-box": path.join(__dirname, "../../client/shared/components/splitter/split-box"),
     "devtools/client/shared/components/frame": path.join(__dirname, "../../client/shared/components/frame"),
-    "devtools/client/shared/key-shortcuts": "devtools-modules/src/key-shortcuts",
+    "devtools/client/shared/components/autocomplete-popup": path.join(__dirname, "../../client/shared/components/autocomplete-popup"),
+    "devtools/client/shared/components/tabs/tabbar": path.join(__dirname, "../../client/shared/components/tabs/tabbar"),
+    "devtools/client/shared/components/tabs/tabs": path.join(__dirname, "../../client/shared/components/tabs/tabs"),
+    "devtools/client/shared/components/tree/tree-view": path.join(__dirname, "../../client/shared/components/tree/tree-view"),
+    "devtools/client/shared/components/tree/tree-row": path.join(__dirname, "../../client/shared/components/tree/tree-row"),
+
+    "devtools/client/shared/source-utils": path.join(__dirname, "../../client/shared/source-utils"),
+    "devtools/client/shared/key-shortcuts": path.join(__dirname, "../../client/shared/key-shortcuts"),
+    "devtools/client/shared/keycodes": path.join(__dirname, "../../client/shared/keycodes"),
     "devtools/client/shared/zoom-keys": "devtools-modules/src/zoom-keys",
+    "devtools/client/shared/curl": path.join(__dirname, "../../client/shared/curl"),
+    "devtools/client/shared/scroll": path.join(__dirname, "../../client/shared/scroll"),
 
+    "devtools/shared/fronts/timeline": path.join(__dirname, "../../shared/shims/fronts/timeline"),
     "devtools/shared/defer": path.join(__dirname, "../../shared/defer"),
     "devtools/shared/old-event-emitter": "devtools-modules/src/utils/event-emitter",
     "devtools/shared/client/main": path.join(__dirname, "new-console-output/test/fixtures/ObjectClient"),
     "devtools/shared/platform/clipboard": path.join(__dirname, "../../shared/platform/content/clipboard"),
     "devtools/shared/platform/stack": path.join(__dirname, "../../shared/platform/content/stack"),
+
+    "devtools/client/netmonitor/src/utils/request-utils": path.join(__dirname, "../netmonitor/src/utils/request-utils"),
+    "devtools/client/netmonitor/src/components/tabbox-panel": path.join(__dirname, "../netmonitor/src/components/tabbox-panel"),
+    "devtools/client/netmonitor/src/connector/firefox-data-provider": path.join(__dirname, "../netmonitor/src/connector/firefox-data-provider"),
+    "devtools/client/netmonitor/src/constants": path.join(__dirname, "../netmonitor/src/constants"),
   }
 };
 
 const mappings = [
   [
     /utils\/menu/, "devtools-launchpad/src/components/shared/menu"
   ],
   [
--- a/devtools/docs/SUMMARY.md
+++ b/devtools/docs/SUMMARY.md
@@ -39,15 +39,16 @@
   * [Debugger API](backend/debugger-api.md)
   * [Backward Compatibility](backend/backward-compatibility.md)
   * Actors
     * [Actors Organization](backend/actor-hierarchy.md)
     * [Handling Multi-Processes in Actors](backend/actor-e10s-handling.md)
     * [Writing Actors With protocol.js](backend/protocol.js.md)
     * [Registering A New Actor](backend/actor-registration.md)
     * [Actor Best Practices](backend/actor-best-practices.md)
+* [Preferences](preferences.md)
 * [Automated tests](tests/README.md)
   * Running tests
     * [`xpcshell`](tests/xpcshell.md)
     * [Chrome mochitests](tests/mochitest-chrome.md)
     * [DevTools mochitests](tests/mochitest-devtools.md)
   * [Writing tests](tests/writing-tests.md)
   * [Debugging intermittent failures](tests/debugging-intermittents.md)
new file mode 100644
--- /dev/null
+++ b/devtools/docs/preferences.md
@@ -0,0 +1,100 @@
+# Preferences
+
+This documentation aims at giving an overview of the preferences API used in DevTools, it
+is not an actual documentation about the list of preferences available in DevTools.
+
+## Overview
+
+Preferences allows you to save and read strings, numbers, booleans to the preferences
+store, which is tied to a profile. A preference can also have a default value.
+
+The technical solution for handling preferences differs depending whether you are
+testing DevTools as Firefox panel, or a standalone tool running with Launchpad.
+
+## Preference types
+
+DevTools relies on nsIPrefBranch for preferences, which supports different types of
+preferences:
+* `Int`
+* `Boolean`
+* `Char`
+* `String`
+
+Choose the appropriate type depending on the data you need to store. If you need to store
+a JavaSript object or array, the recommended way is to:
+* use a `String` type preference
+* use JSON.stringify to save
+* use JSON.parse to read
+
+Note that nsIPrefBranch also supports a `Complex` type, but this type is not supported
+when running in Launchpad.
+
+## Reading and updating preferences
+
+### API docs for nsIPrefBranch and nsIPrefService
+
+DevTools relies on Services.pref to handle preferences. You can access the API docs for
+this service at:
+* [API docs for nsIPrefBranch](https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIPrefBranch)
+* [API docs for nsIPrefService](https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIPrefService)
+
+If you are using Launchpad, note that only a subset of nsIPrefService methods are
+implemented (addObserver and removeObserver). Launchpad relies on a Services shim file
+provided by devtools-module ([code on GitHub](https://github.com/devtools-html/devtools-core/blob/master/packages/devtools-modules/src/Services.js)).
+
+### Requiring Services.pref
+
+To require Services and use Services.pref, you can normally use the following snippet:
+
+```javascript
+const Services = require("Services");
+```
+
+In the rare event where you don't have access to the DevTools' require method, you can use
+
+```javascript
+const { Services } = Components.utils.import("resource://gre/modules/Services.jsm", {});
+```
+
+### Services.pref.get* and Services.pref.set*
+
+The main APIs you will have to know and use are getters and setters.
+* `Services.pref.getIntPref(prefName, defaultValue);` This method will throw if the
+preference cannot be found and you didn't pass a default value!
+* `Services.pref.setIntPref(prefName, prefValue)` This method will throw if the provided
+value does not match the preference type!
+
+These APIs are very similar for each preference type.
+
+## Create a new preference
+
+To create a new preference, it should be assigned a default value. Default preferences are
+defined in preferences files such as:
+- devtools/client/preferences/devtools.js
+- devtools/client/preferences/debugger.js
+- devtools/shim/devtools-startup-prefs.js
+
+Most new preferences should go in devtools/client/preferences/devtools.js. Debugger
+specific preferences should go in devtools/client/preferences/debugger.js. Finally if a
+preference needs to be available very early during the Firefox startup sequence, it should
+go in devtools/shim/devtools-startup-prefs.js.
+
+### Projects using Launchpad
+
+At the time of writing this doc, projects using Launchpad have to duplicate the default
+definition of a preference.
+* debugger.html: update [src/utils/prefs.js](https://github.com/devtools-html/debugger.html/blob/master/src/utils/prefs.js)
+* netmonitor: update [index.js](http://searchfox.org/mozilla-central/source/devtools/client/netmonitor/index.js)
+* webconsole: update [local-dev/index.js](http://searchfox.org/mozilla-central/source/devtools/client/webconsole/local-dev/index.js)
+
+## Inspect preferences
+
+Depending on the project you are working on, preferences are stored differently but can
+always be inspected.
+
+In Firefox, you can open a tab to about:config and search by preference name.
+
+In Launchpad, preferences are actually saved to localStorage. Open DevTools on your
+Launchpad application and inspect the local storage content. You should see entries
+prefixed by `Services.prefs:`. You will only see preferences where a user-specific value
+has overridden the default value.
\ No newline at end of file
--- a/dom/fetch/FetchDriver.cpp
+++ b/dom/fetch/FetchDriver.cpp
@@ -38,16 +38,31 @@
 #include "Fetch.h"
 #include "FetchUtil.h"
 #include "InternalRequest.h"
 #include "InternalResponse.h"
 
 namespace mozilla {
 namespace dom {
 
+namespace {
+
+bool
+ShouldCheckSRI(const InternalRequest* const aRequest,
+               const InternalResponse* const aResponse)
+{
+  MOZ_DIAGNOSTIC_ASSERT(aRequest);
+  MOZ_DIAGNOSTIC_ASSERT(aResponse);
+
+  return !aRequest->GetIntegrity().IsEmpty() &&
+         aResponse->Type() != ResponseType::Error;
+}
+
+} // anonymous namespace
+
 NS_IMPL_ISUPPORTS(FetchDriver,
                   nsIStreamListener, nsIChannelEventSink, nsIInterfaceRequestor,
                   nsIThreadRetargetableStreamListener)
 
 FetchDriver::FetchDriver(InternalRequest* aRequest, nsIPrincipal* aPrincipal,
                          nsILoadGroup* aLoadGroup, nsIEventTarget* aMainThreadEventTarget,
                          bool aIsTrackingFetch)
   : mPrincipal(aPrincipal)
@@ -423,18 +438,17 @@ FetchDriver::BeginAndGetFilteredResponse
         break;
       default:
         MOZ_CRASH("Unexpected case");
     }
   }
 
   MOZ_ASSERT(filteredResponse);
   MOZ_ASSERT(mObserver);
-  if (filteredResponse->Type() == ResponseType::Error ||
-      mRequest->GetIntegrity().IsEmpty()) {
+  if (!ShouldCheckSRI(mRequest, filteredResponse)) {
     mObserver->OnResponseAvailable(filteredResponse);
   #ifdef DEBUG
     mResponseAvailableCalled = true;
   #endif
   }
 
   return filteredResponse.forget();
 }
@@ -596,35 +610,33 @@ FetchDriver::OnStartRequest(nsIRequest* 
   // the channel and must regenerate the tainting from the channel in the
   // interception case.
   mRequest->MaybeIncreaseResponseTainting(loadInfo->GetTainting());
 
   // Resolves fetch() promise which may trigger code running in a worker.  Make
   // sure the Response is fully initialized before calling this.
   mResponse = BeginAndGetFilteredResponse(response, foundOpaqueRedirect);
 
-  // From "Main Fetch" step 17: SRI-part1.
-  if (mResponse->Type() != ResponseType::Error &&
-      !mRequest->GetIntegrity().IsEmpty() &&
-      mSRIMetadata.IsEmpty()) {
-    nsIConsoleReportCollector* aReporter = nullptr;
+  // From "Main Fetch" step 19: SRI-part1.
+  if (ShouldCheckSRI(mRequest, mResponse) && mSRIMetadata.IsEmpty()) {
+    nsIConsoleReportCollector* reporter = nullptr;
     if (mObserver) {
-      aReporter = mObserver->GetReporter();
+      reporter = mObserver->GetReporter();
     }
 
     nsAutoCString sourceUri;
     if (mDocument && mDocument->GetDocumentURI()) {
       mDocument->GetDocumentURI()->GetAsciiSpec(sourceUri);
     } else if (!mWorkerScript.IsEmpty()) {
       sourceUri.Assign(mWorkerScript);
     }
     SRICheck::IntegrityMetadata(mRequest->GetIntegrity(), sourceUri,
-                                aReporter, &mSRIMetadata);
+                                reporter, &mSRIMetadata);
     mSRIDataVerifier = new SRICheckDataVerifier(mSRIMetadata, sourceUri,
-                                                aReporter);
+                                                reporter);
 
     // Do not retarget off main thread when using SRI API.
     return NS_OK;
   }
 
   nsCOMPtr<nsIEventTarget> sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID, &rv);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     FailWithNetworkError();
@@ -735,19 +747,20 @@ FetchDriver::OnDataAvailable(nsIRequest*
       }
     }
   }
 
   uint32_t aRead;
   MOZ_ASSERT(mResponse);
   MOZ_ASSERT(mPipeOutputStream);
 
-  // From "Main Fetch" step 17: SRI-part2.
-  if (mResponse->Type() != ResponseType::Error &&
-      !mRequest->GetIntegrity().IsEmpty()) {
+  // From "Main Fetch" step 19: SRI-part2.
+  // Note: Avoid checking the hidden opaque body.
+  if (mResponse->Type() != ResponseType::Opaque &&
+      ShouldCheckSRI(mRequest, mResponse)) {
     MOZ_ASSERT(mSRIDataVerifier);
 
     SRIVerifierAndOutputHolder holder(mSRIDataVerifier, mPipeOutputStream);
     nsresult rv = aInputStream->ReadSegments(CopySegmentToStreamAndSRI,
                                              &holder, aCount, &aRead);
     return rv;
   }
 
@@ -774,52 +787,50 @@ FetchDriver::OnStopRequest(nsIRequest* a
     }
 
     // We proceed as usual here, since we've already created a successful response
     // from OnStartRequest.
   } else {
     MOZ_ASSERT(mResponse);
     MOZ_ASSERT(!mResponse->IsError());
 
-    // From "Main Fetch" step 17: SRI-part3.
-    if (mResponse->Type() != ResponseType::Error &&
-        !mRequest->GetIntegrity().IsEmpty()) {
+    // From "Main Fetch" step 19: SRI-part3.
+    if (ShouldCheckSRI(mRequest, mResponse)) {
       MOZ_ASSERT(mSRIDataVerifier);
 
       nsCOMPtr<nsIChannel> channel = do_QueryInterface(aRequest);
 
-      nsIConsoleReportCollector* aReporter = nullptr;
+      nsIConsoleReportCollector* reporter = nullptr;
       if (mObserver) {
-        aReporter = mObserver->GetReporter();
+        reporter = mObserver->GetReporter();
       }
 
       nsAutoCString sourceUri;
       if (mDocument && mDocument->GetDocumentURI()) {
         mDocument->GetDocumentURI()->GetAsciiSpec(sourceUri);
       } else if (!mWorkerScript.IsEmpty()) {
         sourceUri.Assign(mWorkerScript);
       }
       nsresult rv = mSRIDataVerifier->Verify(mSRIMetadata, channel, sourceUri,
-                                             aReporter);
+                                             reporter);
       if (NS_FAILED(rv)) {
         FailWithNetworkError();
         // Cancel request.
         return rv;
       }
     }
 
     if (mPipeOutputStream) {
       mPipeOutputStream->Close();
     }
   }
 
   if (mObserver) {
-    if (mResponse->Type() != ResponseType::Error &&
-        !mRequest->GetIntegrity().IsEmpty()) {
-      //From "Main Fetch" step 23: Process response.
+    // From "Main Fetch" step 19.1, 19.2: Process response.
+    if (ShouldCheckSRI(mRequest, mResponse)) {
       MOZ_ASSERT(mResponse);
       mObserver->OnResponseAvailable(mResponse);
       #ifdef DEBUG
         mResponseAvailableCalled = true;
       #endif
     }
 
     mObserver->OnResponseEnd(FetchDriverObserver::eByNetworking);
--- a/dom/fetch/Request.cpp
+++ b/dom/fetch/Request.cpp
@@ -546,21 +546,16 @@ Request::Constructor(const GlobalObject&
     if (!request->HasSimpleMethod()) {
       nsAutoCString method;
       request->GetMethod(method);
       NS_ConvertUTF8toUTF16 label(method);
       aRv.ThrowTypeError<MSG_INVALID_REQUEST_METHOD>(label);
       return nullptr;
     }
 
-    if (!request->GetIntegrity().IsEmpty()) {
-      aRv.ThrowTypeError<MSG_REQUEST_INTEGRITY_METADATA_NOT_EMPTY>();
-      return nullptr;
-    }
-
     requestHeaders->SetGuard(HeadersGuardEnum::Request_no_cors, aRv);
     if (aRv.Failed()) {
       return nullptr;
     }
   }
 
   requestHeaders->Fill(*headers, aRv);
   if (aRv.Failed()) {
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -2559,30 +2559,24 @@ TabChild::InternalSetDocShellIsActive(bo
     // been a request to force paint. This is so that the BackgroundHangMonitor
     // for force painting can be made to wait again.
     if (aIsActive) {
       ProcessHangMonitor::ClearForcePaint();
     }
   });
 
   if (mCompositorOptions) {
-    // Note that |GetLayerManager()| has side-effects in that it creates a layer
-    // manager if one doesn't exist already. Calling it inside a debug-only
-    // assertion is generally bad but in this case we call it unconditionally
-    // just below so it's ok.
     MOZ_ASSERT(mPuppetWidget);
-    MOZ_ASSERT(mPuppetWidget->GetLayerManager());
-    MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
-            || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR
-            || (gfxPlatform::IsHeadless() && mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC));
+    RefPtr<LayerManager> lm = mPuppetWidget->GetLayerManager();
+    MOZ_ASSERT(lm);
 
     // We send the current layer observer epoch to the compositor so that
     // TabParent knows whether a layer update notification corresponds to the
     // latest SetDocShellIsActive request that was made.
-    mPuppetWidget->GetLayerManager()->SetLayerObserverEpoch(mLayerObserverEpoch);
+    lm->SetLayerObserverEpoch(mLayerObserverEpoch);
   }
 
   // docshell is consider prerendered only if not active yet
   mIsPrerendered &= !aIsActive;
   nsCOMPtr<nsIDocShell> docShell = do_GetInterface(WebNavigation());
   if (docShell) {
     bool wasActive;
     docShell->GetIsActive(&wasActive);
@@ -3068,22 +3062,20 @@ TabChild::GetFrom(uint64_t aLayersId)
 }
 
 void
 TabChild::DidComposite(uint64_t aTransactionId,
                        const TimeStamp& aCompositeStart,
                        const TimeStamp& aCompositeEnd)
 {
   MOZ_ASSERT(mPuppetWidget);
-  MOZ_ASSERT(mPuppetWidget->GetLayerManager());
-  MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
-             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR
-             || (gfxPlatform::IsHeadless() && mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC));
-
-  mPuppetWidget->GetLayerManager()->DidComposite(aTransactionId, aCompositeStart, aCompositeEnd);
+  RefPtr<LayerManager> lm = mPuppetWidget->GetLayerManager();
+  MOZ_ASSERT(lm);
+
+  lm->DidComposite(aTransactionId, aCompositeStart, aCompositeEnd);
 }
 
 void
 TabChild::DidRequestComposite(const TimeStamp& aCompositeReqStart,
                               const TimeStamp& aCompositeReqEnd)
 {
   nsCOMPtr<nsIDocShell> docShellComPtr = do_GetInterface(WebNavigation());
   if (!docShellComPtr) {
@@ -3106,34 +3098,29 @@ TabChild::DidRequestComposite(const Time
       MarkerTracingType::END, MarkerStackRequest::NO_STACK);
   }
 }
 
 void
 TabChild::ClearCachedResources()
 {
   MOZ_ASSERT(mPuppetWidget);
-  MOZ_ASSERT(mPuppetWidget->GetLayerManager());
-  MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
-             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR
-             || (gfxPlatform::IsHeadless() && mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC));
-
-  mPuppetWidget->GetLayerManager()->ClearCachedResources();
+  RefPtr<LayerManager> lm = mPuppetWidget->GetLayerManager();
+  MOZ_ASSERT(lm);
+
+  lm->ClearCachedResources();
 }
 
 void
 TabChild::InvalidateLayers()
 {
   MOZ_ASSERT(mPuppetWidget);
-  MOZ_ASSERT(mPuppetWidget->GetLayerManager());
-  MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
-             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR
-             || (gfxPlatform::IsHeadless() && mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC));
-
   RefPtr<LayerManager> lm = mPuppetWidget->GetLayerManager();
+  MOZ_ASSERT(lm);
+
   FrameLayerBuilder::InvalidateAllLayers(lm);
 }
 
 void
 TabChild::ReinitRendering()
 {
   MOZ_ASSERT(mLayersId);
 
@@ -3219,20 +3206,16 @@ TabChild::ReinitRenderingForDeviceReset(
   // Proceed with destroying and recreating the layer manager.
   ReinitRendering();
 }
 
 void
 TabChild::CompositorUpdated(const TextureFactoryIdentifier& aNewIdentifier,
                             uint64_t aDeviceResetSeqNo)
 {
-  MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
-             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR
-             || (gfxPlatform::IsHeadless() && mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC));
-
   RefPtr<LayerManager> lm = mPuppetWidget->GetLayerManager();
 
   mTextureFactoryIdentifier = aNewIdentifier;
   lm->UpdateTextureFactoryIdentifier(aNewIdentifier, aDeviceResetSeqNo);
   FrameLayerBuilder::InvalidateAllLayers(lm);
 }
 
 NS_IMETHODIMP
--- a/dom/media/MediaPrefs.h
+++ b/dom/media/MediaPrefs.h
@@ -133,17 +133,16 @@ private:
 #ifdef MOZ_FFVPX
   DECL_MEDIA_PREF("media.ffvpx.enabled",                      PDMFFVPXEnabled, bool, true);
 #endif
 #ifdef XP_WIN
   DECL_MEDIA_PREF("media.wmf.enabled",                        PDMWMFEnabled, bool, true);
   DECL_MEDIA_PREF("media.wmf.skip-blacklist",                 PDMWMFSkipBlacklist, bool, false);
   DECL_MEDIA_PREF("media.decoder-doctor.wmf-disabled-is-failure", DecoderDoctorWMFDisabledIsFailure, bool, false);
   DECL_MEDIA_PREF("media.wmf.vp9.enabled",                    PDMWMFVP9DecoderEnabled, bool, true);
-  DECL_MEDIA_PREF("media.wmf.amd.vp9.enabled",                PDMWMFAMDVP9DecoderEnabled, bool, true);
   DECL_MEDIA_PREF("media.wmf.decoder.thread-count",           PDMWMFThreadCount, int32_t, -1);
   DECL_MEDIA_PREF("media.wmf.allow-unsupported-resolutions",  PDMWMFAllowUnsupportedResolutions, bool, false);
 #endif
   DECL_MEDIA_PREF("media.decoder.fuzzing.enabled",            PDMFuzzingEnabled, bool, false);
   DECL_MEDIA_PREF("media.decoder.fuzzing.video-output-minimum-interval-ms", PDMFuzzingInterval, uint32_t, 0);
   DECL_MEDIA_PREF("media.decoder.fuzzing.dont-delay-inputexhausted", PDMFuzzingDelayInputExhausted, bool, true);
   DECL_MEDIA_PREF("media.decoder.recycle.enabled",            MediaDecoderCheckRecycling, bool, false);
   DECL_MEDIA_PREF("media.decoder.skip-to-next-key-frame.enabled", MFRSkipToNextKeyFrameEnabled, bool, true);
--- a/dom/media/platforms/wmf/WMFDecoderModule.cpp
+++ b/dom/media/platforms/wmf/WMFDecoderModule.cpp
@@ -10,16 +10,17 @@
 #include "MP4Decoder.h"
 #include "MediaInfo.h"
 #include "MediaPrefs.h"
 #include "VPXDecoder.h"
 #include "WMF.h"
 #include "WMFAudioMFTManager.h"
 #include "WMFMediaDataDecoder.h"
 #include "WMFVideoMFTManager.h"
+#include "gfxPrefs.h"
 #include "mozilla/DebugOnly.h"
 #include "mozilla/Maybe.h"
 #include "mozilla/Services.h"
 #include "mozilla/StaticMutex.h"
 #include "mozilla/WindowsVersion.h"
 #include "mozilla/gfx/gfxVars.h"
 #include "nsAutoPtr.h"
 #include "nsComponentManagerUtils.h"
@@ -259,17 +260,17 @@ WMFDecoderModule::Supports(const TrackIn
   }
   if (aTrackInfo.mMimeType.EqualsLiteral("audio/mpeg") &&
       CanCreateWMFDecoder<CLSID_CMP3DecMediaObject>()) {
     return true;
   }
   if (MediaPrefs::PDMWMFVP9DecoderEnabled()) {
     if ((VPXDecoder::IsVP8(aTrackInfo.mMimeType) ||
          VPXDecoder::IsVP9(aTrackInfo.mMimeType)) &&
-        ((MediaPrefs::PDMWMFAMDVP9DecoderEnabled() &&
+        ((gfxPrefs::PDMWMFAMDVP9DecoderEnabled() &&
           CanCreateWMFDecoder<CLSID_AMDWebmMfVp9Dec>()) ||
          CanCreateWMFDecoder<CLSID_WebmMfVpxDec>())) {
       return true;
     }
   }
 
   // Some unsupported codec.
   return false;
--- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
+++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
@@ -605,17 +605,17 @@ WMFVideoMFTManager::InitInternal()
 {
   mUseHwAccel = false; // default value; changed if D3D setup succeeds.
   bool useDxva = InitializeDXVA();
 
   RefPtr<MFTDecoder> decoder;
 
   HRESULT hr;
   if (mStreamType == VP9 && useDxva && mCheckForAMDDecoder &&
-      MediaPrefs::PDMWMFAMDVP9DecoderEnabled()) {
+      gfxPrefs::PDMWMFAMDVP9DecoderEnabled()) {
     if ((decoder = LoadAMDVP9Decoder())) {
       mAMDVP9InUse = true;
     }
   }
   if (!decoder) {
     mCheckForAMDDecoder = false;
     mAMDVP9InUse = false;
     decoder = new MFTDecoder();
--- a/dom/svg/SVGTransformableElement.cpp
+++ b/dom/svg/SVGTransformableElement.cpp
@@ -200,19 +200,16 @@ SVGTransformableElement::GetBBox(const S
       flags |= nsSVGUtils::eBBoxIncludeStroke;
     }
     if (aOptions.mMarkers) {
       flags |= nsSVGUtils::eBBoxIncludeMarkers;
     }
     if (aOptions.mClipped) {
       flags |= nsSVGUtils::eBBoxIncludeClipped;
     }
-    if (flags == 0) {
-      return NS_NewSVGRect(this,0,0,0,0);
-    }
     if (flags == nsSVGUtils::eBBoxIncludeMarkers ||
         flags == nsSVGUtils::eBBoxIncludeClipped) {
       flags |= nsSVGUtils::eBBoxIncludeFill;
     }
     return NS_NewSVGRect(this, ToRect(nsSVGUtils::GetBBox(frame, flags)));
   }
 }
 
--- a/dom/xbl/nsXBLPrototypeResources.cpp
+++ b/dom/xbl/nsXBLPrototypeResources.cpp
@@ -162,17 +162,17 @@ nsXBLPrototypeResources::GatherRuleProce
                                           SheetType::Doc,
                                           nullptr,
                                           mRuleProcessor);
 }
 
 void
 nsXBLPrototypeResources::ComputeServoStyleSet(nsPresContext* aPresContext)
 {
-  mServoStyleSet.reset(new ServoStyleSet());
+  mServoStyleSet.reset(new ServoStyleSet(ServoStyleSet::Kind::ForXBL));
   mServoStyleSet->Init(aPresContext, nullptr);
   for (StyleSheet* sheet : mStyleSheetList) {
     MOZ_ASSERT(sheet->IsServo(),
                "This should only be called with Servo-flavored style backend!");
     // The XBL style sheets aren't document level sheets, but we need to
     // decide a particular SheetType to add them to style set. This type
     // doesn't affect the place where we pull those rules from
     // stylist::push_applicable_declarations_as_xbl_only_stylist().
--- a/editor/composer/nsEditorSpellCheck.cpp
+++ b/editor/composer/nsEditorSpellCheck.cpp
@@ -359,21 +359,17 @@ nsEditorSpellCheck::InitSpellChecker(nsI
       return NS_ERROR_FAILURE;
     }
     RefPtr<Selection> selection = domSelection->AsSelection();
 
     if (selection->RangeCount()) {
       RefPtr<nsRange> range = selection->GetRangeAt(0);
       NS_ENSURE_STATE(range);
 
-      bool collapsed = false;
-      rv = range->GetCollapsed(&collapsed);
-      NS_ENSURE_SUCCESS(rv, rv);
-
-      if (!collapsed) {
+      if (!range->Collapsed()) {
         // We don't want to touch the range in the selection,
         // so create a new copy of it.
 
         RefPtr<nsRange> rangeBounds = range->CloneRange();
 
         // Make sure the new range spans complete words.
 
         rv = tsDoc->ExpandRangeToWordBoundaries(rangeBounds);
--- a/editor/libeditor/HTMLEditRules.cpp
+++ b/editor/libeditor/HTMLEditRules.cpp
@@ -452,25 +452,25 @@ HTMLEditRules::AfterEditInner(EditAction
   if (action == EditAction::ignore) {
     return NS_OK;
   }
 
   NS_ENSURE_STATE(mHTMLEditor);
   RefPtr<Selection> selection = mHTMLEditor->GetSelection();
   NS_ENSURE_STATE(selection);
 
-  nsCOMPtr<nsIDOMNode> rangeStartContainer, rangeEndContainer;
+  nsCOMPtr<nsINode> rangeStartContainer, rangeEndContainer;
   uint32_t rangeStartOffset = 0, rangeEndOffset = 0;
   // do we have a real range to act on?
   bool bDamagedRange = false;
   if (mDocChangeRange) {
-    mDocChangeRange->GetStartContainer(getter_AddRefs(rangeStartContainer));
-    mDocChangeRange->GetEndContainer(getter_AddRefs(rangeEndContainer));
-    mDocChangeRange->GetStartOffset(&rangeStartOffset);
-    mDocChangeRange->GetEndOffset(&rangeEndOffset);
+    rangeStartContainer = mDocChangeRange->GetStartContainer();
+    rangeEndContainer = mDocChangeRange->GetEndContainer();
+    rangeStartOffset = mDocChangeRange->StartOffset();
+    rangeEndOffset = mDocChangeRange->EndOffset();
     if (rangeStartContainer && rangeEndContainer) {
       bDamagedRange = true;
     }
   }
 
   if (bDamagedRange && !((action == EditAction::undo) ||
                          (action == EditAction::redo))) {
     // don't let any txns in here move the selection around behind our back.
@@ -563,18 +563,20 @@ HTMLEditRules::AfterEditInner(EditAction
 
   NS_ENSURE_STATE(mHTMLEditor);
 
   nsresult rv =
     mHTMLEditor->HandleInlineSpellCheck(
                    action, selection,
                    GetAsDOMNode(mRangeItem->mStartContainer),
                    mRangeItem->mStartOffset,
-                   rangeStartContainer, static_cast<int32_t>(rangeStartOffset),
-                   rangeEndContainer, static_cast<int32_t>(rangeEndOffset));
+                   GetAsDOMNode(rangeStartContainer),
+                   static_cast<int32_t>(rangeStartOffset),
+                   GetAsDOMNode(rangeEndContainer),
+                   static_cast<int32_t>(rangeEndOffset));
   NS_ENSURE_SUCCESS(rv, rv);
 
   // detect empty doc
   rv = CreateBogusNodeIfNeeded(selection);
   NS_ENSURE_SUCCESS(rv, rv);
 
   // adjust selection HINT if needed
   if (!mDidExplicitlySetInterline) {
@@ -7888,49 +7890,46 @@ HTMLEditRules::RemoveEmptyNodes()
 }
 
 nsresult
 HTMLEditRules::SelectionEndpointInNode(nsINode* aNode,
                                        bool* aResult)
 {
   NS_ENSURE_TRUE(aNode && aResult, NS_ERROR_NULL_POINTER);
 
-  nsIDOMNode* node = aNode->AsDOMNode();
-
   *aResult = false;
 
   NS_ENSURE_STATE(mHTMLEditor);
   RefPtr<Selection> selection = mHTMLEditor->GetSelection();
   NS_ENSURE_STATE(selection);
 
   uint32_t rangeCount = selection->RangeCount();
   for (uint32_t rangeIdx = 0; rangeIdx < rangeCount; ++rangeIdx) {
     RefPtr<nsRange> range = selection->GetRangeAt(rangeIdx);
-    nsCOMPtr<nsIDOMNode> startContainer, endContainer;
-    range->GetStartContainer(getter_AddRefs(startContainer));
+    nsINode* startContainer = range->GetStartContainer();
     if (startContainer) {
-      if (node == startContainer) {
+      if (aNode == startContainer) {
         *aResult = true;
         return NS_OK;
       }
-      if (EditorUtils::IsDescendantOf(startContainer, node)) {
+      if (EditorUtils::IsDescendantOf(startContainer, aNode)) {
         *aResult = true;
         return NS_OK;
       }
     }
-    range->GetEndContainer(getter_AddRefs(endContainer));
+    nsINode* endContainer = range->GetEndContainer();
     if (startContainer == endContainer) {
       continue;
     }
     if (endContainer) {
-      if (node == endContainer) {
+      if (aNode == endContainer) {
         *aResult = true;
         return NS_OK;
       }
-      if (EditorUtils::IsDescendantOf(endContainer, node)) {
+      if (EditorUtils::IsDescendantOf(endContainer, aNode)) {
         *aResult = true;
         return NS_OK;
       }
     }
   }
   return NS_OK;
 }
 
@@ -8146,65 +8145,62 @@ HTMLEditRules::ConfirmSelectionInBody()
 
 nsresult
 HTMLEditRules::UpdateDocChangeRange(nsRange* aRange)
 {
   // first make sure aRange is in the document.  It might not be if
   // portions of our editting action involved manipulating nodes
   // prior to placing them in the document (e.g., populating a list item
   // before placing it in its list)
-  nsCOMPtr<nsIDOMNode> startNode;
-  nsresult rv = aRange->GetStartContainer(getter_AddRefs(startNode));
-  NS_ENSURE_SUCCESS(rv, rv);
+  nsCOMPtr<nsINode> startNode = aRange->GetStartContainer();
+  if (NS_WARN_IF(!startNode)) {
+    return NS_ERROR_FAILURE;
+  }
   NS_ENSURE_STATE(mHTMLEditor);
   if (!mHTMLEditor->IsDescendantOfRoot(startNode)) {
     // just return - we don't need to adjust mDocChangeRange in this case
     return NS_OK;
   }
 
   if (!mDocChangeRange) {
     // clone aRange.
     mDocChangeRange = aRange->CloneRange();
   } else {
     int16_t result;
 
     // compare starts of ranges
-    rv = mDocChangeRange->CompareBoundaryPoints(nsIDOMRange::START_TO_START,
-                                                aRange, &result);
+    nsresult rv =
+      mDocChangeRange->CompareBoundaryPoints(nsIDOMRange::START_TO_START,
+                                             aRange, &result);
     if (rv == NS_ERROR_NOT_INITIALIZED) {
       // This will happen is mDocChangeRange is non-null, but the range is
       // uninitialized. In this case we'll set the start to aRange start.
       // The same test won't be needed further down since after we've set
       // the start the range will be collapsed to that point.
       result = 1;
       rv = NS_OK;
     }
     NS_ENSURE_SUCCESS(rv, rv);
     // Positive result means mDocChangeRange start is after aRange start.
     if (result > 0) {
-      uint32_t startOffset;
-      rv = aRange->GetStartOffset(&startOffset);
-      NS_ENSURE_SUCCESS(rv, rv);
-      rv = mDocChangeRange->SetStart(startNode, startOffset);
+      rv = mDocChangeRange->SetStart(startNode, aRange->StartOffset());
       NS_ENSURE_SUCCESS(rv, rv);
     }
 
     // compare ends of ranges
     rv = mDocChangeRange->CompareBoundaryPoints(nsIDOMRange::END_TO_END,
                                                 aRange, &result);
     NS_ENSURE_SUCCESS(rv, rv);
     // Negative result means mDocChangeRange end is before aRange end.
     if (result < 0) {
-      nsCOMPtr<nsIDOMNode> endNode;
-      rv = aRange->GetEndContainer(getter_AddRefs(endNode));
-      NS_ENSURE_SUCCESS(rv, rv);
-      uint32_t endOffset;
-      rv = aRange->GetEndOffset(&endOffset);
-      NS_ENSURE_SUCCESS(rv, rv);
-      rv = mDocChangeRange->SetEnd(endNode, endOffset);
+      nsINode* endNode = aRange->GetEndContainer();
+      if (NS_WARN_IF(!endNode)) {
+        return NS_ERROR_FAILURE;
+      }
+      rv = mDocChangeRange->SetEnd(endNode, aRange->EndOffset());
       NS_ENSURE_SUCCESS(rv, rv);
     }
   }
   return NS_OK;
 }
 
 nsresult
 HTMLEditRules::InsertBRIfNeededInternal(nsINode& aNode,
--- a/editor/libeditor/HTMLEditor.cpp
+++ b/editor/libeditor/HTMLEditor.cpp
@@ -2402,34 +2402,29 @@ HTMLEditor::GetSelectedElement(const nsA
   bool anyTag = (TagName.IsEmpty());
   bool isLinkTag = IsLinkTag(TagName);
   bool isNamedAnchorTag = IsNamedAnchorTag(TagName);
 
   nsCOMPtr<nsIDOMElement> selectedElement;
   RefPtr<nsRange> range = selection->GetRangeAt(0);
   NS_ENSURE_STATE(range);
 
-  nsCOMPtr<nsIDOMNode> startContainer;
-  nsresult rv = range->GetStartContainer(getter_AddRefs(startContainer));
-  NS_ENSURE_SUCCESS(rv, rv);
+  nsCOMPtr<nsINode> startContainer = range->GetStartContainer();
   uint32_t startOffset = range->StartOffset();
 
-  nsCOMPtr<nsIDOMNode> endContainer;
-  rv = range->GetEndContainer(getter_AddRefs(endContainer));
-  NS_ENSURE_SUCCESS(rv, rv);
+  nsCOMPtr<nsINode> endContainer = range->GetEndContainer();
   uint32_t endOffset = range->EndOffset();
 
   // Optimization for a single selected element
   if (startContainer && startContainer == endContainer &&
       endOffset - startOffset == 1) {
-    nsCOMPtr<nsIDOMNode> selectedNode =
-      GetChildAt(startContainer, static_cast<int32_t>(startOffset));
-    NS_ENSURE_SUCCESS(rv, NS_OK);
+    nsCOMPtr<nsINode> selectedNode =
+      startContainer->GetChildAt(static_cast<int32_t>(startOffset));
     if (selectedNode) {
-      selectedNode->GetNodeName(domTagName);
+      selectedNode->AsDOMNode()->GetNodeName(domTagName);
       ToLowerCase(domTagName);
 
       // Test for appropriate node type requested
       if (anyTag || (TagName == domTagName) ||
           (isLinkTag && HTMLEditUtils::IsLink(selectedNode)) ||
           (isNamedAnchorTag && HTMLEditUtils::IsNamedAnchor(selectedNode))) {
         bNodeFound = true;
         selectedElement = do_QueryInterface(selectedNode);
@@ -2452,19 +2447,20 @@ HTMLEditor::GetSelectedElement(const nsA
       int32_t focusOffset = -1;
       if (focusNode) {
         focusOffset = selection->FocusOffset();
       }
 
       // Link node must be the same for both ends of selection
       if (anchorNode) {
         nsCOMPtr<nsIDOMElement> parentLinkOfAnchor;
-        rv = GetElementOrParentByTagName(NS_LITERAL_STRING("href"),
-                                         GetAsDOMNode(anchorNode),
-                                         getter_AddRefs(parentLinkOfAnchor));
+        nsresult rv =
+          GetElementOrParentByTagName(NS_LITERAL_STRING("href"),
+                                      GetAsDOMNode(anchorNode),
+                                      getter_AddRefs(parentLinkOfAnchor));
         // XXX: ERROR_HANDLING  can parentLinkOfAnchor be null?
         if (NS_SUCCEEDED(rv) && parentLinkOfAnchor) {
           if (isCollapsed) {
             // We have just a caret in the link
             bNodeFound = true;
           } else if (focusNode) {
             // Link node must be the same for both ends of selection.
             nsCOMPtr<nsIDOMElement> parentLinkOfFocus;
@@ -2493,16 +2489,17 @@ HTMLEditor::GetSelectedElement(const nsA
           }
         }
       }
     }
 
     if (!isCollapsed) {
       RefPtr<nsRange> currange = selection->GetRangeAt(0);
       if (currange) {
+        nsresult rv;
         nsCOMPtr<nsIContentIterator> iter =
           do_CreateInstance("@mozilla.org/content/post-content-iterator;1",
                             &rv);
         NS_ENSURE_SUCCESS(rv, rv);
 
         iter->Init(currange);
         // loop through the content iterator for each content node
         while (!iter->IsDone()) {
@@ -2558,17 +2555,17 @@ HTMLEditor::GetSelectedElement(const nsA
     return NS_SUCCESS_EDITOR_ELEMENT_NOT_FOUND;
   }
 
   *aReturn = selectedElement;
   if (selectedElement) {
     // Getters must addref
     NS_ADDREF(*aReturn);
   }
-  return rv;
+  return NS_OK;
 }
 
 already_AddRefed<Element>
 HTMLEditor::CreateElementWithDefaults(const nsAString& aTagName)
 {
   MOZ_ASSERT(!aTagName.IsEmpty());
 
   nsAutoString tagName(aTagName);
--- a/editor/libeditor/HTMLEditorDataTransfer.cpp
+++ b/editor/libeditor/HTMLEditorDataTransfer.cpp
@@ -131,26 +131,24 @@ HTMLEditor::LoadHTML(const nsAString& aI
     RefPtr<nsRange> range = selection->GetRangeAt(0);
     NS_ENSURE_TRUE(range, NS_ERROR_NULL_POINTER);
 
     // create fragment for pasted html
     nsCOMPtr<nsIDOMDocumentFragment> docfrag;
     rv = range->CreateContextualFragment(aInputString, getter_AddRefs(docfrag));
     NS_ENSURE_SUCCESS(rv, rv);
     // put the fragment into the document
-    nsCOMPtr<nsIDOMNode> parent;
-    rv = range->GetStartContainer(getter_AddRefs(parent));
-    NS_ENSURE_SUCCESS(rv, rv);
+    nsCOMPtr<nsINode> parent = range->GetStartContainer();
     NS_ENSURE_TRUE(parent, NS_ERROR_NULL_POINTER);
     uint32_t childOffset = range->StartOffset();
 
     nsCOMPtr<nsIDOMNode> nodeToInsert;
     docfrag->GetFirstChild(getter_AddRefs(nodeToInsert));
     while (nodeToInsert) {
-      rv = InsertNode(nodeToInsert, parent,
+      rv = InsertNode(nodeToInsert, GetAsDOMNode(parent),
                       static_cast<int32_t>(childOffset++));
       NS_ENSURE_SUCCESS(rv, rv);
       docfrag->GetFirstChild(getter_AddRefs(nodeToInsert));
     }
   }
 
   return rules->DidDoAction(selection, &ruleInfo, rv);
 }
--- a/editor/libeditor/HTMLTableEditor.cpp
+++ b/editor/libeditor/HTMLTableEditor.cpp
@@ -755,18 +755,17 @@ HTMLEditor::DeleteTableCell(int32_t aNum
   // Don't fail if we didn't find a table or cell
   NS_ENSURE_TRUE(table && cell, NS_SUCCESS_EDITOR_ELEMENT_NOT_FOUND);
 
   AutoPlaceholderBatch beginBatching(this);
   // Prevent rules testing until we're done
   AutoRules beginRulesSniffing(this, EditAction::deleteNode, nsIEditor::eNext);
 
   nsCOMPtr<nsIDOMElement> firstCell;
-  nsCOMPtr<nsIDOMRange> range;
-  rv = GetFirstSelectedCell(getter_AddRefs(range), getter_AddRefs(firstCell));
+  rv = GetFirstSelectedCell(nullptr, getter_AddRefs(firstCell));
   NS_ENSURE_SUCCESS(rv, rv);
 
   if (firstCell && selection->RangeCount() > 1) {
     // When > 1 selected cell,
     //  ignore aNumber and use selected cells
     cell = firstCell;
 
     int32_t rowCount, colCount;
@@ -850,18 +849,17 @@ HTMLEditor::DeleteTableCell(int32_t aNum
               // Set true since we know we will look at a new column next
               checkToDeleteColumn = true;
             }
           }
         }
         if (!deleteCol) {
           // First get the next cell to delete
           nsCOMPtr<nsIDOMElement> nextCell;
-          rv = GetNextSelectedCell(getter_AddRefs(range),
-                                   getter_AddRefs(nextCell));
+          rv = GetNextSelectedCell(nullptr, getter_AddRefs(nextCell));
           NS_ENSURE_SUCCESS(rv, rv);
 
           // Then delete the cell
           rv = DeleteNode(cell);
           NS_ENSURE_SUCCESS(rv, rv);
 
           // The next cell to delete
           cell = nextCell;
@@ -943,18 +941,17 @@ HTMLEditor::DeleteTableCellContents()
   AutoPlaceholderBatch beginBatching(this);
   // Prevent rules testing until we're done
   AutoRules beginRulesSniffing(this, EditAction::deleteNode, nsIEditor::eNext);
   //Don't let Rules System change the selection
   AutoTransactionsConserveSelection dontChangeSelection(this);
 
 
   nsCOMPtr<nsIDOMElement> firstCell;
-  nsCOMPtr<nsIDOMRange> range;
-  rv = GetFirstSelectedCell(getter_AddRefs(range), getter_AddRefs(firstCell));
+  rv = GetFirstSelectedCell(nullptr, getter_AddRefs(firstCell));
   NS_ENSURE_SUCCESS(rv, rv);
 
 
   if (firstCell) {
     cell = firstCell;
     rv = GetCellIndexes(cell, &startRowIndex, &startColIndex);
     NS_ENSURE_SUCCESS(rv, rv);
   }
@@ -1025,18 +1022,17 @@ HTMLEditor::DeleteTableColumn(int32_t aN
   aNumber = std::min(aNumber,(colCount-startColIndex));
 
   AutoPlaceholderBatch beginBatching(this);
   // Prevent rules testing until we're done
   AutoRules beginRulesSniffing(this, EditAction::deleteNode, nsIEditor::eNext);
 
   // Test if deletion is controlled by selected cells
   nsCOMPtr<nsIDOMElement> firstCell;
-  nsCOMPtr<nsIDOMRange> range;
-  rv = GetFirstSelectedCell(getter_AddRefs(range), getter_AddRefs(firstCell));
+  rv = GetFirstSelectedCell(nullptr, getter_AddRefs(firstCell));
   NS_ENSURE_SUCCESS(rv, rv);
 
   uint32_t rangeCount = selection->RangeCount();
 
   if (firstCell && rangeCount > 1) {
     // Fetch indexes again - may be different for selected cells
     rv = GetCellIndexes(firstCell, &startRowIndex, &startColIndex);
     NS_ENSURE_SUCCESS(rv, rv);
@@ -1054,17 +1050,17 @@ HTMLEditor::DeleteTableColumn(int32_t aN
       if (cell != firstCell) {
         rv = GetCellIndexes(cell, &startRowIndex, &startColIndex);
         NS_ENSURE_SUCCESS(rv, rv);
       }
       // Find the next cell in a different column
       // to continue after we delete this column
       int32_t nextCol = startColIndex;
       while (nextCol == startColIndex) {
-        rv = GetNextSelectedCell(getter_AddRefs(range), getter_AddRefs(cell));
+        rv = GetNextSelectedCell(nullptr, getter_AddRefs(cell));
         NS_ENSURE_SUCCESS(rv, rv);
         if (!cell) {
           break;
         }
         rv = GetCellIndexes(cell, &startRowIndex, &nextCol);
         NS_ENSURE_SUCCESS(rv, rv);
       }
       rv = DeleteColumn(table, startColIndex);
@@ -1188,18 +1184,17 @@ HTMLEditor::DeleteTableRow(int32_t aNumb
     return DeleteTable2(table, selection);
   }
 
   AutoPlaceholderBatch beginBatching(this);
   // Prevent rules testing until we're done
   AutoRules beginRulesSniffing(this, EditAction::deleteNode, nsIEditor::eNext);
 
   nsCOMPtr<nsIDOMElement> firstCell;
-  nsCOMPtr<nsIDOMRange> range;
-  rv = GetFirstSelectedCell(getter_AddRefs(range), getter_AddRefs(firstCell));
+  rv = GetFirstSelectedCell(nullptr, getter_AddRefs(firstCell));
   NS_ENSURE_SUCCESS(rv, rv);
 
   uint32_t rangeCount = selection->RangeCount();
 
   if (firstCell && rangeCount > 1) {
     // Fetch indexes again - may be different for selected cells
     rv = GetCellIndexes(firstCell, &startRowIndex, &startColIndex);
     NS_ENSURE_SUCCESS(rv, rv);
@@ -1220,17 +1215,17 @@ HTMLEditor::DeleteTableRow(int32_t aNumb
       if (cell != firstCell) {
         rv = GetCellIndexes(cell, &startRowIndex, &startColIndex);
         NS_ENSURE_SUCCESS(rv, rv);
       }
       // Find the next cell in a different row
       // to continue after we delete this row
       int32_t nextRow = startRowIndex;
       while (nextRow == startRowIndex) {
-        rv = GetNextSelectedCell(getter_AddRefs(range), getter_AddRefs(cell));
+        rv = GetNextSelectedCell(nullptr, getter_AddRefs(cell));
         NS_ENSURE_SUCCESS(rv, rv);
         if (!cell) break;
         rv = GetCellIndexes(cell, &nextRow, &startColIndex);
         NS_ENSURE_SUCCESS(rv, rv);
       }
       // Delete entire row
       rv = DeleteRow(table, startRowIndex);
       NS_ENSURE_SUCCESS(rv, rv);
@@ -2914,46 +2909,45 @@ HTMLEditor::GetCellFromRange(nsRange* aR
                              nsIDOMElement** aCell)
 {
   // Note: this might return a node that is outside of the range.
   // Use carefully.
   NS_ENSURE_TRUE(aRange && aCell, NS_ERROR_NULL_POINTER);
 
   *aCell = nullptr;
 
-  nsCOMPtr<nsIDOMNode> startContainer;
-  nsresult rv = aRange->GetStartContainer(getter_AddRefs(startContainer));
-  NS_ENSURE_SUCCESS(rv, rv);
-  NS_ENSURE_TRUE(startContainer, NS_ERROR_FAILURE);
+  nsCOMPtr<nsINode> startContainer = aRange->GetStartContainer();
+  if (NS_WARN_IF(!startContainer)) {
+    return NS_ERROR_FAILURE;
+  }
 
   uint32_t startOffset = aRange->StartOffset();
 
-  nsCOMPtr<nsIDOMNode> childNode =
-    GetChildAt(startContainer, static_cast<int32_t>(startOffset));
+  nsCOMPtr<nsINode> childNode =
+    startContainer->GetChildAt(static_cast<int32_t>(startOffset));
   // This means selection is probably at a text node (or end of doc?)
   if (!childNode) {
     return NS_ERROR_FAILURE;
   }
 
-  nsCOMPtr<nsIDOMNode> endContainer;
-  rv = aRange->GetEndContainer(getter_AddRefs(endContainer));
-  NS_ENSURE_SUCCESS(rv, rv);
-  NS_ENSURE_TRUE(startContainer, NS_ERROR_FAILURE);
+  nsCOMPtr<nsINode> endContainer = aRange->GetEndContainer();
+  if (NS_WARN_IF(!endContainer)) {
+    return NS_ERROR_FAILURE;
+  }
 
   // If a cell is deleted, the range is collapse
   //   (startOffset == aRange->EndOffset())
   //   so tell caller the cell wasn't found
   if (startContainer == endContainer &&
       aRange->EndOffset() == startOffset+1 &&
       HTMLEditUtils::IsTableCell(childNode)) {
     // Should we also test if frame is selected? (Use GetCellDataAt())
     // (Let's not for now -- more efficient)
     nsCOMPtr<nsIDOMElement> cellElement = do_QueryInterface(childNode);
-    *aCell = cellElement.get();
-    NS_ADDREF(*aCell);
+    cellElement.forget(aCell);
     return NS_OK;
   }
   return NS_SUCCESS_EDITOR_ELEMENT_NOT_FOUND;
 }
 
 NS_IMETHODIMP
 HTMLEditor::GetFirstSelectedCell(nsIDOMRange** aRange,
                                  nsIDOMElement** aCell)
--- a/editor/libeditor/SelectionState.cpp
+++ b/editor/libeditor/SelectionState.cpp
@@ -89,19 +89,17 @@ SelectionState::RestoreSelection(Selecti
 bool
 SelectionState::IsCollapsed()
 {
   if (mArray.Length() != 1) {
     return false;
   }
   RefPtr<nsRange> range = mArray[0]->GetRange();
   NS_ENSURE_TRUE(range, false);
-  bool bIsCollapsed = false;
-  range->GetCollapsed(&bIsCollapsed);
-  return bIsCollapsed;
+  return range->Collapsed();
 }
 
 bool
 SelectionState::IsEqual(SelectionState* aSelState)
 {
   NS_ENSURE_TRUE(aSelState, false);
   size_t myCount = mArray.Length(), itsCount = aSelState->mArray.Length();
   if (myCount != itsCount) {
--- a/editor/txtsvc/nsFilteredContentIterator.cpp
+++ b/editor/txtsvc/nsFilteredContentIterator.cpp
@@ -225,50 +225,48 @@ nsFilteredContentIterator::Last()
   bool didCross;
   CheckAdvNode(node, didCross, eBackward);
 }
 
 ///////////////////////////////////////////////////////////////////////////
 // ContentToParentOffset: returns the content node's parent and offset.
 //
 static void
-ContentToParentOffset(nsIContent *aContent, nsIDOMNode **aParent,
-                      int32_t *aOffset)
+ContentToParentOffset(nsIContent* aContent, nsIContent** aParent,
+                      int32_t* aOffset)
 {
   if (!aParent || !aOffset)
     return;
 
   *aParent = nullptr;
   *aOffset  = 0;
 
   if (!aContent)
     return;
 
-  nsIContent* parent = aContent->GetParent();
-
+  nsCOMPtr<nsIContent> parent = aContent->GetParent();
   if (!parent)
     return;
 
   *aOffset = parent->IndexOf(aContent);
-
-  CallQueryInterface(parent, aParent);
+  parent.forget(aParent);
 }
 
 ///////////////////////////////////////////////////////////////////////////
 // ContentIsInTraversalRange: returns true if content is visited during
 // the traversal of the range in the specified mode.
 //
 static bool
-ContentIsInTraversalRange(nsIContent *aContent,   bool aIsPreMode,
-                          nsIDOMNode *aStartContainer, int32_t aStartOffset,
-                          nsIDOMNode *aEndContainer, int32_t aEndOffset)
+ContentIsInTraversalRange(nsIContent* aContent, bool aIsPreMode,
+                          nsINode* aStartContainer, int32_t aStartOffset,
+                          nsINode* aEndContainer, int32_t aEndOffset)
 {
   NS_ENSURE_TRUE(aStartContainer && aEndContainer && aContent, false);
 
-  nsCOMPtr<nsIDOMNode> parentNode;
+  nsCOMPtr<nsIContent> parentNode;
   int32_t indx = 0;
 
   ContentToParentOffset(aContent, getter_AddRefs(parentNode), &indx);
 
   NS_ENSURE_TRUE(parentNode, false);
 
   if (!aIsPreMode)
     ++indx;
@@ -282,27 +280,21 @@ ContentIsInTraversalRange(nsIContent *aC
 }
 
 static bool
 ContentIsInTraversalRange(nsRange* aRange, nsIDOMNode* aNextNode, bool aIsPreMode)
 {
   nsCOMPtr<nsIContent> content(do_QueryInterface(aNextNode));
   NS_ENSURE_TRUE(content && aRange, false);
 
-  nsCOMPtr<nsIDOMNode> sNode;
-  nsCOMPtr<nsIDOMNode> eNode;
-  uint32_t sOffset;
-  uint32_t eOffset;
-  aRange->GetStartContainer(getter_AddRefs(sNode));
-  aRange->GetStartOffset(&sOffset);
-  aRange->GetEndContainer(getter_AddRefs(eNode));
-  aRange->GetEndOffset(&eOffset);
   return ContentIsInTraversalRange(content, aIsPreMode,
-                                   sNode, static_cast<int32_t>(sOffset),
-                                   eNode, static_cast<int32_t>(eOffset));
+                                   aRange->GetStartContainer(),
+                                   static_cast<int32_t>(aRange->StartOffset()),
+                                   aRange->GetEndContainer(),
+                                   static_cast<int32_t>(aRange->EndOffset()));
 }
 
 //------------------------------------------------------------
 // Helper function to advance to the next or previous node
 nsresult
 nsFilteredContentIterator::AdvanceNode(nsIDOMNode* aNode, nsIDOMNode*& aNewNode, eDirectionType aDir)
 {
   nsCOMPtr<nsIDOMNode> nextNode;
--- a/editor/txtsvc/nsTextServicesDocument.cpp
+++ b/editor/txtsvc/nsTextServicesDocument.cpp
@@ -526,24 +526,16 @@ nsTextServicesDocument::LastSelectedBloc
       return rv;
     }
 
     if (!parent) {
       UNLOCK_DOC(this);
       return NS_ERROR_FAILURE;
     }
 
-    uint32_t offset;
-    rv = range->GetStartOffset(&offset);
-
-    if (NS_FAILED(rv)) {
-      UNLOCK_DOC(this);
-      return rv;
-    }
-
     if (IsTextNode(parent)) {
       // The caret is in a text node. Find the beginning
       // of the text block containing this text node and
       // return.
 
       nsCOMPtr<nsIContent> content(do_QueryInterface(parent));
 
       if (!content) {
@@ -587,33 +579,25 @@ nsTextServicesDocument::LastSelectedBloc
       }
     } else {
       // The caret isn't in a text node. Create an iterator
       // based on a range that extends from the current caret
       // position to the end of the document, then walk forwards
       // till you find a text node, then find the beginning of it's block.
 
       rv = CreateDocumentContentRootToNodeOffsetRange(
-             parent, static_cast<int32_t>(offset), false,
+             parent, range->StartOffset(), false,
              getter_AddRefs(range));
 
       if (NS_FAILED(rv)) {
         UNLOCK_DOC(this);
         return rv;
       }
 
-      bool isCollapsed;
-      rv = range->GetCollapsed(&isCollapsed);
-
-      if (NS_FAILED(rv)) {
-        UNLOCK_DOC(this);
-        return rv;
-      }
-
-      if (isCollapsed) {
+      if (range->Collapsed()) {
         // If we get here, the range is collapsed because there is nothing after
         // the caret! Just return NS_OK;
 
         UNLOCK_DOC(this);
         return NS_OK;
       }
 
       rv = CreateContentIterator(range, getter_AddRefs(iter));
@@ -783,41 +767,26 @@ nsTextServicesDocument::LastSelectedBloc
     return rv;
   }
 
   if (!parent) {
     UNLOCK_DOC(this);
     return NS_ERROR_FAILURE;
   }
 
-  uint32_t offset;
-  rv = range->GetEndOffset(&offset);
+  rv = CreateDocumentContentRootToNodeOffsetRange(
+         parent, range->EndOffset(), false,
+         getter_AddRefs(range));
 
   if (NS_FAILED(rv)) {
     UNLOCK_DOC(this);
     return rv;
   }
 
-  rv = CreateDocumentContentRootToNodeOffsetRange(
-         parent, static_cast<int32_t>(offset), false, getter_AddRefs(range));
-
-  if (NS_FAILED(rv)) {
-    UNLOCK_DOC(this);
-    return rv;
-  }
-
-  bool isCollapsed;
-  rv = range->GetCollapsed(&isCollapsed);
-
-  if (NS_FAILED(rv)) {
-    UNLOCK_DOC(this);
-    return rv;
-  }
-
-  if (isCollapsed) {
+  if (range->Collapsed()) {
     // If we get here, the range is collapsed because there is nothing after
     // the current selection! Just return NS_OK;
 
     UNLOCK_DOC(this);
     return NS_OK;
   }
 
   rv = CreateContentIterator(range, getter_AddRefs(iter));
@@ -1885,36 +1854,30 @@ nsTextServicesDocument::CreateDocumentCo
   NS_ENSURE_SUCCESS(rv, rv);
 
   range.forget(aRange);
   return NS_OK;
 }
 
 nsresult
 nsTextServicesDocument::CreateDocumentContentRootToNodeOffsetRange(
-    nsIDOMNode* aParent, int32_t aOffset, bool aToStart, nsRange** aRange)
+    nsIDOMNode* aParent, uint32_t aOffset, bool aToStart, nsRange** aRange)
 {
   NS_ENSURE_TRUE(aParent && aRange, NS_ERROR_NULL_POINTER);
 
-  *aRange = 0;
-
-  NS_ASSERTION(aOffset >= 0, "Invalid offset!");
-
-  if (aOffset < 0) {
-    return NS_ERROR_FAILURE;
-  }
+  *aRange = nullptr;
 
   nsCOMPtr<nsIDOMNode> bodyNode;
   nsresult rv = GetDocumentContentRootNode(getter_AddRefs(bodyNode));
   NS_ENSURE_SUCCESS(rv, rv);
   NS_ENSURE_TRUE(bodyNode, NS_ERROR_NULL_POINTER);
 
   nsCOMPtr<nsIDOMNode> startNode;
   nsCOMPtr<nsIDOMNode> endNode;
-  int32_t startOffset, endOffset;
+  uint32_t startOffset, endOffset;
 
   if (aToStart) {
     // The range should begin at the start of the document
     // and extend up until (aParent, aOffset).
 
     startNode   = bodyNode;
     startOffset = 0;
     endNode     = aParent;
@@ -1923,17 +1886,17 @@ nsTextServicesDocument::CreateDocumentCo
     // The range should begin at (aParent, aOffset) and
     // extend to the end of the document.
 
     startNode   = aParent;
     startOffset = aOffset;
     endNode     = bodyNode;
 
     nsCOMPtr<nsINode> body = do_QueryInterface(bodyNode);
-    endOffset = body ? int32_t(body->GetChildCount()) : 0;
+    endOffset = body ? body->GetChildCount() : 0;
   }
 
   return nsRange::CreateRange(startNode, startOffset, endNode, endOffset,
                               aRange);
 }
 
 nsresult
 nsTextServicesDocument::CreateDocumentContentIterator(nsIContentIterator **aIterator)
@@ -2358,19 +2321,17 @@ nsTextServicesDocument::GetCollapsedSele
 
   nsCOMPtr<nsIDOMNode> domParent;
   rv = range->GetStartContainer(getter_AddRefs(domParent));
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsINode> parent = do_QueryInterface(domParent);
   MOZ_ASSERT(parent);
 
-  uint32_t offset;
-  rv = range->GetStartOffset(&offset);
-  NS_ENSURE_SUCCESS(rv, rv);
+  uint32_t offset = range->StartOffset();
 
   int32_t e1s1 = nsContentUtils::ComparePoints(eStart->mNode, eStartOffset,
                                                domParent,
                                                static_cast<int32_t>(offset));
   int32_t e2s1 = nsContentUtils::ComparePoints(eEnd->mNode, eEndOffset,
                                                domParent,
                                                static_cast<int32_t>(offset));
 
@@ -2801,34 +2762,25 @@ nsTextServicesDocument::GetRangeEndPoint
                  aEndContainer && aEndOffset, NS_ERROR_NULL_POINTER);
 
   nsresult rv = aRange->GetStartContainer(aStartContainer);
 
   NS_ENSURE_SUCCESS(rv, rv);
 
   NS_ENSURE_TRUE(aStartContainer, NS_ERROR_FAILURE);
 
-  uint32_t offset;
-  rv = aRange->GetStartOffset(&offset);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-  *aStartOffset = static_cast<int32_t>(offset);
+  *aStartOffset = static_cast<int32_t>(aRange->StartOffset());
 
   rv = aRange->GetEndContainer(aEndContainer);
 
   NS_ENSURE_SUCCESS(rv, rv);
 
   NS_ENSURE_TRUE(aEndContainer, NS_ERROR_FAILURE);
 
-  rv = aRange->GetEndOffset(&offset);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-  *aEndOffset = static_cast<int32_t>(offset);
+  *aEndOffset = static_cast<int32_t>(aRange->EndOffset());
   return NS_OK;
 }
 
 nsresult
 nsTextServicesDocument::CreateRange(nsIDOMNode* aStartContainer,
                                     int32_t aStartOffset,
                                     nsIDOMNode* aEndContainer,
                                     int32_t aEndOffset,
--- a/editor/txtsvc/nsTextServicesDocument.h
+++ b/editor/txtsvc/nsTextServicesDocument.h
@@ -173,17 +173,17 @@ private:
   /* nsTextServicesDocument private methods. */
 
   nsresult CreateContentIterator(nsRange* aRange,
                                  nsIContentIterator** aIterator);
 
   nsresult GetDocumentContentRootNode(nsIDOMNode **aNode);
   nsresult CreateDocumentContentRange(nsRange** aRange);
   nsresult CreateDocumentContentRootToNodeOffsetRange(nsIDOMNode* aParent,
-                                                      int32_t aOffset,
+                                                      uint32_t aOffset,
                                                       bool aToStart,
                                                       nsRange** aRange);
   nsresult CreateDocumentContentIterator(nsIContentIterator **aIterator);
 
   nsresult AdjustContentIterator();
 
   static nsresult FirstTextNode(nsIContentIterator *aIterator, TSDIteratorStatus *IteratorStatus);
   static nsresult LastTextNode(nsIContentIterator *aIterator, TSDIteratorStatus *IteratorStatus);
--- a/gfx/2d/BaseRect.h
+++ b/gfx/2d/BaseRect.h
@@ -201,16 +201,21 @@ struct BaseRect {
   void SetRect(T aX, T aY, T aWidth, T aHeight)
   {
     x = aX; y = aY; width = aWidth; height = aHeight;
   }
   void SetRect(const Point& aPt, const SizeT& aSize)
   {
     SetRect(aPt.x, aPt.y, aSize.width, aSize.height);
   }
+  void GetRect(T* aX, T* aY, T* aWidth, T* aHeight)
+  {
+    *aX = x; *aY = y; *aWidth = width; *aHeight = height;
+  }
+
   void MoveTo(T aX, T aY) { x = aX; y = aY; }
   void MoveTo(const Point& aPoint) { x = aPoint.x; y = aPoint.y; }
   void MoveBy(T aDx, T aDy) { x += aDx; y += aDy; }
   void MoveBy(const Point& aPoint) { x += aPoint.x; y += aPoint.y; }
   void SizeTo(T aWidth, T aHeight) { width = aWidth; height = aHeight; }
   void SizeTo(const SizeT& aSize) { width = aSize.width; height = aSize.height; }
 
   void Inflate(T aD) { Inflate(aD, aD); }
--- a/gfx/layers/apz/src/HitTestingTreeNode.cpp
+++ b/gfx/layers/apz/src/HitTestingTreeNode.cpp
@@ -333,24 +333,26 @@ HitTestingTreeNode::GetVisibleRegion() c
 }
 
 void
 HitTestingTreeNode::Dump(const char* aPrefix) const
 {
   if (mPrevSibling) {
     mPrevSibling->Dump(aPrefix);
   }
-  printf_stderr("%sHitTestingTreeNode (%p) APZC (%p) g=(%s) %s%s%sr=(%s) t=(%s) c=(%s)\n",
+  printf_stderr("%sHitTestingTreeNode (%p) APZC (%p) g=(%s) %s%s%sr=(%s) t=(%s) c=(%s)%s%s\n",
     aPrefix, this, mApzc.get(),
     mApzc ? Stringify(mApzc->GetGuid()).c_str() : nsPrintfCString("l=%" PRIu64, mLayersId).get(),
     (mOverride & EventRegionsOverride::ForceDispatchToContent) ? "fdtc " : "",
     (mOverride & EventRegionsOverride::ForceEmptyHitRegion) ? "fehr " : "",
     (mFixedPosTarget != FrameMetrics::NULL_SCROLL_ID) ? nsPrintfCString("fixed=%" PRIu64 " ", mFixedPosTarget).get() : "",
     Stringify(mEventRegions).c_str(), Stringify(mTransform).c_str(),
-    mClipRegion ? Stringify(mClipRegion.ref()).c_str() : "none");
+    mClipRegion ? Stringify(mClipRegion.ref()).c_str() : "none",
+    mIsScrollbarContainer ? " scrollbar" : "",
+    IsScrollThumbNode() ? " scrollthumb" : "");
   if (mLastChild) {
     mLastChild->Dump(nsPrintfCString("%s  ", aPrefix).get());
   }
 }
 
 void
 HitTestingTreeNode::SetApzcParent(AsyncPanZoomController* aParent)
 {
--- a/gfx/layers/wr/WebRenderLayerManager.cpp
+++ b/gfx/layers/wr/WebRenderLayerManager.cpp
@@ -725,17 +725,22 @@ WebRenderLayerManager::EndTransactionInt
       mLayerScrollData.emplace_back();
       mLayerScrollData.back().InitializeRoot(mLayerScrollData.size() - 1);
       if (aDisplayListBuilder->IsBuildingLayerEventRegions()) {
         nsIPresShell* shell = aDisplayListBuilder->RootReferenceFrame()->PresContext()->PresShell();
         if (nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(shell)) {
           mLayerScrollData.back().SetEventRegionsOverride(EventRegionsOverride::ForceDispatchToContent);
         }
       }
-      if (Maybe<ScrollMetadata> rootMetadata = nsLayoutUtils::GetRootMetadata(aDisplayListBuilder, nullptr, ContainerLayerParameters())) {
+      RefPtr<WebRenderLayerManager> self(this);
+      auto callback = [self](FrameMetrics::ViewID aScrollId) -> bool {
+        return self->mScrollData.HasMetadataFor(aScrollId);
+      };
+      if (Maybe<ScrollMetadata> rootMetadata = nsLayoutUtils::GetRootMetadata(
+            aDisplayListBuilder, nullptr, ContainerLayerParameters(), callback)) {
         mLayerScrollData.back().AppendScrollMetadata(mScrollData, rootMetadata.ref());
       }
       // Append the WebRenderLayerScrollData items into WebRenderScrollData
       // in reverse order, from topmost to bottommost. This is in keeping with
       // the semantics of WebRenderScrollData.
       for (auto i = mLayerScrollData.crbegin(); i != mLayerScrollData.crend(); i++) {
         mScrollData.AddLayerData(*i);
       }
--- a/gfx/layers/wr/WebRenderScrollData.cpp
+++ b/gfx/layers/wr/WebRenderScrollData.cpp
@@ -209,16 +209,22 @@ WebRenderScrollData::GetLayerData(size_t
 
 const ScrollMetadata&
 WebRenderScrollData::GetScrollMetadata(size_t aIndex) const
 {
   MOZ_ASSERT(aIndex < mScrollMetadatas.Length());
   return mScrollMetadatas[aIndex];
 }
 
+bool
+WebRenderScrollData::HasMetadataFor(const FrameMetrics::ViewID& aScrollId) const
+{
+  return mScrollIdMap.find(aScrollId) != mScrollIdMap.end();
+}
+
 void
 WebRenderScrollData::SetFocusTarget(const FocusTarget& aFocusTarget)
 {
   mFocusTarget = aFocusTarget;
 }
 
 void
 WebRenderScrollData::SetIsFirstPaint()
--- a/gfx/layers/wr/WebRenderScrollData.h
+++ b/gfx/layers/wr/WebRenderScrollData.h
@@ -147,16 +147,17 @@ public:
   size_t GetLayerCount() const;
 
   // Return a pointer to the scroll data at the given index. Use with caution,
   // as the pointer may be invalidated if this WebRenderScrollData is mutated.
   WebRenderLayerScrollData* GetLayerDataMutable(size_t aIndex);
   const WebRenderLayerScrollData* GetLayerData(size_t aIndex) const;
 
   const ScrollMetadata& GetScrollMetadata(size_t aIndex) const;
+  bool HasMetadataFor(const FrameMetrics::ViewID& aScrollId) const;
 
   const FocusTarget& GetFocusTarget() const { return mFocusTarget; }
   void SetFocusTarget(const FocusTarget& aFocusTarget);
 
   void SetIsFirstPaint();
   bool IsFirstPaint() const;
   void SetPaintSequenceNumber(uint32_t aPaintSequenceNumber);
   uint32_t GetPaintSequenceNumber() const;
--- a/gfx/thebes/gfxPrefs.h
+++ b/gfx/thebes/gfxPrefs.h
@@ -663,16 +663,17 @@ private:
 #ifdef XP_WIN
   DECL_GFX_PREF(Live, "media.windows-media-foundation.allow-d3d11-dxva", PDMWMFAllowD3D11, bool, true);
   DECL_GFX_PREF(Live, "media.windows-media-foundation.max-dxva-videos", PDMWMFMaxDXVAVideos, uint32_t, 8);
   DECL_GFX_PREF(Live, "media.windows-media-foundation.use-nv12-format", PDMWMFUseNV12Format, bool, true);
   DECL_GFX_PREF(Once, "media.windows-media-foundation.use-sync-texture", PDMWMFUseSyncTexture, bool, true);
   DECL_GFX_PREF(Live, "media.wmf.low-latency.enabled", PDMWMFLowLatencyEnabled, bool, false);
   DECL_GFX_PREF(Live, "media.wmf.skip-blacklist", PDMWMFSkipBlacklist, bool, false);
   DECL_GFX_PREF(Live, "media.wmf.deblacklisting-for-telemetry-in-gpu-process", PDMWMFDeblacklistingForTelemetryInGPUProcess, bool, false);
+  DECL_GFX_PREF(Live, "media.wmf.amd.vp9.enabled", PDMWMFAMDVP9DecoderEnabled, bool, true);
 #endif
 
   // These affect how line scrolls from wheel events will be accelerated.
   DECL_GFX_PREF(Live, "mousewheel.acceleration.factor",        MouseWheelAccelerationFactor, int32_t, -1);
   DECL_GFX_PREF(Live, "mousewheel.acceleration.start",         MouseWheelAccelerationStart, int32_t, -1);
 
   // This affects whether events will be routed through APZ or not.
   DECL_GFX_PREF(Live, "mousewheel.system_scroll_override_on_root_content.enabled",
--- a/image/test/mochitest/test_xultree_animation.xhtml
+++ b/image/test/mochitest/test_xultree_animation.xhtml
@@ -47,17 +47,17 @@ Mozilla Bug 666446: lots of animated gif
 <div id="debug" style="display:none"></div>
 <pre id="test">
 <script type="text/javascript">
 
 /** Test for Bug 666446 nsSVGFEImageElement/RasterImage**/
 
 if (SpecialPowers.DOMWindowUtils.isStyledByServo) {
   // Stylo currently asserts for any XUL bits.
-  SimpleTest.expectAssertions(9, 9);
+  SimpleTest.expectAssertions(7, 7);
 }
 
 const FAILURE_TIMEOUT = 5000; // Fail early after 120 seconds (2 minutes)
 
 function main() {
   var animTest = new AnimationTest(20, FAILURE_TIMEOUT, 'referenceItem',
                                    'imageItem', 'debug', '',
                                    'animated-gif-finalframe.gif', true);
--- a/js/src/builtin/Eval.cpp
+++ b/js/src/builtin/Eval.cpp
@@ -464,17 +464,19 @@ js::ExecuteInGlobalAndReturnScope(JSCont
     }
 
     Rooted<EnvironmentObject*> env(cx, NonSyntacticVariablesObject::create(cx));
     if (!env)
         return false;
 
     // Unlike the non-syntactic scope chain API used by the subscript loader,
     // this API creates a fresh block scope each time.
-    env = LexicalEnvironmentObject::createNonSyntactic(cx, env);
+    //
+    // NOTE: Gecko FrameScripts expect lexical |this| to be the global.
+    env = LexicalEnvironmentObject::createNonSyntactic(cx, env, global);
     if (!env)
         return false;
 
     RootedValue rval(cx);
     if (!ExecuteKernel(cx, script, *env, UndefinedValue(),
                        NullFramePtr() /* evalInFrame */, rval.address()))
     {
         return false;
--- a/js/src/jit/IonBuilder.cpp
+++ b/js/src/jit/IonBuilder.cpp
@@ -12443,18 +12443,24 @@ IonBuilder::jsop_functionthis()
     // Hard case: |this| may be a primitive we have to wrap.
     MDefinition* def = current->getSlot(info().thisSlot());
 
     if (def->type() == MIRType::Object) {
         current->push(def);
         return Ok();
     }
 
+    // Beyond this point we may need to access non-syntactic global. Ion doesn't
+    // currently support this so just abort.
+    if (script()->hasNonSyntacticScope())
+        return abort(AbortReason::Disable, "JSOP_FUNCTIONTHIS would need non-syntactic global");
+
     if (IsNullOrUndefined(def->type())) {
-        pushConstant(GetThisValue(&script()->global()));
+        LexicalEnvironmentObject* globalLexical = &script()->global().lexicalEnvironment();
+        pushConstant(globalLexical->thisValue());
         return Ok();
     }
 
     MComputeThis* thisObj = MComputeThis::New(alloc(), def);
     current->add(thisObj);
     current->push(thisObj);
 
     return resumeAfter(thisObj);
--- a/js/src/jscompartment.cpp
+++ b/js/src/jscompartment.cpp
@@ -577,17 +577,17 @@ JSCompartment::getOrCreateNonSyntacticLe
     RootedObject key(cx, enclosing);
     if (enclosing->is<WithEnvironmentObject>()) {
         MOZ_ASSERT(!enclosing->as<WithEnvironmentObject>().isSyntactic());
         key = &enclosing->as<WithEnvironmentObject>().object();
     }
     RootedObject lexicalEnv(cx, nonSyntacticLexicalEnvironments_->lookup(key));
 
     if (!lexicalEnv) {
-        lexicalEnv = LexicalEnvironmentObject::createNonSyntactic(cx, enclosing);
+        lexicalEnv = LexicalEnvironmentObject::createNonSyntactic(cx, enclosing, enclosing);
         if (!lexicalEnv)
             return nullptr;
         if (!nonSyntacticLexicalEnvironments_->add(cx, key, lexicalEnv))
             return nullptr;
     }
 
     return &lexicalEnv->as<LexicalEnvironmentObject>();
 }
--- a/js/src/jsobj.cpp
+++ b/js/src/jsobj.cpp
@@ -3266,19 +3266,16 @@ js::GetThisValue(JSObject* obj)
     }
 
     if (obj->is<ModuleEnvironmentObject>())
         return UndefinedValue();
 
     if (obj->is<WithEnvironmentObject>())
         return ObjectValue(*obj->as<WithEnvironmentObject>().withThis());
 
-    if (obj->is<NonSyntacticVariablesObject>())
-        return GetThisValue(obj->enclosingEnvironment());
-
     return ObjectValue(*obj);
 }
 
 class GetObjectSlotNameFunctor : public JS::CallbackTracer::ContextFunctor
 {
     JSObject* obj;
 
   public:
--- a/js/src/vm/EnvironmentObject.cpp
+++ b/js/src/vm/EnvironmentObject.cpp
@@ -972,31 +972,33 @@ LexicalEnvironmentObject::createGlobal(J
     if (!JSObject::setSingleton(cx, env))
         return nullptr;
 
     env->initThisValue(global);
     return env;
 }
 
 /* static */ LexicalEnvironmentObject*
-LexicalEnvironmentObject::createNonSyntactic(JSContext* cx, HandleObject enclosing)
+LexicalEnvironmentObject::createNonSyntactic(JSContext* cx, HandleObject enclosing,
+                                             HandleObject thisv)
 {
     MOZ_ASSERT(enclosing);
     MOZ_ASSERT(!IsSyntacticEnvironment(enclosing));
 
     RootedShape shape(cx, LexicalScope::getEmptyExtensibleEnvironmentShape(cx));
     if (!shape)
         return nullptr;
 
     LexicalEnvironmentObject* env =
         LexicalEnvironmentObject::createTemplateObject(cx, shape, enclosing, gc::TenuredHeap);
     if (!env)
         return nullptr;
 
-    env->initThisValue(enclosing);
+    env->initThisValue(thisv);
+
     return env;
 }
 
 /* static */ LexicalEnvironmentObject*
 LexicalEnvironmentObject::createHollowForDebug(JSContext* cx, Handle<LexicalScope*> scope)
 {
     MOZ_ASSERT(!scope->hasEnvironment());
 
--- a/js/src/vm/EnvironmentObject.h
+++ b/js/src/vm/EnvironmentObject.h
@@ -505,17 +505,18 @@ class LexicalEnvironmentObject : public 
     }
 
   public:
     static LexicalEnvironmentObject* create(JSContext* cx, Handle<LexicalScope*> scope,
                                             HandleObject enclosing, gc::InitialHeap heap);
     static LexicalEnvironmentObject* create(JSContext* cx, Handle<LexicalScope*> scope,
                                             AbstractFramePtr frame);
     static LexicalEnvironmentObject* createGlobal(JSContext* cx, Handle<GlobalObject*> global);
-    static LexicalEnvironmentObject* createNonSyntactic(JSContext* cx, HandleObject enclosing);
+    static LexicalEnvironmentObject* createNonSyntactic(JSContext* cx, HandleObject enclosing,
+                                                        HandleObject thisv);
     static LexicalEnvironmentObject* createHollowForDebug(JSContext* cx,
                                                           Handle<LexicalScope*> scope);
 
     // Create a new LexicalEnvironmentObject with the same enclosing env and
     // variable values as this.
     static LexicalEnvironmentObject* clone(JSContext* cx, Handle<LexicalEnvironmentObject*> env);
 
     // Create a new LexicalEnvironmentObject with the same enclosing env as
@@ -1078,16 +1079,24 @@ IsExtensibleLexicalEnvironment(JSObject*
 
 inline bool
 IsGlobalLexicalEnvironment(JSObject* env)
 {
     return env->is<LexicalEnvironmentObject>() &&
            env->as<LexicalEnvironmentObject>().isGlobal();
 }
 
+inline bool
+IsNSVOLexicalEnvironment(JSObject* env)
+{
+    return env->is<LexicalEnvironmentObject>() &&
+           env->as<LexicalEnvironmentObject>().enclosingEnvironment()
+                                              .is<NonSyntacticVariablesObject>();
+}
+
 inline JSObject*
 MaybeUnwrapWithEnvironment(JSObject* env)
 {
     if (env->is<WithEnvironmentObject>())
         return &env->as<WithEnvironmentObject>().object();
     return env;
 }
 
--- a/js/src/vm/Interpreter.cpp
+++ b/js/src/vm/Interpreter.cpp
@@ -90,17 +90,17 @@ js::BoxNonStrictThis(JSContext* cx, Hand
 {
     /*
      * Check for SynthesizeFrame poisoning and fast constructors which
      * didn't check their callee properly.
      */
     MOZ_ASSERT(!thisv.isMagic());
 
     if (thisv.isNullOrUndefined()) {
-        vp.set(GetThisValue(cx->global()));
+        vp.set(cx->global()->lexicalEnvironment().thisValue());
         return true;
     }
 
     if (thisv.isObject()) {
         vp.set(thisv);
         return true;
     }
 
@@ -122,16 +122,41 @@ js::GetFunctionThis(JSContext* cx, Abstr
         frame.callee()->strict() ||
         frame.callee()->isSelfHostedBuiltin())
     {
         res.set(frame.thisArgument());
         return true;
     }
 
     RootedValue thisv(cx, frame.thisArgument());
+
+    // If there is a NSVO on environment chain, use it as basis for fallback
+    // global |this|. This gives a consistent definition of global lexical
+    // |this| between function and global contexts.
+    //
+    // NOTE: If only non-syntactic WithEnvironments are on the chain, we use
+    // the global lexical |this| value.
+    if (frame.script()->hasNonSyntacticScope() && thisv.isNullOrUndefined()) {
+        RootedObject env(cx, frame.environmentChain());
+        while (true) {
+            if (IsNSVOLexicalEnvironment(env) || IsGlobalLexicalEnvironment(env)) {
+                res.set(GetThisValue(env));
+                return true;
+            }
+            if (!env->enclosingEnvironment()) {
+                // This can only happen in Debugger eval frames: in that case we
+                // don't always have a global lexical env, see EvaluateInEnv.
+                MOZ_ASSERT(env->is<GlobalObject>());
+                res.set(GetThisValue(env));
+                return true;
+            }
+            env = env->enclosingEnvironment();
+        }
+    }
+
     return BoxNonStrictThis(cx, thisv, res);
 }
 
 void
 js::GetNonSyntacticGlobalThis(JSContext* cx, HandleObject envChain, MutableHandleValue res)
 {
     RootedObject env(cx, envChain);
     while (true) {
@@ -1462,16 +1487,19 @@ JS_STATIC_ASSERT(JSOP_IFNE == JSOP_IFEQ 
  * global.
  */
 static inline Value
 ComputeImplicitThis(JSObject* obj)
 {
     if (obj->is<GlobalObject>())
         return UndefinedValue();
 
+    if (obj->is<NonSyntacticVariablesObject>())
+        return UndefinedValue();
+
     if (IsCacheableEnvironment(obj))
         return UndefinedValue();
 
     // Debugger environments need special casing, as despite being
     // non-syntactic, they wrap syntactic environments and should not be
     // treated like other embedding-specific non-syntactic environments.
     if (obj->is<DebugEnvironmentProxy>())
         return ComputeImplicitThis(&obj->as<DebugEnvironmentProxy>().environment());
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -7593,32 +7593,16 @@ nsCSSFrameConstructor::StyleNewChildRang
       if (MOZ_LIKELY(parent) && parent->HasServoData()) {
         styleSet->StyleNewChildren(parent);
       }
     }
   }
 }
 
 void
-nsCSSFrameConstructor::StyleChildRangeForReconstruct(nsIContent* aStartChild,
-                                                     nsIContent* aEndChild)
-{
-  ServoStyleSet* styleSet = mPresShell->StyleSet()->AsServo();
-
-  // We take a parallelism hit here, since we don't have a great API to pass
-  // a range of elements to style to Servo.
-  for (nsIContent* child = aStartChild; child != aEndChild;
-       child = child->GetNextSibling()) {
-    if (child->IsElement()) {
-      styleSet->StyleSubtreeForReconstruct(child->AsElement());
-    }
-  }
-}
-
-void
 nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer,
                                        nsIContent* aFirstNewContent,
                                        bool aAllowLazyConstruction,
                                        bool aForReconstruction,
                                        TreeMatchContext* aProvidedTreeMatchContext)
 {
   MOZ_ASSERT(!aProvidedTreeMatchContext || !aAllowLazyConstruction);
   MOZ_ASSERT(!aAllowLazyConstruction || !RestyleManager()->IsInStyleRefresh());
@@ -7697,22 +7681,18 @@ nsCSSFrameConstructor::ContentAppended(n
       if (isNewlyAddedContentForServo) {
         LazilyStyleNewChildRange(aFirstNewContent, nullptr);
       }
       return;
     }
   }
 
   // We couldn't construct lazily. Make Servo eagerly traverse the new content.
-  if (aContainer->IsStyledByServo()) {
-    if (aForReconstruction) {
-      StyleChildRangeForReconstruct(aFirstNewContent, nullptr);
-    } else {
-      StyleNewChildRange(aFirstNewContent, nullptr);
-    }
+  if (isNewlyAddedContentForServo) {
+    StyleNewChildRange(aFirstNewContent, nullptr);
   }
 
   if (isNewShadowTreeContent) {
     // Recreate frames if content is appended into a ShadowRoot
     // because children of ShadowRoot are rendered in place of children
     // of the host.
     //XXXsmaug This is super unefficient!
     nsIContent* bindingParent = aContainer->GetBindingParent();
@@ -8186,22 +8166,18 @@ nsCSSFrameConstructor::ContentRangeInser
       if (isNewlyAddedContentForServo) {
         LazilyStyleNewChildRange(aStartChild, aEndChild);
       }
       return;
     }
   }
 
   // We couldn't construct lazily. Make Servo eagerly traverse the new content.
-  if (aContainer->IsStyledByServo()) {
-    if (aForReconstruction) {
-      StyleChildRangeForReconstruct(aStartChild, aEndChild);
-    } else {
-      StyleNewChildRange(aStartChild, aEndChild);
-    }
+  if (isNewlyAddedContentForServo) {
+    StyleNewChildRange(aStartChild, aEndChild);
   }
 
   if (isNewShadowTreeContent) {
     // Recreate frames if content is inserted into a ShadowRoot
     // because children of ShadowRoot are rendered in place of
     // the children of the host.
     //XXXsmaug This is super unefficient!
     nsIContent* bindingParent = aContainer->GetBindingParent();
--- a/layout/base/nsCSSFrameConstructor.h
+++ b/layout/base/nsCSSFrameConstructor.h
@@ -180,23 +180,16 @@ private:
    * on their flattened tree parents.  This is used when content is inserted
    * into the document and we decide that we cannot do lazy frame construction.
    * It handles children being rebound to different insertion points by calling
    * StyleNewChildren on each child's flattened tree parent.  Only used when we
    * are styled by Servo.
    */
   void StyleNewChildRange(nsIContent* aStartChild, nsIContent* aEndChild);
 
-  /**
-   * Calls StyleSubtreeForReconstruct on each child in the aStartChild/aEndChild
-   * range. Only used when we are styled by Servo.
-   */
-  void StyleChildRangeForReconstruct(nsIContent* aStartChild,
-                                     nsIContent* aEndChild);
-
 public:
   /**
    * Lazy frame construction is controlled by the aAllowLazyConstruction bool
    * parameter of nsCSSFrameConstructor::ContentAppended/Inserted. It is true
    * for all inserts/appends as passed from the presshell, except for the
    * insert of the root element, which is always non-lazy. Even if the
    * aAllowLazyConstruction passed to ContentAppended/Inserted is true we still
    * may not be able to construct lazily, so we call MaybeConstructLazily.
--- a/layout/base/nsDocumentViewer.cpp
+++ b/layout/base/nsDocumentViewer.cpp
@@ -2314,17 +2314,17 @@ nsDocumentViewer::CreateStyleSet(nsIDocu
   // different sets for different media
 
   StyleBackendType backendType = aDocument->GetStyleBackendType();
 
   StyleSetHandle styleSet;
   if (backendType == StyleBackendType::Gecko) {
     styleSet = new nsStyleSet();
   } else {
-    styleSet = new ServoStyleSet();
+    styleSet = new ServoStyleSet(ServoStyleSet::Kind::Master);
   }
 
   styleSet->BeginUpdate();
 
   // The document will fill in the document sheets when we create the presshell
 
   if (aDocument->IsBeingUsedAsImage()) {
     MOZ_ASSERT(aDocument->IsSVGDocument(),
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -9067,17 +9067,18 @@ nsLayoutUtils::ComputeScrollMetadata(nsI
   }
 
   return metadata;
 }
 
 /*static*/ Maybe<ScrollMetadata>
 nsLayoutUtils::GetRootMetadata(nsDisplayListBuilder* aBuilder,
                                Layer* aRootLayer,
-                               const ContainerLayerParameters& aContainerParameters)
+                               const ContainerLayerParameters& aContainerParameters,
+                               const std::function<bool(ViewID& aScrollId)>& aCallback)
 {
   nsIFrame* frame = aBuilder->RootReferenceFrame();
   nsPresContext* presContext = frame->PresContext();
   nsIPresShell* presShell = presContext->PresShell();
   nsIDocument* document = presShell->GetDocument();
 
   // If we're using containerless scrolling, there is still one case where we
   // want the root container layer to have metrics. If the parent process is
@@ -9103,17 +9104,17 @@ nsLayoutUtils::GetRootMetadata(nsDisplay
     // The only case we don't want to do this is in non-APZ fennec, where
     // we want the root xul document to get a null scroll id so that the root
     // content document gets the first non-null scroll id.
     content = document->GetDocumentElement();
   }
 
   if (ensureMetricsForRootId && content) {
     ViewID scrollId = nsLayoutUtils::FindOrCreateIDFor(content);
-    if (aRootLayer && nsLayoutUtils::ContainsMetricsWithId(aRootLayer, scrollId)) {
+    if (aCallback(scrollId)) {
       ensureMetricsForRootId = false;
     }
   }
 
   if (addMetrics || ensureMetricsForRootId) {
     bool isRootContent = presContext->IsRootContentDocument();
 
     nsRect viewport(aBuilder->ToReferenceFrame(frame), frame->GetSize());
--- a/layout/base/nsLayoutUtils.h
+++ b/layout/base/nsLayoutUtils.h
@@ -2844,21 +2844,23 @@ public:
                                               ViewID aScrollParentId,
                                               const nsRect& aViewport,
                                               const mozilla::Maybe<nsRect>& aClipRect,
                                               bool aIsRoot,
                                               const ContainerLayerParameters& aContainerParameters);
 
   /**
    * Returns the metadata to put onto the root layer of a layer tree, if one is
-   * needed.
+   * needed. The last argument is a callback function to check if the caller
+   * already has a metadata for a given scroll id.
    */
   static mozilla::Maybe<ScrollMetadata> GetRootMetadata(nsDisplayListBuilder* aBuilder,
                                                         Layer* aRootLayer,
-                                                        const ContainerLayerParameters& aContainerParameters);
+                                                        const ContainerLayerParameters& aContainerParameters,
+                                                        const std::function<bool(ViewID& aScrollId)>& aCallback);
 
   /**
    * If the given scroll frame needs an area excluded from its composition
    * bounds due to scrollbars, return that area, otherwise return an empty
    * margin.
    * There is no need to exclude scrollbars in the following cases:
    *   - If the scroll frame is not the RCD-RSF; in that case, the composition
    *     bounds is calculated based on the scroll port which already excludes
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -2227,17 +2227,21 @@ already_AddRefed<LayerManager> nsDisplay
         containerParameters.mXScale);
     if (aBuilder->IsBuildingLayerEventRegions() &&
         nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(presShell)) {
       root->SetEventRegionsOverride(EventRegionsOverride::ForceDispatchToContent);
     } else {
       root->SetEventRegionsOverride(EventRegionsOverride::NoOverride);
     }
 
-    if (Maybe<ScrollMetadata> rootMetadata = nsLayoutUtils::GetRootMetadata(aBuilder, root, containerParameters)) {
+    auto callback = [root](FrameMetrics::ViewID aScrollId) -> bool {
+      return nsLayoutUtils::ContainsMetricsWithId(root, aScrollId);
+    };
+    if (Maybe<ScrollMetadata> rootMetadata = nsLayoutUtils::GetRootMetadata(
+          aBuilder, root, containerParameters, callback)) {
       root->SetScrollMetadata(rootMetadata.value());
     }
 
     // NS_WARNING is debug-only, so don't even bother checking the conditions in
     // a release build.
 #ifdef DEBUG
     bool usingDisplayport = false;
     if (nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame()) {
--- a/layout/reftests/async-scrolling/reftest.list
+++ b/layout/reftests/async-scrolling/reftest.list
@@ -1,8 +1,13 @@
+# this pref is only meaningful if webrender is enabled. it is reset by the
+# default-preferences line at the end of the file, and so only affects the
+# tests in this folder.
+default-preferences pref(gfx.webrender.layers-free,true)
+
 skip-if(!asyncPan) == bg-fixed-1.html bg-fixed-1-ref.html
 skip-if(!asyncPan) == bg-fixed-cover-1.html bg-fixed-cover-1-ref.html
 skip-if(!asyncPan) == bg-fixed-cover-2.html bg-fixed-cover-2-ref.html
 skip-if(!asyncPan) == bg-fixed-cover-3.html bg-fixed-cover-3-ref.html
 skip-if(!asyncPan) == bg-fixed-child.html bg-fixed-child-ref.html
 skip-if(!asyncPan) == bg-fixed-child-clip-1.html bg-fixed-child-clip-ref.html
 skip-if(!asyncPan) == bg-fixed-child-clip-2.html bg-fixed-child-clip-ref.html
 fuzzy(1,246) fuzzy-if(skiaContent,2,170) fuzzy-if(browserIsRemote&&d2d,53,185) skip-if(!asyncPan) == bg-fixed-child-mask.html bg-fixed-child-mask-ref.html
@@ -20,37 +25,37 @@ skip-if(!asyncPan) == position-fixed-2.h
 skip-if(!asyncPan) == position-fixed-body.html position-fixed-body-ref.html
 skip-if(!asyncPan) == position-fixed-cover-1.html position-fixed-cover-1-ref.html
 skip-if(!asyncPan) == position-fixed-cover-2.html position-fixed-cover-2-ref.html
 skip-if(!asyncPan) == position-fixed-cover-3.html position-fixed-cover-3-ref.html
 fuzzy-if(Android,5,4) skip-if(!asyncPan) == position-fixed-transformed-1.html position-fixed-transformed-1-ref.html
 skip-if(!asyncPan) == split-layers-1.html split-layers-1-ref.html
 skip-if(!asyncPan) == split-layers-multi-scrolling-1.html split-layers-multi-scrolling-1-ref.html
 fuzzy-if(skiaContent,2,240000) fuzzy-if(browserIsRemote&&!skiaContent&&(cocoaWidget||winWidget),1,240000) skip-if(!asyncPan) == split-opacity-layers-1.html split-opacity-layers-1-ref.html
-fails-if(webrender) skip-if(!asyncPan) == sticky-pos-scrollable-1.html sticky-pos-scrollable-1-ref.html # bug 1366295 for webrender
-skip-if(!asyncPan) == sticky-pos-scrollable-2.html sticky-pos-scrollable-2-ref.html
+skip-if(!asyncPan) == sticky-pos-scrollable-1.html sticky-pos-scrollable-1-ref.html
+fails-if(webrender) skip-if(!asyncPan) == sticky-pos-scrollable-2.html sticky-pos-scrollable-2-ref.html # bug 1366295 for webrender
 fails-if(webrender) skip-if(!asyncPan) == sticky-pos-scrollable-3.html sticky-pos-scrollable-3-ref.html # bug 1366295 for webrender
 skip-if(!asyncPan) == fixed-pos-scrollable-1.html fixed-pos-scrollable-1-ref.html
 skip-if(!asyncPan) == culling-1.html culling-1-ref.html
 skip-if(!asyncPan) == position-fixed-iframe-1.html position-fixed-iframe-1-ref.html
 skip-if(!asyncPan) == position-fixed-iframe-2.html position-fixed-iframe-2-ref.html
 fuzzy-if(skiaContent,1,11300) skip-if(!asyncPan) == position-fixed-in-scroll-container.html position-fixed-in-scroll-container-ref.html
 skip-if(!asyncPan) == position-fixed-inside-sticky-1.html position-fixed-inside-sticky-1-ref.html
 skip-if(!asyncPan) == position-fixed-inside-sticky-2.html position-fixed-inside-sticky-2-ref.html
 fuzzy(1,60000) skip-if(!asyncPan) == group-opacity-surface-size-1.html group-opacity-surface-size-1-ref.html
 fails-if(webrender) skip-if(!asyncPan) == position-sticky-transformed.html position-sticky-transformed-ref.html # bug 1366295 for webrender
 skip-if(!asyncPan) == offscreen-prerendered-active-opacity.html offscreen-prerendered-active-opacity-ref.html
 fuzzy-if(Android,6,4) fuzzy-if(skiaContent&&!Android,1,34) skip-if(!asyncPan) == offscreen-clipped-blendmode-1.html offscreen-clipped-blendmode-ref.html
 fuzzy-if(Android,6,4) skip-if(!asyncPan) == offscreen-clipped-blendmode-2.html offscreen-clipped-blendmode-ref.html
 fuzzy-if(Android,6,4) skip == offscreen-clipped-blendmode-3.html offscreen-clipped-blendmode-ref.html # bug 1251588 - wrong AGR on mix-blend-mode item
 fuzzy-if(Android,6,4) skip-if(!asyncPan) == offscreen-clipped-blendmode-4.html offscreen-clipped-blendmode-ref.html
-fuzzy-if(Android,7,4) fails-if(webrender) skip-if(!asyncPan) == perspective-scrolling-1.html perspective-scrolling-1-ref.html # bug 1361720 for webrender
-fuzzy-if(Android,7,4) fails-if(webrender) skip-if(!asyncPan) == perspective-scrolling-2.html perspective-scrolling-2-ref.html # bug 1361720 for webrender
+fuzzy-if(Android,7,4) skip-if(!asyncPan) == perspective-scrolling-1.html perspective-scrolling-1-ref.html
+fuzzy-if(Android,7,4) skip-if(!asyncPan) == perspective-scrolling-2.html perspective-scrolling-2-ref.html
 fuzzy-if(Android,7,4) fails-if(webrender) skip-if(!asyncPan) == perspective-scrolling-3.html perspective-scrolling-3-ref.html # bug 1361720 for webrender
-fuzzy-if(Android,7,4) fails-if(webrender) skip-if(!asyncPan) == perspective-scrolling-4.html perspective-scrolling-4-ref.html # bug 1361720 for webrender
+fuzzy-if(Android,7,4) skip-if(!asyncPan) == perspective-scrolling-4.html perspective-scrolling-4-ref.html
 pref(apz.disable_for_scroll_linked_effects,true) skip-if(!asyncPan) == disable-apz-for-sle-pages.html disable-apz-for-sle-pages-ref.html
 fuzzy-if(browserIsRemote&&d2d,1,19) skip-if(!asyncPan) == background-blend-mode-1.html background-blend-mode-1-ref.html
 random-if(webrender) skip-if(Android||!asyncPan) != opaque-fractional-displayport-1.html about:blank    # test is specific to "layers" and not valid with webrender
 random-if(webrender) skip-if(Android||!asyncPan) != opaque-fractional-displayport-2.html about:blank    # test is specific to "layers" and not valid with webrender
 fuzzy-if(Android,6,4) fails-if(webrender) skip-if(!asyncPan) == fixed-pos-scrolled-clip-1.html fixed-pos-scrolled-clip-1-ref.html   # bug 1373802 for webrender
 fuzzy-if(Android,6,8) fails-if(webrender) skip-if(!asyncPan) == fixed-pos-scrolled-clip-2.html fixed-pos-scrolled-clip-2-ref.html   # bug 1373802 for webrender
 fuzzy-if(Android,6,8) fails-if(webrender) skip-if(!asyncPan) == fixed-pos-scrolled-clip-3.html fixed-pos-scrolled-clip-3-ref.html   # bug 1373802 for webrender
 fuzzy-if(Android,6,8) fails-if(webrender) skip-if(!asyncPan) == fixed-pos-scrolled-clip-4.html fixed-pos-scrolled-clip-4-ref.html   # bug 1373802 for webrender
--- a/layout/reftests/transform/reftest.list
+++ b/layout/reftests/transform/reftest.list
@@ -136,9 +136,9 @@ pref(svg.transform-box.enabled,true) == 
 == transform-origin-svg-2a.svg transform-origin-svg-2-ref.svg
 == transform-origin-svg-2b.svg transform-origin-svg-2-ref.svg
 # Bug 1122526
 == animate-layer-scale-inherit-1.html animate-layer-scale-inherit-1-ref.html
 == animate-layer-scale-inherit-2.html animate-layer-scale-inherit-2-ref.html
 == animate-layer-scale-inherit-3.html animate-layer-scale-inherit-1-ref.html
 # Bug 1301500
 == dynamic-add-without-change-cb-1.html dynamic-add-without-change-cb-1-ref.html
-fuzzy-if(d2d,1,5) fuzzy-if(skiaContent,22,180) skip-if(styloVsGecko||stylo) == table-overflowed-by-animation.html table-overflowed-by-animation-ref.html
+fuzzy-if(d2d,1,5) fuzzy-if(skiaContent,22,180) == table-overflowed-by-animation.html table-overflowed-by-animation-ref.html
--- a/layout/reftests/webkit-gradient/reftest.list
+++ b/layout/reftests/webkit-gradient/reftest.list
@@ -13,8 +13,11 @@ default-preferences pref(layout.css.pref
 == webkit-gradient-linear-1c.html webkit-gradient-linear-1-ref.html
 == webkit-gradient-linear-1d.html webkit-gradient-linear-1-ref.html
 == webkit-gradient-linear-2.html webkit-gradient-linear-2-ref.html
 
 # Tests for -webkit-gradient(radial, ...)
 == webkit-gradient-radial-1a.html webkit-gradient-radial-1-ref.html
 == webkit-gradient-radial-1b.html webkit-gradient-radial-1-ref.html
 == webkit-gradient-radial-2.html webkit-gradient-radial-2-ref.html
+
+# Tests for -webkit-linear-gradient
+== webkit-linear-gradient-1.html webkit-linear-gradient-1-ref.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/webkit-gradient/webkit-linear-gradient-1-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      div {
+        width: 50px;
+        height: 200px;
+        background-image: -webkit-linear-gradient(top, red, blue);
+      }
+    </style>
+  </head>
+  <body>
+    <div></div>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/webkit-gradient/webkit-linear-gradient-1.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      div {
+        width: 50px;
+        height: 200px;
+        background-image: -webkit-linear-gradient(red, blue);
+      }
+    </style>
+  </head>
+  <body>
+    <div></div>
+  </body>
+</html>
--- a/layout/style/ServoStyleSet.cpp
+++ b/layout/style/ServoStyleSet.cpp
@@ -80,18 +80,19 @@ public:
 
 private:
   AutoRestyleTimelineMarker mTimelineMarker;
   AutoSetInServoTraversal mSetInServoTraversal;
 };
 
 } // namespace mozilla
 
-ServoStyleSet::ServoStyleSet()
-  : mPresContext(nullptr)
+ServoStyleSet::ServoStyleSet(Kind aKind)
+  : mKind(aKind)
+  , mPresContext(nullptr)
   , mAuthorStyleDisabled(false)
   , mStylistState(StylistState::NotDirty)
   , mUserFontSetUpdateGeneration(0)
   , mUserFontCacheUpdateGeneration(0)
   , mNeedsRestyleAfterEnsureUniqueInner(false)
 {
 }
 
@@ -1046,57 +1047,16 @@ ServoStyleSet::StyleNewlyBoundElement(El
   if (MOZ_LIKELY(aElement->HasServoData())) {
     StyleNewChildren(aElement);
   } else {
     StyleNewSubtree(aElement);
   }
 }
 
 void
-ServoStyleSet::StyleSubtreeForReconstruct(Element* aRoot)
-{
-  MOZ_ASSERT(MayTraverseFrom(aRoot));
-  MOZ_ASSERT(aRoot->HasServoData());
-
-  // If the restyle root is beneath |aRoot|, there won't be any descendants bit
-  // leading us to aRoot. In this case, we need to traverse from the restyle
-  // root instead.
-  nsIDocument* doc = mPresContext->Document();
-  nsINode* restyleRoot = doc->GetServoRestyleRoot();
-  if (!restyleRoot) {
-    return;
-  }
-  Element* el = restyleRoot->IsElement() ? restyleRoot->AsElement() : nullptr;
-  if (el && nsContentUtils::ContentIsFlattenedTreeDescendantOf(el, aRoot)) {
-    MOZ_ASSERT(MayTraverseFrom(el));
-    aRoot = el;
-    doc->ClearServoRestyleRoot();
-  }
-
-  auto flags = ServoTraversalFlags::Forgetful |
-               ServoTraversalFlags::AggressivelyForgetful |
-               ServoTraversalFlags::ClearDirtyBits;
-  PreTraverse(flags);
-
-  AutoPrepareTraversal guard(this);
-
-  const SnapshotTable& snapshots = Snapshots();
-
-  DebugOnly<bool> postTraversalRequired =
-    Servo_TraverseSubtree(aRoot, mRawSet.get(), &snapshots, flags);
-  MOZ_ASSERT(!postTraversalRequired);
-
-  if (mPresContext->EffectCompositor()->PreTraverseInSubtree(flags, aRoot)) {
-    postTraversalRequired =
-      Servo_TraverseSubtree(aRoot, mRawSet.get(), &snapshots, flags);
-    MOZ_ASSERT(!postTraversalRequired);
-  }
-}
-
-void
 ServoStyleSet::MarkOriginsDirty(OriginFlags aChangedOrigins)
 {
   SetStylistStyleSheetsDirty();
   Servo_StyleSet_NoteStyleSheetsChanged(mRawSet.get(),
                                         mAuthorStyleDisabled,
                                         aChangedOrigins);
 }
 
@@ -1427,17 +1387,23 @@ ServoStyleSet::ResolveForDeclarations(
                                                aParentOrNull,
                                                aDeclarations).Consume();
 }
 
 void
 ServoStyleSet::UpdateStylist()
 {
   MOZ_ASSERT(StylistNeedsUpdate());
-  Element* root = mPresContext->Document()->GetDocumentElement();
+
+  // There's no need to compute invalidations and such for an XBL styleset,
+  // since they are loaded and unloaded synchronously, and they don't have to
+  // deal with dynamic content changes.
+  Element* root =
+    IsMaster() ? mPresContext->Document()->GetDocumentElement() : nullptr;
+
   Servo_StyleSet_FlushStyleSheets(mRawSet.get(), root);
   mStylistState = StylistState::NotDirty;
 }
 
 void
 ServoStyleSet::MaybeGCRuleTree()
 {
   MOZ_ASSERT(NS_IsMainThread());
--- a/layout/style/ServoStyleSet.h
+++ b/layout/style/ServoStyleSet.h
@@ -92,17 +92,31 @@ public:
     return sInServoTraversal;
   }
 
   static ServoStyleSet* Current()
   {
     return sInServoTraversal;
   }
 
-  ServoStyleSet();
+  // The kind of styleset we have.
+  //
+  // We use ServoStyleSet also from XBL bindings, and some stuff needs to be
+  // different between them.
+  enum class Kind : uint8_t {
+    // A "master" StyleSet.
+    //
+    // This one is owned by a pres shell for a given document.
+    Master,
+
+    // A StyleSet for XBL, which is owned by a given XBL binding.
+    ForXBL,
+  };
+
+  explicit ServoStyleSet(Kind aKind);
   ~ServoStyleSet();
 
   void Init(nsPresContext* aPresContext, nsBindingManager* aBindingManager);
   void BeginShutdown();
   void Shutdown();
 
   void RecordStyleSheetChange(mozilla::ServoStyleSheet*, StyleSheet::ChangeType);
 
@@ -284,26 +298,16 @@ public:
    * Eagerly styles the children of an element that has just had an XBL
    * binding applied to it.  Some XBL consumers attach bindings to elements
    * that have not been styled yet, and in such cases, this will do the
    * equivalent of StyleNewSubtree instead.
    */
   void StyleNewlyBoundElement(dom::Element* aElement);
 
   /**
-   * Like StyleNewSubtree, but in response to a request to reconstruct frames
-   * for the given subtree, and so works on elements that already have
-   * styles.  This will leave the subtree in a state just like after an initial
-   * styling, i.e. with new styles, no change hints, and with the dirty
-   * descendants bits cleared.  No comparison of old and new styles is done,
-   * so no change hints will be processed.
-   */
-  void StyleSubtreeForReconstruct(dom::Element* aRoot);
-
-  /**
    * Helper for correctly calling UpdateStylist without paying the cost of an
    * extra function call in the common no-rebuild-needed case.
    */
   void UpdateStylistIfNeeded()
   {
     if (StylistNeedsUpdate()) {
       UpdateStylist();
     }
@@ -470,16 +474,19 @@ private:
   friend class AutoSetInServoTraversal;
   friend class AutoPrepareTraversal;
 
   /**
    * Gets the pending snapshots to handle from the restyle manager.
    */
   const SnapshotTable& Snapshots();
 
+  bool IsMaster() const { return mKind == Kind::Master; }
+  bool IsForXBL() const { return mKind == Kind::ForXBL; }
+
   /**
    * Resolve all ServoDeclarationBlocks attached to mapped
    * presentation attributes cached on the document.
    *
    * Call this before jumping into Servo's style system.
    */
   void ResolveMappedAttrDeclarationBlocks();
 
@@ -550,16 +557,17 @@ private:
 
   void InsertSheetOfType(SheetType aType,
                          ServoStyleSheet* aSheet,
                          ServoStyleSheet* aBeforeSheet);
 
   void RemoveSheetOfType(SheetType aType,
                          ServoStyleSheet* aSheet);
 
+  const Kind mKind;
   nsPresContext* mPresContext;
   UniquePtr<RawServoStyleSet> mRawSet;
   EnumeratedArray<SheetType, SheetType::Count,
                   nsTArray<RefPtr<ServoStyleSheet>>> mSheets;
   bool mAuthorStyleDisabled;
   StylistState mStylistState;
   uint64_t mUserFontSetUpdateGeneration;
   uint32_t mUserFontCacheUpdateGeneration;
--- a/layout/style/ServoTypes.h
+++ b/layout/style/ServoTypes.h
@@ -62,19 +62,16 @@ enum class ServoTraversalFlags : uint32_
   // Styles unstyled elements, but does not handle invalidations on
   // already-styled elements.
   UnstyledOnly = 1 << 2,
   // A forgetful traversal ignores the previous state of the frame tree, and
   // thus does not compute damage or maintain other state describing the styles
   // pre-traversal. A forgetful traversal is usually the right thing if you
   // aren't going to do a post-traversal.
   Forgetful = 1 << 3,
-  // Actively seeks out and clears change hints that may have been posted into
-  // the tree. Nonsensical without also passing Forgetful.
-  AggressivelyForgetful = 1 << 4,
   // Clears all the dirty bits (dirty descendants, animation-only dirty-descendants,
   // needs frame, descendants need frames) on the elements traversed.
   // in the subtree.
   ClearDirtyBits = 1 << 5,
   // Clears only the animation-only dirty descendants bit in the subtree.
   ClearAnimationOnlyDirtyDescendants = 1 << 6,
   // Allows the traversal to run in parallel if there are sufficient cores on
   // the machine.
new file mode 100644
--- /dev/null
+++ b/layout/style/crashtests/1384232.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<script>
+root = document.createElement("div")
+document.documentElement.appendChild(root)
+document.documentElement.appendChild(document.createElement("thead"))
+document.documentElement.getBoundingClientRect()
+root.appendChild(document.createElement("textarea"))
+</script>
--- a/layout/style/crashtests/crashtests.list
+++ b/layout/style/crashtests/crashtests.list
@@ -204,8 +204,9 @@ load 1387481-1.html
 load 1387499.html
 load 1388234.html
 load 1391577.html
 load 1393189.html
 load 1393580.html
 load 1389645.html
 load 1390726.html
 load 1393791.html
+load 1384232.html
--- a/layout/style/jar.mn
+++ b/layout/style/jar.mn
@@ -1,17 +1,16 @@
 # 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/.
 
 toolkit.jar:
 *  res/ua.css                                (res/ua.css)
 *  res/html.css                              (res/html.css)
    res/quirk.css                             (res/quirk.css)
-   res/plaintext.css                         (res/plaintext.css)
    res/counterstyles.css                     (res/counterstyles.css)
    res/noscript.css                          (res/noscript.css)
    res/noframes.css                          (res/noframes.css)
 *  res/forms.css                             (res/forms.css)
    res/number-control.css                    (res/number-control.css)
    res/arrow.gif                             (res/arrow.gif)
    res/arrow-left.gif                        (res/arrow-left.gif)
    res/arrow-right.gif                       (res/arrow-right.gif)
--- a/layout/style/moz.build
+++ b/layout/style/moz.build
@@ -299,16 +299,17 @@ JAR_MANIFESTS += ['jar.mn']
 
 RESOURCE_FILES += [
     'contenteditable.css',
     'designmode.css',
 ]
 
 CONTENT_ACCESSIBLE_FILES += [
     'ImageDocument.css',
+    'res/plaintext.css',
     'res/viewsource.css',
     'TopLevelImageDocument.css',
     'TopLevelVideoDocument.css',
 ]
 
 GENERATED_FILES += [
     'nsStyleStructList.h',
 ]
--- a/layout/tables/TableArea.h
+++ b/layout/tables/TableArea.h
@@ -7,35 +7,45 @@
 #define mozilla_TableArea_h_
 
 #include "nsRect.h"
 
 namespace mozilla {
 
 struct TableArea
 {
-  TableArea() : mRect() { }
+  TableArea()
+    : mStartCol(0), mStartRow(0), mColCount(0), mRowCount(0) { }
   TableArea(int32_t aStartCol, int32_t aStartRow,
             int32_t aColCount, int32_t aRowCount)
-    : mRect(aStartCol, aStartRow, aColCount, aRowCount) { }
-
-  int32_t& StartCol() { return mRect.x; }
-  int32_t& StartRow() { return mRect.y; }
-  int32_t& ColCount() { return mRect.width; }
-  int32_t& RowCount() { return mRect.height; }
+    : mStartCol(aStartCol),
+      mStartRow(aStartRow),
+      mColCount(aColCount),
+      mRowCount(aRowCount) { }
 
-  int32_t StartCol() const { return mRect.x; }
-  int32_t StartRow() const { return mRect.y; }
-  int32_t ColCount() const { return mRect.width; }
-  int32_t RowCount() const { return mRect.height; }
-  int32_t EndCol() const { return mRect.XMost(); }
-  int32_t EndRow() const { return mRect.YMost(); }
+  int32_t& StartCol() { return mStartCol; }
+  int32_t& StartRow() { return mStartRow; }
+  int32_t& ColCount() { return mColCount; }
+  int32_t& RowCount() { return mRowCount; }
+
+  int32_t StartCol() const { return mStartCol; }
+  int32_t StartRow() const { return mStartRow; }
+  int32_t ColCount() const { return mColCount; }
+  int32_t RowCount() const { return mRowCount; }
+  int32_t EndCol() const { return mStartCol + mColCount; }
+  int32_t EndRow() const { return mStartRow + mRowCount; }
 
   void UnionArea(const TableArea& aArea1, const TableArea& aArea2)
-    { mRect.UnionRect(aArea1.mRect, aArea2.mRect); }
+    {
+      nsIntRect rect(aArea1.mStartCol, aArea1.mStartRow,
+                     aArea1.mColCount, aArea1.mRowCount);
+      rect.UnionRect(rect, nsIntRect(aArea2.mStartCol, aArea2.mStartRow,
+                                     aArea2.mColCount, aArea2.mRowCount));
+      rect.GetRect(&mStartCol, &mStartRow, &mColCount, &mRowCount);
+    }
 
 private:
-  nsIntRect mRect;
+  int32_t mStartCol, mStartRow, mColCount, mRowCount;
 };
 
 } // namespace mozilla
 
 #endif // mozilla_TableArea_h_
--- a/layout/xul/test/test_bug381167.xhtml
+++ b/layout/xul/test/test_bug381167.xhtml
@@ -23,17 +23,17 @@ https://bugzilla.mozilla.org/show_bug.cg
 <script type="application/javascript">
 
 /** Test for Bug 381167 **/
 
 SimpleTest.waitForExplicitFinish();
 
 if (SpecialPowers.DOMWindowUtils.isStyledByServo) {
   // Stylo currently asserts for any XUL bits.
-  SimpleTest.expectAssertions(5, 5);
+  SimpleTest.expectAssertions(3, 3);
 }
 
 function closeit() {
   var evt = document.createEvent('KeyboardEvent');
                                  evt.initKeyEvent('keypress', true, true,
                                  window,
                                  true, false, false, false,
                                  'W'.charCodeAt(0), 0);
--- a/mobile/android/components/extensions/ext-android.js
+++ b/mobile/android/components/extensions/ext-android.js
@@ -1,13 +1,10 @@
 "use strict";
 
-XPCOMUtils.defineLazyModuleGetter(global, "EventEmitter",
-                                  "resource://gre/modules/EventEmitter.jsm");
-
 // This function is pretty tightly tied to Extension.jsm.
 // Its job is to fill in the |tab| property of the sender.
 const getSender = (extension, target, sender) => {
   let tabId = -1;
   if ("tabId" in sender) {
     // The message came from a privileged extension page running in a tab. In
     // that case, it should include a tabId property (which is filled in by the
     // page-open listener below).
--- a/mobile/android/components/extensions/ext-browserAction.js
+++ b/mobile/android/components/extensions/ext-browserAction.js
@@ -10,18 +10,20 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 
 // Import the android BrowserActions module.
 XPCOMUtils.defineLazyModuleGetter(this, "BrowserActions",
                                   "resource://gre/modules/BrowserActions.jsm");
 
 // WeakMap[Extension -> BrowserAction]
 let browserActionMap = new WeakMap();
 
-class BrowserAction {
+class BrowserAction extends EventEmitter {
   constructor(options, extension) {
+    super();
+
     this.uuid = `{${extension.uuid}}`;
 
     this.defaults = {
       name: options.default_title || extension.name,
     };
 
     this.tabContext = new TabContext(tab => Object.create(this.defaults),
                                      extension);
@@ -29,17 +31,16 @@ class BrowserAction {
     this.tabManager = extension.tabManager;
 
     this.tabContext.on("tab-selected", // eslint-disable-line mozilla/balanced-listeners
                        (evt, tabId) => { this.onTabSelected(tabId); });
     this.tabContext.on("tab-closed", // eslint-disable-line mozilla/balanced-listeners
                        (evt, tabId) => { this.onTabClosed(tabId); });
 
     BrowserActions.register(this);
-    EventEmitter.decorate(this);
   }
 
   /**
    * Required by the BrowserActions module. This event will get
    * called whenever the browser action is clicked on.
    */
   onClicked() {
     const tab = tabTracker.activeTab;
--- a/mobile/android/components/extensions/ext-pageAction.js
+++ b/mobile/android/components/extensions/ext-pageAction.js
@@ -17,18 +17,20 @@ Cu.import("resource://gre/modules/Extens
 
 var {
   IconDetails,
 } = ExtensionParent;
 
 // WeakMap[Extension -> PageAction]
 let pageActionMap = new WeakMap();
 
-class PageAction {
+class PageAction extends EventEmitter {
   constructor(manifest, extension) {
+    super();
+
     this.id = null;
 
     this.extension = extension;
 
     this.defaults = {
       icons: IconDetails.normalize({path: manifest.default_icon}, extension),
       popup: manifest.default_popup,
     };
@@ -60,18 +62,16 @@ class PageAction {
     };
 
     this.shouldShow = false;
 
     this.tabContext.on("tab-selected", // eslint-disable-line mozilla/balanced-listeners
                        (evt, tabId) => { this.onTabSelected(tabId); });
     this.tabContext.on("tab-closed", // eslint-disable-line mozilla/balanced-listeners
                        (evt, tabId) => { this.onTabClosed(tabId); });
-
-    EventEmitter.decorate(this);
   }
 
   /**
    * Updates the page action whenever a tab is selected.
    * @param {Integer} tabId The ID of the selected tab.
    */
   onTabSelected(tabId) {
     if (this.options.icon) {
@@ -187,16 +187,17 @@ class PageAction {
     });
   }
 
   /**
    * Hides the page action for the active tab.
    */
   hide() {
     this.shouldShow = false;
+
     if (this.id) {
       PageActions.remove(this.id);
       this.id = null;
     }
   }
 
   shutdown() {
     this.tabContext.shutdown();
--- a/mobile/android/components/extensions/ext-utils.js
+++ b/mobile/android/components/extensions/ext-utils.js
@@ -429,24 +429,24 @@ class Tab extends TabBase {
   }
 
   get windowId() {
     return windowTracker.getId(this.window);
   }
 }
 
 // Manages tab-specific context data and dispatches tab select and close events.
-class TabContext {
+class TabContext extends EventEmitter {
   constructor(getDefaults, extension) {
+    super();
+
     this.extension = extension;
     this.getDefaults = getDefaults;
     this.tabData = new Map();
 
-    EventEmitter.decorate(this);
-
     GlobalEventDispatcher.registerListener(this, [
       "Tab:Selected",
       "Tab:Closed",
     ]);
   }
 
   get(tabId) {
     if (!this.tabData.has(tabId)) {
--- a/mobile/android/components/extensions/test/mochitest/test_ext_pageAction_show_hide.html
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_pageAction_show_hide.html
@@ -34,18 +34,25 @@ add_task(async function test_pageAction(
       return tab;
     }
 
     let tab1 = await createNewTab("about:blank");
     let tab2 = await createNewTab("about:blank");
 
     browser.test.onMessage.addListener(async (msg, data) => {
       if (msg === "select-tab") {
+        const onActivatedListener = ({tabId}) => {
+          if (tabId === data) {
+            browser.tabs.onActivated.removeListener(onActivatedListener);
+            browser.test.sendMessage("tab-selected");
+          }
+        };
+        browser.tabs.onActivated.addListener(onActivatedListener);
+
         await browser.tabs.update(data, {active: true});
-        browser.test.sendMessage("tab-selected");
       } else if (msg === "pageAction-show") {
         browser.pageAction.show(data).then(() => {
           browser.test.sendMessage("page-action-shown");
         });
       } else if (msg === "pageAction-hide") {
         browser.pageAction.hide(data).then(() => {
           browser.test.sendMessage("page-action-hidden");
         });
--- a/mobile/android/components/extensions/test/mochitest/test_ext_tabs_lastAccessed.html
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_lastAccessed.html
@@ -31,18 +31,24 @@ add_task(async function testLastAccessed
 
         let [tab1] = await browser.tabs.query({url: "https://example.com/?1"});
         let [tab2] = await browser.tabs.query({url: "https://example.com/?2"});
 
         browser.test.assertTrue(tab1 && tab2, "Expected tabs were found");
 
         let now = Date.now();
 
-        browser.test.assertTrue(past < tab1.lastAccessed &&
-                                tab1.lastAccessed < tab2.lastAccessed &&
+        browser.test.assertTrue(typeof tab1.lastAccessed == "number",
+                                "tab1 lastAccessed should be a number");
+
+        browser.test.assertTrue(typeof tab2.lastAccessed == "number",
+                                "tab2 lastAccessed should be a number");
+
+        browser.test.assertTrue(past <= tab1.lastAccessed &&
+                                tab1.lastAccessed <= tab2.lastAccessed &&
                                 tab2.lastAccessed <= now,
                                 "lastAccessed timestamps are recent and in the right order");
 
         await browser.tabs.remove([tab1.id, tab2.id]);
 
         browser.test.notifyPass("tabs.lastAccessed");
       });
     },
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -3703,17 +3703,17 @@ pref("font.name-list.sans-serif.he", "Ar
 pref("font.name-list.monospace.he", "Fixed Miriam Transparent, Miriam Fixed, Rod, Courier New");
 pref("font.name-list.cursive.he", "Guttman Yad, Ktav, Arial");
 
 pref("font.name-list.serif.ja", "Yu Mincho, MS PMincho, MS Mincho, Meiryo, Yu Gothic, MS PGothic, MS Gothic");
 pref("font.name-list.sans-serif.ja", "Meiryo, Yu Gothic, MS PGothic, MS Gothic, Yu Mincho, MS PMincho, MS Mincho");
 pref("font.name-list.monospace.ja", "MS Gothic, MS Mincho, Meiryo, Yu Gothic, Yu Mincho, MS PGothic, MS PMincho");
 
 pref("font.name-list.serif.ko", "Batang, Gulim");
-pref("font.name-list.sans-serif.ko", "Gulim");
+pref("font.name-list.sans-serif.ko", "Gulim, Malgun Gothic");
 pref("font.name-list.monospace.ko", "GulimChe");
 pref("font.name-list.cursive.ko", "Gungsuh");
 
 pref("font.name-list.serif.th", "Tahoma");
 pref("font.name-list.sans-serif.th", "Tahoma");
 pref("font.name-list.monospace.th", "Tahoma");
 pref("font.name-list.cursive.th", "Tahoma");
 
--- a/parser/html/nsHtml5PlainTextUtils.cpp
+++ b/parser/html/nsHtml5PlainTextUtils.cpp
@@ -17,17 +17,17 @@ nsHtml5PlainTextUtils::NewLinkAttributes
 {
   nsHtml5HtmlAttributes* linkAttrs = new nsHtml5HtmlAttributes(0);
   nsHtml5String rel =
     nsHtml5Portability::newStringFromLiteral("alternate stylesheet");
   linkAttrs->addAttribute(nsHtml5AttributeName::ATTR_REL, rel, -1);
   nsHtml5String type = nsHtml5Portability::newStringFromLiteral("text/css");
   linkAttrs->addAttribute(nsHtml5AttributeName::ATTR_TYPE, type, -1);
   nsHtml5String href = nsHtml5Portability::newStringFromLiteral(
-    "resource://gre-resources/plaintext.css");
+    "resource://content-accessible/plaintext.css");
   linkAttrs->addAttribute(nsHtml5AttributeName::ATTR_HREF, href, -1);
 
   nsresult rv;
   nsCOMPtr<nsIStringBundleService> bundleService = do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
   NS_ASSERTION(NS_SUCCEEDED(rv) && bundleService, "The bundle service could not be loaded");
   nsCOMPtr<nsIStringBundle> bundle;
   rv = bundleService->CreateBundle("chrome://global/locale/browser.properties",
                                    getter_AddRefs(bundle));
--- a/servo/components/canvas/webgl_thread.rs
+++ b/servo/components/canvas/webgl_thread.rs
@@ -3,17 +3,16 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 use canvas_traits::canvas::byte_swap;
 use canvas_traits::webgl::*;
 use euclid::Size2D;
 use fnv::FnvHashMap;
 use gleam::gl;
 use offscreen_gl_context::{GLContext, GLContextAttributes, GLLimits, NativeGLContextMethods};
-use std::mem;
 use std::thread;
 use super::gl_context::{GLContextFactory, GLContextWrapper};
 use webrender;
 use webrender_api;
 
 /// WebGL Threading API entry point that lives in the constellation.
 /// It allows to get a WebGLThread handle for each script pipeline.
 pub use ::webgl_mode::WebGLThreads;
@@ -197,18 +196,16 @@ impl<VR: WebVRRenderHandler + 'static, O
                 self.contexts.insert(id, ctx);
                 self.cached_context_info.insert(id, WebGLContextInfo {
                     texture_id,
                     size,
                     alpha: attributes.alpha,
                     image_key: None,
                     share_mode,
                     gl_sync: None,
-                    old_image_key: None,
-                    very_old_image_key: None,
                 });
 
                 self.observer.on_context_create(id, texture_id, size);
 
                 Ok((id, limits, share_mode))
             },
             Err(msg) => {
                 Err(msg.to_owned())
@@ -226,23 +223,28 @@ impl<VR: WebVRRenderHandler + 'static, O
             Ok(_) => {
                 let (real_size, texture_id, _) = ctx.get_info();
                 self.observer.on_context_resize(context_id, texture_id, real_size);
 
                 let info = self.cached_context_info.get_mut(&context_id).unwrap();
                 // Update webgl texture size. Texture id may change too.
                 info.texture_id = texture_id;
                 info.size = real_size;
-                // WR doesn't support resizing and requires to create a new `ImageKey`.
-                // Mark the current image_key to be deleted later in the next epoch.
-                if let Some(image_key) = info.image_key.take() {
-                    // If this executes, then we are in a new epoch since we last recreated the canvas,
-                    // so `old_image_key` must be `None`.
-                    debug_assert!(info.old_image_key.is_none());
-                    info.old_image_key = Some(image_key);
+                // Update WR image if needed. Resize image updates are only required for SharedTexture mode.
+                // Readback mode already updates the image every frame to send the raw pixels.
+                // See `handle_update_wr_image`.
+                match (info.image_key, info.share_mode) {
+                    (Some(image_key), WebGLContextShareMode::SharedTexture) => {
+                        Self::update_wr_external_image(&self.webrender_api,
+                                                       info.size,
+                                                       info.alpha,
+                                                       context_id,
+                                                       image_key);
+                    },
+                    _ => {}
                 }
 
                 sender.send(Ok(())).unwrap();
             },
             Err(msg) => {
                 sender.send(Err(msg.into())).unwrap();
             }
         }
@@ -252,50 +254,44 @@ impl<VR: WebVRRenderHandler + 'static, O
     fn remove_webgl_context(&mut self, context_id: WebGLContextId) {
         // Release webrender image keys.
         if let Some(info) = self.cached_context_info.remove(&context_id) {
             let mut updates = webrender_api::ResourceUpdates::new();
 
             if let Some(image_key) = info.image_key {
                 updates.delete_image(image_key);
             }
-            if let Some(image_key) = info.old_image_key {
-                updates.delete_image(image_key);
-            }
-            if let Some(image_key) = info.very_old_image_key {
-                updates.delete_image(image_key);
-            }
 
             self.webrender_api.update_resources(updates)
         }
 
         // Release GL context.
         if self.contexts.remove(&context_id).is_some() {
             self.observer.on_context_delete(context_id);
         }
 
         // Removing a GLContext may make the current bound context_id dirty.
         self.bound_context_id = None;
     }
 
-    /// Handles the creation/update of webrender_api::ImageKeys fpr a specific WebGLContext.
+    /// Handles the creation/update of webrender_api::ImageKeys for a specific WebGLContext.
     /// This method is invoked from a UpdateWebRenderImage message sent by the layout thread.
-    /// If SharedTexture is used the UpdateWebRenderImage message is sent only after a WebGLContext creation or resize.
+    /// If SharedTexture is used the UpdateWebRenderImage message is sent only after a WebGLContext creation.
     /// If Readback is used UpdateWebRenderImage message is sent always on each layout iteration in order to
     /// submit the updated raw pixels.
     fn handle_update_wr_image(&mut self, context_id: WebGLContextId, sender: WebGLSender<webrender_api::ImageKey>) {
         let info = self.cached_context_info.get_mut(&context_id).unwrap();
         let webrender_api = &self.webrender_api;
 
         let image_key = match info.share_mode {
             WebGLContextShareMode::SharedTexture => {
                 let size = info.size;
                 let alpha = info.alpha;
                 // Reuse existing ImageKey or generate a new one.
-                // When using a shared texture ImageKeys are only generated after a WebGLContext creation or resize.
+                // When using a shared texture ImageKeys are only generated after a WebGLContext creation.
                 *info.image_key.get_or_insert_with(|| {
                     Self::create_wr_external_image(webrender_api, size, alpha, context_id)
                 })
             },
             WebGLContextShareMode::Readback => {
                 let pixels = Self::raw_pixels(&self.contexts[&context_id], info.size);
                 match info.image_key.clone() {
                     Some(image_key) => {
@@ -317,23 +313,16 @@ impl<VR: WebVRRenderHandler + 'static, O
                                                                        pixels);
                         info.image_key = Some(image_key);
                         image_key
                     }
                 }
             }
         };
 
-        // Delete old image
-        if let Some(image_key) = mem::replace(&mut info.very_old_image_key, info.old_image_key.take()) {
-            let mut updates = webrender_api::ResourceUpdates::new();
-            updates.delete_image(image_key);
-            self.webrender_api.update_resources(updates);
-        }
-
         // Send the ImageKey to the Layout thread.
         sender.send(image_key).unwrap();
     }
 
     /// Gets a reference to a GLContextWrapper for a given WebGLContextId and makes it current if required.
     fn make_current_if_needed<'a>(context_id: WebGLContextId,
                                   contexts: &'a FnvHashMap<WebGLContextId, GLContextWrapper>,
                                   bound_id: &mut Option<WebGLContextId>) -> Option<&'a GLContextWrapper> {
@@ -360,35 +349,46 @@ impl<VR: WebVRRenderHandler + 'static, O
     }
 
     /// Creates a `webrender_api::ImageKey` that uses shared textures.
     fn create_wr_external_image(webrender_api: &webrender_api::RenderApi,
                                 size: Size2D<i32>,
                                 alpha: bool,
                                 context_id: WebGLContextId) -> webrender_api::ImageKey {
         let descriptor = Self::image_descriptor(size, alpha);
-
-        let data = webrender_api::ExternalImageData {
-            id: webrender_api::ExternalImageId(context_id.0 as u64),
-            channel_index: 0,
-            image_type: webrender_api::ExternalImageType::Texture2DHandle,
-        };
-        let data = webrender_api::ImageData::External(data);
+        let data = Self::external_image_data(context_id);
 
         let image_key = webrender_api.generate_image_key();
         let mut updates = webrender_api::ResourceUpdates::new();
         updates.add_image(image_key,
                           descriptor,
                           data,
                           None);
         webrender_api.update_resources(updates);
 
         image_key
     }
 
+    /// Updates a `webrender_api::ImageKey` that uses shared textures.
+    fn update_wr_external_image(webrender_api: &webrender_api::RenderApi,
+                                size: Size2D<i32>,
+                                alpha: bool,
+                                context_id: WebGLContextId,
+                                image_key: webrender_api::ImageKey) {
+        let descriptor = Self::image_descriptor(size, alpha);
+        let data = Self::external_image_data(context_id);
+
+        let mut updates = webrender_api::ResourceUpdates::new();
+        updates.update_image(image_key,
+                             descriptor,
+                             data,
+                             None);
+        webrender_api.update_resources(updates);
+    }
+
     /// Creates a `webrender_api::ImageKey` that uses raw pixels.
     fn create_wr_readback_image(webrender_api: &webrender_api::RenderApi,
                                 size: Size2D<i32>,
                                 alpha: bool,
                                 data: Vec<u8>) -> webrender_api::ImageKey {
         let descriptor = Self::image_descriptor(size, alpha);
         let data = webrender_api::ImageData::new(data);
 
@@ -427,16 +427,26 @@ impl<VR: WebVRRenderHandler + 'static, O
             height: size.height as u32,
             stride: None,
             format: if alpha { webrender_api::ImageFormat::BGRA8 } else { webrender_api::ImageFormat::RGB8 },
             offset: 0,
             is_opaque: !alpha,
         }
     }
 
+    /// Helper function to create a `webrender_api::ImageData::External` instance.
+    fn external_image_data(context_id: WebGLContextId) -> webrender_api::ImageData {
+        let data = webrender_api::ExternalImageData {
+            id: webrender_api::ExternalImageId(context_id.0 as u64),
+            channel_index: 0,
+            image_type: webrender_api::ExternalImageType::Texture2DHandle,
+        };
+        webrender_api::ImageData::External(data)
+    }
+
     /// Helper function to fetch the raw pixels used in readback mode.
     fn raw_pixels(context: &GLContextWrapper, size: Size2D<i32>) -> Vec<u8> {
         let width = size.width as usize;
         let height = size.height as usize;
 
         let mut pixels = context.gl().read_pixels(0, 0,
                                                   size.width as gl::GLsizei,
                                                   size.height as gl::GLsizei,
@@ -474,20 +484,16 @@ struct WebGLContextInfo {
     /// True if the WebGLContext uses an alpha channel.
     alpha: bool,
     /// Currently used WebRender image key.
     image_key: Option<webrender_api::ImageKey>,
     /// The sharing mode used to send the image to WebRender.
     share_mode: WebGLContextShareMode,
     /// GLSync Object used for a correct synchronization with Webrender external image callbacks.
     gl_sync: Option<gl::GLsync>,
-    /// An old WebRender image key that can be deleted when the next epoch ends.
-    old_image_key: Option<webrender_api::ImageKey>,
-    /// An old WebRender image key that can be deleted when the current epoch ends.
-    very_old_image_key: Option<webrender_api::ImageKey>,
 }
 
 /// Trait used to observe events in a WebGL Thread.
 /// Used in webrender::ExternalImageHandler when multiple WebGL threads are used.
 pub trait WebGLThreadObserver: Send + 'static {
     fn on_context_create(&mut self, ctx_id: WebGLContextId, texture_id: u32, size: Size2D<i32>);
     fn on_context_resize(&mut self, ctx_id: WebGLContextId, texture_id: u32, size: Size2D<i32>);
     fn on_context_delete(&mut self, ctx_id: WebGLContextId);
--- a/servo/components/script/dom/bluetooth.rs
+++ b/servo/components/script/dom/bluetooth.rs
@@ -9,17 +9,16 @@ use bluetooth_traits::scanfilter::{Bluet
 use bluetooth_traits::scanfilter::{RequestDeviceoptions, ServiceUUIDSequence};
 use core::clone::Clone;
 use dom::bindings::cell::DOMRefCell;
 use dom::bindings::codegen::Bindings::BluetoothBinding::{self, BluetoothDataFilterInit, BluetoothLEScanFilterInit};
 use dom::bindings::codegen::Bindings::BluetoothBinding::{BluetoothMethods, RequestDeviceOptions};
 use dom::bindings::codegen::Bindings::BluetoothPermissionResultBinding::BluetoothPermissionDescriptor;
 use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerBinding::
     BluetoothRemoteGATTServerMethods;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::PermissionStatusBinding::{PermissionName, PermissionState};
 use dom::bindings::codegen::UnionTypes::StringOrUnsignedLong;
 use dom::bindings::error::Error::{self, Network, Security, Type};
 use dom::bindings::error::Fallible;
 use dom::bindings::js::{JS, Root};
 use dom::bindings::refcounted::{Trusted, TrustedPromise};
 use dom::bindings::reflector::{DomObject, reflect_dom_object};
 use dom::bindings::str::DOMString;
--- a/servo/components/script/dom/bluetoothdevice.rs
+++ b/servo/components/script/dom/bluetoothdevice.rs
@@ -3,17 +3,16 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 use bluetooth_traits::{BluetoothCharacteristicMsg, BluetoothDescriptorMsg};
 use bluetooth_traits::{BluetoothRequest, BluetoothResponse, BluetoothServiceMsg};
 use dom::bindings::cell::DOMRefCell;
 use dom::bindings::codegen::Bindings::BluetoothDeviceBinding;
 use dom::bindings::codegen::Bindings::BluetoothDeviceBinding::BluetoothDeviceMethods;
 use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerMethods;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::error::Error;
 use dom::bindings::error::ErrorResult;
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::{JS, MutNullableJS, Root};
 use dom::bindings::reflector::{DomObject, reflect_dom_object};
 use dom::bindings::str::DOMString;
 use dom::bluetooth::{AsyncBluetoothListener, Bluetooth, response_async};
 use dom::bluetoothcharacteristicproperties::BluetoothCharacteristicProperties;
--- a/servo/components/script/dom/bluetoothremotegattcharacteristic.rs
+++ b/servo/components/script/dom/bluetoothremotegattcharacteristic.rs
@@ -7,17 +7,16 @@ use bluetooth_traits::blocklist::{Blockl
 use dom::bindings::cell::DOMRefCell;
 use dom::bindings::codegen::Bindings::BluetoothCharacteristicPropertiesBinding::
     BluetoothCharacteristicPropertiesMethods;
 use dom::bindings::codegen::Bindings::BluetoothRemoteGATTCharacteristicBinding;
 use dom::bindings::codegen::Bindings::BluetoothRemoteGATTCharacteristicBinding::
     BluetoothRemoteGATTCharacteristicMethods;
 use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerMethods;
 use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServiceBinding::BluetoothRemoteGATTServiceMethods;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::error::Error::{self, InvalidModification, Network, NotSupported, Security};
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::{JS, Root};
 use dom::bindings::reflector::{DomObject, reflect_dom_object};
 use dom::bindings::str::{ByteString, DOMString};
 use dom::bluetooth::{AsyncBluetoothListener, get_gatt_children, response_async};
 use dom::bluetoothcharacteristicproperties::BluetoothCharacteristicProperties;
 use dom::bluetoothremotegattservice::BluetoothRemoteGATTService;
--- a/servo/components/script/dom/bluetoothremotegattservice.rs
+++ b/servo/components/script/dom/bluetoothremotegattservice.rs
@@ -1,17 +1,16 @@
 /* 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 bluetooth_traits::{BluetoothResponse, GATTType};
 use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerMethods;
 use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServiceBinding;
 use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServiceBinding::BluetoothRemoteGATTServiceMethods;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::error::Error;
 use dom::bindings::js::{JS, Root};
 use dom::bindings::reflector::reflect_dom_object;
 use dom::bindings::str::DOMString;
 use dom::bluetooth::{AsyncBluetoothListener, get_gatt_children};
 use dom::bluetoothdevice::BluetoothDevice;
 use dom::bluetoothuuid::{BluetoothCharacteristicUUID, BluetoothServiceUUID, BluetoothUUID};
 use dom::eventtarget::EventTarget;
--- a/servo/components/script/dom/dedicatedworkerglobalscope.rs
+++ b/servo/components/script/dom/dedicatedworkerglobalscope.rs
@@ -4,17 +4,16 @@
 
 use devtools;
 use devtools_traits::DevtoolScriptControlMsg;
 use dom::abstractworker::{SharedRt, SimpleWorkerErrorHandler, WorkerScriptMsg};
 use dom::abstractworkerglobalscope::{SendableWorkerScriptChan, WorkerThreadWorkerChan};
 use dom::bindings::cell::DOMRefCell;
 use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding;
 use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding::DedicatedWorkerGlobalScopeMethods;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::error::{ErrorInfo, ErrorResult};
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::{Root, RootCollection};
 use dom::bindings::reflector::DomObject;
 use dom::bindings::str::DOMString;
 use dom::bindings::structuredclone::StructuredCloneData;
 use dom::globalscope::GlobalScope;
 use dom::messageevent::MessageEvent;
--- a/servo/components/script/dom/document.rs
+++ b/servo/components/script/dom/document.rs
@@ -10,18 +10,16 @@ use dom::activation::{ActivationSource, 
 use dom::attr::Attr;
 use dom::beforeunloadevent::BeforeUnloadEvent;
 use dom::bindings::callback::ExceptionHandling;
 use dom::bindings::cell::DOMRefCell;
 use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods;
 use dom::bindings::codegen::Bindings::DocumentBinding;
 use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState, ElementCreationOptions};
 use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull;
 use dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFrameElementBinding::HTMLIFrameElementMethods;
 use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
 use dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter;
 use dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceMethods;
 use dom::bindings::codegen::Bindings::TouchBinding::TouchMethods;
 use dom::bindings::codegen::Bindings::WindowBinding::{FrameRequestCallback, ScrollBehavior, WindowMethods};
 use dom::bindings::codegen::UnionTypes::NodeOrString;
 use dom::bindings::error::{Error, ErrorResult, Fallible};
--- a/servo/components/script/dom/eventsource.rs
+++ b/servo/components/script/dom/eventsource.rs
@@ -1,14 +1,13 @@
 /* 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 dom::bindings::cell::DOMRefCell;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::EventSourceBinding::{EventSourceInit, EventSourceMethods, Wrap};
 use dom::bindings::error::{Error, Fallible};
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::Root;
 use dom::bindings::refcounted::Trusted;
 use dom::bindings::reflector::{DomObject, reflect_dom_object};
 use dom::bindings::str::DOMString;
 use dom::event::Event;
--- a/servo/components/script/dom/filereader.rs
+++ b/servo/components/script/dom/filereader.rs
@@ -1,16 +1,15 @@
 /* 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 base64;
 use dom::bindings::cell::DOMRefCell;
 use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::FileReaderBinding::{self, FileReaderConstants, FileReaderMethods};
 use dom::bindings::codegen::UnionTypes::StringOrObject;
 use dom::bindings::error::{Error, ErrorResult, Fallible};
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::{MutNullableJS, Root};
 use dom::bindings::refcounted::Trusted;
 use dom::bindings::reflector::{DomObject, reflect_dom_object};
 use dom::bindings::str::DOMString;
--- a/servo/components/script/dom/htmlbodyelement.rs
+++ b/servo/components/script/dom/htmlbodyelement.rs
@@ -1,15 +1,14 @@
 /* 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 cssparser::RGBA;
 use dom::attr::Attr;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::{EventHandlerNonNull, OnBeforeUnloadEventHandlerNonNull};
 use dom::bindings::codegen::Bindings::HTMLBodyElementBinding::{self, HTMLBodyElementMethods};
 use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::{LayoutJS, Root};
 use dom::bindings::str::DOMString;
 use dom::document::Document;
 use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers};
 use dom::eventtarget::EventTarget;
--- a/servo/components/script/dom/htmlelement.rs
+++ b/servo/components/script/dom/htmlelement.rs
@@ -1,17 +1,16 @@
 /* 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 dom::activation::{ActivationSource, synthetic_click_activation};
 use dom::attr::Attr;
 use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
 use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull;
 use dom::bindings::codegen::Bindings::HTMLElementBinding;
 use dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods;
 use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
 use dom::bindings::error::{Error, ErrorResult};
 use dom::bindings::inheritance::{ElementTypeId, HTMLElementTypeId, NodeTypeId};
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::{JS, MutNullableJS, Root, RootedReference};
 use dom::bindings::str::DOMString;
--- a/servo/components/script/dom/htmlframesetelement.rs
+++ b/servo/components/script/dom/htmlframesetelement.rs
@@ -1,13 +1,12 @@
 /* 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 dom::bindings::codegen::Bindings::EventHandlerBinding::{EventHandlerNonNull, OnBeforeUnloadEventHandlerNonNull};
 use dom::bindings::codegen::Bindings::HTMLFrameSetElementBinding;
 use dom::bindings::codegen::Bindings::HTMLFrameSetElementBinding::HTMLFrameSetElementMethods;
 use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
 use dom::bindings::js::Root;
 use dom::document::Document;
 use dom::htmlelement::HTMLElement;
 use dom::node::{Node, document_from_node};
 use dom_struct::dom_struct;
--- a/servo/components/script/dom/macros.rs
+++ b/servo/components/script/dom/macros.rs
@@ -329,17 +329,17 @@ macro_rules! jsmanaged_array(
                 }
             }
         }
     );
 );
 
 /// These are used to generate a event handler which has no special case.
 macro_rules! define_event_handler(
-    ($handler: ident, $event_type: ident, $getter: ident, $setter: ident, $setter_fn: ident) => (
+    ($handler: ty, $event_type: ident, $getter: ident, $setter: ident, $setter_fn: ident) => (
         fn $getter(&self) -> Option<::std::rc::Rc<$handler>> {
             use dom::bindings::inheritance::Castable;
             use dom::eventtarget::EventTarget;
             let eventtarget = self.upcast::<EventTarget>();
             eventtarget.get_event_handler_common(stringify!($event_type))
         }
 
         fn $setter(&self, listener: Option<::std::rc::Rc<$handler>>) {
@@ -347,17 +347,17 @@ macro_rules! define_event_handler(
             use dom::eventtarget::EventTarget;
             let eventtarget = self.upcast::<EventTarget>();
             eventtarget.$setter_fn(stringify!($event_type), listener)
         }
     )
 );
 
 macro_rules! define_window_owned_event_handler(
-    ($handler: ident, $event_type: ident, $getter: ident, $setter: ident) => (
+    ($handler: ty, $event_type: ident, $getter: ident, $setter: ident) => (
         fn $getter(&self) -> Option<::std::rc::Rc<$handler>> {
             let document = document_from_node(self);
             if document.has_browsing_context() {
                 document.window().$getter()
             } else {
                 None
             }
         }
@@ -368,46 +368,69 @@ macro_rules! define_window_owned_event_h
                 document.window().$setter(listener)
             }
         }
     )
 );
 
 macro_rules! event_handler(
     ($event_type: ident, $getter: ident, $setter: ident) => (
-        define_event_handler!(EventHandlerNonNull, $event_type, $getter, $setter,
-                              set_event_handler_common);
+        define_event_handler!(
+            ::dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull,
+            $event_type,
+            $getter,
+            $setter,
+            set_event_handler_common
+        );
     )
 );
 
 macro_rules! error_event_handler(
     ($event_type: ident, $getter: ident, $setter: ident) => (
-        define_event_handler!(OnErrorEventHandlerNonNull, $event_type, $getter, $setter,
-                              set_error_event_handler);
+        define_event_handler!(
+            ::dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull,
+            $event_type,
+            $getter,
+            $setter,
+            set_error_event_handler
+        );
     )
 );
 
 macro_rules! beforeunload_event_handler(
     ($event_type: ident, $getter: ident, $setter: ident) => (
-        define_event_handler!(OnBeforeUnloadEventHandlerNonNull, $event_type,
-                              $getter, $setter, set_beforeunload_event_handler);
+        define_event_handler!(
+            ::dom::bindings::codegen::Bindings::EventHandlerBinding::OnBeforeUnloadEventHandlerNonNull,
+            $event_type,
+            $getter,
+            $setter,
+            set_beforeunload_event_handler
+        );
     )
 );
 
 macro_rules! window_owned_event_handler(
     ($event_type: ident, $getter: ident, $setter: ident) => (
-        define_window_owned_event_handler!(EventHandlerNonNull,
-                                           $event_type, $getter, $setter);
+        define_window_owned_event_handler!(
+            ::dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull,
+            $event_type,
+            $getter,
+            $setter
+        );
     )
 );
 
 macro_rules! window_owned_beforeunload_event_handler(
     ($event_type: ident, $getter: ident, $setter: ident) => (
-        define_window_owned_event_handler!(OnBeforeUnloadEventHandlerNonNull,
-                                           $event_type, $getter, $setter);
+        define_window_owned_event_handler!(
+            ::dom::bindings::codegen::Bindings::EventHandlerBinding::OnBeforeUnloadEventHandlerNonNull,
+            $event_type,
+            $getter,
+            $setter
+        );
     )
 );
 
 // https://html.spec.whatwg.org/multipage/#globaleventhandlers
 // see webidls/EventHandler.webidl
 // As more methods get added, just update them here.
 macro_rules! global_event_handlers(
     () => (
--- a/servo/components/script/dom/mediaquerylist.rs
+++ b/servo/components/script/dom/mediaquerylist.rs
@@ -1,14 +1,13 @@
 /* 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 dom::bindings::cell::DOMRefCell;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::EventListenerBinding::EventListener;
 use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
 use dom::bindings::codegen::Bindings::MediaQueryListBinding::{self, MediaQueryListMethods};
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::{JS, Root};
 use dom::bindings::reflector::DomObject;
 use dom::bindings::reflector::reflect_dom_object;
 use dom::bindings::str::DOMString;
--- a/servo/components/script/dom/permissionstatus.rs
+++ b/servo/components/script/dom/permissionstatus.rs
@@ -1,13 +1,12 @@
 /* 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 dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::PermissionStatusBinding::{self, PermissionDescriptor, PermissionName};
 use dom::bindings::codegen::Bindings::PermissionStatusBinding::PermissionState;
 use dom::bindings::codegen::Bindings::PermissionStatusBinding::PermissionStatusMethods;
 use dom::bindings::js::Root;
 use dom::bindings::reflector::reflect_dom_object;
 use dom::eventtarget::EventTarget;
 use dom::globalscope::GlobalScope;
 use dom_struct::dom_struct;
--- a/servo/components/script/dom/serviceworker.rs
+++ b/servo/components/script/dom/serviceworker.rs
@@ -1,15 +1,14 @@
 /* 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 dom::abstractworker::SimpleWorkerErrorHandler;
 use dom::bindings::cell::DOMRefCell;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::ServiceWorkerBinding::{ServiceWorkerMethods, ServiceWorkerState, Wrap};
 use dom::bindings::error::{ErrorResult, Error};
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::Root;
 use dom::bindings::refcounted::Trusted;
 use dom::bindings::reflector::{DomObject, reflect_dom_object};
 use dom::bindings::str::USVString;
 use dom::bindings::structuredclone::StructuredCloneData;
--- a/servo/components/script/dom/serviceworkerglobalscope.rs
+++ b/servo/components/script/dom/serviceworkerglobalscope.rs
@@ -1,16 +1,15 @@
 /* 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 devtools;
 use devtools_traits::DevtoolScriptControlMsg;
 use dom::abstractworker::WorkerScriptMsg;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::ServiceWorkerGlobalScopeBinding;
 use dom::bindings::codegen::Bindings::ServiceWorkerGlobalScopeBinding::ServiceWorkerGlobalScopeMethods;
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::{Root, RootCollection};
 use dom::bindings::reflector::DomObject;
 use dom::bindings::str::DOMString;
 use dom::event::Event;
 use dom::eventtarget::EventTarget;
--- a/servo/components/script/dom/webglrenderingcontext.rs
+++ b/servo/components/script/dom/webglrenderingcontext.rs
@@ -259,20 +259,16 @@ impl WebGLRenderingContext {
         let (sender, receiver) = webgl_channel().unwrap();
         self.webgl_sender.send_resize(size, sender).unwrap();
 
         if let Err(msg) = receiver.recv().unwrap() {
             error!("Error resizing WebGLContext: {}", msg);
             return;
         };
 
-        // Reset webrender_image because resize creates a new image_key.
-        // The new image key is set in the next handle_layout() method.
-        self.webrender_image.set(None);
-
         // ClearColor needs to be restored because after a resize the GLContext is recreated
         // and the framebuffer is cleared using the default black transparent color.
         let color = self.current_clear_color.get();
         self.send_command(WebGLCommand::ClearColor(color.0, color.1, color.2, color.3));
 
         // WebGL Spec: Scissor rect must not change if the canvas is resized.
         // See: webgl/conformance-1.0.3/conformance/rendering/gl-scissor-canvas-dimensions.html
         // NativeContext handling library changes the scissor after a resize, so we need to reset the
--- a/servo/components/script/dom/websocket.rs
+++ b/servo/components/script/dom/websocket.rs
@@ -1,15 +1,14 @@
 /* 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 dom::bindings::cell::DOMRefCell;
 use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::WebSocketBinding;
 use dom::bindings::codegen::Bindings::WebSocketBinding::{BinaryType, WebSocketMethods};
 use dom::bindings::codegen::UnionTypes::StringOrStringSequence;
 use dom::bindings::conversions::ToJSValConvertible;
 use dom::bindings::error::{Error, ErrorResult, Fallible};
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::Root;
 use dom::bindings::refcounted::Trusted;
--- a/servo/components/script/dom/window.rs
+++ b/servo/components/script/dom/window.rs
@@ -5,19 +5,16 @@
 use app_units::Au;
 use base64;
 use bluetooth_traits::BluetoothRequest;
 use canvas_traits::webgl::WebGLChan;
 use cssparser::{Parser, ParserInput};
 use devtools_traits::{ScriptToDevtoolsControlMsg, TimelineMarker, TimelineMarkerType};
 use dom::bindings::cell::DOMRefCell;
 use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState};
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::OnBeforeUnloadEventHandlerNonNull;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull;
 use dom::bindings::codegen::Bindings::FunctionBinding::Function;
 use dom::bindings::codegen::Bindings::PermissionStatusBinding::PermissionState;
 use dom::bindings::codegen::Bindings::RequestBinding::RequestInit;
 use dom::bindings::codegen::Bindings::WindowBinding::{self, FrameRequestCallback, WindowMethods};
 use dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions};
 use dom::bindings::codegen::UnionTypes::RequestOrUSVString;
 use dom::bindings::error::{Error, ErrorResult, Fallible};
 use dom::bindings::inheritance::Castable;
--- a/servo/components/script/dom/worker.rs
+++ b/servo/components/script/dom/worker.rs
@@ -1,16 +1,15 @@
 /* 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 devtools_traits::{DevtoolsPageInfo, ScriptToDevtoolsControlMsg};
 use dom::abstractworker::{SharedRt, SimpleWorkerErrorHandler};
 use dom::abstractworker::WorkerScriptMsg;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::WorkerBinding;
 use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods;
 use dom::bindings::error::{Error, ErrorResult, Fallible, ErrorInfo};
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::Root;
 use dom::bindings::refcounted::Trusted;
 use dom::bindings::reflector::{DomObject, reflect_dom_object};
 use dom::bindings::str::DOMString;
--- a/servo/components/script/dom/workerglobalscope.rs
+++ b/servo/components/script/dom/workerglobalscope.rs
@@ -1,14 +1,13 @@
 /* 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 devtools_traits::{DevtoolScriptControlMsg, WorkerId};
-use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull;
 use dom::bindings::codegen::Bindings::FunctionBinding::Function;
 use dom::bindings::codegen::Bindings::RequestBinding::RequestInit;
 use dom::bindings::codegen::Bindings::WorkerGlobalScopeBinding::WorkerGlobalScopeMethods;
 use dom::bindings::codegen::UnionTypes::RequestOrUSVString;
 use dom::bindings::error::{Error, ErrorResult, Fallible, report_pending_exception};
 use dom::bindings::inheritance::Castable;
 use dom::bindings::js::{MutNullableJS, Root};
 use dom::bindings::reflector::DomObject;
--- a/servo/components/script/dom/xmlhttprequest.rs
+++ b/servo/components/script/dom/xmlhttprequest.rs
@@ -1,16 +1,15 @@
 /* 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 document_loader::DocumentLoader;
 use dom::bindings::cell::DOMRefCell;
 use dom::bindings::codegen::Bindings::BlobBinding::BlobBinding::BlobMethods;
-use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
 use dom::bindings::codegen::Bindings::XMLHttpRequestBinding;
 use dom::bindings::codegen::Bindings::XMLHttpRequestBinding::BodyInit;
 use dom::bindings::codegen::Bindings::XMLHttpRequestBinding::XMLHttpRequestMethods;
 use dom::bindings::codegen::Bindings::XMLHttpRequestBinding::XMLHttpRequestResponseType;
 use dom::bindings::codegen::UnionTypes::DocumentOrBodyInit;
 use dom::bindings::conversions::ToJSValConvertible;
 use dom::bindings::error::{Error, ErrorResult, Fallible};
--- a/servo/components/script/dom/xmlhttprequesteventtarget.rs
+++ b/servo/components/script/dom/xmlhttprequesteventtarget.rs
@@ -1,13 +1,12 @@
 /* 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 dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
 use dom::bindings::codegen::Bindings::XMLHttpRequestEventTargetBinding::XMLHttpRequestEventTargetMethods;
 use dom::eventtarget::EventTarget;
 use dom_struct::dom_struct;
 
 #[dom_struct]
 pub struct XMLHttpRequestEventTarget {
     eventtarget: EventTarget,
 }
--- a/servo/components/style/rule_tree/mod.rs
+++ b/servo/components/style/rule_tree/mod.rs
@@ -194,46 +194,53 @@ impl RuleTree {
         let mut important_author = SmallVec::<[StyleSource; 4]>::new();
         let mut important_user = SmallVec::<[StyleSource; 4]>::new();
         let mut important_ua = SmallVec::<[StyleSource; 4]>::new();
         let mut transition = None;
 
         for (source, level) in iter {
             debug_assert!(last_level <= level, "Not really ordered");
             debug_assert!(!level.is_important(), "Important levels handled internally");
-            let (any_normal, any_important) = {
+            let any_important = {
                 let pdb = source.read(level.guard(guards));
-                (pdb.any_normal(), pdb.any_important())
+                pdb.any_important()
             };
+
             if any_important {
                 found_important = true;
                 match level {
                     AuthorNormal => important_author.push(source.clone()),
                     UANormal => important_ua.push(source.clone()),
                     UserNormal => important_user.push(source.clone()),
                     StyleAttributeNormal => {
                         debug_assert!(important_style_attr.is_none());
                         important_style_attr = Some(source.clone());
                     },
                     _ => {},
                 };
             }
-            // We really want to ensure empty rule nodes appear in the rule tree for
-            // devtools, this condition ensures that if we find an empty rule node, we
-            // insert it at the normal level.
-            if any_normal || !any_important {
-                if matches!(level, Transitions) && found_important {
-                    // There can be at most one transition, and it will come at
-                    // the end of the iterator. Stash it and apply it after
-                    // !important rules.
-                    debug_assert!(transition.is_none());
-                    transition = Some(source);
-                } else {
-                    current = current.ensure_child(self.root.downgrade(), source, level);
-                }
+
+            // We don't optimize out empty rules, even though we could.
+            //
+            // Inspector relies on every rule being inserted in the normal level
+            // at least once, in order to return the rules with the correct
+            // specificity order.
+            //
+            // TODO(emilio): If we want to apply these optimizations without
+            // breaking inspector's expectations, we'd need to run
+            // selector-matching again at the inspector's request. That may or
+            // may not be a better trade-off.
+            if matches!(level, Transitions) && found_important {
+                // There can be at most one transition, and it will come at
+                // the end of the iterator. Stash it and apply it after
+                // !important rules.
+                debug_assert!(transition.is_none());
+                transition = Some(source);
+            } else {
+                current = current.ensure_child(self.root.downgrade(), source, level);
             }
             last_level = level;
         }
 
         // Early-return in the common case of no !important declarations.
         if !found_important {
             return current;
         }
--- a/servo/components/style/traversal.rs
+++ b/servo/components/style/traversal.rs
@@ -285,23 +285,17 @@ pub trait DomTraversal<E: TElement> : Sy
         // restyling.
         if !data.restyle.hint.is_empty() {
             return true;
         }
 
         // Servo uses the post-order traversal for flow construction, so we need
         // to traverse any element with damage so that we can perform fixup /
         // reconstruction on our way back up the tree.
-        //
-        // In aggressively forgetful traversals (where we seek out and clear damage
-        // in addition to not computing it) we also need to traverse nodes with
-        // explicit damage and no other restyle data, so that this damage can be cleared.
-        if (cfg!(feature = "servo") ||
-            traversal_flags.contains(traversal_flags::AggressivelyForgetful)) &&
-           !data.restyle.damage.is_empty() {
+        if cfg!(feature = "servo") && !data.restyle.damage.is_empty() {
             return true;
         }
 
         trace!("{:?} doesn't need traversal", el);
         false
     }
 
     /// Returns true if we want to cull this subtree from the travesal.
--- a/servo/components/style/traversal_flags.rs
+++ b/servo/components/style/traversal_flags.rs
@@ -19,19 +19,16 @@ bitflags! {
         /// Styles unstyled elements, but does not handle invalidations on
         /// already-styled elements.
         const UnstyledOnly = 1 << 2,
         /// A forgetful traversal ignores the previous state of the frame tree, and
         /// thus does not compute damage or maintain other state describing the styles
         /// pre-traversal. A forgetful traversal is usually the right thing if you
         /// aren't going to do a post-traversal.
         const Forgetful = 1 << 3,
-        /// Actively seeks out and clears change hints that may have been posted into
-        /// the tree. Nonsensical without also passing Forgetful.
-        const AggressivelyForgetful = 1 << 4,
         /// Clears all the dirty bits on the elements traversed.
         const ClearDirtyBits = 1 << 5,
         /// Clears the animation-only dirty descendants bit in the subtree.
         const ClearAnimationOnlyDirtyDescendants = 1 << 6,
         /// Allows the traversal to run in parallel if there are sufficient cores on
         /// the machine.
         const ParallelTraversal = 1 << 7,
         /// Flush throttled animations. By default, we only update throttled animations
@@ -61,17 +58,16 @@ pub fn assert_traversal_flags_match() {
         }
     }
 
     check_traversal_flags! {
         ServoTraversalFlags_AnimationOnly => AnimationOnly,
         ServoTraversalFlags_ForCSSRuleChanges => ForCSSRuleChanges,
         ServoTraversalFlags_UnstyledOnly => UnstyledOnly,
         ServoTraversalFlags_Forgetful => Forgetful,
-        ServoTraversalFlags_AggressivelyForgetful => AggressivelyForgetful,
         ServoTraversalFlags_ClearDirtyBits => ClearDirtyBits,
         ServoTraversalFlags_ClearAnimationOnlyDirtyDescendants =>
             ClearAnimationOnlyDirtyDescendants,
         ServoTraversalFlags_ParallelTraversal => ParallelTraversal,
         ServoTraversalFlags_FlushThrottledAnimations => FlushThrottledAnimations,
     }
 }
 
--- a/servo/components/style/values/computed/image.rs
+++ b/servo/components/style/values/computed/image.rs
@@ -73,20 +73,23 @@ pub type GradientItem = GenericGradientI
 
 /// A computed color stop.
 pub type ColorStop = GenericColorStop<RGBA, LengthOrPercentage>;
 
 /// Computed values for `-moz-image-rect(...)`.
 pub type MozImageRect = GenericMozImageRect<NumberOrPercentage, ComputedUrl>;
 
 impl GenericLineDirection for LineDirection {
-    fn points_downwards(&self) -> bool {
+    fn points_downwards(&self, compat_mode: CompatMode) -> bool {
         match *self {
             LineDirection::Angle(angle) => angle.radians() == PI,
-            LineDirection::Vertical(Y::Bottom) => true,
+            LineDirection::Vertical(Y::Bottom)
+                if compat_mode == CompatMode::Modern => true,
+            LineDirection::Vertical(Y::Top)
+                if compat_mode != CompatMode::Modern => true,
             LineDirection::Corner(..) => false,
             #[cfg(feature = "gecko")]
             LineDirection::MozPosition(_, _) => false,
             _ => false,
         }
     }
 
     fn to_css<W>(&self, dest: &mut W, compat_mode: CompatMode) -> fmt::Result
--- a/servo/components/style/values/generics/image.rs
+++ b/servo/components/style/values/generics/image.rs
@@ -225,17 +225,18 @@ impl<D, L, LoP, P, C, A> ToCss for Gradi
         }
 
         if self.repeating {
             dest.write_str("repeating-")?;
         }
         dest.write_str(self.kind.label())?;
         dest.write_str("-gradient(")?;
         let mut skip_comma = match self.kind {
-            GradientKind::Linear(ref direction) if direction.points_downwards() => true,
+            GradientKind::Linear(ref direction)
+                if direction.points_downwards(self.compat_mode) => true,
             GradientKind::Linear(ref direction) => {
                 direction.to_css(dest, self.compat_mode)?;
                 false
             },
             GradientKind::Radial(ref shape, ref position, ref angle) => {
                 let omit_shape = match *shape {
                     EndingShape::Ellipse(Ellipse::Extent(ShapeExtent::Cover)) |
                     EndingShape::Ellipse(Ellipse::Extent(ShapeExtent::FarthestCorner)) => {
@@ -282,17 +283,17 @@ impl<D, L, LoP, P, A> GradientKind<D, L,
             GradientKind::Radial(..) => "radial",
         }
     }
 }
 
 /// The direction of a linear gradient.
 pub trait LineDirection {
     /// Whether this direction points towards, and thus can be omitted.
-    fn points_downwards(&self) -> bool;
+    fn points_downwards(&self, compat_mode: CompatMode) -> bool;
 
     /// Serialises this direction according to the compatibility mode.
     fn to_css<W>(&self, dest: &mut W, compat_mode: CompatMode) -> fmt::Result
         where W: fmt::Write;
 }
 
 impl<L> ToCss for Circle<L>
 where
--- a/servo/components/style/values/specified/image.rs
+++ b/servo/components/style/values/specified/image.rs
@@ -521,17 +521,20 @@ impl GradientKind {
     fn parse_linear<'i, 't>(context: &ParserContext,
                             input: &mut Parser<'i, 't>,
                             compat_mode: &mut CompatMode)
                             -> Result<Self, ParseError<'i>> {
         let direction = if let Ok(d) = input.try(|i| LineDirection::parse(context, i, compat_mode)) {
             input.expect_comma()?;
             d
         } else {
-            LineDirection::Vertical(Y::Bottom)
+            match *compat_mode {
+                CompatMode::Modern => LineDirection::Vertical(Y::Bottom),
+                _ => LineDirection::Vertical(Y::Top),
+            }
         };
         Ok(GenericGradientKind::Linear(direction))
     }
 
     fn parse_radial<'i, 't>(context: &ParserContext,
                             input: &mut Parser<'i, 't>,
                             compat_mode: &mut CompatMode)
                             -> Result<Self, ParseError<'i>> {
@@ -610,20 +613,23 @@ impl GradientKind {
         #[cfg(not(feature = "gecko"))]
         {
             return Ok(GenericGradientKind::Radial(shape, position, angle));
         }
     }
 }
 
 impl GenericsLineDirection for LineDirection {
-    fn points_downwards(&self) -> bool {
+    fn points_downwards(&self, compat_mode: CompatMode) -> bool {
         match *self {
             LineDirection::Angle(ref angle) => angle.radians() == PI,
-            LineDirection::Vertical(Y::Bottom) => true,
+            LineDirection::Vertical(Y::Bottom)
+                if compat_mode == CompatMode::Modern => true,
+            LineDirection::Vertical(Y::Top)
+                if compat_mode != CompatMode::Modern => true,
             _ => false,
         }
     }
 
     fn to_css<W>(&self, dest: &mut W, compat_mode: CompatMode) -> fmt::Result
         where W: fmt::Write
     {
         match *self {
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -1916,34 +1916,30 @@ pub extern "C" fn Servo_ComputedValues_E
 #[no_mangle]
 pub extern "C" fn Servo_ComputedValues_GetStyleRuleList(values: ServoStyleContextBorrowed,
                                                         rules: RawGeckoServoStyleRuleListBorrowedMut) {
     let rule_node = match values.rules {
         Some(ref r) => r,
         None => return,
     };
 
-    let global_style_data = &*GLOBAL_STYLE_DATA;
-    let guard = global_style_data.shared_lock.read();
-
     // TODO(emilio): Will benefit from SmallVec.
     let mut result = vec![];
     for node in rule_node.self_and_ancestors() {
         let style_rule = match *node.style_source() {
             StyleSource::Style(ref rule) => rule,
             _ => continue,
         };
 
+        // For the rules with any important declaration, we insert them into
+        // rule tree twice, one for normal level and another for important
+        // level. So, we skip the important one to keep the specificity order of
+        // rules.
         if node.importance().important() {
-            let block = style_rule.read_with(&guard).block.read_with(&guard);
-            if block.any_normal() {
-                // We'll append it when we find the normal rules in our
-                // parent chain.
-                continue;
-            }
+            continue;
         }
 
         result.push(style_rule);
     }
 
     unsafe { rules.set_len(result.len() as u32) };
     for (ref src, ref mut dest) in result.into_iter().zip(rules.iter_mut()) {
         src.with_raw_offset_arc(|arc| {
--- a/taskcluster/ci/upload-generated-sources/kind.yml
+++ b/taskcluster/ci/upload-generated-sources/kind.yml
@@ -24,12 +24,12 @@ job-template:
     symbol: Ugs
     kind: build
   worker:
      docker-image: {in-tree: "lint"}
      max-run-time: 600
   run:
     using: run-task
     command: >
-            cd /home/worker/checkouts/gecko &&
+            cd /builds/worker/checkouts/gecko &&
             ./mach python build/upload_generated_sources.py ${ARTIFACT_URL}
   scopes:
       - secrets:get:project/releng/gecko/build/level-{level}/gecko-generated-sources-upload
--- a/taskcluster/docker/README.md
+++ b/taskcluster/docker/README.md
@@ -90,21 +90,24 @@ Example:
   image: {#docker_image}builder{/docker_image}
 
 Each image has a hash and a version, given by its `HASH` and `VERSION` files.
 When rebuilding a prebuilt image the `VERSION` should be bumped. Once a new
 version of the image has been built the `HASH` file should be updated with the
 hash of the image.
 
 The `HASH` file is the image hash as computed by docker, this is always on the
-format `sha256:<digest>`. In production images will be referenced by image hash.
-This mitigates attacks against the registry as well as simplifying validate of
-correctness. The `VERSION` file only serves to provide convenient names, such
-that old versions are easy to discover in the registry (and ensuring old
-versions aren't deleted by garbage-collection).
+format `sha256:<digest>`. Note that Docker produces a numbre of hashes in this
+format; the hash used in this context is the one returned from `docker push`.
+
+In production images will be referenced by image hash.  This mitigates attacks
+against the registry as well as simplifying validate of correctness. The
+`VERSION` file only serves to provide convenient names, such that old versions
+are easy to discover in the registry (and ensuring old versions aren't deleted
+by garbage-collection).
 
 This way, older tasks which were designed to run on an older version of the image
 can still be executed in taskcluster, while new tasks can use the new version.
 Further more, this mitigates attacks against the registry as docker will verify
 the image hash when loading the image.
 
 Each image also has a `REGISTRY`, defaulting to the `REGISTRY` in this directory,
 and specifying the image registry to which the completed image should be uploaded.
--- a/taskcluster/docker/decision/Dockerfile
+++ b/taskcluster/docker/decision/Dockerfile
@@ -1,28 +1,29 @@
 FROM          ubuntu:16.04
 MAINTAINER    Greg Arndt <garndt@mozilla.com>
 
 # Add worker user
-RUN useradd -d /home/worker -s /bin/bash -m worker
-RUN mkdir /home/worker/artifacts && chown worker:worker /home/worker/artifacts
+RUN mkdir /builds
+RUN useradd -d /builds/worker -s /bin/bash -m worker
+RUN mkdir /builds/worker/artifacts && chown worker:worker /builds/worker/artifacts
 
 # %include python/mozbuild/mozbuild/action/tooltool.py
 ADD topsrcdir/python/mozbuild/mozbuild/action/tooltool.py /tmp/tooltool.py
 
 # %include testing/mozharness/external_tools/robustcheckout.py
 ADD topsrcdir/testing/mozharness/external_tools/robustcheckout.py /usr/local/mercurial/robustcheckout.py
 
 # %include taskcluster/docker/recipes/install-mercurial.sh
 ADD topsrcdir/taskcluster/docker/recipes/install-mercurial.sh /tmp/install-mercurial.sh
 
 ADD system-setup.sh /tmp/system-setup.sh
 RUN bash /tmp/system-setup.sh
 
 # %include taskcluster/docker/recipes/run-task
-ADD topsrcdir/taskcluster/docker/recipes/run-task /home/worker/bin/run-task
+ADD topsrcdir/taskcluster/docker/recipes/run-task /builds/worker/bin/run-task
 
-ENV PATH /home/worker/bin:$PATH
+ENV PATH /builds/worker/bin:$PATH
 ENV SHELL /bin/bash
-ENV HOME /home/worker
+ENV HOME /builds/worker
 
 # Set a default command useful for debugging
 CMD ["/bin/bash", "--login"]
--- a/taskcluster/docker/decision/HASH
+++ b/taskcluster/docker/decision/HASH
@@ -1,1 +1,1 @@
-sha256:c5451ee6c655b3d97d4baa3b0e29a5115f23e0991d4f7f36d2a8f793076d6854
+sha256:4039fd878e5700b326d4a636e28c595c053fbcb53909c1db84ad1f513cf644ef
--- a/taskcluster/docker/decision/VERSION
+++ b/taskcluster/docker/decision/VERSION
@@ -1,1 +1,1 @@
-0.1.10
+2.0.0
--- a/taskcluster/docker/image_builder/Dockerfile
+++ b/taskcluster/docker/image_builder/Dockerfile
@@ -17,26 +17,26 @@ ADD topsrcdir/taskcluster/docker/recipes
 
 # Add and run setup script
 ADD build-image.sh      /usr/local/bin/build-image.sh
 ADD download-and-compress /usr/local/bin/download-and-compress
 ADD setup.sh            /setup/setup.sh
 RUN bash /setup/setup.sh
 
 # Setup a workspace that won't use AUFS.
-VOLUME /home/worker/checkouts
-VOLUME /home/worker/workspace
+VOLUME /builds/worker/checkouts
+VOLUME /builds/worker/workspace
 
 # Set variable normally configured at login, by the shells parent process, these
 # are taken from GNU su manual
-ENV           HOME          /home/worker
+ENV           HOME          /builds/worker
 ENV           SHELL         /bin/bash
 ENV           USER          worker
 ENV           LOGNAME       worker
 ENV           HOSTNAME      taskcluster-worker
 ENV           LC_ALL        C
 
 # Create worker user
-RUN useradd -d /home/worker -s /bin/bash -m worker
+RUN useradd -d /builds/worker -s /bin/bash -m worker
 
 # Set some sane defaults
-WORKDIR /home/worker/
+WORKDIR /builds/worker/
 CMD     build-image.sh
--- a/taskcluster/docker/image_builder/HASH
+++ b/taskcluster/docker/image_builder/HASH
@@ -1,1 +1,1 @@
-sha256:ceaaf92511cfbff711598005585127953873332c62f245dcf1892510c4eb371f
+sha256:24ce54a1602453bc93515aecd9d4ad25a22115fbc4b209ddb5541377e9a37315
--- a/taskcluster/docker/image_builder/VERSION
+++ b/taskcluster/docker/image_builder/VERSION
@@ -1,1 +1,1 @@
-1.3.0
+2.0.0
--- a/taskcluster/docker/image_builder/build-image.sh
+++ b/taskcluster/docker/image_builder/build-image.sh
@@ -13,31 +13,31 @@ raise_error() {
   exit 1
 }
 
 # Ensure that the PROJECT is specified so the image can be indexed
 test -n "$PROJECT"    || raise_error "PROJECT must be provided."
 test -n "$HASH"       || raise_error "Context HASH must be provided."
 test -n "$IMAGE_NAME" || raise_error "IMAGE_NAME must be provided."
 
-# Create artifact folder
-mkdir -p /home/worker/workspace/artifacts
-
 # Construct a CONTEXT_FILE
-CONTEXT_FILE=/home/worker/workspace/context.tar
+CONTEXT_FILE=/builds/worker/workspace/context.tar
 
 # Run ./mach taskcluster-build-image with --context-only to build context
 run-task \
-  --vcs-checkout "/home/worker/checkouts/gecko" \
+  --vcs-checkout "/builds/worker/checkouts/gecko" \
   -- \
-  /home/worker/checkouts/gecko/mach taskcluster-build-image \
+  /builds/worker/checkouts/gecko/mach taskcluster-build-image \
   --context-only "$CONTEXT_FILE" \
   "$IMAGE_NAME"
 test -f "$CONTEXT_FILE" || raise_error "Context file wasn't created"
 
+# Create artifact folder (note that this must occur after run-task)
+mkdir -p /builds/worker/workspace/artifacts
+
 # Post context tar-ball to docker daemon
 # This interacts directly with the docker remote API, see:
 # https://docs.docker.com/engine/reference/api/docker_remote_api_v1.18/
 curl -s --fail \
   -X POST \
   --header 'Content-Type: application/tar' \
   --data-binary "@$CONTEXT_FILE" \
   --unix-socket /var/run/docker.sock "http:/build?t=$IMAGE_NAME:$HASH" \
@@ -58,10 +58,10 @@ fi
 
 # Get image from docker daemon (try up to 10 times)
 # This interacts directly with the docker remote API, see:
 # https://docs.docker.com/engine/reference/api/docker_remote_api_v1.18/
 #
 # The script will retry up to 10 times.
 /usr/local/bin/download-and-compress \
     http+unix://%2Fvar%2Frun%2Fdocker.sock/images/${IMAGE_NAME}:${HASH}/get \
-    /home/worker/workspace/image.tar.zst.tmp \
-    /home/worker/workspace/artifacts/image.tar.zst
+    /builds/worker/workspace/image.tar.zst.tmp \
+    /builds/worker/workspace/artifacts/image.tar.zst
--- a/taskcluster/docker/image_builder/setup.sh
+++ b/taskcluster/docker/image_builder/setup.sh
@@ -24,17 +24,17 @@ apt-get install -y python-pip
 . /setup/install-mercurial.sh
 
 # Install build-image.sh script
 chmod +x /usr/local/bin/build-image.sh
 chmod +x /usr/local/bin/run-task
 chmod +x /usr/local/bin/download-and-compress
 
 # Create workspace
-mkdir -p /home/worker/workspace
+mkdir -p /builds/worker/workspace
 
 # Install python-zstandard.
 cd /setup
 tooltool_fetch <<EOF
 [
   {
     "size": 463794,
     "visibility": "public",
--- a/taskcluster/docs/docker-images.rst
+++ b/taskcluster/docs/docker-images.rst
@@ -3,16 +3,18 @@
 =============
 Docker Images
 =============
 
 TaskCluster Docker images are defined in the source directory under
 ``taskcluster/docker``. Each directory therein contains the name of an
 image used as part of the task graph.
 
+More information is available in the ``README.md`` file in that directory.
+
 Adding Extra Files to Images
 ============================
 
 Dockerfile syntax has been extended to allow *any* file from the
 source checkout to be added to the image build *context*. (Traditionally
 you can only ``ADD`` files from the same directory as the Dockerfile.)
 
 Simply add the following syntax as a comment in a Dockerfile::
@@ -34,9 +36,9 @@ context under the ``topsrcdir/`` path.
 
 Files are added as they exist on disk. e.g. executable flags should be
 preserved. However, the file owner/group is changed to ``root`` and the
 ``mtime`` of the file is normalized.
 
 Here is an example Dockerfile snippet::
 
    # %include mach
-   ADD topsrcdir/mach /home/worker/mach
+   ADD topsrcdir/mach /builds/worker/mach
--- a/taskcluster/taskgraph/action.yml
+++ b/taskcluster/taskgraph/action.yml
@@ -33,17 +33,17 @@ payload:
   cache:
     level-{{level}}-checkouts: /home/worker/checkouts
 
   features:
     taskclusterProxy: true
 
   # Note: This task is built server side without the context or tooling that
   # exist in tree so we must hard code the version
-  image: 'taskcluster/decision:0.1.7'
+  image: 'taskcluster/decision:2.0.0@sha256:4039fd878e5700b326d4a636e28c595c053fbcb53909c1db84ad1f513cf644ef'
 
   # Virtually no network or other potentially risky operations happen as part
   # of the task timeout aside from the initial clone. We intentionally have
   # set this to a lower value _all_ decision tasks should use a root
   # repository which is cached.
   maxRunTime: 1800
 
   command:
--- a/taskcluster/taskgraph/transforms/docker_image.py
+++ b/taskcluster/taskgraph/transforms/docker_image.py
@@ -95,37 +95,38 @@ def fill_template(config, tasks):
             # this image..
             'worker': {
                 'implementation': 'docker-worker',
                 'os': 'linux',
                 'docker-image': docker_image('image_builder'),
                 'caches': [{
                     'type': 'persistent',
                     'name': 'level-{}-imagebuilder-v1'.format(config.params['level']),
-                    'mount-point': '/home/worker/checkouts',
+                    'mount-point': '/builds/worker/checkouts',
                 }],
                 'volumes': [
-                    # Keep in sync with Dockerfile.
-                    '/home/worker/checkouts',
-                    '/home/worker/workspace',
+                    # Keep in sync with Dockerfile and TASKCLUSTER_VOLUMES
+                    '/builds/worker/checkouts',
+                    '/builds/worker/workspace',
                 ],
                 'artifacts': [{
                     'type': 'file',
-                    'path': '/home/worker/workspace/artifacts/image.tar.zst',
+                    'path': '/builds/worker/workspace/artifacts/image.tar.zst',
                     'name': 'public/image.tar.zst',
                 }],
                 'env': {
-                    'HG_STORE_PATH': '/home/worker/checkouts/hg-store',
+                    'HG_STORE_PATH': '/builds/worker/checkouts/hg-store',
                     'HASH': context_hash,
                     'PROJECT': config.params['project'],
                     'IMAGE_NAME': image_name,
                     'DOCKER_IMAGE_ZSTD_LEVEL': zstd_level,
                     'GECKO_BASE_REPOSITORY': config.params['base_repository'],
                     'GECKO_HEAD_REPOSITORY': config.params['head_repository'],
                     'GECKO_HEAD_REV': config.params['head_rev'],
+                    'TASKCLUSTER_VOLUMES': '/builds/worker/checkouts;/builds/worker/workspace',
                 },
                 'chain-of-trust': True,
                 'docker-in-docker': True,
                 'taskcluster-proxy': True,
                 'max-run-time': 7200,
             },
         }
 
--- a/testing/web-platform/tests/fetch/api/basic/integrity.js
+++ b/testing/web-platform/tests/fetch/api/basic/integrity.js
@@ -1,45 +1,80 @@
 if (this.document === undefined) {
   importScripts("/resources/testharness.js");
   importScripts("../resources/utils.js");
 }
 
-function integrity(desc, url, integrity, shouldPass) {
-   if (shouldPass) {
+function integrity(desc, url, integrity, initRequestMode, shouldPass) {
+  var fetchRequestInit = {'integrity': integrity}
+  if (!!initRequestMode && initRequestMode !== "") {
+    fetchRequestInit.mode = initRequestMode;
+  }
+  var fetchPromise = fetch(url, fetchRequestInit);
+
+  if (shouldPass) {
     promise_test(function(test) {
-      return fetch(url, {'integrity': integrity}).then(function(resp) {
-        assert_equals(resp.status, 200, "Response's status is 200");
+      return fetchPromise.then(function(resp) {
+        if (initRequestMode !== "no-cors") {
+          assert_equals(resp.status, 200, "Response's status is 200");
+        } else {
+          assert_equals(resp.status, 0, "Opaque response's status is 0");
+          assert_equals(resp.type, "opaque");
+        }
       });
     }, desc);
   } else {
     promise_test(function(test) {
-      return promise_rejects(test, new TypeError(), fetch(url, {'integrity': integrity}));
+      return promise_rejects(test, new TypeError(), fetchPromise);
     }, desc);
   }
 }
 
 var topSha256 = "sha256-KHIDZcXnR2oBHk9DrAA+5fFiR6JjudYjqoXtMR1zvzk=";
 var topSha384 = "sha384-MgZYnnAzPM/MjhqfOIMfQK5qcFvGZsGLzx4Phd7/A8fHTqqLqXqKo8cNzY3xEPTL";
 var topSha512 = "sha512-D6yns0qxG0E7+TwkevZ4Jt5t7Iy3ugmAajG/dlf6Pado1JqTyneKXICDiqFIkLMRExgtvg8PlxbKTkYfRejSOg==";
 var invalidSha256 = "sha256-dKUcPOn/AlUjWIwcHeHNqYXPlvyGiq+2dWOdFcE+24I=";
 var invalidSha512 = "sha512-oUceBRNxPxnY60g/VtPCj2syT4wo4EZh2CgYdWy9veW8+OsReTXoh7dizMGZafvx9+QhMS39L/gIkxnPIn41Zg==";
 
 var url = "../resources/top.txt";
 var corsUrl = "http://{{host}}:{{ports[http][1]}}" + dirname(location.pathname) + RESOURCES_DIR + "top.txt";
 /* Enable CORS*/
 corsUrl += "?pipe=header(Access-Control-Allow-Origin,*)";
+var corsUrl2 = "https://{{host}}:{{ports[https][0]}}/fetch/api/resource/top.txt";
 
-integrity("Empty string integrity", url, "", true);
-integrity("SHA-256 integrity", url, topSha256, true);
-integrity("SHA-384 integrity", url, topSha384, true);
-integrity("SHA-512 integrity", url, topSha512, true);
-integrity("Invalid integrity", url, invalidSha256, false);
-integrity("Multiple integrities: valid stronger than invalid", url, invalidSha256 + " " + topSha384, true);
-integrity("Multiple integrities: invalid stronger than valid", url, invalidSha512 + " " + topSha384, false);
-integrity("Multiple integrities: invalid as strong as valid", url, invalidSha512 + " " + topSha512, true);
-integrity("Multiple integrities: both are valid", url,  topSha384 + " " + topSha512, true);
-integrity("Multiple integrities: both are invalid", url, invalidSha256 + " " + invalidSha512, false);
-integrity("CORS empty integrity", corsUrl, "", true);
-integrity("CORS SHA-512 integrity", corsUrl, topSha512, true);
-integrity("CORS invalid integrity", corsUrl, invalidSha512, false);
+integrity("Empty string integrity", url, "", /* initRequestMode */ undefined,
+          /* shouldPass */ true);
+integrity("SHA-256 integrity", url, topSha256, /* initRequestMode */ undefined,
+          /* shouldPass */ true);
+integrity("SHA-384 integrity", url, topSha384, /* initRequestMode */ undefined,
+          /* shouldPass */ true);
+integrity("SHA-512 integrity", url, topSha512, /* initRequestMode */ undefined,
+          /* shouldPass */ true);
+integrity("Invalid integrity", url, invalidSha256,
+          /* initRequestMode */ undefined, /* shouldPass */  false);
+integrity("Multiple integrities: valid stronger than invalid", url,
+          invalidSha256 + " " + topSha384, /* initRequestMode */ undefined,
+          /* shouldPass */ true);
+integrity("Multiple integrities: invalid stronger than valid",
+          url, invalidSha512 + " " + topSha384, /* initRequestMode */ undefined,
+          /* shouldPass */ false);
+integrity("Multiple integrities: invalid as strong as valid", url,
+          invalidSha512 + " " + topSha512, /* initRequestMode */ undefined,
+          /* shouldPass */ true);
+integrity("Multiple integrities: both are valid", url,
+          topSha384 + " " + topSha512, /* initRequestMode */ undefined,
+          /* shouldPass */ true);
+integrity("Multiple integrities: both are invalid", url,
+          invalidSha256 + " " + invalidSha512, /* initRequestMode */ undefined,
+          /* shouldPass */ false);
+integrity("CORS empty integrity", corsUrl, "", /* initRequestMode */ undefined,
+          /* shouldPass */ true);
+integrity("CORS SHA-512 integrity", corsUrl, topSha512,
+          /* initRequestMode */ undefined, /* shouldPass */ true);
+integrity("CORS invalid integrity", corsUrl, invalidSha512,
+          /* initRequestMode */ undefined, /* shouldPass */ false);
+
+integrity("Empty string integrity for opaque response", corsUrl2, "",
+          /* initRequestMode */ "no-cors", /* shouldPass */ true);
+integrity("SHA-* integrity for opaque response", corsUrl2, topSha512,
+          /* initRequestMode */ "no-cors", /* shouldPass */ false);
 
 done();
--- a/testing/web-platform/tests/fetch/api/request/request-error.html
+++ b/testing/web-platform/tests/fetch/api/request/request-error.html
@@ -48,22 +48,16 @@
 
       test(function() {
         assert_throws(new TypeError() , function() { new Request("", {"mode" : "no-cors", "method" : "PUT"}); },
           "Expect TypeError exception");
       },"RequestInit's mode is no-cors and method is not simple");
 
       test(function() {
         assert_throws(new TypeError() ,
-                      function() { new Request("", {"mode" : "no-cors", "integrity" : "not  an empty string"}); },
-                      "Expect TypeError exception");
-      },"RequestInit's mode is no-cors and integrity is not empty");
-
-      test(function() {
-        assert_throws(new TypeError() ,
                       function() { new Request("", {"mode" : "cors", "cache" : "only-if-cached"}); },
                       "Expect TypeError exception");
       },"RequestInit's cache mode is only-if-cached and mode is not same-origin");
 
       test(function() {
         var initialHeaders = new Headers([["Content-Type", "potato"]]);
         var initialRequest = new Request("", {"headers" : initialHeaders});
         var request = new Request(initialRequest);
--- a/toolkit/components/telemetry/Scalars.yaml
+++ b/toolkit/components/telemetry/Scalars.yaml
@@ -940,16 +940,59 @@ formautofill.addresses:
     notification_emails:
       - autofill@lists.mozilla.org
       - jcheng@mozilla.com
       - chsiang@mozilla.com
     release_channel_collection: opt-out
     record_in_processes:
       - 'main'
 
+formautofill.creditCards:
+  fill_type_manual:
+    bug_numbers:
+      - 1371232
+    description: Count at submission time whether the submitted credit card form was filled manually.
+    expires: never
+    kind: uint
+    notification_emails:
+      - autofill@lists.mozilla.org
+      - jcheng@mozilla.com
+      - chsiang@mozilla.com
+    release_channel_collection: opt-out
+    record_in_processes:
+      - 'main'
+  fill_type_autofill:
+    bug_numbers:
+      - 1371232
+    description: Count at submission time whether the submitted credit card form was autofilled.
+    expires: never
+    kind: uint
+    notification_emails:
+      - autofill@lists.mozilla.org
+      - jcheng@mozilla.com
+      - chsiang@mozilla.com
+    release_channel_collection: opt-out
+    record_in_processes:
+      - 'main'
+  fill_type_autofill_modified:
+    bug_numbers:
+      - 1371232
+    description: >
+      Count at submission time whether the submitted credit card form was autofilled but
+      the data in form is changed.
+    expires: never
+    kind: uint
+    notification_emails:
+      - autofill@lists.mozilla.org
+      - jcheng@mozilla.com
+      - chsiang@mozilla.com
+    release_channel_collection: opt-out
+    record_in_processes:
+      - 'main'
+
 # The following section is for probes for tcp protocol.
 network.tcp:
   overlapped_io_canceled_before_finished:
     bug_numbers:
       - 1363372
     description: >
       Count the number of sockets that use overlapped io and are canceled before
       the overlapped io finishes. (We only use overlapped io for connectEx when
--- a/toolkit/components/telemetry/UpdatePing.jsm
+++ b/toolkit/components/telemetry/UpdatePing.jsm
@@ -36,16 +36,68 @@ this.UpdatePing = {
     if (!this._enabled) {
       return;
     }
 
     Services.obs.addObserver(this, UPDATE_DOWNLOADED_TOPIC);
   },
 
   /**
+   * Get the information about the update we're going to apply/was just applied
+   * from the update manager.
+   *
+   * @return {nsIUpdate} The information about the update, if available, or null.
+   */
+  _getActiveUpdate() {
+    let updateManager =
+      Cc["@mozilla.org/updates/update-manager;1"].getService(Ci.nsIUpdateManager);
+    if (!updateManager || !updateManager.activeUpdate) {
+      return null;
+    }
+
+    return updateManager.activeUpdate;
+  },
+
+  /**
+   * Generate an "update" ping with reason "success" and dispatch it
+   * to the Telemetry system.
+   *
+   * @param {String} aPreviousVersion The browser version we updated from.
+   * @param {String} aPreviousBuildId The browser build id we updated from.
+   */
+  handleUpdateSuccess(aPreviousVersion, aPreviousBuildId) {
+    this._log.trace("handleUpdateSuccess");
+
+    // An update could potentially change the update channel. Moreover,
+    // updates can only be applied if the update's channel matches with the build channel.
+    // There's no way to pass this information from the caller nor the environment as,
+    // in that case, the environment would report the "new" channel. However, the
+    // update manager should still have information about the active update: given the
+    // previous assumptions, we can simply get the channel from the update and assume
+    // it matches with the state previous to the update.
+    let update = this._getActiveUpdate();
+
+    const payload = {
+      reason: "success",
+      previousChannel: update ? update.channel : null,
+      previousVersion: aPreviousVersion,
+      previousBuildId: aPreviousBuildId,
+    };
+
+    const options = {
+      addClientId: true,
+      addEnvironment: true,
+      usePingSender: false,
+    };
+
+    TelemetryController.submitExternalPing(PING_TYPE, payload, options)
+                       .catch(e => this._log.error("handleUpdateSuccess - failed to submit update ping", e));
+  },
+
+  /**
    * Generate an "update" ping with reason "ready" and dispatch it
    * to the Telemetry system.
    *
    * @param {String} aUpdateState The state of the downloaded patch. See
    *        nsIUpdateService.idl for a list of possible values.
    */
   _handleUpdateReady(aUpdateState) {
     const ALLOWED_STATES = [
@@ -53,25 +105,22 @@ this.UpdatePing = {
     ];
     if (!ALLOWED_STATES.includes(aUpdateState)) {
       this._log.trace("Unexpected update state: " + aUpdateState);
       return;
     }
 
     // Get the information about the update we're going to apply from the
     // update manager.
-    let updateManager =
-      Cc["@mozilla.org/updates/update-manager;1"].getService(Ci.nsIUpdateManager);
-    if (!updateManager || !updateManager.activeUpdate) {
+    let update = this._getActiveUpdate();
+    if (!update) {
       this._log.trace("Cannot get the update manager or no update is currently active.");
       return;
     }
 
-    let update = updateManager.activeUpdate;
-
     const payload = {
       reason: "ready",
       targetChannel: update.channel,
       targetVersion: update.appVersion,
       targetBuildId: update.buildID,
     };
 
     const options = {
--- a/toolkit/components/telemetry/docs/data/main-ping.rst
+++ b/toolkit/components/telemetry/docs/data/main-ping.rst
@@ -422,21 +422,19 @@ Telemetry Experiments uses it to note wh
 
 webrtc
 ------
 Contains special statistics gathered by WebRTC related components.
 
 So far only a bitmask for the ICE candidate type present in a successful or
 failed WebRTC connection is getting reported through C++ code as
 IceCandidatesStats, because the required bitmask is too big to be represented
-in a regular enum histogram. Further this data differentiates between Loop
-(aka Firefox Hello) connections and everything else, which is categorized as
-WebRTC.
+in a regular enum histogram.
 
-Note: in most cases the webrtc and loop dictionaries inside of
+Note: in most cases the webrtc dictionary inside of
 IceCandidatesStats will simply be empty as the user has not used any WebRTC
 PeerConnection at all during the ping report time.
 
 Structure:
 
 .. code-block:: js
 
     "webrtc": {
@@ -444,25 +442,16 @@ Structure:
         "webrtc": {
           "34526345": {
             "successCount": 5
           },
           "2354353": {
             "failureCount": 1
           }
         },
-        "loop": {
-          "2349346359": {
-            "successCount": 3
-          },
-          "73424": {
-            "successCount": 1,
-            "failureCount": 5
-          }
-        }
       }
     },
 
 gc
 --
 Contains statistics about selected garbage collections. To avoid
 bloating the ping, only a few GCs are included. There are two
 selection strategies. We always save the two GCs with the worst
--- a/toolkit/components/telemetry/docs/data/update-ping.rst
+++ b/toolkit/components/telemetry/docs/data/update-ping.rst
@@ -1,50 +1,66 @@
 
 "update" ping
 ==================
 
-This opt-out ping is sent from Firefox Desktop when a browser update is ready to be applied. There is a
-plan to send this ping after an update is successfully applied and the work will happen in `bug 1380256 <https://bugzilla.mozilla.org/show_bug.cgi?id=1380256>`_.
+This opt-out ping is sent from Firefox Desktop when a browser update is ready to be applied and after it was correctly applied.
 
 Structure:
 
 .. code-block:: js
 
     {
       type: "update",
       ... common ping data
       clientId: <UUID>,
       environment: { ... },
       payload: {
-        reason: <string>, // "ready"
-        targetChannel: <string>, // "nightly"
-        targetVersion: <string>, // "56.01a"
-        targetBuildId: <string>, // "20080811053724"
+        reason: <string>, // "ready", "success"
+        targetChannel: <string>, // "nightly" (only present for reason = "ready")
+        targetVersion: <string>, // "56.01a" (only present for reason = "ready")
+        targetBuildId: <string>, // "20080811053724" (only present for reason = "ready")
+        previousChannel: <string>, // "nightly" or null (only present for reason = "success")
+        previousVersion: <string>, // "55.01a" (only present for reason = "success")
+        previousBuildId: <string>, // "20080810053724" (only present for reason = "success")
       }
     }
 
 payload.reason
 --------------
-This field only supports the value ``ready``, meaning that the ping was generated after an update was downloaded
-and marked as ready to be processed. For *non-staged* updates this happens as soon as the download
-finishes and is verified while for *staged* updates this happens before the staging step is started.
+This field supports the following values:
+
+- ``ready`` meaning that the ping was generated after an update was downloaded and marked as ready to be processed. For *non-staged* updates this happens as soon as the download finishes and is verified while for *staged* updates this happens before the staging step is started.
+- ``ready`` the ping was generated after the browser was restarted and the update correctly applied.
 
 payload.targetChannel
 -----------------------
 The Firefox channel the update was fetched from (only valid for pings with reason "ready").
 
 payload.targetVersion
 -----------------------
 The Firefox version the browser is updating to. Follows the same format a application.version (only valid for pings with reason "ready").
 
 payload.targetBuildId
 -----------------------
 The Firefox build id the browser is updating to. Follows the same format a application.buildId (only valid for pings with reason "ready").
 
+payload.previousChannel
+-----------------------
+The Firefox channel the profile was on before the update was applied (only valid for pings with reason "success").
+This can be ``null``.
+
+payload.previousVersion
+-----------------------
+The Firefox version the browser is updating from. Follows the same format a application.version (only valid for pings with reason "success").
+
+payload.previousBuildId
+-----------------------
+The Firefox build id the browser is updating from. Follows the same format a application.buildId (only valid for pings with reason "success").
+
 Expected behaviours
 -------------------
 The following is a list of conditions and expected behaviours for the ``update`` ping:
 
 - **The ping is generated once every time an update is downloaded, after it was verified:**
 
   - *for users who saw the privacy policy*, the ``update`` ping is sent immediately;
   - *for users who did not see the privacy policy*, the ``update`` ping is saved to disk and after the policy is displayed.
--- a/toolkit/components/telemetry/tests/browser/browser.ini
+++ b/toolkit/components/telemetry/tests/browser/browser.ini
@@ -1,5 +1,6 @@
 # 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/.
 
 [browser_TelemetryGC.js]
+[browser_UpdatePingSuccess.js]
new file mode 100644
--- /dev/null
+++ b/toolkit/components/telemetry/tests/browser/browser_UpdatePingSuccess.js
@@ -0,0 +1,61 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+"use strict";
+
+Cu.import("resource://testing-common/TelemetryArchiveTesting.jsm", this);
+
+add_task(async function test_updatePing() {
+  const TEST_VERSION = "37.85";
+  const TEST_BUILDID = "20150711123724";
+
+  // Set the preferences needed for the test: they will be cleared up
+  // after it runs.
+  await SpecialPowers.pushPrefEnv({"set": [
+    ["app.update.postupdate", true],
+    ["browser.startup.homepage_override.mstone", TEST_VERSION],
+    ["browser.startup.homepage_override.buildID", TEST_BUILDID],
+    ["toolkit.telemetry.log.level", "Trace"]
+  ]});
+
+  // Start monitoring the ping archive.
+  let archiveChecker = new TelemetryArchiveTesting.Checker();
+  await archiveChecker.promiseInit();
+
+  // Manually call the BrowserContentHandler: this automatically gets called when
+  // the browser is started and an update was applied successfully in order to
+  // display the "update" info page.
+  Cc["@mozilla.org/browser/clh;1"].getService(Ci.nsIBrowserHandler).defaultArgs;
+
+  // We cannot control when the ping will be generated/archived after we trigger
+  // an update, so let's make sure to have one before moving on with validation.
+  let updatePing;
+  await BrowserTestUtils.waitForCondition(async function() {
+    // Check that the ping made it into the Telemetry archive.
+    // The test data is defined in ../data/sharedUpdateXML.js
+    updatePing = await archiveChecker.promiseFindPing("update", [
+        [["payload", "reason"], "success"],
+        [["payload", "previousBuildId"], TEST_BUILDID],
+        [["payload", "previousVersion"], TEST_VERSION]
+      ]);
+    return !!updatePing;
+  }, "Make sure the ping is generated before trying to validate it.", 500, 100);
+
+  ok(updatePing, "The 'update' ping must be correctly sent.");
+
+  // We have no easy way to simulate a previously applied update from toolkit/telemetry.
+  // Instead of moving this test to mozapps/update as well, just test that the
+  // "previousChannel" field is present and either a string or null.
+  ok("previousChannel" in updatePing.payload,
+     "The payload must contain the 'previousChannel' field");
+  const channelField = updatePing.payload.previousChannel;
+  if (channelField != null) {
+    ok(typeof(channelField) == "string", "'previousChannel' must be a string, if available.");
+  }
+
+  // Also make sure that the ping contains both a client id and an
+  // environment section.
+  ok("clientId" in updatePing, "The update ping must report a client id.");
+  ok("environment" in updatePing, "The update ping must report the environment.");
+});
--- a/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js
@@ -4,16 +4,17 @@
 /* This testcase triggers two telemetry pings.
  *
  * Telemetry code keeps histograms of past telemetry pings. The first
  * ping populates these histograms. One of those histograms is then
  * checked in the second request.
  */
 
 Cu.import("resource://services-common/utils.js");
+Cu.import("resource://gre/modules/AppConstants.jsm");
 Cu.import("resource://gre/modules/ClientID.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/LightweightThemeManager.jsm", this);
 Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
 Cu.import("resource://gre/modules/TelemetryController.jsm", this);
 Cu.import("resource://gre/modules/TelemetrySession.jsm", this);
 Cu.import("resource://gre/modules/TelemetryStorage.jsm", this);
 Cu.import("resource://gre/modules/TelemetryEnvironment.jsm", this);
@@ -160,17 +161,17 @@ function checkPingFormat(aPing, aType, a
 function checkPayloadInfo(data) {
   const ALLOWED_REASONS = [
     "environment-change", "shutdown", "daily", "saved-session", "test-ping"
   ];
   let numberCheck = arg => { return (typeof arg == "number"); };
   let positiveNumberCheck = arg => { return numberCheck(arg) && (arg >= 0); };
   let stringCheck = arg => { return (typeof arg == "string") && (arg != ""); };
   let revisionCheck = arg => {
-    return (Services.appinfo.isOfficial) ? stringCheck(arg) : (typeof arg == "string");
+    return (AppConstants.MOZILLA_OFFICIAL) ? stringCheck(arg) : (typeof arg == "string");
   };
   let uuidCheck = arg => {
     return UUID_REGEX.test(arg);
   };
   let isoDateCheck = arg => {
     // We expect use of this version of the ISO format:
     // 2015-04-12T18:51:19.1+00:00
     const isoDateRegEx = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+[+-]\d{2}:\d{2}$/;
--- a/toolkit/components/thumbnails/BackgroundPageThumbs.jsm
+++ b/toolkit/components/thumbnails/BackgroundPageThumbs.jsm
@@ -282,16 +282,17 @@ const BackgroundPageThumbs = {
         });
       }
       // else: we must have been idle and not currently doing a capture (eg,
       // maybe a GC or similar crashed) - so there's no need to attempt a
       // queue restart - the next capture request will set everything up.
     });
 
     browser.messageManager.loadFrameScript(FRAME_SCRIPT_URL, false);
+    browser.docShellIsActive = false;
     this._thumbBrowser = browser;
   },
 
   _destroyBrowser() {
     if (!this._thumbBrowser)
       return;
     this._thumbBrowser.remove();
     delete this._thumbBrowser;
--- a/toolkit/components/thumbnails/content/backgroundPageThumbsContent.js
+++ b/toolkit/components/thumbnails/content/backgroundPageThumbsContent.js
@@ -156,29 +156,35 @@ const backgroundPageThumbsContent = {
             delete this._cancelTimer;
           }, 0, Ci.nsITimer.TYPE_ONE_SHOT);
         }
       }
     }
   },
 
   _captureCurrentPage() {
-    let capture = this._currentCapture;
-    capture.finalURL = this._webNav.currentURI.spec;
-    capture.pageLoadTime = new Date() - capture.pageLoadStartDate;
+    let win = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
+                      .getInterface(Ci.nsIDOMWindow);
+    win.requestIdleCallback(() => {
+      let capture = this._currentCapture;
+      capture.finalURL = this._webNav.currentURI.spec;
+      capture.pageLoadTime = new Date() - capture.pageLoadStartDate;
 
-    let canvasDrawDate = new Date();
+      let canvasDrawDate = new Date();
 
-    let finalCanvas = PageThumbUtils.createSnapshotThumbnail(content, null);
-    capture.canvasDrawTime = new Date() - canvasDrawDate;
+      docShell.isActive = true;
+      let finalCanvas = PageThumbUtils.createSnapshotThumbnail(content, null);
+      docShell.isActive = false;
+      capture.canvasDrawTime = new Date() - canvasDrawDate;
 
-    finalCanvas.toBlob(blob => {
-      capture.imageBlob = new Blob([blob]);
-      // Load about:blank to finish the capture and wait for onStateChange.
-      this._loadAboutBlank();
+      finalCanvas.toBlob(blob => {
+        capture.imageBlob = new Blob([blob]);
+        // Load about:blank to finish the capture and wait for onStateChange.
+        this._loadAboutBlank();
+      });
     });
   },
 
   _finishCurrentCapture() {
     let capture = this._currentCapture;
     let fileReader = new FileReader();
     fileReader.onloadend = () => {
       sendAsyncMessage("BackgroundPageThumbs:didCapture", {
--- a/toolkit/content/tests/widgets/mochitest.ini
+++ b/toolkit/content/tests/widgets/mochitest.ini
@@ -44,8 +44,10 @@ skip-if = toolkit == 'android' # bug 107
 [test_videocontrols_video_direction.html]
 skip-if = os == 'win'
 [test_videocontrols_video_noaudio.html]
 skip-if = toolkit == 'android'
 [test_bug1319301.html]
 skip-if = toolkit == 'android'
 [test_bug898940.html]
 [test_videocontrols_error.html]
+[test_videocontrols_orientation.html]
+skip-if = toolkit != 'android'
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/toolkit/content/tests/widgets/test_videocontrols_orientation.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Video controls test</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<p id="display"></p>
+
+<div id="content">
+  <video id="video" controls mozNoDynamicControls preload="metadata"></video>
+</div>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+var video = document.getElementById("video");
+
+let onLoaded = event => {
+  SpecialPowers.pushPrefEnv(
+    {"set": [["full-screen-api.allow-trusted-requests-only", false]]},
+    startMediaLoad);
+}
+window.addEventListener("load", onLoaded);
+
+let startMediaLoad = () => {
+  // Kick off test once video has loaded, in its canplaythrough event handler.
+  video.src = "video.ogg";
+  video.addEventListener("canplaythrough", runTest);
+}
+
+function runTest() {
+  is(document.fullscreenElement, null, "should not be in fullscreen initially");
+  isnot(window.screen.orientation.type, "landscape-primary", "should not be in landscape");
+  isnot(window.screen.orientation.type, "landscape-secondary", "should not be in landscape");
+
+  let originalOnChange = window.screen.orientation.onchange;
+
+  window.screen.orientation.onchange = () => {
+    is(document.fullscreenElement, video);
+    ok(window.screen.orientation.type === "landscape-primary" ||
+       window.screen.orientation.type === "landscape-secondary", "should be in landscape");
+
+    window.screen.orientation.onchange = () => {
+      window.screen.orientation.onchange = originalOnChange;
+      isnot(window.screen.orientation.type, "landscape-primary", "should not be in landscape");
+      isnot(window.screen.orientation.type, "landscape-secondary", "should not be in landscape");
+      SimpleTest.finish();
+    };
+    document.mozCancelFullScreen();
+  };
+
+  video.mozRequestFullScreen();
+}
+
+</script>
+</pre>
+</body>
+</html>
--- a/toolkit/locales/en-US/chrome/global/aboutTelemetry.dtd
+++ b/toolkit/locales/en-US/chrome/global/aboutTelemetry.dtd
@@ -1,165 +1,45 @@
 <!-- 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/. -->
 
-<!ENTITY aboutTelemetry.pageTitle "Telemetry Data">
-
-<!ENTITY aboutTelemetry.pingDataSource "
-Ping data source:
-">
-
-<!ENTITY aboutTelemetry.moreInformations "
-Looking for more information?
-">
-
-<!ENTITY aboutTelemetry.firefoxDataDoc "
-The <a>Firefox Data Documentation</a> contains guides about how to work with our data tools.
-">
-
-<!ENTITY aboutTelemetry.telemetryClientDoc "
-The <a>Firefox Telemetry client documentation</a> includes definitions for concepts, API documentation and data references.
-">
-
-<!ENTITY aboutTelemetry.telemetryDashboard "
-The <a>Telemetry dashboards</a> allow you to visualize the data Mozilla receives via Telemetry.
-">
-
-<!ENTITY aboutTelemetry.showCurrentPingData "
-Current ping data
-">
-
-<!ENTITY aboutTelemetry.showArchivedPingData "
-Archived ping data
-">
-
-<!ENTITY aboutTelemetry.raw "
-Raw JSON
-">
-
-<!ENTITY aboutTelemetry.showInFirefoxJsonViewer "
-Open in the JSON viewer
-">
+<!ENTITY aboutTelemetry.pingDataSource "Ping data source:">
+<!ENTITY aboutTelemetry.showCurrentPingData "Current ping data">
+<!ENTITY aboutTelemetry.showArchivedPingData "Archived ping data">
+<!ENTITY aboutTelemetry.showSubsessionData "Show subsession data">
+<!ENTITY aboutTelemetry.choosePing "Choose ping:">
+<!ENTITY aboutTelemetry.archivePingType "Ping Type">
+<!ENTITY aboutTelemetry.archivePingHeader "Ping">
+<!ENTITY aboutTelemetry.optionGroupToday "Today">
+<!ENTITY aboutTelemetry.optionGroupYesterday "Yesterday">
+<!ENTITY aboutTelemetry.optionGroupOlder "Older">
+<!ENTITY aboutTelemetry.payloadChoiceHeader "Payload">
 
-<!ENTITY aboutTelemetry.showSubsessionData "
-Show subsession data
-">
-
-<!ENTITY aboutTelemetry.choosePing "
-Choose ping:
-">
-
-<!ENTITY aboutTelemetry.showNewerPing "
-&lt;&lt; Newer ping
-">
-
-<!ENTITY aboutTelemetry.showOlderPing "
-Older ping &gt;&gt;
-">
-
-<!ENTITY aboutTelemetry.archiveWeekHeader "
-Week
-">
+<!ENTITY aboutTelemetry.pageTitle "Telemetry Data">
+<!ENTITY aboutTelemetry.moreInformations "Looking for more information?">
+<!ENTITY aboutTelemetry.firefoxDataDoc "The <a>Firefox Data Documentation</a> contains guides about how to work with our data tools.">
+<!ENTITY aboutTelemetry.telemetryClientDoc "The <a>Firefox Telemetry client documentation</a> includes definitions for concepts, API documentation and data references.">
+<!ENTITY aboutTelemetry.telemetryDashboard "The <a>Telemetry dashboards</a> allow you to visualize the data Mozilla receives via Telemetry.">
 
-<!ENTITY aboutTelemetry.archivePingType "
-Ping Type
-">
-
-<!ENTITY aboutTelemetry.archivePingHeader "
-Ping
-">
-
-<!ENTITY aboutTelemetry.optionGroupToday "
-Today
-">
-
-<!ENTITY aboutTelemetry.optionGroupYesterday "
-Yesterday
-">
-
-<!ENTITY aboutTelemetry.optionGroupOlder "
-Older
-">
+<!ENTITY aboutTelemetry.showInFirefoxJsonViewer "Open in the JSON viewer">
 
-<!ENTITY aboutTelemetry.generalDataSection "
-  General Data
-">
-
-<!ENTITY aboutTelemetry.environmentDataSection "
-  Environment Data
-">
-
-<!ENTITY aboutTelemetry.telemetryLogSection "
-  Telemetry Log
-">
-
-<!ENTITY aboutTelemetry.slowSqlSection "
-  Slow SQL Statements
-">
-
-<!ENTITY aboutTelemetry.chromeHangsSection "
-  Browser Hangs
-">
-
-<!ENTITY aboutTelemetry.capturedStacksSection "
-  Captured Stacks
-">
-
-<!ENTITY aboutTelemetry.scalarsSection "
-  Scalars
-">
-
-<!ENTITY aboutTelemetry.keyedScalarsSection "
-  Keyed Scalars
-">
-
-<!ENTITY aboutTelemetry.histogramsSection "
-  Histograms
-">
-
-<!ENTITY aboutTelemetry.keyedHistogramsSection "
-  Keyed Histograms
-">
+<!ENTITY aboutTelemetry.generalDataSection "General Data">
+<!ENTITY aboutTelemetry.environmentDataSection "Environment Data">
+<!ENTITY aboutTelemetry.sessionInfoSection "Session Information">
+<!ENTITY aboutTelemetry.scalarsSection "Scalars">
+<!ENTITY aboutTelemetry.keyedScalarsSection "Keyed Scalars">
+<!ENTITY aboutTelemetry.histogramsSection "Histograms">
+<!ENTITY aboutTelemetry.keyedHistogramsSection "Keyed Histograms">
+<!ENTITY aboutTelemetry.eventsSection "Events">
+<!ENTITY aboutTelemetry.simpleMeasurementsSection "Simple Measurements">
+<!ENTITY aboutTelemetry.telemetryLogSection "Telemetry Log">
+<!ENTITY aboutTelemetry.slowSqlSection "Slow SQL Statements">
+<!ENTITY aboutTelemetry.chromeHangsSection "Browser Hangs">
+<!ENTITY aboutTelemetry.addonDetailsSection "Add-on Details">
+<!ENTITY aboutTelemetry.capturedStacksSection "Captured Stacks">
+<!ENTITY aboutTelemetry.lateWritesSection "Late Writes">
+<!ENTITY aboutTelemetry.rawPayloadSection "Raw Payload">
+<!ENTITY aboutTelemetry.raw "Raw JSON">
 
-<!ENTITY aboutTelemetry.eventsSection "
-  Events
-">
-
-<!ENTITY aboutTelemetry.simpleMeasurementsSection "
-  Simple Measurements
-">
-
-<!ENTITY aboutTelemetry.addonDetailsSection "
-  Add-on Details
-">
-
-<!ENTITY aboutTelemetry.lateWritesSection "
-  Late Writes
-">
-
-<!ENTITY aboutTelemetry.rawPayloadSection "
-Raw Payload
-">
-
-<!ENTITY aboutTelemetry.sessionInfoSection "
-  Session Information
-">
-
-<!ENTITY aboutTelemetry.fullSqlWarning "
-  NOTE: Slow SQL debugging is enabled. Full SQL strings may be displayed below but they will not be submitted to Telemetry.
-">
-
-<!ENTITY aboutTelemetry.fetchStackSymbols "
-  Fetch function names for stacks
-">
-
-<!ENTITY aboutTelemetry.hideStackSymbols "
-  Show raw stack data
-">
-
-<!ENTITY aboutTelemetry.filterText "
-  Filter (strings or /regexp/)
-">
-
-<!ENTITY aboutTelemetry.payloadChoiceHeader "
-  Payload
-">
+<!ENTITY aboutTelemetry.fullSqlWarning "NOTE: Slow SQL debugging is enabled. Full SQL strings may be displayed below but they will not be submitted to Telemetry.">
+<!ENTITY aboutTelemetry.fetchStackSymbols "Fetch function names for stacks">
+<!ENTITY aboutTelemetry.hideStackSymbols "Show raw stack data">
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -92,16 +92,17 @@ const PREF_E10S_ADDON_POLICY          = 
 const PREF_E10S_HAS_NONEXEMPT_ADDON   = "extensions.e10s.rollout.hasAddon";
 const PREF_ALLOW_LEGACY               = "extensions.legacy.enabled";
 const PREF_ALLOW_NON_MPC              = "extensions.allow-non-mpc-extensions";
 
 const PREF_EM_MIN_COMPAT_APP_VERSION      = "extensions.minCompatibleAppVersion";
 const PREF_EM_MIN_COMPAT_PLATFORM_VERSION = "extensions.minCompatiblePlatformVersion";
 
 const PREF_EM_HOTFIX_ID               = "extensions.hotfix.id";
+const PREF_EM_LAST_APP_BUILD_ID       = "extensions.lastAppBuildId";
 
 const OBSOLETE_PREFERENCES = [
   "extensions.bootstrappedAddons",
   "extensions.enabledAddons",
   "extensions.xpiState",
   "extensions.installCache",
 ];
 
@@ -274,18 +275,27 @@ const LOGGER_ID = "addons.xpi";
 // (Requires AddonManager.jsm)
 var logger = Log.repository.getLogger(LOGGER_ID);
 
 const LAZY_OBJECTS = ["XPIDatabase", "XPIDatabaseReconcile"];
 /* globals XPIDatabase, XPIDatabaseReconcile*/
 
 var gLazyObjectsLoaded = false;
 
-XPCOMUtils.defineLazyPreferenceGetter(this, "gStartupScanScopes",
-                                      PREF_EM_STARTUP_SCAN_SCOPES, 0);
+XPCOMUtils.defineLazyGetter(this, "gStartupScanScopes", () => {
+  let appBuildID = Services.appinfo.appBuildID;
+  let oldAppBuildID = Services.prefs.getCharPref(PREF_EM_LAST_APP_BUILD_ID, "");
+  Services.prefs.setCharPref(PREF_EM_LAST_APP_BUILD_ID, appBuildID);
+  if (appBuildID !== oldAppBuildID) {
+    // If the build id changed, scan all scopes
+    return AddonManager.SCOPE_ALL;
+  }
+
+  return Services.prefs.getIntPref(PREF_EM_STARTUP_SCAN_SCOPES, 0);
+});
 
 function loadLazyObjects() {
   let uri = "resource://gre/modules/addons/XPIProviderUtils.js";
   let scope = Cu.Sandbox(Services.scriptSecurityManager.getSystemPrincipal(), {
     sandboxName: uri,
     wantGlobalProperties: ["TextDecoder"],
   });
 
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -1101,27 +1101,16 @@ nsXULAppInfo::GetDefaultUpdateChannel(ns
 NS_IMETHODIMP
 nsXULAppInfo::GetDistributionID(nsACString& aResult)
 {
   aResult.AssignLiteral(MOZ_DISTRIBUTION_ID);
   return NS_OK;
 }
 
 NS_IMETHODIMP
-nsXULAppInfo::GetIsOfficial(bool* aResult)
-{
-#ifdef MOZILLA_OFFICIAL
-  *aResult = true;
-#else
-  *aResult = false;
-#endif
-  return NS_OK;
-}
-
-NS_IMETHODIMP
 nsXULAppInfo::GetWindowsDLLBlocklistStatus(bool* aResult)
 {
 #if defined(HAS_DLL_BLOCKLIST)
   *aResult = DllBlocklist_CheckStatus();
 #else
   *aResult = false;
 #endif
   return NS_OK;
--- a/tools/profiler/core/platform.cpp
+++ b/tools/profiler/core/platform.cpp
@@ -2323,39 +2323,45 @@ profiler_init(void* aStackTop)
 
     const char* startupEntries = getenv("MOZ_PROFILER_STARTUP_ENTRIES");
     if (startupEntries && startupEntries[0] != '\0') {
       errno = 0;
       entries = strtol(startupEntries, nullptr, 10);
       if (errno == 0 && entries > 0) {
         LOG("- MOZ_PROFILER_STARTUP_ENTRIES = %d", entries);
       } else {
+        LOG("- MOZ_PROFILER_STARTUP_ENTRIES not a valid integer: %s",
+            startupEntries);
         PrintUsageThenExit(1);
       }
     }
 
     const char* startupInterval = getenv("MOZ_PROFILER_STARTUP_INTERVAL");
     if (startupInterval && startupInterval[0] != '\0') {
       errno = 0;
       interval = PR_strtod(startupInterval, nullptr);
       if (errno == 0 && interval > 0.0 && interval <= 1000.0) {
         LOG("- MOZ_PROFILER_STARTUP_INTERVAL = %f", interval);
       } else {
+        LOG("- MOZ_PROFILER_STARTUP_INTERVAL not a valid float: %s",
+            startupInterval);
         PrintUsageThenExit(1);
       }
     }
 
     const char* startupFeaturesBitfield =
       getenv("MOZ_PROFILER_STARTUP_FEATURES_BITFIELD");
     if (startupFeaturesBitfield && startupFeaturesBitfield[0] != '\0') {
       errno = 0;
       features = strtol(startupFeaturesBitfield, nullptr, 10);
       if (errno == 0 && features != 0) {
         LOG("- MOZ_PROFILER_STARTUP_FEATURES_BITFIELD = %d", features);
       } else {
+        LOG("- MOZ_PROFILER_STARTUP_FEATURES_BITFIELD not a valid integer: %s",
+            startupFeaturesBitfield);
         PrintUsageThenExit(1);
       }
     } else {
       const char* startupFeatures = getenv("MOZ_PROFILER_STARTUP_FEATURES");
       if (startupFeatures && startupFeatures[0] != '\0') {
         // Interpret startupFeatures as a list of feature strings, separated by
         // commas.
         UniquePtr<char[]> featureStringStorage;
@@ -2506,18 +2512,25 @@ AutoSetProfilerEnvVarsForChildProcess::A
     return;
   }
 
   PR_SetEnv("MOZ_PROFILER_STARTUP=1");
   SprintfLiteral(mSetEntries, "MOZ_PROFILER_STARTUP_ENTRIES=%d",
                  ActivePS::Entries(lock));
   PR_SetEnv(mSetEntries);
 
-  SprintfLiteral(mSetInterval, "MOZ_PROFILER_STARTUP_INTERVAL=%f",
-                 ActivePS::Interval(lock));
+  // Use AppendFloat instead of SprintfLiteral with %f because the decimal
+  // separator used by %f is locale-dependent. But the string we produce needs
+  // to be parseable by strtod, which only accepts the period character as a
+  // decimal separator. AppendFloat always uses the period character.
+  nsCString setInterval;
+  setInterval.AppendLiteral("MOZ_PROFILER_STARTUP_INTERVAL=");
+  setInterval.AppendFloat(ActivePS::Interval(lock));
+  strncpy(mSetInterval, setInterval.get(), MOZ_ARRAY_LENGTH(mSetInterval));
+  mSetInterval[MOZ_ARRAY_LENGTH(mSetInterval) - 1] = '\0';
   PR_SetEnv(mSetInterval);
 
   SprintfLiteral(mSetFeaturesBitfield,
                  "MOZ_PROFILER_STARTUP_FEATURES_BITFIELD=%d",
                  ActivePS::Features(lock));
   PR_SetEnv(mSetFeaturesBitfield);
 
   std::string filtersString;
--- a/xpcom/system/nsIXULRuntime.idl
+++ b/xpcom/system/nsIXULRuntime.idl
@@ -191,18 +191,13 @@ interface nsIXULRuntime : nsISupports
   readonly attribute AUTF8String defaultUpdateChannel;
 
   /**
    * The distribution ID for this build (MOZ_DISTRIBUTION_ID).
    */
   readonly attribute AUTF8String distributionID;
 
   /**
-   * True if this is an official build (MOZILLA_OFFICIAL).
-   */
-  readonly attribute boolean isOfficial;
-
-  /**
    * True if Windows DLL blocklist initialized correctly. This is
    * primarily for automated testing purposes.
    */
   readonly attribute boolean windowsDLLBlocklistStatus;
 };