Merge m-c to m-i
authorPhil Ringnalda <philringnalda@gmail.com>
Thu, 17 Nov 2016 20:33:59 -0800
changeset 323275 b46f6f9436132594d363812238f2dda7ed640969
parent 323274 c97615bbeb94b0ffe5132bece933061ee5eaecf7 (current diff)
parent 323140 8e476f8bd52d13cc1648e15ea2b72641c2d7bd8a (diff)
child 323276 55eb93732d993f9328c1ecb12a579b2b6df1bfef
push id21
push usermaklebus@msu.edu
push dateThu, 01 Dec 2016 06:22:08 +0000
milestone53.0a1
Merge m-c to m-i MozReview-Commit-ID: GwBaSZdoAZK
media/webrtc/signaling/test/jsep_session_unittest.cpp
media/webrtc/signaling/test/jsep_track_unittest.cpp
modules/libpref/init/all.js
python/mozbuild/mozbuild/testing.py
testing/marionette/harness/marionette/atoms/b2g_update_test.js
testing/marionette/harness/marionette/runner/mixins/endurance.py
testing/marionette/harness/marionette/runner/mixins/reporting.py
testing/marionette/harness/marionette/runner/mixins/resources/htmlreport/jquery.js
testing/marionette/harness/marionette/runner/mixins/resources/htmlreport/main.js
testing/marionette/harness/marionette/runner/mixins/resources/htmlreport/style.css
testing/marionette/harness/marionette/runner/mixins/xmlgen.py
testing/marionette/harness/marionette/tests/unit/test_element_touch.py
testing/marionette/harness/marionette/tests/unit/test_gesture.py
testing/marionette/harness/marionette/tests/unit/test_multi_finger.py
testing/marionette/harness/marionette/tests/unit/test_single_finger.py
testing/marionette/harness/marionette/tests/unit/test_using_prefs.py
testing/marionette/harness/marionette/tests/update-tests.ini
testing/marionette/harness/marionette/venv_b2g_update_test.sh
toolkit/components/extensions/ExtensionChild.jsm
toolkit/components/extensions/ExtensionContent.jsm
toolkit/components/extensions/ExtensionParent.jsm
toolkit/mozapps/update/tests/marionette/.eslintrc.js
toolkit/mozapps/update/tests/marionette/data/bad.xml
toolkit/mozapps/update/tests/marionette/data/err.cgi
toolkit/mozapps/update/tests/marionette/update-smoketests.ini
toolkit/mozapps/update/tests/marionette/update-tests.ini
toolkit/mozapps/update/tests/marionette/update_smoketest_ota_same_version.js
toolkit/mozapps/update/tests/marionette/update_smoketest_ota_same_version.py
toolkit/mozapps/update/tests/marionette/update_smoketest_ota_simple.js
toolkit/mozapps/update/tests/marionette/update_smoketest_ota_simple.py
toolkit/mozapps/update/tests/marionette/update_test_ota_simple.js
toolkit/mozapps/update/tests/marionette/update_test_ota_simple.py
toolkit/mozapps/update/tests/marionette/update_test_status.js
toolkit/mozapps/update/tests/marionette/update_test_status.py
--- a/browser/app/blocklist.xml
+++ b/browser/app/blocklist.xml
@@ -1,10 +1,10 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<blocklist lastupdate="1479243909840" xmlns="http://www.mozilla.org/2006/addons-blocklist">
+<blocklist lastupdate="1479324316851" xmlns="http://www.mozilla.org/2006/addons-blocklist">
   <emItems>
     <emItem blockID="i988" id="{b12785f5-d8d0-4530-a3ea-5c4263b85bef}">
       <prefs/>
       <versionRange minVersion="0" maxVersion="*" severity="1"/>
     </emItem>
     <emItem blockID="i398" id="{377e5d4d-77e5-476a-8716-7e70a9272da0}">
       <prefs/>
       <versionRange minVersion="0" maxVersion="*" severity="1"/>
@@ -2097,16 +2097,21 @@
       <match exp="CiscoWebCommunicator\.plugin" name="filename"/>
       <versionRange maxVersion="3.0.5.99999999999999" minVersion="0" severity="0" vulnerabilitystatus="1"/>
     </pluginItem>
     <pluginItem blockID="p944">
       <match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
       <infoURL>https://get.adobe.com/flashplayer/</infoURL>
       <versionRange maxVersion="13.0.0.302" minVersion="13.0.0.302" severity="0" vulnerabilitystatus="1"/>
     </pluginItem>
+    <pluginItem blockID="p1420">
+      <match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
+      <infoURL>https://get.adobe.com/flashplayer/</infoURL>
+      <versionRange maxVersion="23.0.0.205" minVersion="23.0.0.185" severity="0" vulnerabilitystatus="1"/>
+    </pluginItem>
     <pluginItem blockID="p248">
       <match exp="Scorch\.plugin" name="filename"/>
       <versionRange maxVersion="6.2.0b88" minVersion="0" severity="1"/>
     </pluginItem>
     <pluginItem blockID="p1141">
       <match exp="JavaAppletPlugin\.plugin" name="filename"/>
       <infoURL>https://java.com/</infoURL>
       <versionRange maxVersion="Java 7 Update 97" minVersion="Java 7 Update 91" severity="0" vulnerabilitystatus="1"/>
@@ -2146,16 +2151,21 @@
           <versionRange maxVersion="*" minVersion="18.0a1"/>
         </targetApplication>
       </versionRange>
     </pluginItem>
     <pluginItem blockID="p102">
       <match exp="npmozax\.dll" name="filename"/>
       <versionRange maxVersion="*" minVersion="0"/>
     </pluginItem>
+    <pluginItem blockID="p1419" os="Linux">
+      <match exp="libflashplayer\.so" name="filename"/>
+      <infoURL>https://get.adobe.com/flashplayer/</infoURL>
+      <versionRange maxVersion="11.2.202.643" minVersion="11.2.202.637" severity="0" vulnerabilitystatus="1"/>
+    </pluginItem>
     <pluginItem blockID="p80">
       <match exp="\(TM\)" name="name"/>
       <match exp="(npjp2\.dll)|(libnpjp2\.so)" name="filename"/>
       <match exp="[^\d\._]((0(\.\d+(\.\d+([_\.]\d+)?)?)?)|(1\.(([0-5](\.\d+([_\.]\d+)?)?)|(6(\.0([_\.](0?\d|1\d|2\d|30))?)?)|(7(\.0([_\.][0-2])?)?))))([^\d\._]|$)" name="description"/>
       <versionRange severity="1"/>
     </pluginItem>
     <pluginItem blockID="p1415">
       <match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
--- a/browser/components/privatebrowsing/content/aboutPrivateBrowsing.xhtml
+++ b/browser/components/privatebrowsing/content/aboutPrivateBrowsing.xhtml
@@ -49,37 +49,31 @@
         </div>
         <p>&aboutPrivateBrowsing.info.saved.before;<strong>&aboutPrivateBrowsing.info.saved.emphasize;</strong>&aboutPrivateBrowsing.info.saved.after2;</p>
         <div class="list-row">
           <ul>
             <li>&aboutPrivateBrowsing.info.bookmarks;</li>
             <li>&aboutPrivateBrowsing.info.downloads;</li>
           </ul>
         </div>
-        <p>
-          &aboutPrivateBrowsing.note.before;
-          <strong>&aboutPrivateBrowsing.note.emphasize;</strong>
-          &aboutPrivateBrowsing.note.after;
-        </p>
+        <p>&aboutPrivateBrowsing.note.before;<strong>&aboutPrivateBrowsing.note.emphasize;</strong>&aboutPrivateBrowsing.note.after;</p>
       </section>
 
       <h2 id="tpSubHeader" class="about-subheader">
         <span class="tpTitle">&trackingProtection.title;</span>
         <input id="tpToggle" class="toggle toggle-input" type="checkbox"/>
         <span id="tpButton" class="toggle-btn"></span>
       </h2>
 
       <section class="section-main">
         <p>&trackingProtection.description2;</p>
         <p>
           <a id="startTour" class="button">&trackingProtection.startTour1;</a>
         </p>
       </section>
 
       <section class="section-main">
-        <p class="about-info">&aboutPrivateBrowsing.learnMore2;
-          <a id="learnMore" target="_blank">&aboutPrivateBrowsing.learnMore2.title;</a>.
-        </p>
+        <p class="about-info">&aboutPrivateBrowsing.learnMore3.before;<a id="learnMore" target="_blank">&aboutPrivateBrowsing.learnMore3.title;</a>&aboutPrivateBrowsing.learnMore3.after;</p>
       </section>
 
     </div>
   </body>
 </html>
--- a/browser/config/mozconfigs/macosx-universal/nightly
+++ b/browser/config/mozconfigs/macosx-universal/nightly
@@ -1,15 +1,19 @@
 . "$topsrcdir/browser/config/mozconfigs/macosx-universal/common-opt"
 
 ac_add_options --disable-install-strip
 ac_add_options --enable-verify-mar
 ac_add_options --enable-profiling
 ac_add_options --enable-instruments
-ac_add_options --enable-dtrace
+
+# Cross-universal builds fail when dtrace is enabled
+if test `uname -s` != Linux; then
+  ac_add_options --enable-dtrace
+fi
 
 if test "${MOZ_UPDATE_CHANNEL}" = "nightly"; then
 ac_add_options --with-macbundlename-prefix=Firefox
 fi
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.rust"
--- a/browser/locales/en-US/chrome/browser/aboutPrivateBrowsing.dtd
+++ b/browser/locales/en-US/chrome/browser/aboutPrivateBrowsing.dtd
@@ -18,14 +18,15 @@
 <!ENTITY aboutPrivateBrowsing.info.saved.before          "Firefox ">
 <!ENTITY aboutPrivateBrowsing.info.saved.emphasize       "will save">
 <!ENTITY aboutPrivateBrowsing.info.saved.after2          " your:">
 <!ENTITY aboutPrivateBrowsing.info.downloads             "downloads">
 <!ENTITY aboutPrivateBrowsing.info.bookmarks             "bookmarks">
 <!ENTITY aboutPrivateBrowsing.note.before                "Private Browsing ">
 <!ENTITY aboutPrivateBrowsing.note.emphasize             "doesn’t make you anonymous">
 <!ENTITY aboutPrivateBrowsing.note.after                 " on the Internet. Your employer or Internet service provider can still know what page you visit.">
-<!ENTITY aboutPrivateBrowsing.learnMore2                 "Learn more about">
-<!ENTITY aboutPrivateBrowsing.learnMore2.title           "Private Browsing">
+<!ENTITY aboutPrivateBrowsing.learnMore3.before          "Learn more about ">
+<!ENTITY aboutPrivateBrowsing.learnMore3.title           "Private Browsing">
+<!ENTITY aboutPrivateBrowsing.learnMore3.after           ".">
 
 <!ENTITY trackingProtection.title                        "Tracking Protection">
 <!ENTITY trackingProtection.description2                 "Some websites use trackers that can monitor your activity across the Internet. With Tracking Protection Firefox will block many trackers that can collect information about your browsing behavior.">
 <!ENTITY trackingProtection.startTour1                   "See how it works">
--- a/browser/modules/PluginContent.jsm
+++ b/browser/modules/PluginContent.jsm
@@ -127,27 +127,23 @@ PluginContent.prototype = {
         }
     }
   },
 
   observe: function observe(aSubject, aTopic, aData) {
     switch (aTopic) {
       case "decoder-doctor-notification":
         let data = JSON.parse(aData);
-        if (this.haveShownNotification &&
+        let type = data.type.toLowerCase();
+        if (type == "cannot-play" &&
+            this.haveShownNotification &&
             aSubject.top.document == this.content.document &&
             data.formats.toLowerCase().includes("application/x-mpegurl", 0)) {
-          let principal = this.content.document.nodePrincipal;
-          let location = this.content.document.location.href;
           this.global.content.pluginRequiresReload = true;
-          this.global.sendAsyncMessage("PluginContent:ShowClickToPlayNotification",
-                                       { plugins: [...this.pluginData.values()],
-                                         showNow: true,
-                                         location: location,
-                                       }, null, principal);
+          this.updateNotificationUI(this.content.document);
         }
     }
   },
 
   onPageShow: function(event) {
     // Ignore events that aren't from the main document.
     if (!this.content || event.target != this.content.document) {
       return;
@@ -230,16 +226,22 @@ PluginContent.prototype = {
              pluginName: pluginName,
              pluginTag: pluginTag,
              permissionString: permissionString,
              fallbackType: fallbackType,
              blocklistState: blocklistState,
            };
   },
 
+  /**
+   * _getPluginInfoForTag is called when iterating the plugins for a document,
+   * and what we get from nsIDOMWindowUtils is an nsIPluginTag, and not an
+   * nsIObjectLoadingContent. This only should happen if the plugin is
+   * click-to-play (see bug 1186948).
+   */
   _getPluginInfoForTag: function(pluginTag, tagMimetype) {
     let pluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
 
     let pluginName = gNavigatorBundle.GetStringFromName("pluginInfo.unknownPlugin");
     let permissionString = null;
     let blocklistState = null;
 
     if (pluginTag) {
@@ -264,17 +266,21 @@ PluginContent.prototype = {
         blocklistState = Ci.nsIBlocklistService.STATE_NOT_BLOCKED;
       }
     }
 
     return { mimetype: tagMimetype,
              pluginName: pluginName,
              pluginTag: pluginTag,
              permissionString: permissionString,
-             fallbackType: null,
+             // Since we should only have entered _getPluginInfoForTag when
+             // examining a click-to-play plugin, we can safely hard-code
+             // this fallback type, since we don't actually have an
+             // nsIObjectLoadingContent to check.
+             fallbackType: Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
              blocklistState: blocklistState,
            };
   },
 
   /**
    * Update the visibility of the plugin overlay.
    */
   setVisibility : function(plugin, overlay, shouldShow) {
--- a/build/autoconf/toolchain.m4
+++ b/build/autoconf/toolchain.m4
@@ -78,16 +78,17 @@ case "${TOOLCHAIN_PREFIX}" in
 esac
 AC_PROG_CC
 AC_PROG_CXX
 
 AC_CHECK_PROGS(RANLIB, "${TOOLCHAIN_PREFIX}ranlib", :)
 AC_CHECK_PROGS(AR, "${TOOLCHAIN_PREFIX}ar", :)
 AC_CHECK_PROGS(AS, "${TOOLCHAIN_PREFIX}as", :)
 AC_CHECK_PROGS(LD, "${TOOLCHAIN_PREFIX}ld", :)
+AC_CHECK_PROGS(LIPO, "${TOOLCHAIN_PREFIX}lipo", :)
 AC_CHECK_PROGS(STRIP, "${TOOLCHAIN_PREFIX}strip", :)
 AC_CHECK_PROGS(WINDRES, "${TOOLCHAIN_PREFIX}windres", :)
 AC_CHECK_PROGS(OTOOL, "${TOOLCHAIN_PREFIX}otool", :)
 AC_CHECK_PROGS(OBJCOPY, "${TOOLCHAIN_PREFIX}objcopy", :)
 PATH=$_SAVE_PATH
 ])
 
 AC_DEFUN([MOZ_CXX11],
--- a/build/macosx/universal/mozconfig.common
+++ b/build/macosx/universal/mozconfig.common
@@ -1,21 +1,24 @@
 # 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/.
 
 mk_add_options MOZ_UNIFY_BDATE=1
 
-DARWIN_VERSION=`uname -r`
+DARWIN_VERSION=10
 ac_add_app_options i386 --target=i386-apple-darwin$DARWIN_VERSION
 ac_add_app_options x86_64 --target=x86_64-apple-darwin$DARWIN_VERSION
 ac_add_app_options i386 --with-unify-dist=../x86_64/dist
 ac_add_app_options x86_64 --with-unify-dist=../i386/dist
 
-ac_add_options --with-macos-sdk=/Developer/SDKs/MacOSX10.7.sdk
+if ! test `uname -s` = Linux; then
+  # Cross-universal builds already do the equivalent of this by setting -isysroot directly
+  ac_add_options --with-macos-sdk=/Developer/SDKs/MacOSX10.7.sdk
+fi
 
 . $topsrcdir/build/macosx/mozconfig.common
 
 # $MOZ_BUILD_APP is only defined when sourced by configure.  That's not a
 # problem, because the variables it affects only need to be set for
 # configure.
 if test -n "$MOZ_BUILD_APP" ; then
 if test "$MOZ_BUILD_APP" = "i386" -o "$MOZ_BUILD_APP" = "x86_64"; then
@@ -30,22 +33,22 @@ if test "$MOZ_BUILD_APP" = "i386" -o "$M
 
   # It's not strictly necessary to specify -arch during native builds, but it
   # makes the merged about:buildconfig easier to follow, and it reduces
   # conditionalized differences between builds.
   CC="$CC -arch $TARGET_CPU"
   CXX="$CXX -arch $TARGET_CPU"
 
   # These must be set for cross builds, and don't hurt straight builds.
-  RANLIB=ranlib
-  AR=ar
+  RANLIB="${TOOLCHAIN_PREFIX}ranlib"
+  AR="${TOOLCHAIN_PREFIX}ar"
   AS=$CC
   LD=ld
   STRIP="strip"
-  OTOOL="otool"
+  OTOOL="${TOOLCHAIN_PREFIX}otool"
 
   # Each per-CPU build should be entirely oblivious to the fact that a
   # universal binary will be produced.  The exception is packager.mk, which
   # needs to know to look for universal bits when building the .dmg.
   UNIVERSAL_BINARY=1
 
   export CC CXX HOST_CC HOST_CXX RANLIB AR AS LD STRIP OTOOL
 fi
--- a/devtools/client/framework/devtools-browser.js
+++ b/devtools/client/framework/devtools-browser.js
@@ -721,23 +721,24 @@ var gDevToolsBrowser = exports.gDevTools
 };
 
 // Handle all already registered tools,
 gDevTools.getToolDefinitionArray()
          .forEach(def => gDevToolsBrowser._addToolToWindows(def));
 // and the new ones.
 gDevTools.on("tool-registered", function (ev, toolId) {
   let toolDefinition = gDevTools._tools.get(toolId);
-  gDevToolsBrowser._addToolToWindows(toolDefinition);
+  // If the tool has been registered globally, add to all the
+  // available windows.
+  if (toolDefinition) {
+    gDevToolsBrowser._addToolToWindows(toolDefinition);
+  }
 });
 
 gDevTools.on("tool-unregistered", function (ev, toolId) {
-  if (typeof toolId != "string") {
-    toolId = toolId.id;
-  }
   gDevToolsBrowser._removeToolFromWindows(toolId);
 });
 
 gDevTools.on("toolbox-ready", gDevToolsBrowser._updateMenuCheckbox);
 gDevTools.on("toolbox-destroyed", gDevToolsBrowser._updateMenuCheckbox);
 
 Services.obs.addObserver(gDevToolsBrowser.destroy, "quit-application", false);
 Services.obs.addObserver(gDevToolsBrowser, "browser-delayed-startup-finished", false);
--- a/devtools/client/framework/devtools.js
+++ b/devtools/client/framework/devtools.js
@@ -135,22 +135,26 @@ DevTools.prototype = {
    */
   unregisterTool: function DT_unregisterTool(tool, isQuitApplication) {
     let toolId = null;
     if (typeof tool == "string") {
       toolId = tool;
       tool = this._tools.get(tool);
     }
     else {
+      let {Deprecated} = Cu.import("resource://gre/modules/Deprecated.jsm", {});
+      Deprecated.warning("Deprecation WARNING: gDevTools.unregisterTool(tool) is deprecated. " +
+                         "You should unregister a tool using its toolId: " +
+                         "gDevTools.unregisterTool(toolId).");
       toolId = tool.id;
     }
     this._tools.delete(toolId);
 
     if (!isQuitApplication) {
-      this.emit("tool-unregistered", tool);
+      this.emit("tool-unregistered", toolId);
     }
   },
 
   /**
    * Sorting function used for sorting tools based on their ordinals.
    */
   ordinalSort: function DT_ordinalSort(d1, d2) {
     let o1 = (typeof d1.ordinal == "number") ? d1.ordinal : MAX_ORDINAL;
--- a/devtools/client/framework/test/browser.ini
+++ b/devtools/client/framework/test/browser.ini
@@ -73,16 +73,17 @@ skip-if = e10s # Bug 1069044 - destroyIn
 [browser_toolbox_split_console.js]
 [browser_toolbox_target.js]
 [browser_toolbox_tabsswitch_shortcuts.js]
 [browser_toolbox_textbox_context_menu.js]
 [browser_toolbox_theme_registration.js]
 [browser_toolbox_toggle.js]
 [browser_toolbox_tool_ready.js]
 [browser_toolbox_tool_remote_reopen.js]
+[browser_toolbox_tools_per_toolbox_registration.js]
 [browser_toolbox_transport_events.js]
 [browser_toolbox_view_source_01.js]
 [browser_toolbox_view_source_02.js]
 [browser_toolbox_view_source_03.js]
 [browser_toolbox_view_source_04.js]
 [browser_toolbox_window_reload_target.js]
 [browser_toolbox_window_shortcuts.js]
 skip-if = os == "mac" && os_version == "10.8" || os == "win" && os_version == "5.1" # Bug 851129 - Re-enable browser_toolbox_window_shortcuts.js test after leaks are fixed
--- a/devtools/client/framework/test/browser_toolbox_dynamic_registration.js
+++ b/devtools/client/framework/test/browser_toolbox_dynamic_registration.js
@@ -66,19 +66,18 @@ function getAllBrowserWindows() {
 
 function testUnregister()
 {
   gDevTools.once("tool-unregistered", toolUnregistered);
 
   gDevTools.unregisterTool("test-tool");
 }
 
-function toolUnregistered(event, toolDefinition)
+function toolUnregistered(event, toolId)
 {
-  let toolId = toolDefinition.id;
   is(toolId, "test-tool", "tool-unregistered event handler sent tool id");
 
   ok(!gDevTools.getToolDefinitionMap().has(toolId), "tool removed from map");
 
   // test that it disappeared from the UI
   let doc = toolbox.doc;
   let tab = doc.getElementById("toolbox-tab-" + toolId);
   ok(!tab, "tool's tab was removed from the toolbox UI");
--- a/devtools/client/framework/test/browser_toolbox_options.js
+++ b/devtools/client/framework/test/browser_toolbox_options.js
@@ -16,16 +16,17 @@ const L10N = new LocalizationHelper("dev
 add_task(function* () {
   const URL = "data:text/html;charset=utf8,test for dynamically registering " +
               "and unregistering tools";
   registerNewTool();
   let tab = yield addTab(URL);
   let target = TargetFactory.forTab(tab);
   toolbox = yield gDevTools.showToolbox(target);
   doc = toolbox.doc;
+  yield registerNewPerToolboxTool();
   yield testSelectTool();
   yield testOptionsShortcut();
   yield testOptions();
   yield testToggleTools();
   yield cleanup();
 });
 
 function registerNewTool() {
@@ -41,16 +42,41 @@ function registerNewTool() {
   ok(!gDevTools.getToolDefinitionMap().has("test-tool"),
     "The tool is not registered");
 
   gDevTools.registerTool(toolDefinition);
   ok(gDevTools.getToolDefinitionMap().has("test-tool"),
     "The tool is registered");
 }
 
+function registerNewPerToolboxTool() {
+  let toolDefinition = {
+    id: "test-pertoolbox-tool",
+    isTargetSupported: () => true,
+    visibilityswitch: "devtools.test-pertoolbox-tool.enabled",
+    url: "about:blank",
+    label: "perToolboxSomeLabel"
+  };
+
+  ok(gDevTools, "gDevTools exists");
+  ok(!gDevTools.getToolDefinitionMap().has("test-pertoolbox-tool"),
+     "The per-toolbox tool is not registered globally");
+
+  ok(toolbox, "toolbox exists");
+  ok(!toolbox.hasAdditionalTool("test-pertoolbox-tool"),
+     "The per-toolbox tool is not yet registered to the toolbox");
+
+  toolbox.addAdditionalTool(toolDefinition);
+
+  ok(!gDevTools.getToolDefinitionMap().has("test-pertoolbox-tool"),
+     "The per-toolbox tool is not registered globally");
+  ok(toolbox.hasAdditionalTool("test-pertoolbox-tool"),
+     "The per-toolbox tool has been registered to the toolbox");
+}
+
 function* testSelectTool() {
   info("Checking to make sure that the options panel can be selected.");
 
   let onceSelected = toolbox.once("options-selected");
   toolbox.selectTool("options");
   yield onceSelected;
   ok(true, "Toolbox selected via selectTool method");
 }
@@ -163,19 +189,23 @@ function* testMouseClick(node, prefValue
 }
 
 function* testToggleTools() {
   let toolNodes = panelWin.document.querySelectorAll(
     "#default-tools-box input[type=checkbox]:not([data-unsupported])," +
     "#additional-tools-box input[type=checkbox]:not([data-unsupported])");
   let enabledTools = [...toolNodes].filter(node => node.checked);
 
-  let toggleableTools = gDevTools.getDefaultTools().filter(tool => {
-    return tool.visibilityswitch;
-  }).concat(gDevTools.getAdditionalTools());
+  let toggleableTools = gDevTools.getDefaultTools()
+                                 .filter(tool => {
+                                   return tool.visibilityswitch;
+                                 })
+                                 .concat(gDevTools.getAdditionalTools())
+                                 .concat(toolbox.getAdditionalTools());
+
 
   for (let node of toolNodes) {
     let id = node.getAttribute("id");
     ok(toggleableTools.some(tool => tool.id === id),
       "There should be a toggle checkbox for: " + id);
   }
 
   // Store modified pref names so that they can be cleared on error.
@@ -230,17 +260,17 @@ function* toggleTool(node) {
   }
   node.scrollIntoView();
   EventUtils.synthesizeMouseAtCenter(node, {}, panelWin);
 
   yield deferred.promise;
 }
 
 function checkUnregistered(toolId, deferred, event, data) {
-  if (data.id == toolId) {
+  if (data == toolId) {
     ok(true, "Correct tool removed");
     // checking tab on the toolbox
     ok(!doc.getElementById("toolbox-tab-" + toolId),
       "Tab removed for " + toolId);
   } else {
     ok(false, "Something went wrong, " + toolId + " was not unregistered");
   }
   deferred.resolve();
copy from devtools/client/framework/test/browser_toolbox_dynamic_registration.js
copy to devtools/client/framework/test/browser_toolbox_tools_per_toolbox_registration.js
--- a/devtools/client/framework/test/browser_toolbox_dynamic_registration.js
+++ b/devtools/client/framework/test/browser_toolbox_tools_per_toolbox_registration.js
@@ -1,105 +1,139 @@
 /* -*- 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/ */
 
-const TEST_URL = "data:text/html,test for dynamically registering and unregistering tools";
-
-var toolbox;
+const TEST_URL = `data:text/html,<!DOCTYPE html>
+  <html>
+    <head>
+      <meta charset="utf-8">
+    </head>
+    <body>
+      test for registering and unregistering tools to a specific toolbox
+    </body>
+  </html>`;
 
-function test()
-{
+const TOOL_ID = "test-toolbox-tool";
+var toolbox;
+var target;
+
+function test() {
   addTab(TEST_URL).then(tab => {
-    let target = TargetFactory.forTab(tab);
-    gDevTools.showToolbox(target).then(testRegister);
+    target = TargetFactory.forTab(tab);
+
+    gDevTools.showToolbox(target)
+      .then(toolboxRegister)
+      .then(testToolRegistered);
   });
 }
 
-function testRegister(aToolbox)
-{
+var resolveToolInstanceBuild;
+var waitForToolInstanceBuild = new Promise((resolve) => {
+  resolveToolInstanceBuild = resolve;
+});
+
+var resolveToolInstanceDestroyed;
+var waitForToolInstanceDestroyed = new Promise((resolve) => {
+  resolveToolInstanceDestroyed = resolve;
+});
+
+function toolboxRegister(aToolbox) {
   toolbox = aToolbox;
-  gDevTools.once("tool-registered", toolRegistered);
+
+  var resolveToolInstanceBuild;
 
-  gDevTools.registerTool({
-    id: "test-tool",
-    label: "Test Tool",
+  waitForToolInstanceBuild = new Promise((resolve) => {
+    resolveToolInstanceBuild = resolve;
+  });
+
+  info("add per-toolbox tool in the opened toolbox.");
+
+  toolbox.addAdditionalTool({
+    id: TOOL_ID,
+    label: "per-toolbox Test Tool",
     inMenu: true,
     isTargetSupported: () => true,
-    build: function () {},
+    build: function () {
+      info("per-toolbox tool has been built.");
+      resolveToolInstanceBuild();
+
+      return {
+        destroy: () => {
+          info("per-toolbox tool has been destroyed.");
+          resolveToolInstanceDestroyed();
+        },
+      };
+    },
     key: "t"
   });
 }
 
-function toolRegistered(event, toolId)
-{
-  is(toolId, "test-tool", "tool-registered event handler sent tool id");
+function testToolRegistered() {
+  ok(!gDevTools.getToolDefinitionMap().has(TOOL_ID), "per-toolbox tool is not registered globally");
+  ok(toolbox.hasAdditionalTool(TOOL_ID),
+     "per-toolbox tool registered to the specific toolbox");
 
-  ok(gDevTools.getToolDefinitionMap().has(toolId), "tool added to map");
-
-  // test that it appeared in the UI
+  // Test that the tool appeared in the UI.
   let doc = toolbox.doc;
-  let tab = doc.getElementById("toolbox-tab-" + toolId);
+  let tab = doc.getElementById("toolbox-tab-" + TOOL_ID);
   ok(tab, "new tool's tab exists in toolbox UI");
 
-  let panel = doc.getElementById("toolbox-panel-" + toolId);
+  let panel = doc.getElementById("toolbox-panel-" + TOOL_ID);
   ok(panel, "new tool's panel exists in toolbox UI");
 
   for (let win of getAllBrowserWindows()) {
-    let key = win.document.getElementById("key_" + toolId);
-    ok(key, "key for new tool added to every browser window");
-    let menuitem = win.document.getElementById("menuitem_" + toolId);
-    ok(menuitem, "menu item of new tool added to every browser window");
+    let key = win.document.getElementById("key_" + TOOL_ID);
+    if (win.document == doc) {
+      continue;
+    }
+    ok(!key, "key for new tool should not exists in the other browser windows");
+    let menuitem = win.document.getElementById("menuitem_" + TOOL_ID);
+    ok(!menuitem, "menu item should not exists in the other browser window");
   }
 
-  // then unregister it
-  testUnregister();
+  // Test that the tool is built once selected and then test its unregistering.
+  info("select per-toolbox tool in the opened toolbox.");
+  gDevTools.showToolbox(target, TOOL_ID)
+           .then(waitForToolInstanceBuild)
+           .then(testUnregister);
 }
 
 function getAllBrowserWindows() {
   let wins = [];
   let enumerator = Services.wm.getEnumerator("navigator:browser");
   while (enumerator.hasMoreElements()) {
     wins.push(enumerator.getNext());
   }
   return wins;
 }
 
-function testUnregister()
-{
-  gDevTools.once("tool-unregistered", toolUnregistered);
+function testUnregister() {
+  info("remove per-toolbox tool in the opened toolbox.");
+  toolbox.removeAdditionalTool(TOOL_ID);
 
-  gDevTools.unregisterTool("test-tool");
+  Promise.all([
+    waitForToolInstanceDestroyed
+  ]).then(toolboxToolUnregistered);
 }
 
-function toolUnregistered(event, toolDefinition)
-{
-  let toolId = toolDefinition.id;
-  is(toolId, "test-tool", "tool-unregistered event handler sent tool id");
-
-  ok(!gDevTools.getToolDefinitionMap().has(toolId), "tool removed from map");
+function toolboxToolUnregistered() {
+  ok(!toolbox.hasAdditionalTool(TOOL_ID),
+     "per-toolbox tool unregistered from the specific toolbox");
 
   // test that it disappeared from the UI
   let doc = toolbox.doc;
-  let tab = doc.getElementById("toolbox-tab-" + toolId);
+  let tab = doc.getElementById("toolbox-tab-" + TOOL_ID);
   ok(!tab, "tool's tab was removed from the toolbox UI");
 
-  let panel = doc.getElementById("toolbox-panel-" + toolId);
+  let panel = doc.getElementById("toolbox-panel-" + TOOL_ID);
   ok(!panel, "tool's panel was removed from toolbox UI");
 
-  for (let win of getAllBrowserWindows()) {
-    let key = win.document.getElementById("key_" + toolId);
-    ok(!key, "key removed from every browser window");
-    let menuitem = win.document.getElementById("menuitem_" + toolId);
-    ok(!menuitem, "menu item removed from every browser window");
-  }
-
   cleanup();
 }
 
-function cleanup()
-{
+function cleanup() {
   toolbox.destroy();
   toolbox = null;
   gBrowser.removeCurrentTab();
   finish();
 }
--- a/devtools/client/framework/toolbox-options.js
+++ b/devtools/client/framework/toolbox-options.js
@@ -181,25 +181,25 @@ OptionsPanel.prototype = {
   setupToolsList: function () {
     let defaultToolsBox = this.panelDoc.getElementById("default-tools-box");
     let additionalToolsBox = this.panelDoc.getElementById(
       "additional-tools-box");
     let toolsNotSupportedLabel = this.panelDoc.getElementById(
       "tools-not-supported-label");
     let atleastOneToolNotSupported = false;
 
+    const toolbox = this.toolbox;
+
+    // Signal tool registering/unregistering globally (for the tools registered
+    // globally) and per toolbox (for the tools registered to a single toolbox).
     let onCheckboxClick = function (id) {
-      let toolDefinition = gDevTools._tools.get(id);
+      let toolDefinition = gDevTools._tools.get(id) || toolbox.getToolDefinition(id);
       // Set the kill switch pref boolean to true
       Services.prefs.setBoolPref(toolDefinition.visibilityswitch, this.checked);
-      if (this.checked) {
-        gDevTools.emit("tool-registered", id);
-      } else {
-        gDevTools.emit("tool-unregistered", toolDefinition);
-      }
+      gDevTools.emit(this.checked ? "tool-registered" : "tool-unregistered", id);
     };
 
     let createToolCheckbox = tool => {
       let checkboxLabel = this.panelDoc.createElement("label");
       let checkboxInput = this.panelDoc.createElement("input");
       checkboxInput.setAttribute("type", "checkbox");
       checkboxInput.setAttribute("id", tool.id);
       checkboxInput.setAttribute("title", tool.tooltip || "");
@@ -238,16 +238,23 @@ OptionsPanel.prototype = {
 
     // Populating the additional tools list that came from add-ons.
     let atleastOneAddon = false;
     for (let tool of gDevTools.getAdditionalTools()) {
       atleastOneAddon = true;
       additionalToolsBox.appendChild(createToolCheckbox(tool));
     }
 
+    // Populating the additional toolbox-specific tools list that came
+    // from WebExtension add-ons.
+    for (let tool of this.toolbox.getAdditionalTools()) {
+      atleastOneAddon = true;
+      additionalToolsBox.appendChild(createToolCheckbox(tool));
+    }
+
     if (!atleastOneAddon) {
       additionalToolsBox.style.display = "none";
     }
 
     if (!atleastOneToolNotSupported) {
       toolsNotSupportedLabel.style.display = "none";
     }
 
--- a/devtools/client/framework/toolbox.js
+++ b/devtools/client/framework/toolbox.js
@@ -890,16 +890,17 @@ Toolbox.prototype = {
       toolbarHeight
     });
   },
 
   /**
    * Add tabs to the toolbox UI for registered tools
    */
   _buildTabs: function () {
+    // Build tabs for global registered tools.
     for (let definition of gDevTools.getToolDefinitionArray()) {
       this._buildTabForTool(definition);
     }
   },
 
   /**
    * Get all dev tools tab bar focusable elements. These are visible elements
    * such as buttons or elements with tabindex.
@@ -1248,16 +1249,91 @@ Toolbox.prototype = {
         });
       }
     }
 
     this._addKeysToWindow();
   },
 
   /**
+   * Lazily created map of the additional tools registered to this toolbox.
+   *
+   * @returns {Map<string, object>}
+   *          a map of the tools definitions registered to this
+   *          particular toolbox (the key is the toolId string, the value
+   *          is the tool definition plain javascript object).
+   */
+  get additionalToolDefinitions() {
+    if (!this._additionalToolDefinitions) {
+      this._additionalToolDefinitions = new Map();
+    }
+
+    return this._additionalToolDefinitions;
+  },
+
+  /**
+   * Retrieve the array of the additional tools registered to this toolbox.
+   *
+   * @return {Array<object>}
+   *         the array of additional tool definitions registered on this toolbox.
+   */
+  getAdditionalTools() {
+    return Array.from(this.additionalToolDefinitions.values());
+  },
+
+  /**
+   * Test the existence of a additional tools registered to this toolbox by tool id.
+   *
+   * @param {string} toolId
+   *        the id of the tool to test for existence.
+   *
+   * @return {boolean}
+   *
+   */
+  hasAdditionalTool(toolId) {
+    return this.additionalToolDefinitions.has(toolId);
+  },
+
+  /**
+   * Register and load an additional tool on this particular toolbox.
+   *
+   * @param {object} definition
+   *        the additional tool definition to register and add to this toolbox.
+   */
+  addAdditionalTool(definition) {
+    if (!definition.id) {
+      throw new Error("Tool definition id is missing");
+    }
+
+    if (this.isToolRegistered(definition.id)) {
+      throw new Error("Tool definition already registered: " +
+                      definition.id);
+    }
+
+    this.additionalToolDefinitions.set(definition.id, definition);
+    this._buildTabForTool(definition);
+  },
+
+  /**
+   * Unregister and unload an additional tool from this particular toolbox.
+   *
+   * @param {string} toolId
+   *        the id of the additional tool to unregister and remove.
+   */
+  removeAdditionalTool(toolId) {
+    if (!this.hasAdditionalTool(toolId)) {
+      throw new Error("Tool definition not registered to this toolbox: " +
+                      toolId);
+    }
+
+    this.unloadTool(toolId);
+    this.additionalToolDefinitions.delete(toolId);
+  },
+
+  /**
    * Ensure the tool with the given id is loaded.
    *
    * @param {string} id
    *        The id of the tool to load.
    */
   loadTool: function (id) {
     if (id === "inspector" && !this._inspector) {
       return this.initInspector().then(() => {
@@ -1275,17 +1351,19 @@ Toolbox.prototype = {
       } else {
         this.once(id + "-ready", initializedPanel => {
           deferred.resolve(initializedPanel);
         });
       }
       return deferred.promise;
     }
 
-    let definition = gDevTools.getToolDefinition(id);
+    // Retrieve the tool definition (from the global or the per-toolbox tool maps)
+    let definition = this.getToolDefinition(id);
+
     if (!definition) {
       deferred.reject(new Error("no such tool id " + id));
       return deferred.promise;
     }
 
     iframe = this.doc.createElement("iframe");
     iframe.className = "toolbox-panel-iframe";
     iframe.id = "toolbox-panel-iframe-" + id;
@@ -1902,51 +1980,57 @@ Toolbox.prototype = {
     // host switching button. We now have to restore the focus.
     this.focusTool(this.currentToolId, true);
 
     this.emit("host-changed");
     this._telemetry.log(HOST_HISTOGRAM, this._getTelemetryHostId());
   },
 
   /**
-   * Return if the tool is available as a tab (i.e. if it's checked
-   * in the options panel). This is different from Toolbox.getPanel -
-   * a tool could be registered but not yet opened in which case
-   * isToolRegistered would return true but getPanel would return false.
+   * Test the availability of a tool (both globally registered tools and
+   * additional tools registered to this toolbox) by tool id.
+   *
+   * @param  {string} toolId
+   *         Id of the tool definition to search in the per-toolbox or globally
+   *         registered tools.
+   *
+   * @returns {bool}
+   *         Returns true if the tool is registered globally or on this toolbox.
    */
   isToolRegistered: function (toolId) {
-    return gDevTools.getToolDefinitionMap().has(toolId);
+    return !!this.getToolDefinition(toolId);
   },
 
   /**
-   * Handler for the tool-registered event.
-   * @param  {string} event
-   *         Name of the event ("tool-registered")
+   * Return the tool definition registered globally or additional tools registered
+   * to this toolbox.
+   *
    * @param  {string} toolId
-   *         Id of the tool that was registered
+   *         Id of the tool definition to retrieve for the per-toolbox and globally
+   *         registered tools.
+   *
+   * @returns {object}
+   *         The plain javascript object that represents the requested tool definition.
    */
-  _toolRegistered: function (event, toolId) {
-    let tool = gDevTools.getToolDefinition(toolId);
-    this._buildTabForTool(tool);
-    // Emit the event so tools can listen to it from the toolbox level
-    // instead of gDevTools
-    this.emit("tool-registered", toolId);
+  getToolDefinition: function (toolId) {
+    return gDevTools.getToolDefinition(toolId) ||
+      this.additionalToolDefinitions.get(toolId);
   },
 
   /**
-   * Handler for the tool-unregistered event.
-   * @param  {string} event
-   *         Name of the event ("tool-unregistered")
-   * @param  {string|object} toolId
-   *         Definition or id of the tool that was unregistered. Passing the
-   *         tool id should be avoided as it is a temporary measure.
+   * Internal helper that removes a loaded tool from the toolbox,
+   * it removes a loaded tool panel and tab from the toolbox without removing
+   * its definition, so that it can still be listed in options and re-added later.
+   *
+   * @param  {string} toolId
+   *         Id of the tool to be removed.
    */
-  _toolUnregistered: function (event, toolId) {
+  unloadTool: function (toolId) {
     if (typeof toolId != "string") {
-      toolId = toolId.id;
+      throw new Error("Unexpected non-string toolId received.");
     }
 
     if (this._toolPanels.has(toolId)) {
       let instance = this._toolPanels.get(toolId);
       instance.destroy();
       this._toolPanels.delete(toolId);
     }
 
@@ -1975,16 +2059,48 @@ Toolbox.prototype = {
 
     if (this.hostType == Toolbox.HostType.WINDOW) {
       let doc = this.win.parent.document;
       let key = doc.getElementById("key_" + toolId);
       if (key) {
         key.parentNode.removeChild(key);
       }
     }
+  },
+
+  /**
+   * Handler for the tool-registered event.
+   * @param  {string} event
+   *         Name of the event ("tool-registered")
+   * @param  {string} toolId
+   *         Id of the tool that was registered
+   */
+  _toolRegistered: function (event, toolId) {
+    let tool = this.getToolDefinition(toolId);
+    if (!tool) {
+      // Ignore if the tool is not found, when a per-toolbox tool
+      // has been toggle in the toolbox options view, every toolbox will receive
+      // the toolbox-register and toolbox-unregister events.
+      return;
+    }
+    this._buildTabForTool(tool);
+    // Emit the event so tools can listen to it from the toolbox level
+    // instead of gDevTools.
+    this.emit("tool-registered", toolId);
+  },
+
+  /**
+   * Handler for the tool-unregistered event.
+   * @param  {string} event
+   *         Name of the event ("tool-unregistered")
+   * @param  {string} toolId
+   *         id of the tool that was unregistered
+   */
+  _toolUnregistered: function (event, toolId) {
+    this.unloadTool(toolId);
     // Emit the event so tools can listen to it from the toolbox level
     // instead of gDevTools
     this.emit("tool-unregistered", toolId);
   },
 
   /**
    * Initialize the inspector/walker/selection/highlighter fronts.
    * Returns a promise that resolves when the fronts are initialized
--- a/devtools/client/inspector/rules/test/browser_rules_authored_color.js
+++ b/devtools/client/inspector/rules/test/browser_rules_authored_color.js
@@ -1,65 +1,67 @@
 /* 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 for as-authored styles.
+// Test for as-authored color styles.
 
-function* createTestContent(style) {
-  let html = `<style type="text/css">
-      ${style}
-      </style>
-      <div id="testid" class="testclass">Styled Node</div>`;
-  let tab = yield addTab("data:text/html;charset=utf-8," +
-                         encodeURIComponent(html));
-
-  let {inspector, view} = yield openRuleView();
-  yield selectNode("#testid", inspector);
-  return {view, tab};
-}
+/**
+ * Array of test color objects:
+ *   {String} name: name of the used & expected color format.
+ *   {String} id: id of the element that will be created to test this color.
+ *   {String} color: initial value of the color property applied to the test element.
+ *   {String} result: expected value of the color property after edition.
+ */
+const colors = [
+  {name: "hex", id: "test1", color: "#f0c", result: "#0f0"},
+  {name: "rgb", id: "test2", color: "rgb(0,128,250)", result: "rgb(0, 255, 0)"},
+  // Test case preservation.
+  {name: "hex", id: "test3", color: "#F0C", result: "#0F0"},
+];
 
 add_task(function* () {
-  let colors = [
-    {name: "hex", text: "#f0c", result: "#0f0"},
-    {name: "rgb", text: "rgb(0,128,250)", result: "rgb(0, 255, 0)"},
-    // Test case preservation.
-    {name: "hex", text: "#F0C", result: "#0F0"},
-  ];
-
   Services.prefs.setCharPref("devtools.defaultColorUnit", "authored");
 
+  let html = "";
+  for (let {color, id} of colors) {
+    html += `<div id="${id}" style="color: ${color}">Styled Node</div>`;
+  }
+
+  let tab = yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(html));
+
+  let {inspector, view} = yield openRuleView();
+
   for (let color of colors) {
-    let {view, tab} = yield createTestContent("#testid {" +
-                                              "  color: " + color.text + ";" +
-                                              "} ");
+    let cPicker = view.tooltips.colorPicker;
+    let selector = "#" + color.id;
+    yield selectNode(selector, inspector);
 
-    let cPicker = view.tooltips.colorPicker;
-    let swatch = getRuleViewProperty(view, "#testid", "color").valueSpan
+    let swatch = getRuleViewProperty(view, "element", "color").valueSpan
         .querySelector(".ruleview-colorswatch");
     let onColorPickerReady = cPicker.once("ready");
     swatch.click();
     yield onColorPickerReady;
 
     yield simulateColorPickerChange(view, cPicker, [0, 255, 0, 1], {
-      selector: "#testid",
+      selector,
       name: "color",
       value: "rgb(0, 255, 0)"
     });
 
     let spectrum = cPicker.spectrum;
     let onHidden = cPicker.tooltip.once("hidden");
     // Validating the color change ends up updating the rule view twice
     let onRuleViewChanged = waitForNEvents(view, "ruleview-changed", 2);
     focusAndSendKey(spectrum.element.ownerDocument.defaultView, "RETURN");
     yield onHidden;
     yield onRuleViewChanged;
 
-    is(getRuleViewPropertyValue(view, "#testid", "color"), color.result,
+    is(getRuleViewPropertyValue(view, "element", "color"), color.result,
        "changing the color preserved the unit for " + color.name);
+  }
 
-    let target = TargetFactory.forTab(tab);
-    yield gDevTools.closeToolbox(target);
-    gBrowser.removeCurrentTab();
-  }
+  let target = TargetFactory.forTab(tab);
+  yield gDevTools.closeToolbox(target);
+  gBrowser.removeCurrentTab();
 });
--- a/devtools/client/netmonitor/custom-request-view.js
+++ b/devtools/client/netmonitor/custom-request-view.js
@@ -1,19 +1,21 @@
 /* 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/. */
 /* globals window, dumpn, gNetwork, $, EVENTS, NetMonitorView */
 "use strict";
 
-const {Task} = require("devtools/shared/task");
-const {writeHeaderText, getKeyWithEvent} = require("./request-utils");
-
-loader.lazyRequireGetter(this, "NetworkHelper",
-  "devtools/shared/webconsole/network-helper");
+const { Task } = require("devtools/shared/task");
+const {
+  writeHeaderText,
+  getKeyWithEvent,
+  getUrlQuery,
+  parseQueryString,
+} = require("./request-utils");
 
 /**
  * Functions handling the custom request view.
  */
 function CustomRequestView() {
   dumpn("CustomRequestView was instantiated");
 }
 
@@ -107,18 +109,17 @@ CustomRequestView.prototype = {
 
   /**
    * Update the query string field based on the url.
    *
    * @param object url
    *        The URL to extract query string from.
    */
   updateCustomQuery: function (url) {
-    let paramsArray = NetworkHelper.parseQueryString(
-      NetworkHelper.nsIURL(url).query);
+    const paramsArray = parseQueryString(getUrlQuery(url));
 
     if (!paramsArray) {
       $("#custom-query").hidden = true;
       return;
     }
 
     $("#custom-query").hidden = false;
     $("#custom-query-value").value = writeQueryText(paramsArray);
@@ -130,17 +131,17 @@ CustomRequestView.prototype = {
    * @param object queryText
    *        The contents of the query string field.
    */
   updateCustomUrl: function (queryText) {
     let params = parseQueryText(queryText);
     let queryString = writeQueryString(params);
 
     let url = $("#custom-url-value").value;
-    let oldQuery = NetworkHelper.nsIURL(url).query;
+    let oldQuery = getUrlQuery(url);
     let path = url.replace(oldQuery, queryString);
 
     $("#custom-url-value").value = path;
   }
 };
 
 /**
  * Parse text representation of multiple HTTP headers.
--- a/devtools/client/netmonitor/har/har-builder.js
+++ b/devtools/client/netmonitor/har/har-builder.js
@@ -3,19 +3,21 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
 const { defer, all } = require("promise");
 const { LocalizationHelper } = require("devtools/shared/l10n");
 const Services = require("Services");
 const appInfo = Services.appinfo;
 const { CurlUtils } = require("devtools/client/shared/curl");
-const { getFormDataSections } = require("devtools/client/netmonitor/request-utils");
-
-loader.lazyRequireGetter(this, "NetworkHelper", "devtools/shared/webconsole/network-helper");
+const {
+  getFormDataSections,
+  getUrlQuery,
+  parseQueryString,
+} = require("devtools/client/netmonitor/request-utils");
 
 loader.lazyGetter(this, "L10N", () => {
   return new LocalizationHelper("devtools/client/locales/har.properties");
 });
 
 const HAR_VERSION = "1.1";
 
 /**
@@ -165,18 +167,17 @@ HarBuilder.prototype = {
     request.method = file.method;
     request.url = file.url;
     request.httpVersion = file.httpVersion || "";
 
     request.headers = this.buildHeaders(file.requestHeaders);
     request.headers = this.appendHeadersPostData(request.headers, file);
     request.cookies = this.buildCookies(file.requestCookies);
 
-    request.queryString = NetworkHelper.parseQueryString(
-      NetworkHelper.nsIURL(file.url).query) || [];
+    request.queryString = parseQueryString(getUrlQuery(file.url)) || [];
 
     request.postData = this.buildPostData(file);
 
     request.headersSize = file.requestHeaders.headersSize;
 
     // Set request body size, but make sure the body is fetched
     // from the backend.
     if (file.requestPostData) {
@@ -275,17 +276,17 @@ HarBuilder.prototype = {
         // Extract form parameters and produce nice HAR array.
         getFormDataSections(
           file.requestHeaders,
           file.requestHeadersFromUploadStream,
           file.requestPostData,
           this._options.getString
         ).then(formDataSections => {
           formDataSections.forEach(section => {
-            let paramsArray = NetworkHelper.parseQueryString(section);
+            let paramsArray = parseQueryString(section);
             if (paramsArray) {
               postData.params = [...postData.params, ...paramsArray];
             }
           });
         });
       }
     });
 
--- a/devtools/client/netmonitor/netmonitor-controller.js
+++ b/devtools/client/netmonitor/netmonitor-controller.js
@@ -51,24 +51,16 @@ XPCOMUtils.defineConstant(this, "Editor"
 XPCOMUtils.defineConstant(this, "Prefs", Prefs);
 
 XPCOMUtils.defineLazyModuleGetter(this, "Chart",
   "resource://devtools/client/shared/widgets/Chart.jsm");
 
 XPCOMUtils.defineLazyServiceGetter(this, "clipboardHelper",
   "@mozilla.org/widget/clipboardhelper;1", "nsIClipboardHelper");
 
-Object.defineProperty(this, "NetworkHelper", {
-  get: function () {
-    return require("devtools/shared/webconsole/network-helper");
-  },
-  configurable: true,
-  enumerable: true
-});
-
 /**
  * Object defining the network monitor controller components.
  */
 var NetMonitorController = {
   /**
    * Initializes the view and connects the monitor client.
    *
    * @return object
--- a/devtools/client/netmonitor/netmonitor-view.js
+++ b/devtools/client/netmonitor/netmonitor-view.js
@@ -3,31 +3,33 @@
 /* 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/. */
 /* import-globals-from ./netmonitor-controller.js */
 /* globals Prefs, gNetwork, setInterval, setTimeout, clearInterval, clearTimeout, btoa */
 /* exported $, $all */
 "use strict";
 
-XPCOMUtils.defineLazyGetter(this, "NetworkHelper", function () {
-  return require("devtools/shared/webconsole/network-helper");
-});
-
 /* eslint-disable mozilla/reject-some-requires */
 const {VariablesView} = require("resource://devtools/client/shared/widgets/VariablesView.jsm");
 /* eslint-disable mozilla/reject-some-requires */
 const {VariablesViewController} = require("resource://devtools/client/shared/widgets/VariablesViewController.jsm");
 const {ToolSidebar} = require("devtools/client/framework/sidebar");
 const {testing: isTesting} = require("devtools/shared/flags");
 const {ViewHelpers, Heritage} = require("devtools/client/shared/widgets/view-helpers");
 const {Filters} = require("./filter-predicates");
-const {getFormDataSections,
-       formDataURI,
-       getUriHostPort} = require("./request-utils");
+const {
+  formDataURI,
+  decodeUnicodeUrl,
+  getFormDataSections,
+  getUrlBaseName,
+  getUrlQuery,
+  getUrlHost,
+  parseQueryString,
+} = require("./request-utils");
 const {L10N} = require("./l10n");
 const {RequestsMenuView} = require("./requests-menu-view");
 const {CustomRequestView} = require("./custom-request-view");
 const {ToolbarView} = require("./toolbar-view");
 const {configureStore} = require("./store");
 const {PerformanceStatisticsView} = require("./performance-statistics-view");
 
 // Initialize the global redux variables
@@ -547,17 +549,17 @@ NetworkDetailsView.prototype = {
   /**
    * Sets the network request summary shown in this view.
    *
    * @param object data
    *        The data source (this should be the attachment of a request item).
    */
   _setSummary: function (data) {
     if (data.url) {
-      let unicodeUrl = NetworkHelper.convertToUnicode(unescape(data.url));
+      let unicodeUrl = decodeUnicodeUrl(data.url);
       $("#headers-summary-url-value").setAttribute("value", unicodeUrl);
       $("#headers-summary-url-value").setAttribute("tooltiptext", unicodeUrl);
       $("#headers-summary-url").removeAttribute("hidden");
     } else {
       $("#headers-summary-url").setAttribute("hidden", "true");
     }
 
     if (data.method) {
@@ -738,17 +740,17 @@ NetworkDetailsView.prototype = {
 
   /**
    * Sets the network request get params shown in this view.
    *
    * @param string url
    *        The request's url.
    */
   _setRequestGetParams: function (url) {
-    let query = NetworkHelper.nsIURL(url).query;
+    let query = getUrlQuery(url);
     if (query) {
       this._addParams(this._paramsQueryString, query);
     }
   },
 
   /**
    * Sets the network request post params shown in this view.
    *
@@ -820,17 +822,17 @@ NetworkDetailsView.prototype = {
    * Populates the params container in this view with the specified data.
    *
    * @param string name
    *        The type of params to populate (get or post).
    * @param string queryString
    *        A query string of params (e.g. "?foo=bar&baz=42").
    */
   _addParams: function (name, queryString) {
-    let paramsArray = NetworkHelper.parseQueryString(queryString);
+    let paramsArray = parseQueryString(queryString);
     if (!paramsArray) {
       return;
     }
     let paramsScope = this._params.addScope(name);
     paramsScope.expanded = true;
 
     for (let param of paramsArray) {
       let paramVar = paramsScope.addItem(param.name, {}, {relaxed: true});
@@ -913,17 +915,17 @@ NetworkDetailsView.prototype = {
       $("#response-content-image-box").setAttribute("align", "center");
       $("#response-content-image-box").setAttribute("pack", "center");
       $("#response-content-image-box").hidden = false;
       $("#response-content-image").src = formDataURI(mimeType, encoding, responseBody);
 
       // Immediately display additional information about the image:
       // file name, mime type and encoding.
       $("#response-content-image-name-value").setAttribute("value",
-        NetworkHelper.nsIURL(url).fileName);
+        getUrlBaseName(url));
       $("#response-content-image-mime-value").setAttribute("value", mimeType);
 
       // Wait for the image to load in order to display the width and height.
       $("#response-content-image").onload = e => {
         // XUL images are majestic so they don't bother storing their dimensions
         // in width and height attributes like the rest of the folk. Hack around
         // this by getting the bounding client rect and subtracting the margins.
         let { width, height } = e.target.getBoundingClientRect();
@@ -1121,17 +1123,17 @@ NetworkDetailsView.prototype = {
       let disabledLabel = L10N.getStr("netmonitor.security.disabled");
 
       // Connection parameters
       setValue("#security-protocol-version-value",
         securityInfo.protocolVersion);
       setValue("#security-ciphersuite-value", securityInfo.cipherSuite);
 
       // Host header
-      let domain = getUriHostPort(url);
+      let domain = getUrlHost(url);
       let hostHeader = L10N.getFormatStr("netmonitor.security.hostHeader",
         domain);
       setValue("#security-info-host-header", hostHeader);
 
       // Parameters related to the domain
       setValue("#security-http-strict-transport-security-value",
                 securityInfo.hsts ? enabledLabel : disabledLabel);
 
--- a/devtools/client/netmonitor/request-list-context-menu.js
+++ b/devtools/client/netmonitor/request-list-context-menu.js
@@ -8,27 +8,29 @@
 
 const Services = require("Services");
 const { Task } = require("devtools/shared/task");
 const { Curl } = require("devtools/client/shared/curl");
 const { gDevTools } = require("devtools/client/framework/devtools");
 const Menu = require("devtools/client/framework/menu");
 const MenuItem = require("devtools/client/framework/menu-item");
 const { L10N } = require("./l10n");
-const { formDataURI, getFormDataSections } = require("./request-utils");
+const {
+  formDataURI,
+  getFormDataSections,
+  getUrlQuery,
+  parseQueryString,
+} = require("./request-utils");
 
 loader.lazyRequireGetter(this, "HarExporter",
   "devtools/client/netmonitor/har/har-exporter", true);
 
 loader.lazyServiceGetter(this, "clipboardHelper",
   "@mozilla.org/widget/clipboardhelper;1", "nsIClipboardHelper");
 
-loader.lazyRequireGetter(this, "NetworkHelper",
-  "devtools/shared/webconsole/network-helper");
-
 function RequestListContextMenu() {}
 
 RequestListContextMenu.prototype = {
   get selectedItem() {
     return NetMonitorView.RequestsMenu.selectedItem;
   },
 
   get items() {
@@ -51,18 +53,17 @@ RequestListContextMenu.prototype = {
       visible: !!selectedItem,
       click: () => this.copyUrl(),
     }));
 
     menu.append(new MenuItem({
       id: "request-menu-context-copy-url-params",
       label: L10N.getStr("netmonitor.context.copyUrlParams"),
       accesskey: L10N.getStr("netmonitor.context.copyUrlParams.accesskey"),
-      visible: !!(selectedItem &&
-               NetworkHelper.nsIURL(selectedItem.attachment.url).query),
+      visible: !!(selectedItem && getUrlQuery(selectedItem.attachment.url)),
       click: () => this.copyUrlParams(),
     }));
 
     menu.append(new MenuItem({
       id: "request-menu-context-copy-post-data",
       label: L10N.getStr("netmonitor.context.copyPostData"),
       accesskey: L10N.getStr("netmonitor.context.copyPostData.accesskey"),
       visible: !!(selectedItem && selectedItem.attachment.requestPostData),
@@ -198,17 +199,17 @@ RequestListContextMenu.prototype = {
   },
 
   /**
    * Copy the request url query string parameters from the currently
    * selected item.
    */
   copyUrlParams() {
     let { url } = this.selectedItem.attachment;
-    let params = NetworkHelper.nsIURL(url).query.split("&");
+    let params = getUrlQuery(url).split("&");
     let string = params.join(Services.appinfo.OS === "WINNT" ? "\r\n" : "\n");
     clipboardHelper.copyString(string);
   },
 
   /**
    * Copy the request form data parameters (or raw payload) from
    * the currently selected item.
    */
@@ -219,17 +220,17 @@ RequestListContextMenu.prototype = {
     let formDataSections = yield getFormDataSections(
       selected.requestHeaders,
       selected.requestHeadersFromUploadStream,
       selected.requestPostData,
       gNetwork.getString.bind(gNetwork));
 
     let params = [];
     formDataSections.forEach(section => {
-      let paramsArray = NetworkHelper.parseQueryString(section);
+      let paramsArray = parseQueryString(section);
       if (paramsArray) {
         params = [...params, ...paramsArray];
       }
     });
 
     let string = params
       .map(param => param.name + (param.value ? "=" + param.value : ""))
       .join(Services.appinfo.OS === "WINNT" ? "\r\n" : "\n");
--- a/devtools/client/netmonitor/request-utils.js
+++ b/devtools/client/netmonitor/request-utils.js
@@ -1,59 +1,52 @@
 "use strict";
+
 /* eslint-disable mozilla/reject-some-requires */
 const { Ci } = require("chrome");
 const { KeyCodes } = require("devtools/client/shared/keycodes");
 const { Task } = require("devtools/shared/task");
-const NetworkHelper = require("devtools/shared/webconsole/network-helper");
 
 /**
  * Helper method to get a wrapped function which can be bound to as
  * an event listener directly and is executed only when data-key is
  * present in event.target.
  *
- * @param function callback
- *          Function to execute execute when data-key
- *          is present in event.target.
- * @param bool onlySpaceOrReturn
- *          Flag to indicate if callback should only be called
-            when the space or return button is pressed
- * @return function
- *          Wrapped function with the target data-key as the first argument
- *          and the event as the second argument.
+ * @param {function} callback - function to execute execute when data-key
+ *                              is present in event.target.
+ * @param {bool} onlySpaceOrReturn - flag to indicate if callback should only
+ *                                   be called when the space or return button
+ *                                   is pressed
+ * @return {function} wrapped function with the target data-key as the first argument
+ *                    and the event as the second argument.
  */
-exports.getKeyWithEvent = function (callback, onlySpaceOrReturn) {
+function getKeyWithEvent(callback, onlySpaceOrReturn) {
   return function (event) {
     let key = event.target.getAttribute("data-key");
     let filterKeyboardEvent = !onlySpaceOrReturn ||
                               event.keyCode === KeyCodes.DOM_VK_SPACE ||
                               event.keyCode === KeyCodes.DOM_VK_RETURN;
 
     if (key && filterKeyboardEvent) {
       callback.call(null, key);
     }
   };
-};
+}
 
 /**
  * Extracts any urlencoded form data sections (e.g. "?foo=bar&baz=42") from a
  * POST request.
  *
- * @param object headers
- *        The "requestHeaders".
- * @param object uploadHeaders
- *        The "requestHeadersFromUploadStream".
- * @param object postData
- *        The "requestPostData".
- * @param object getString
-          Callback to retrieve a string from a LongStringGrip.
- * @return array
- *        A promise that is resolved with the extracted form data.
+ * @param {object} headers - the "requestHeaders".
+ * @param {object} uploadHeaders - the "requestHeadersFromUploadStream".
+ * @param {object} postData - the "requestPostData".
+ * @param {function} getString - callback to retrieve a string from a LongStringGrip.
+ * @return {array} a promise list that is resolved with the extracted form data.
  */
-exports.getFormDataSections = Task.async(function* (headers, uploadHeaders, postData,
+const getFormDataSections = Task.async(function* (headers, uploadHeaders, postData,
                                                     getString) {
   let formDataSections = [];
 
   let { headers: requestHeaders } = headers;
   let { headers: payloadHeaders } = uploadHeaders;
   let allHeaders = [...payloadHeaders, ...requestHeaders];
 
   let contentTypeHeader = allHeaders.find(e => {
@@ -78,83 +71,142 @@ exports.getFormDataSections = Task.async
   }
 
   return formDataSections;
 });
 
 /**
  * Form a data: URI given a mime type, encoding, and some text.
  *
- * @param {String} mimeType the mime type
- * @param {String} encoding the encoding to use; if not set, the
- *        text will be base64-encoded.
- * @param {String} text the text of the URI.
- * @return {String} a data: URI
+ * @param {string} mimeType - mime type
+ * @param {string} encoding - encoding to use; if not set, the
+ *                            text will be base64-encoded.
+ * @param {string} text - text of the URI.
+ * @return {string} a data URI
  */
-exports.formDataURI = function (mimeType, encoding, text) {
+function formDataURI(mimeType, encoding, text) {
   if (!encoding) {
     encoding = "base64";
     text = btoa(text);
   }
   return "data:" + mimeType + ";" + encoding + "," + text;
-};
+}
 
 /**
  * Write out a list of headers into a chunk of text
  *
- * @param array headers
- *        Array of headers info {name, value}
- * @return string text
- *         List of headers in text format
+ * @param {array} headers - array of headers info { name, value }
+ * @return {string} list of headers in text format
  */
-exports.writeHeaderText = function (headers) {
+function writeHeaderText(headers) {
   return headers.map(({name, value}) => name + ": " + value).join("\n");
-};
+}
+
+/**
+ * Convert a string into unicode if string is valid.
+ * If there is a malformed URI sequence, it returns input string.
+ *
+ * @param {string} url - a string
+ * @return {string} unicode string
+ */
+function decodeUnicodeUrl(string) {
+  try {
+    return decodeURIComponent(string);
+  } catch (err) {
+    // Ignore error and return input string directly.
+  }
+  return string;
+}
 
 /**
  * Helper for getting an abbreviated string for a mime type.
  *
- * @param string mimeType
- * @return string
+ * @param {string} mimeType - mime type
+ * @return {string} abbreviated mime type
  */
-exports.getAbbreviatedMimeType = function (mimeType) {
+function getAbbreviatedMimeType(mimeType) {
   if (!mimeType) {
     return "";
   }
   return (mimeType.split(";")[0].split("/")[1] || "").split("+")[0];
-};
+}
+
+/**
+ * Helpers for getting the last portion of a url.
+ * For example helper returns "basename" from http://domain.com/path/basename
+ * If basename portion is empty, it returns the url pathname.
+ *
+ * @param {string} url - url string
+ * @return {string} unicode basename of a url
+ */
+function getUrlBaseName(url) {
+  const pathname = (new URL(url)).pathname;
+  return decodeUnicodeUrl(
+    pathname.replace(/\S*\//, "") || pathname || "/");
+}
+
+/**
+ * Helpers for getting the query portion of a url.
+ *
+ * @param {string} url - url string
+ * @return {string} unicode query of a url
+ */
+function getUrlQuery(url) {
+  return decodeUnicodeUrl((new URL(url)).search.replace(/^\?/, ""));
+}
 
 /**
- * Helpers for getting details about an nsIURL.
+ * Helpers for getting unicode name and query portions of a url.
+ *
+ * @param {string} url - url string
+ * @return {string} unicode basename and query portions of a url
+ */
+function getUrlBaseNameWithQuery(url) {
+  return getUrlBaseName(url) + decodeUnicodeUrl((new URL(url)).search);
+}
+
+/**
+ * Helpers for getting unicode hostname portion of an URL.
  *
- * @param nsIURL | string url
- * @return string
+ * @param {string} url - url string
+ * @return {string} unicode hostname of a url
+ */
+function getUrlHostName(url) {
+  return decodeUnicodeUrl((new URL(url)).hostname);
+}
+
+/**
+ * Helpers for getting unicode host portion of an URL.
+ *
+ * @param {string} url - url string
+ * @return {string} unicode host of a url
  */
-exports.getUriNameWithQuery = function (url) {
-  if (!(url instanceof Ci.nsIURL)) {
-    url = NetworkHelper.nsIURL(url);
+function getUrlHost(url) {
+  return decodeUnicodeUrl((new URL(url)).host);
+}
+
+/**
+ * Parse a url's query string into its components
+ *
+ * @param {string} query - query string of a url portion
+ * @return {array} array of query params { name, value }
+ */
+function parseQueryString(query) {
+  if (!query) {
+    return null;
   }
 
-  let name = NetworkHelper.convertToUnicode(
-    unescape(url.fileName || url.filePath || "/"));
-  let query = NetworkHelper.convertToUnicode(unescape(url.query));
-
-  return name + (query ? "?" + query : "");
-};
-
-exports.getUriHostPort = function (url) {
-  if (!(url instanceof Ci.nsIURL)) {
-    url = NetworkHelper.nsIURL(url);
-  }
-  return NetworkHelper.convertToUnicode(unescape(url.hostPort));
-};
-
-exports.getUriHost = function (url) {
-  return exports.getUriHostPort(url).replace(/:\d+$/, "");
-};
+  return query.replace(/^[?&]/, "").split("&").map(e => {
+    let param = e.split("=");
+    return {
+      name: param[0] ? decodeUnicodeUrl(param[0]) : "",
+      value: param[1] ? decodeUnicodeUrl(param[1]) : "",
+    };
+  });
+}
 
 /**
  * Convert a nsIContentPolicy constant to a display string
  */
 const LOAD_CAUSE_STRINGS = {
   [Ci.nsIContentPolicy.TYPE_INVALID]: "invalid",
   [Ci.nsIContentPolicy.TYPE_OTHER]: "other",
   [Ci.nsIContentPolicy.TYPE_SCRIPT]: "script",
@@ -175,11 +227,27 @@ const LOAD_CAUSE_STRINGS = {
   [Ci.nsIContentPolicy.TYPE_CSP_REPORT]: "csp",
   [Ci.nsIContentPolicy.TYPE_XSLT]: "xslt",
   [Ci.nsIContentPolicy.TYPE_BEACON]: "beacon",
   [Ci.nsIContentPolicy.TYPE_FETCH]: "fetch",
   [Ci.nsIContentPolicy.TYPE_IMAGESET]: "imageset",
   [Ci.nsIContentPolicy.TYPE_WEB_MANIFEST]: "webManifest"
 };
 
-exports.loadCauseString = function (causeType) {
+function loadCauseString(causeType) {
   return LOAD_CAUSE_STRINGS[causeType] || "unknown";
+}
+
+module.exports = {
+  getKeyWithEvent,
+  getFormDataSections,
+  formDataURI,
+  writeHeaderText,
+  decodeUnicodeUrl,
+  getAbbreviatedMimeType,
+  getUrlBaseName,
+  getUrlQuery,
+  getUrlBaseNameWithQuery,
+  getUrlHostName,
+  getUrlHost,
+  parseQueryString,
+  loadCauseString,
 };
--- a/devtools/client/netmonitor/requests-menu-view.js
+++ b/devtools/client/netmonitor/requests-menu-view.js
@@ -19,28 +19,26 @@ const {setImageTooltip, getImageDimensio
 const {Heritage, WidgetMethods, setNamedTimeout} =
   require("devtools/client/shared/widgets/view-helpers");
 const {CurlUtils} = require("devtools/client/shared/curl");
 const {Filters, isFreetextMatch} = require("./filter-predicates");
 const {Sorters} = require("./sort-predicates");
 const {L10N, WEBCONSOLE_L10N} = require("./l10n");
 const {formDataURI,
        writeHeaderText,
+       decodeUnicodeUrl,
        getKeyWithEvent,
        getAbbreviatedMimeType,
-       getUriNameWithQuery,
-       getUriHostPort,
-       getUriHost,
+       getUrlBaseNameWithQuery,
+       getUrlHost,
+       getUrlHostName,
        loadCauseString} = require("./request-utils");
 const Actions = require("./actions/index");
 const RequestListContextMenu = require("./request-list-context-menu");
 
-loader.lazyRequireGetter(this, "NetworkHelper",
-  "devtools/shared/webconsole/network-helper");
-
 const HTML_NS = "http://www.w3.org/1999/xhtml";
 const EPSILON = 0.001;
 // ms
 const RESIZE_REFRESH_RATE = 50;
 // ms
 const REQUESTS_REFRESH_RATE = 50;
 // tooltip show/hide delay in ms
 const REQUESTS_TOOLTIP_TOGGLE_DELAY = 500;
@@ -920,27 +918,20 @@ RequestsMenuView.prototype = Heritage.ex
 
     switch (key) {
       case "method": {
         let node = $(".requests-menu-method", target);
         node.setAttribute("value", value);
         break;
       }
       case "url": {
-        let uri;
-        try {
-          uri = NetworkHelper.nsIURL(value);
-        } catch (e) {
-          // User input may not make a well-formed url yet.
-          break;
-        }
-        let nameWithQuery = getUriNameWithQuery(uri);
-        let hostPort = getUriHostPort(uri);
-        let host = getUriHost(uri);
-        let unicodeUrl = NetworkHelper.convertToUnicode(unescape(uri.spec));
+        let nameWithQuery = getUrlBaseNameWithQuery(value);
+        let hostPort = getUrlHost(value);
+        let host = getUrlHostName(value);
+        let unicodeUrl = decodeUnicodeUrl(value);
 
         let file = $(".requests-menu-file", target);
         file.setAttribute("value", nameWithQuery);
         file.setAttribute("tooltiptext", unicodeUrl);
 
         let domain = $(".requests-menu-domain", target);
         domain.setAttribute("value", hostPort);
         domain.setAttribute("tooltiptext", hostPort);
--- a/devtools/client/netmonitor/sort-predicates.js
+++ b/devtools/client/netmonitor/sort-predicates.js
@@ -1,13 +1,13 @@
 "use strict";
 
 const { getAbbreviatedMimeType,
-        getUriNameWithQuery,
-        getUriHostPort,
+        getUrlBaseNameWithQuery,
+        getUrlHost,
         loadCauseString } = require("./request-utils");
 
 /**
  * Predicates used when sorting items.
  *
  * @param object first
  *        The first item used in the comparison.
  * @param object second
@@ -31,27 +31,27 @@ function status(first, second) {
 function method(first, second) {
   if (first.method == second.method) {
     return first.startedMillis - second.startedMillis;
   }
   return first.method > second.method ? 1 : -1;
 }
 
 function file(first, second) {
-  let firstUrl = getUriNameWithQuery(first.url).toLowerCase();
-  let secondUrl = getUriNameWithQuery(second.url).toLowerCase();
+  let firstUrl = getUrlBaseNameWithQuery(first.url).toLowerCase();
+  let secondUrl = getUrlBaseNameWithQuery(second.url).toLowerCase();
   if (firstUrl == secondUrl) {
     return first.startedMillis - second.startedMillis;
   }
   return firstUrl > secondUrl ? 1 : -1;
 }
 
 function domain(first, second) {
-  let firstDomain = getUriHostPort(first.url).toLowerCase();
-  let secondDomain = getUriHostPort(second.url).toLowerCase();
+  let firstDomain = getUrlHost(first.url).toLowerCase();
+  let secondDomain = getUrlHost(second.url).toLowerCase();
   if (firstDomain == secondDomain) {
     return first.startedMillis - second.startedMillis;
   }
   return firstDomain > secondDomain ? 1 : -1;
 }
 
 function cause(first, second) {
   let firstCause = loadCauseString(first.cause.type);
--- a/devtools/client/netmonitor/test/head.js
+++ b/devtools/client/netmonitor/test/head.js
@@ -4,18 +4,23 @@
 
 /* import-globals-from ../../framework/test/shared-head.js */
 
 // shared-head.js handles imports, constants, and utility functions
 Services.scriptloader.loadSubScript(
   "chrome://mochitests/content/browser/devtools/client/framework/test/shared-head.js",
   this);
 
-var NetworkHelper = require("devtools/shared/webconsole/network-helper");
 var { Toolbox } = require("devtools/client/framework/toolbox");
+const {
+  decodeUnicodeUrl,
+  getUrlBaseName,
+  getUrlQuery,
+  getUrlHost,
+} = require("devtools/client/netmonitor/request-utils");
 
 const EXAMPLE_URL = "http://example.com/browser/devtools/client/netmonitor/test/";
 const HTTPS_EXAMPLE_URL = "https://example.com/browser/devtools/client/netmonitor/test/";
 
 const API_CALLS_URL = EXAMPLE_URL + "html_api-calls-test-page.html";
 const SIMPLE_URL = EXAMPLE_URL + "html_simple-test-page.html";
 const NAVIGATE_URL = EXAMPLE_URL + "html_navigate-test-page.html";
 const CONTENT_TYPE_URL = EXAMPLE_URL + "html_content-type-test-page.html";
@@ -255,21 +260,20 @@ function verifyRequestItemTarget(aReques
 
   info("Widget index of item: " + widgetIndex);
   info("Visible index of item: " + visibleIndex);
 
   let { fuzzyUrl, status, statusText, cause, type, fullMimeType,
         transferred, size, time, displayedStatus } = aData;
   let { attachment, target } = aRequestItem;
 
-  let uri = Services.io.newURI(aUrl, null, null).QueryInterface(Ci.nsIURL);
-  let unicodeUrl = NetworkHelper.convertToUnicode(unescape(aUrl));
-  let name = NetworkHelper.convertToUnicode(unescape(uri.fileName || uri.filePath || "/"));
-  let query = NetworkHelper.convertToUnicode(unescape(uri.query));
-  let hostPort = uri.hostPort;
+  let unicodeUrl = decodeUnicodeUrl(aUrl);
+  let name = getUrlBaseName(aUrl);
+  let query = getUrlQuery(aUrl);
+  let hostPort = getUrlHost(aUrl);
   let remoteAddress = attachment.remoteAddress;
 
   if (fuzzyUrl) {
     ok(attachment.method.startsWith(aMethod), "The attached method is correct.");
     ok(attachment.url.startsWith(aUrl), "The attached url is correct.");
   } else {
     is(attachment.method, aMethod, "The attached method is correct.");
     is(attachment.url, aUrl, "The attached url is correct.");
--- a/devtools/server/actors/webconsole.js
+++ b/devtools/server/actors/webconsole.js
@@ -1735,16 +1735,17 @@ WebConsoleActor.prototype =
     let result = WebConsoleUtils.cloneObject(aMessage);
 
     result.workerType = WebConsoleUtils.getWorkerType(result) || "none";
 
     delete result.wrappedJSObject;
     delete result.ID;
     delete result.innerID;
     delete result.consoleID;
+    delete result.originAttributes;
 
     result.arguments = Array.map(aMessage.arguments || [], (aObj) => {
       let dbgObj = this.makeDebuggeeValue(aObj, aUseObjectGlobal);
       return this.createValueGrip(dbgObj);
     });
 
     result.styles = Array.map(aMessage.styles || [], (aString) => {
       return this.createValueGrip(aString);
--- a/dom/console/ConsoleAPIStorage.js
+++ b/dom/console/ConsoleAPIStorage.js
@@ -122,16 +122,22 @@ ConsoleAPIStorageService.prototype = {
    */
   recordEvent: function CS_recordEvent(aId, aOuterId, aEvent)
   {
     if (!_consoleStorage.has(aId)) {
       _consoleStorage.set(aId, []);
     }
 
     let storage = _consoleStorage.get(aId);
+
+    // Clone originAttributes to prevent "TypeError: can't access dead object"
+    // exceptions when cached console messages are retrieved/filtered
+    // by the devtools webconsole actor.
+    aEvent.originAttributes = Cu.cloneInto(aEvent.originAttributes, {});
+
     storage.push(aEvent);
 
     // truncate
     if (storage.length > STORAGE_MAX_EVENTS) {
       storage.shift();
     }
 
     Services.obs.notifyObservers(aEvent, "console-api-log-event", aOuterId);
--- a/dom/events/EventDispatcher.cpp
+++ b/dom/events/EventDispatcher.cpp
@@ -488,17 +488,18 @@ EventTargetChainItem::HandleEventTargetC
       }
       if (aVisitor.mEvent->mFlags.mInSystemGroup) {
         item.PostHandleEvent(aVisitor);
       }
     }
   }
   aVisitor.mEvent->mFlags.mInBubblingPhase = false;
 
-  if (!aVisitor.mEvent->mFlags.mInSystemGroup) {
+  if (!aVisitor.mEvent->mFlags.mInSystemGroup &&
+      aVisitor.mEvent->IsAllowedToDispatchInSystemGroup()) {
     // Dispatch to the system event group.  Make sure to clear the
     // STOP_DISPATCH flag since this resets for each event group.
     aVisitor.mEvent->mFlags.mPropagationStopped = false;
     aVisitor.mEvent->mFlags.mImmediatePropagationStopped = false;
 
     // Setting back the original target of the event.
     aVisitor.mEvent->mTarget = aVisitor.mEvent->mOriginalTarget;
 
--- a/dom/events/test/pointerevents/mochitest.ini
+++ b/dom/events/test/pointerevents/mochitest.ini
@@ -113,20 +113,18 @@ support-files =
 [test_pointerevent_setpointercapture_override_pending_capture_element-manual.html]
   support-files = pointerevent_setpointercapture_override_pending_capture_element-manual.html
 [test_pointerevent_setpointercapture_relatedtarget-manual.html]
   support-files = pointerevent_setpointercapture_relatedtarget-manual.html
 [test_pointerevent_setpointercapture_to_same_element_twice-manual.html]
   support-files = pointerevent_setpointercapture_to_same_element_twice-manual.html
 [test_pointerevent_suppress_compat_events_on_click.html]
   support-files = pointerevent_suppress_compat_events_on_click.html
-  disabled = should be investigated
 [test_pointerevent_suppress_compat_events_on_drag_mouse.html]
   support-files = pointerevent_suppress_compat_events_on_drag_mouse.html
-  disabled = should be investigated
 [test_touch_action.html]
   support-files =
     ../../../../gfx/layers/apz/test/mochitest/apz_test_utils.js
     ../../../../gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js
     touch_action_helpers.js
     pointerevent_touch-action-auto-css_touch-manual.html
     pointerevent_touch-action-button-test_touch-manual.html
     pointerevent_touch-action-inherit_child-auto-child-none_touch-manual.html
@@ -143,10 +141,12 @@ support-files =
     pointerevent_touch-action-span-test_touch-manual.html
     pointerevent_touch-action-svg-test_touch-manual.html
     pointerevent_touch-action-table-test_touch-manual.html
 [test_bug1285128.html]
 [test_bug1293174_implicit_pointer_capture_for_touch_1.html]
   support-files = bug1293174_implicit_pointer_capture_for_touch_1.html
 [test_bug1293174_implicit_pointer_capture_for_touch_2.html]
   support-files = bug1293174_implicit_pointer_capture_for_touch_2.html
+[test_bug1303704.html]
 [test_empty_file.html]
   disabled = disabled # Bug 1150091 - Issue with support-files
+[test_bug1315862.html]
new file mode 100644
--- /dev/null
+++ b/dom/events/test/pointerevents/test_bug1303704.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1303704
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 1303704</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>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1303704">Mozilla Bug 1303704</a>
+<p id="display"></p>
+<a id="link1" href="http://www.google.com">Link 1</a>
+<script type="text/javascript">
+
+/** Test for Bug 1303704 **/
+SimpleTest.waitForExplicitFinish();
+
+function runTests() {
+  let link1 = window.document.getElementById("link1");
+  let mouseEvents = ["mousedown", "mouseup", "mousemove"];
+
+  link1.addEventListener("pointerdown", (e) => {
+    e.preventDefault();
+    is(e.defaultPrevented, true, "defaultPrevented should be true");
+  }, false);
+
+  mouseEvents.forEach((elm, index, arr) => {
+    link1.addEventListener(elm, () => {
+      ok(false, "Should not receive " + elm + " after preventDefault on pointerdown");
+    }, false);
+  });
+
+  link1.addEventListener("click", (e) => {
+    e.preventDefault();
+    SimpleTest.finish();
+  }, false);
+
+  synthesizeMouseAtCenter(link1, { type: "mousedown",
+                                   inputSource: SpecialPowers.Ci.nsIDOMMouseEvent.MOZ_SOURCE_MOUSE });
+  synthesizeMouseAtCenter(link1, { type: "mousemove",
+                                   inputSource: SpecialPowers.Ci.nsIDOMMouseEvent.MOZ_SOURCE_MOUSE });
+  synthesizeMouseAtCenter(link1, { type: "mouseup",
+                                   inputSource: SpecialPowers.Ci.nsIDOMMouseEvent.MOZ_SOURCE_MOUSE });
+}
+
+SpecialPowers.pushPrefEnv({"set": [["dom.w3c_pointer_events.enabled", true]]}, runTests);
+
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/dom/events/test/pointerevents/test_bug1315862.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1315862
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 1315862</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="content">
+  This is a test to check if pointer events are dispatched in the system group
+</p>
+<script type="text/javascript">
+
+/** Test for Bug 1315862 **/
+SimpleTest.waitForExplicitFinish();
+
+function runTests() {
+  let allPointerEvents = ["pointerdown", "pointerup", "pointercancel",
+                          "pointermove", "pointerover", "pointerout",
+                          "pointerenter", "pointerleave", "gotpointercapture",
+                          "lostpointercapture"
+                         ];
+  let content = document.getElementById('content');
+  let iframe = document.createElement('iframe');
+  let receivePointerEvents = false;
+  iframe.width = 50;
+  iframe.height = 50;
+  content.appendChild(iframe);
+  iframe.contentDocument.body.innerHTML =
+    "<div style='width: 100%; height: 100%; border: 1px solid black;'></div>";
+
+  let target = iframe.contentDocument.body.firstChild;
+  allPointerEvents.forEach((event, idx, arr) => {
+    SpecialPowers.addSystemEventListener(target, event, () => {
+      ok(false, "Shouldn't dispatch " + event + " in the system group");
+      receivePointerEvents = true;
+    });
+  });
+  target.addEventListener("pointerdown", (e) => {
+    target.setPointerCapture(e.pointerId);
+  }, false);
+  target.addEventListener("pointerup", () => {
+    is(receivePointerEvents, false, "Shouldn't dispatch pointer events in the system group");
+    SimpleTest.finish();
+  }, false);
+  let source = SpecialPowers.Ci.nsIDOMMouseEvent.MOZ_SOURCE_MOUSE;
+  synthesizeMouse(target, 5, 5, { type: "mousemove", inputSource: source },
+                  iframe.contentWindow);
+  synthesizeMouse(target, 5, 5, { type: "mousedown", inputSource: source },
+                  iframe.contentWindow);
+  synthesizeMouse(target, 5, 5, { type: "mousemove", inputSource: source },
+                  iframe.contentWindow);
+  synthesizeMouse(target, 5, 5, { type: "mouseup", inputSource: source },
+                  iframe.contentWindow);
+}
+
+SpecialPowers.pushPrefEnv({"set": [["dom.w3c_pointer_events.enabled", true]]}, runTests);
+
+</script>
+</body>
+</html>
--- a/dom/media/PeerConnection.js
+++ b/dom/media/PeerConnection.js
@@ -1037,21 +1037,16 @@ RTCPeerConnection.prototype = {
       }));
     });
   },
 
   addStream: function(stream) {
     stream.getTracks().forEach(track => this.addTrack(track, stream));
   },
 
-  getStreamById: function(id) {
-    throw new this._win.DOMException("getStreamById not yet implemented",
-                                     "NotSupportedError");
-  },
-
   addTrack: function(track, stream) {
     if (stream.currentTime === undefined) {
       throw new this._win.DOMException("invalid stream.", "InvalidParameterError");
     }
     this._checkClosed();
     this._senders.forEach(sender => {
       if (sender.track == track) {
         throw new this._win.DOMException("already added.",
--- a/dom/media/eme/mediadrm/MediaDrmCDMProxy.cpp
+++ b/dom/media/eme/mediadrm/MediaDrmCDMProxy.cpp
@@ -367,16 +367,23 @@ MediaDrmCDMProxy::GetSessionIdsForKeyId(
 #ifdef DEBUG
 bool
 MediaDrmCDMProxy::IsOnOwnerThread()
 {
   return NS_GetCurrentThread() == mOwnerThread;
 }
 #endif
 
+const nsString&
+MediaDrmCDMProxy::GetMediaDrmStubId() const
+{
+  MOZ_ASSERT(mCDM);
+  return mCDM->GetMediaDrmStubId();
+}
+
 void
 MediaDrmCDMProxy::OnCDMCreated(uint32_t aPromiseId)
 {
   MOZ_ASSERT(NS_IsMainThread());
   if (mKeys.IsNull()) {
     return;
   }
 
@@ -459,9 +466,9 @@ MediaDrmCDMProxy::md_Shutdown()
   if (mShutdownCalled) {
     return;
   }
   mShutdownCalled = true;
   mCDM->Shutdown();
   mCDM = nullptr;
 }
 
-} // namespace mozilla
\ No newline at end of file
+} // namespace mozilla
--- a/dom/media/eme/mediadrm/MediaDrmCDMProxy.h
+++ b/dom/media/eme/mediadrm/MediaDrmCDMProxy.h
@@ -5,17 +5,16 @@
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef MediaDrmCDMProxy_h_
 #define MediaDrmCDMProxy_h_
 
 #include <jni.h>
 #include "mozilla/jni/Types.h"
 #include "GeneratedJNINatives.h"
-
 #include "mozilla/CDMProxy.h"
 #include "mozilla/CDMCaps.h"
 #include "mozilla/dom/MediaKeys.h"
 #include "mozilla/MediaDrmProxySupport.h"
 #include "mozilla/UniquePtr.h"
 
 #include "MediaCodec.h"
 #include "nsString.h"
@@ -113,16 +112,18 @@ public:
 
   void GetSessionIdsForKeyId(const nsTArray<uint8_t>& aKeyId,
                              nsTArray<nsCString>& aSessionIds) override;
 
 #ifdef DEBUG
   bool IsOnOwnerThread() override;
 #endif
 
+  const nsString& GetMediaDrmStubId() const;
+
 private:
   virtual ~MediaDrmCDMProxy();
 
   void OnCDMCreated(uint32_t aPromiseId);
 
   struct CreateSessionData {
     MediaKeySessionType mSessionType;
     uint32_t mCreateSessionToken;
@@ -176,9 +177,9 @@ private:
   void md_CreateSession(nsAutoPtr<CreateSessionData> aData);
   void md_UpdateSession(nsAutoPtr<UpdateSessionData> aData);
   void md_CloseSession(nsAutoPtr<SessionOpData> aData);
   void md_Shutdown();
 // =====================================================================
 };
 
 } // namespace mozilla
-#endif // MediaDrmCDMProxy_h_
\ No newline at end of file
+#endif // MediaDrmCDMProxy_h_
--- a/dom/media/eme/mediadrm/MediaDrmProxySupport.cpp
+++ b/dom/media/eme/mediadrm/MediaDrmProxySupport.cpp
@@ -199,16 +199,19 @@ MediaDrmProxySupport::MediaDrmProxySuppo
   : mKeySystem(aKeySystem), mDestroyed(false)
 {
   mJavaCallbacks = MediaDrmProxy::NativeMediaDrmProxyCallbacks::New();
 
   mBridgeProxy =
     MediaDrmProxy::Create(mKeySystem,
                           mJavaCallbacks,
                           MediaPrefs::PDMAndroidRemoteCodecEnabled());
+
+  MOZ_ASSERT(mBridgeProxy, "mBridgeProxy should not be null");
+  mMediaDrmStubId = mBridgeProxy->GetStubId()->ToString();
 }
 
 MediaDrmProxySupport::~MediaDrmProxySupport()
 {
   MOZ_ASSERT(mDestroyed, "Shutdown() should be called before !!");
   MediaDrmJavaCallbacksSupport::DisposeNative(mJavaCallbacks);
 }
 
@@ -276,9 +279,9 @@ MediaDrmProxySupport::Shutdown()
 
   if (mDestroyed) {
     return;
   }
   mBridgeProxy->Destroy();
   mDestroyed = true;
 }
 
-} // namespace mozilla
\ No newline at end of file
+} // namespace mozilla
--- a/dom/media/eme/mediadrm/MediaDrmProxySupport.h
+++ b/dom/media/eme/mediadrm/MediaDrmProxySupport.h
@@ -49,19 +49,21 @@ public:
                      const nsCString& aSessionId,
                      const nsTArray<uint8_t>& aResponse);
 
   void CloseSession(uint32_t aPromiseId,
                     const nsCString& aSessionId);
 
   void Shutdown();
 
+  const nsString& GetMediaDrmStubId() const { return mMediaDrmStubId; }
+
 private:
   const nsString mKeySystem;
   java::MediaDrmProxy::GlobalRef mBridgeProxy;
   java::MediaDrmProxy::NativeMediaDrmProxyCallbacks::GlobalRef mJavaCallbacks;
   DecryptorProxyCallback* mCallback;
   bool mDestroyed;
-
+  nsString mMediaDrmStubId;
 };
 
 } // namespace mozilla
-#endif // MediaDrmProxySupport_H
\ No newline at end of file
+#endif // MediaDrmProxySupport_H
--- a/dom/media/gtest/TestAudioPacketizer.cpp
+++ b/dom/media/gtest/TestAudioPacketizer.cpp
@@ -1,15 +1,16 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include <stdint.h>
 #include <math.h>
+#include <memory>
 #include "../AudioPacketizer.h"
 #include "gtest/gtest.h"
 
 using namespace mozilla;
 
 template<typename T>
 class AutoBuffer
 {
@@ -32,26 +33,26 @@ int16_t Sequence(int16_t* aBuffer, uint3
 {
   uint32_t i;
   for (i = 0; i < aSize; i++) {
     aBuffer[i] = aStart + i;
   }
   return aStart + i;
 }
 
-void IsSequence(int16_t* aBuffer, uint32_t aSize, uint32_t aStart = 0)
+void IsSequence(std::unique_ptr<int16_t[]> aBuffer, uint32_t aSize, uint32_t aStart = 0)
 {
   for (uint32_t i = 0; i < aSize; i++) {
     ASSERT_TRUE(aBuffer[i] == static_cast<int64_t>(aStart + i)) <<
       "Buffer is not a sequence at offset " << i << std::endl;
   }
   // Buffer is a sequence.
 }
 
-void Zero(int16_t* aBuffer, uint32_t aSize)
+void Zero(std::unique_ptr<int16_t[]> aBuffer, uint32_t aSize)
 {
   for (uint32_t i = 0; i < aSize; i++) {
     ASSERT_TRUE(aBuffer[i] == 0) <<
       "Buffer is not null at offset " << i << std::endl;
   }
 }
 
 double sine(uint32_t aPhase) {
@@ -60,79 +61,73 @@ double sine(uint32_t aPhase) {
 
 TEST(AudioPacketizer, Test)
 {
   for (int16_t channels = 1; channels < 2; channels++) {
     // Test that the packetizer returns zero on underrun
     {
       AudioPacketizer<int16_t, int16_t> ap(441, channels);
       for (int16_t i = 0; i < 10; i++) {
-        int16_t* out = ap.Output();
-        Zero(out, 441);
-        delete[] out;
+        std::unique_ptr<int16_t[]> out(ap.Output());
+        Zero(std::move(out), 441);
       }
     }
     // Simple test, with input/output buffer size aligned on the packet size,
     // alternating Input and Output calls.
     {
       AudioPacketizer<int16_t, int16_t> ap(441, channels);
       int16_t seqEnd = 0;
       for (int16_t i = 0; i < 10; i++) {
         AutoBuffer<int16_t> b(441 * channels);
         int16_t prevEnd = seqEnd;
         seqEnd = Sequence(b.Get(), channels * 441, prevEnd);
         ap.Input(b.Get(), 441);
-        int16_t* out = ap.Output();
-        IsSequence(out, 441 * channels, prevEnd);
-        delete[] out;
+        std::unique_ptr<int16_t[]> out(ap.Output());
+        IsSequence(std::move(out), 441 * channels, prevEnd);
       }
     }
     // Simple test, with input/output buffer size aligned on the packet size,
     // alternating two Input and Output calls.
     {
       AudioPacketizer<int16_t, int16_t> ap(441, channels);
       int16_t seqEnd = 0;
       for (int16_t i = 0; i < 10; i++) {
         AutoBuffer<int16_t> b(441 * channels);
         AutoBuffer<int16_t> b1(441 * channels);
         int16_t prevEnd0 = seqEnd;
         seqEnd = Sequence(b.Get(), 441 * channels, prevEnd0);
         int16_t prevEnd1 = seqEnd;
         seqEnd = Sequence(b1.Get(), 441 * channels, seqEnd);
         ap.Input(b.Get(), 441);
         ap.Input(b1.Get(), 441);
-        int16_t* out = ap.Output();
-        int16_t* out2 = ap.Output();
-        IsSequence(out, 441 * channels, prevEnd0);
-        IsSequence(out2, 441 * channels, prevEnd1);
-        delete[] out;
-        delete[] out2;
+        std::unique_ptr<int16_t[]> out(ap.Output());
+        std::unique_ptr<int16_t[]> out2(ap.Output());
+        IsSequence(std::move(out), 441 * channels, prevEnd0);
+        IsSequence(std::move(out2), 441 * channels, prevEnd1);
       }
     }
     // Input/output buffer size not aligned on the packet size,
     // alternating two Input and Output calls.
     {
       AudioPacketizer<int16_t, int16_t> ap(441, channels);
       int16_t prevEnd = 0;
       int16_t prevSeq = 0;
       for (int16_t i = 0; i < 10; i++) {
         AutoBuffer<int16_t> b(480 * channels);
         AutoBuffer<int16_t> b1(480 * channels);
         prevSeq = Sequence(b.Get(), 480 * channels, prevSeq);
         prevSeq = Sequence(b1.Get(), 480 * channels, prevSeq);
         ap.Input(b.Get(), 480);
         ap.Input(b1.Get(), 480);
-        int16_t* out = ap.Output();
-        int16_t* out2 = ap.Output();
-        IsSequence(out, 441 * channels, prevEnd);
+        std::unique_ptr<int16_t[]> out(ap.Output());
+        std::unique_ptr<int16_t[]> out2(ap.Output());
+        IsSequence(std::move(out), 441 * channels, prevEnd);
         prevEnd += 441 * channels;
-        IsSequence(out2, 441 * channels, prevEnd);
+        IsSequence(std::move(out2), 441 * channels, prevEnd);
         prevEnd += 441 * channels;
-        delete[] out;
-        delete[] out2;
       }
       printf("Available: %d\n", ap.PacketsAvailable());
     }
 
     // "Real-life" test case: streaming a sine wave through a packetizer, and
     // checking that we have the right output.
     // 128 is, for example, the size of a Web Audio API block, and 441 is the
     // size of a webrtc.org packet when the sample rate is 44100 (10ms)
@@ -146,22 +141,21 @@ TEST(AudioPacketizer, Test)
           for (int32_t c = 0; c < channels; c++) {
             // int16_t sinewave at 440Hz/44100Hz sample rate
             b.Get()[j * channels + c] = (2 << 14) * sine(phase);
           }
           phase++;
         }
         ap.Input(b.Get(), 128);
         while (ap.PacketsAvailable()) {
-          int16_t* packet = ap.Output();
+          std::unique_ptr<int16_t[]> packet(ap.Output());
           for (uint32_t k = 0; k < ap.PacketSize(); k++) {
             for (int32_t c = 0; c < channels; c++) {
               ASSERT_TRUE(packet[k * channels + c] ==
                           static_cast<int16_t>(((2 << 14) * sine(outPhase))));
             }
             outPhase++;
           }
-          delete [] packet;
         }
       }
     }
   }
 }
--- a/dom/media/platforms/PDMFactory.cpp
+++ b/dom/media/platforms/PDMFactory.cpp
@@ -464,13 +464,21 @@ PDMFactory::GetDecoder(const TrackInfo& 
     }
   }
   return pdm.forget();
 }
 
 void
 PDMFactory::SetCDMProxy(CDMProxy* aProxy)
 {
+  MOZ_ASSERT(aProxy);
+
+#ifdef MOZ_WIDGET_ANDROID
+  if (IsWidevineKeySystem(aProxy->KeySystem())) {
+    mEMEPDM = new AndroidDecoderModule(aProxy);
+    return;
+  }
+#endif
   RefPtr<PDMFactory> m = new PDMFactory();
   mEMEPDM = new EMEDecoderModule(aProxy, m);
 }
 
 }  // namespace mozilla
--- a/dom/media/platforms/android/AndroidDecoderModule.cpp
+++ b/dom/media/platforms/android/AndroidDecoderModule.cpp
@@ -114,16 +114,21 @@ GetCryptoInfoFromSample(const MediaRawDa
                   numBytesOfEncryptedData,
                   keyId,
                   iv,
                   MediaCodec::CRYPTO_MODE_AES_CTR);
 
   return cryptoInfo;
 }
 
+AndroidDecoderModule::AndroidDecoderModule(CDMProxy* aProxy)
+{
+  mProxy = static_cast<MediaDrmCDMProxy*>(aProxy);
+}
+
 bool
 AndroidDecoderModule::SupportsMimeType(const nsACString& aMimeType,
                                        DecoderDoctorDiagnostics* aDiagnostics) const
 {
   if (!AndroidBridge::Bridge() ||
       AndroidBridge::Bridge()->GetAPIVersion() < 16) {
     return false;
   }
@@ -169,26 +174,34 @@ AndroidDecoderModule::CreateVideoDecoder
 
   const VideoInfo& config = aParams.VideoConfig();
   NS_ENSURE_SUCCESS(MediaFormat::CreateVideoFormat(
       TranslateMimeType(config.mMimeType),
       config.mDisplay.width,
       config.mDisplay.height,
       &format), nullptr);
 
+  nsString drmStubId;
+  if (mProxy) {
+    drmStubId = mProxy->GetMediaDrmStubId();
+  }
+
   RefPtr<MediaDataDecoder> decoder = MediaPrefs::PDMAndroidRemoteCodecEnabled() ?
-      RemoteDataDecoder::CreateVideoDecoder(config,
-                                            format,
-                                            aParams.mCallback,
-                                            aParams.mImageContainer) :
-      MediaCodecDataDecoder::CreateVideoDecoder(config,
-                                                format,
-                                                aParams.mCallback,
-                                                aParams.mImageContainer);
-
+    RemoteDataDecoder::CreateVideoDecoder(config,
+                                          format,
+                                          aParams.mCallback,
+                                          aParams.mImageContainer,
+                                          drmStubId) :
+    MediaCodecDataDecoder::CreateVideoDecoder(config,
+                                              format,
+                                              aParams.mCallback,
+                                              aParams.mImageContainer,
+                                              drmStubId,
+                                              mProxy,
+                                              aParams.mTaskQueue);
   return decoder.forget();
 }
 
 already_AddRefed<MediaDataDecoder>
 AndroidDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
 {
   const AudioInfo& config = aParams.AudioConfig();
   MOZ_ASSERT(config.mBitDepth == 16, "We only handle 16-bit audio!");
@@ -199,20 +212,28 @@ AndroidDecoderModule::CreateAudioDecoder
       config.mMimeType.Data(), config.mRate, config.mChannels);
 
   NS_ENSURE_SUCCESS(MediaFormat::CreateAudioFormat(
       config.mMimeType,
       config.mRate,
       config.mChannels,
       &format), nullptr);
 
+  nsString drmStubId;
+  if (mProxy) {
+    drmStubId = mProxy->GetMediaDrmStubId();
+  }
   RefPtr<MediaDataDecoder> decoder = MediaPrefs::PDMAndroidRemoteCodecEnabled() ?
-      RemoteDataDecoder::CreateAudioDecoder(config, format, aParams.mCallback) :
-      MediaCodecDataDecoder::CreateAudioDecoder(config, format, aParams.mCallback);
-
+      RemoteDataDecoder::CreateAudioDecoder(config, format, aParams.mCallback, drmStubId) :
+      MediaCodecDataDecoder::CreateAudioDecoder(config,
+                                                format,
+                                                aParams.mCallback,
+                                                drmStubId,
+                                                mProxy,
+                                                aParams.mTaskQueue);
   return decoder.forget();
 }
 
 PlatformDecoderModule::ConversionRequired
 AndroidDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
 {
   if (aConfig.IsVideo()) {
     return ConversionRequired::kNeedAnnexB;
--- a/dom/media/platforms/android/AndroidDecoderModule.h
+++ b/dom/media/platforms/android/AndroidDecoderModule.h
@@ -1,34 +1,38 @@
 /* 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/. */
 
 #ifndef AndroidDecoderModule_h_
 #define AndroidDecoderModule_h_
 
 #include "PlatformDecoderModule.h"
+#include "mozilla/MediaDrmCDMProxy.h"
 
 namespace mozilla {
 
 class AndroidDecoderModule : public PlatformDecoderModule {
 public:
   already_AddRefed<MediaDataDecoder>
   CreateVideoDecoder(const CreateDecoderParams& aParams) override;
 
   already_AddRefed<MediaDataDecoder>
   CreateAudioDecoder(const CreateDecoderParams& aParams) override;
 
-  AndroidDecoderModule() {}
+  AndroidDecoderModule(CDMProxy* aProxy = nullptr);
   virtual ~AndroidDecoderModule() {}
 
   bool SupportsMimeType(const nsACString& aMimeType,
                         DecoderDoctorDiagnostics* aDiagnostics) const override;
 
   ConversionRequired
   DecoderNeedsConversion(const TrackInfo& aConfig) const override;
+
+private:
+  RefPtr<MediaDrmCDMProxy> mProxy;
 };
 
 extern LazyLogModule sAndroidDecoderModuleLog;
 
 } // namespace mozilla
 
 #endif
--- a/dom/media/platforms/android/MediaCodecDataDecoder.cpp
+++ b/dom/media/platforms/android/MediaCodecDataDecoder.cpp
@@ -51,19 +51,20 @@ CreateDecoder(const nsACString& aMimeTyp
 }
 
 class VideoDataDecoder : public MediaCodecDataDecoder
 {
 public:
   VideoDataDecoder(const VideoInfo& aConfig,
                    MediaFormat::Param aFormat,
                    MediaDataDecoderCallback* aCallback,
-                   layers::ImageContainer* aImageContainer)
+                   layers::ImageContainer* aImageContainer,
+                   const nsString& aDrmStubId)
     : MediaCodecDataDecoder(MediaData::Type::VIDEO_DATA, aConfig.mMimeType,
-                            aFormat, aCallback)
+                            aFormat, aCallback, aDrmStubId)
     , mImageContainer(aImageContainer)
     , mConfig(aConfig)
   {
 
   }
 
   const char* GetDescriptionName() const override
   {
@@ -76,17 +77,16 @@ public:
     if (!mSurfaceTexture) {
       NS_WARNING("Failed to create SurfaceTexture for video decode\n");
       return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
     }
 
     if (NS_FAILED(InitDecoder(mSurfaceTexture->JavaSurface()))) {
       return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
     }
-
     return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
   }
 
   void Cleanup() override
   {
   }
 
   nsresult PostOutput(BufferInfo::Param aInfo, MediaFormat::Param aFormat,
@@ -122,25 +122,69 @@ public:
     INVOKE_CALLBACK(Output, v);
     return NS_OK;
   }
 
 protected:
   layers::ImageContainer* mImageContainer;
   const VideoInfo& mConfig;
   RefPtr<AndroidSurfaceTexture> mSurfaceTexture;
+  RefPtr<SamplesWaitingForKey> mSamplesWaitingForKey;
 };
 
+
+
+class EMEVideoDataDecoder : public VideoDataDecoder {
+public:
+  EMEVideoDataDecoder(const VideoInfo& aConfig,
+                      MediaFormat::Param aFormat,
+                      MediaDataDecoderCallback* aCallback,
+                      layers::ImageContainer* aImageContainer,
+                      const nsString& aDrmStubId,
+                      CDMProxy* aProxy,
+                      TaskQueue* aTaskQueue)
+   : VideoDataDecoder(aConfig, aFormat, aCallback, aImageContainer, aDrmStubId)
+   , mSamplesWaitingForKey(new SamplesWaitingForKey(this, aCallback,
+                                                    aTaskQueue, aProxy))
+  {
+  }
+
+  void Input(MediaRawData* aSample) override;
+  void Shutdown() override;
+
+private:
+  RefPtr<SamplesWaitingForKey> mSamplesWaitingForKey;
+};
+
+void
+EMEVideoDataDecoder::Input(MediaRawData* aSample)
+{
+  if (mSamplesWaitingForKey->WaitIfKeyNotUsable(aSample)) {
+    return;
+  }
+  VideoDataDecoder::Input(aSample);
+}
+
+void
+EMEVideoDataDecoder::Shutdown()
+{
+  VideoDataDecoder::Shutdown();
+
+  mSamplesWaitingForKey->BreakCycles();
+  mSamplesWaitingForKey = nullptr;
+}
+
 class AudioDataDecoder : public MediaCodecDataDecoder
 {
 public:
   AudioDataDecoder(const AudioInfo& aConfig, MediaFormat::Param aFormat,
-                   MediaDataDecoderCallback* aCallback)
+                   MediaDataDecoderCallback* aCallback,
+                   const nsString& aDrmStubId)
     : MediaCodecDataDecoder(MediaData::Type::AUDIO_DATA, aConfig.mMimeType,
-                            aFormat, aCallback)
+                            aFormat, aCallback, aDrmStubId)
   {
     JNIEnv* const env = jni::GetEnvForThread();
 
     jni::ByteBuffer::LocalRef buffer(env);
     NS_ENSURE_SUCCESS_VOID(aFormat->GetByteBuffer(NS_LITERAL_STRING("csd-0"),
                                                   &buffer));
 
     if (!buffer && aConfig.mCodecSpecificConfig->Length() >= 2) {
@@ -205,47 +249,109 @@ public:
                                            Move(audio),
                                            numChannels,
                                            sampleRate);
     INVOKE_CALLBACK(Output, data);
     return NS_OK;
   }
 };
 
+class EMEAudioDataDecoder : public AudioDataDecoder {
+public:
+  EMEAudioDataDecoder(const AudioInfo& aConfig, MediaFormat::Param aFormat,
+                      MediaDataDecoderCallback* aCallback, const nsString& aDrmStubId,
+                      CDMProxy* aProxy, TaskQueue* aTaskQueue)
+   : AudioDataDecoder(aConfig, aFormat, aCallback, aDrmStubId)
+   , mSamplesWaitingForKey(new SamplesWaitingForKey(this, aCallback,
+                                                    aTaskQueue, aProxy))
+  {
+  }
+
+  void Input(MediaRawData* aSample) override;
+  void Shutdown() override;
+
+private:
+  RefPtr<SamplesWaitingForKey> mSamplesWaitingForKey;
+};
+
+void
+EMEAudioDataDecoder::Input(MediaRawData* aSample)
+{
+  if (mSamplesWaitingForKey->WaitIfKeyNotUsable(aSample)) {
+    return;
+  }
+  AudioDataDecoder::Input(aSample);
+}
+
+void
+EMEAudioDataDecoder::Shutdown()
+{
+  AudioDataDecoder::Shutdown();
+
+  mSamplesWaitingForKey->BreakCycles();
+  mSamplesWaitingForKey = nullptr;
+}
+
 MediaDataDecoder*
 MediaCodecDataDecoder::CreateAudioDecoder(const AudioInfo& aConfig,
-                                          MediaFormat::Param aFormat,
-                                          MediaDataDecoderCallback* aCallback)
+                                          java::sdk::MediaFormat::Param aFormat,
+                                          MediaDataDecoderCallback* aCallback,
+                                          const nsString& aDrmStubId,
+                                          CDMProxy* aProxy,
+                                          TaskQueue* aTaskQueue)
 {
-  return new AudioDataDecoder(aConfig, aFormat, aCallback);
+  if (!aProxy) {
+    return new AudioDataDecoder(aConfig, aFormat, aCallback, aDrmStubId);
+  } else {
+    return new EMEAudioDataDecoder(aConfig,
+                                   aFormat,
+                                   aCallback,
+                                   aDrmStubId,
+                                   aProxy,
+                                   aTaskQueue);
+  }
 }
 
 MediaDataDecoder*
 MediaCodecDataDecoder::CreateVideoDecoder(const VideoInfo& aConfig,
-                                          MediaFormat::Param aFormat,
+                                          java::sdk::MediaFormat::Param aFormat,
                                           MediaDataDecoderCallback* aCallback,
-                                          layers::ImageContainer* aImageContainer)
+                                          layers::ImageContainer* aImageContainer,
+                                          const nsString& aDrmStubId,
+                                          CDMProxy* aProxy,
+                                          TaskQueue* aTaskQueue)
 {
-  return new VideoDataDecoder(aConfig, aFormat, aCallback, aImageContainer);
+  if (!aProxy) {
+    return new VideoDataDecoder(aConfig, aFormat, aCallback, aImageContainer, aDrmStubId);
+  } else {
+    return new EMEVideoDataDecoder(aConfig,
+                                   aFormat,
+                                   aCallback,
+                                   aImageContainer,
+                                   aDrmStubId,
+                                   aProxy,
+                                   aTaskQueue);
+  }
 }
 
 MediaCodecDataDecoder::MediaCodecDataDecoder(MediaData::Type aType,
                                              const nsACString& aMimeType,
                                              MediaFormat::Param aFormat,
-                                             MediaDataDecoderCallback* aCallback)
+                                             MediaDataDecoderCallback* aCallback,
+                                             const nsString& aDrmStubId)
   : mType(aType)
   , mMimeType(aMimeType)
   , mFormat(aFormat)
   , mCallback(aCallback)
   , mInputBuffers(nullptr)
   , mOutputBuffers(nullptr)
   , mMonitor("MediaCodecDataDecoder::mMonitor")
   , mState(ModuleState::kDecoding)
+  , mDrmStubId(aDrmStubId)
 {
-
 }
 
 MediaCodecDataDecoder::~MediaCodecDataDecoder()
 {
   Shutdown();
 }
 
 RefPtr<MediaDataDecoder::InitPromise>
@@ -268,18 +374,21 @@ MediaCodecDataDecoder::InitDecoder(Surfa
 {
   mDecoder = CreateDecoder(mMimeType);
   if (!mDecoder) {
     INVOKE_CALLBACK(Error,
                     MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__));
     return NS_ERROR_FAILURE;
   }
 
+  MediaCrypto::LocalRef crypto = MediaDrmProxy::GetMediaCrypto(mDrmStubId);
+  bool hascrypto = !!crypto;
+  LOG("Has(%d) MediaCrypto (%s)", hascrypto, NS_ConvertUTF16toUTF8(mDrmStubId).get());
   nsresult rv;
-  NS_ENSURE_SUCCESS(rv = mDecoder->Configure(mFormat, aSurface, nullptr, 0), rv);
+  NS_ENSURE_SUCCESS(rv = mDecoder->Configure(mFormat, aSurface, crypto, 0), rv);
   NS_ENSURE_SUCCESS(rv = mDecoder->Start(), rv);
 
   NS_ENSURE_SUCCESS(rv = ResetInputBuffers(), rv);
   NS_ENSURE_SUCCESS(rv = ResetOutputBuffers(), rv);
 
   nsCOMPtr<nsIRunnable> r = NewRunnableMethod(this, &MediaCodecDataDecoder::DecoderLoop);
   rv = NS_NewNamedThread("MC Decoder", getter_AddRefs(mThread), r);
 
--- a/dom/media/platforms/android/MediaCodecDataDecoder.h
+++ b/dom/media/platforms/android/MediaCodecDataDecoder.h
@@ -18,22 +18,28 @@
 namespace mozilla {
 
 typedef std::deque<RefPtr<MediaRawData>> SampleQueue;
 
 class MediaCodecDataDecoder : public MediaDataDecoder {
 public:
   static MediaDataDecoder* CreateAudioDecoder(const AudioInfo& aConfig,
                                               java::sdk::MediaFormat::Param aFormat,
-                                              MediaDataDecoderCallback* aCallback);
+                                              MediaDataDecoderCallback* aCallback,
+                                              const nsString& aDrmStubId,
+                                              CDMProxy* aProxy,
+                                              TaskQueue* aTaskQueue);
 
   static MediaDataDecoder* CreateVideoDecoder(const VideoInfo& aConfig,
                                               java::sdk::MediaFormat::Param aFormat,
                                               MediaDataDecoderCallback* aCallback,
-                                              layers::ImageContainer* aImageContainer);
+                                              layers::ImageContainer* aImageContainer,
+                                              const nsString& aDrmStubId,
+                                              CDMProxy* aProxy,
+                                              TaskQueue* aTaskQueue);
 
   virtual ~MediaCodecDataDecoder();
 
   RefPtr<MediaDataDecoder::InitPromise> Init() override;
   void Flush() override;
   void Drain() override;
   void Shutdown() override;
   void Input(MediaRawData* aSample) override;
@@ -53,17 +59,18 @@ protected:
     kShutdown
   };
 
   friend class AndroidDecoderModule;
 
   MediaCodecDataDecoder(MediaData::Type aType,
                         const nsACString& aMimeType,
                         java::sdk::MediaFormat::Param aFormat,
-                        MediaDataDecoderCallback* aCallback);
+                        MediaDataDecoderCallback* aCallback,
+                        const nsString& aDrmStubId);
 
   static const char* ModuleStateStr(ModuleState aState);
 
   virtual nsresult InitDecoder(java::sdk::Surface::Param aSurface);
 
   virtual nsresult Output(java::sdk::BufferInfo::Param aInfo, void* aBuffer,
       java::sdk::MediaFormat::Param aFormat, const media::TimeUnit& aDuration)
   {
@@ -114,13 +121,15 @@ protected:
   // Only these members are protected by mMonitor.
   Monitor mMonitor;
 
   ModuleState mState;
 
   SampleQueue mQueue;
   // Durations are stored in microseconds.
   std::deque<media::TimeUnit> mDurations;
+
+  nsString mDrmStubId;
 };
 
 } // namespace mozilla
 
 #endif
--- a/dom/media/platforms/android/RemoteDataDecoder.cpp
+++ b/dom/media/platforms/android/RemoteDataDecoder.cpp
@@ -180,19 +180,20 @@ public:
 
   private:
     RemoteVideoDecoder* mDecoder;
   };
 
   RemoteVideoDecoder(const VideoInfo& aConfig,
                    MediaFormat::Param aFormat,
                    MediaDataDecoderCallback* aCallback,
-                   layers::ImageContainer* aImageContainer)
+                   layers::ImageContainer* aImageContainer,
+                   const nsString& aDrmStubId)
     : RemoteDataDecoder(MediaData::Type::VIDEO_DATA, aConfig.mMimeType,
-                        aFormat, aCallback)
+                        aFormat, aCallback, aDrmStubId)
     , mImageContainer(aImageContainer)
     , mConfig(aConfig)
   {
   }
 
   RefPtr<InitPromise> Init() override
   {
     mSurfaceTexture = AndroidSurfaceTexture::Create();
@@ -208,17 +209,20 @@ public:
 
     // Register native methods.
     JavaCallbacksSupport::Init();
 
     mJavaCallbacks = CodecProxy::NativeCallbacks::New();
     JavaCallbacksSupport::AttachNative(mJavaCallbacks,
                                        mozilla::MakeUnique<CallbacksSupport>(this, mCallback));
 
-    mJavaDecoder = CodecProxy::Create(mFormat, mSurfaceTexture->JavaSurface(), mJavaCallbacks);
+    mJavaDecoder = CodecProxy::Create(mFormat,
+                                      mSurfaceTexture->JavaSurface(),
+                                      mJavaCallbacks,
+                                      mDrmStubId);
     if (mJavaDecoder == nullptr) {
       return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
     }
 
     mInputDurations.Clear();
 
     return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
   }
@@ -276,20 +280,21 @@ private:
   RefPtr<AndroidSurfaceTexture> mSurfaceTexture;
   DurationQueue mInputDurations;
 };
 
 class RemoteAudioDecoder final : public RemoteDataDecoder
 {
 public:
   RemoteAudioDecoder(const AudioInfo& aConfig,
-                   MediaFormat::Param aFormat,
-                   MediaDataDecoderCallback* aCallback)
+                     MediaFormat::Param aFormat,
+                     MediaDataDecoderCallback* aCallback,
+                     const nsString& aDrmStubId)
     : RemoteDataDecoder(MediaData::Type::AUDIO_DATA, aConfig.mMimeType,
-                        aFormat, aCallback)
+                        aFormat, aCallback, aDrmStubId)
     , mConfig(aConfig)
   {
     JNIEnv* const env = jni::GetEnvForThread();
 
     bool formatHasCSD = false;
     NS_ENSURE_SUCCESS_VOID(aFormat->ContainsKey(NS_LITERAL_STRING("csd-0"), &formatHasCSD));
 
     if (!formatHasCSD && aConfig.mCodecSpecificConfig->Length() >= 2) {
@@ -306,17 +311,17 @@ public:
   {
     // Register native methods.
     JavaCallbacksSupport::Init();
 
     mJavaCallbacks = CodecProxy::NativeCallbacks::New();
     JavaCallbacksSupport::AttachNative(mJavaCallbacks,
                                        mozilla::MakeUnique<CallbacksSupport>(this, mCallback));
 
-    mJavaDecoder = CodecProxy::Create(mFormat, nullptr, mJavaCallbacks);
+    mJavaDecoder = CodecProxy::Create(mFormat, nullptr, mJavaCallbacks, mDrmStubId);
     if (mJavaDecoder == nullptr) {
       return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
     }
 
     return InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__);
   }
 
 private:
@@ -405,38 +410,42 @@ private:
   };
 
   const AudioInfo& mConfig;
 };
 
 MediaDataDecoder*
 RemoteDataDecoder::CreateAudioDecoder(const AudioInfo& aConfig,
                                           MediaFormat::Param aFormat,
-                                          MediaDataDecoderCallback* aCallback)
+                                          MediaDataDecoderCallback* aCallback,
+                                          const nsString& aDrmStubId)
 {
-  return new RemoteAudioDecoder(aConfig, aFormat, aCallback);
+  return new RemoteAudioDecoder(aConfig, aFormat, aCallback, aDrmStubId);
 }
 
 MediaDataDecoder*
 RemoteDataDecoder::CreateVideoDecoder(const VideoInfo& aConfig,
                                           MediaFormat::Param aFormat,
                                           MediaDataDecoderCallback* aCallback,
-                                          layers::ImageContainer* aImageContainer)
+                                          layers::ImageContainer* aImageContainer,
+                                          const nsString& aDrmStubId)
 {
-  return new RemoteVideoDecoder(aConfig, aFormat, aCallback, aImageContainer);
+  return new RemoteVideoDecoder(aConfig, aFormat, aCallback, aImageContainer, aDrmStubId);
 }
 
 RemoteDataDecoder::RemoteDataDecoder(MediaData::Type aType,
                                      const nsACString& aMimeType,
                                      MediaFormat::Param aFormat,
-                                     MediaDataDecoderCallback* aCallback)
+                                     MediaDataDecoderCallback* aCallback,
+                                     const nsString& aDrmStubId)
   : mType(aType)
   , mMimeType(aMimeType)
   , mFormat(aFormat)
   , mCallback(aCallback)
+  , mDrmStubId(aDrmStubId)
 {
 }
 
 void
 RemoteDataDecoder::Flush()
 {
   mJavaDecoder->Flush();
 }
--- a/dom/media/platforms/android/RemoteDataDecoder.h
+++ b/dom/media/platforms/android/RemoteDataDecoder.h
@@ -17,46 +17,50 @@
 #include <deque>
 
 namespace mozilla {
 
 class RemoteDataDecoder : public MediaDataDecoder {
 public:
   static MediaDataDecoder* CreateAudioDecoder(const AudioInfo& aConfig,
                                               java::sdk::MediaFormat::Param aFormat,
-                                              MediaDataDecoderCallback* aCallback);
+                                              MediaDataDecoderCallback* aCallback,
+                                              const nsString& aDrmStubId);
 
   static MediaDataDecoder* CreateVideoDecoder(const VideoInfo& aConfig,
                                               java::sdk::MediaFormat::Param aFormat,
                                               MediaDataDecoderCallback* aCallback,
-                                              layers::ImageContainer* aImageContainer);
+                                              layers::ImageContainer* aImageContainer,
+                                              const nsString& aDrmStubId);
 
   virtual ~RemoteDataDecoder() {}
 
   void Flush() override;
   void Drain() override;
   void Shutdown() override;
   void Input(MediaRawData* aSample) override;
   const char* GetDescriptionName() const override
   {
     return "android remote decoder";
   }
 
 protected:
   RemoteDataDecoder(MediaData::Type aType,
                     const nsACString& aMimeType,
                     java::sdk::MediaFormat::Param aFormat,
-                    MediaDataDecoderCallback* aCallback);
+                    MediaDataDecoderCallback* aCallback,
+                    const nsString& aDrmStubId);
 
   MediaData::Type mType;
 
   nsAutoCString mMimeType;
   java::sdk::MediaFormat::GlobalRef mFormat;
 
   MediaDataDecoderCallback* mCallback;
 
   java::CodecProxy::GlobalRef mJavaDecoder;
   java::CodecProxy::NativeCallbacks::GlobalRef mJavaCallbacks;
+  nsString mDrmStubId;
 };
 
 } // namespace mozilla
 
 #endif
--- a/dom/media/systemservices/CamerasChild.cpp
+++ b/dom/media/systemservices/CamerasChild.cpp
@@ -217,17 +217,17 @@ public:
       mReplyLock(aCamerasChild->mReplyMonitor),
       mRequestLock(aCamerasChild->mRequestMutex),
       mSuccess(true),
       mFailureValue(aFailureValue), mSuccessValue(aSuccessValue)
   {
     Dispatch();
   }
 
-  const T& ReturnValue() const {
+  T ReturnValue() const {
     if (mSuccess) {
       return mSuccessValue;
     } else {
       return mFailureValue;
     }
   }
 
   const bool& Success() const {
--- a/dom/media/webaudio/AudioParam.h
+++ b/dom/media/webaudio/AudioParam.h
@@ -49,16 +49,17 @@ public:
                                   ErrorResult& aRv)
   {
     if (!WebAudioUtils::IsTimeValid(aStartTime)) {
       aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
       return this;
     }
     aValues.ComputeLengthAndData();
 
+    aStartTime = std::max(aStartTime, GetParentObject()->CurrentTime());
     EventInsertionHelper(aRv, AudioTimelineEvent::SetValueCurve,
                          aStartTime, 0.0f, 0.0f, aDuration, aValues.Data(),
                          aValues.Length());
     return this;
   }
 
   void SetValue(float aValue)
   {
@@ -77,67 +78,73 @@ public:
   }
 
   AudioParam* SetValueAtTime(float aValue, double aStartTime, ErrorResult& aRv)
   {
     if (!WebAudioUtils::IsTimeValid(aStartTime)) {
       aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
       return this;
     }
+    aStartTime = std::max(aStartTime, GetParentObject()->CurrentTime());
     EventInsertionHelper(aRv, AudioTimelineEvent::SetValueAtTime,
                          aStartTime, aValue);
 
     return this;
   }
 
   AudioParam* LinearRampToValueAtTime(float aValue, double aEndTime,
                                       ErrorResult& aRv)
   {
     if (!WebAudioUtils::IsTimeValid(aEndTime)) {
       aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
       return this;
     }
+    aEndTime = std::max(aEndTime, GetParentObject()->CurrentTime());
     EventInsertionHelper(aRv, AudioTimelineEvent::LinearRamp, aEndTime, aValue);
     return this;
   }
 
   AudioParam* ExponentialRampToValueAtTime(float aValue, double aEndTime,
                                            ErrorResult& aRv)
   {
     if (!WebAudioUtils::IsTimeValid(aEndTime)) {
       aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
       return this;
     }
+    aEndTime = std::max(aEndTime, GetParentObject()->CurrentTime());
     EventInsertionHelper(aRv, AudioTimelineEvent::ExponentialRamp,
                          aEndTime, aValue);
     return this;
   }
 
   AudioParam* SetTargetAtTime(float aTarget, double aStartTime,
                               double aTimeConstant, ErrorResult& aRv)
   {
     if (!WebAudioUtils::IsTimeValid(aStartTime) ||
         !WebAudioUtils::IsTimeValid(aTimeConstant)) {
       aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
       return this;
     }
+    aStartTime = std::max(aStartTime, GetParentObject()->CurrentTime());
     EventInsertionHelper(aRv, AudioTimelineEvent::SetTarget,
                          aStartTime, aTarget,
                          aTimeConstant);
 
     return this;
   }
 
   AudioParam* CancelScheduledValues(double aStartTime, ErrorResult& aRv)
   {
     if (!WebAudioUtils::IsTimeValid(aStartTime)) {
       aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
       return this;
     }
 
+    aStartTime = std::max(aStartTime, GetParentObject()->CurrentTime());
+
     // Remove some events on the main thread copy.
     AudioEventTimeline::CancelScheduledValues(aStartTime);
 
     AudioTimelineEvent event(AudioTimelineEvent::Cancel, aStartTime, 0.0f);
 
     SendEventToEngine(event);
 
     return this;
--- a/dom/webidl/RTCPeerConnection.webidl
+++ b/dom/webidl/RTCPeerConnection.webidl
@@ -115,18 +115,16 @@ interface RTCPeerConnection : EventTarge
   [ChromeOnly]
   attribute DOMString id;
 
   RTCConfiguration      getConfiguration ();
   [UnsafeInPrerendering, Deprecated="RTCPeerConnectionGetStreams"]
   sequence<MediaStream> getLocalStreams ();
   [UnsafeInPrerendering, Deprecated="RTCPeerConnectionGetStreams"]
   sequence<MediaStream> getRemoteStreams ();
-  [UnsafeInPrerendering]
-  MediaStream? getStreamById (DOMString streamId);
   void addStream (MediaStream stream);
 
   // replaces addStream; fails if already added
   // because a track can be part of multiple streams, stream parameters
   // indicate which particular streams should be referenced in signaling
 
   RTCRtpSender addTrack(MediaStreamTrack track,
                         MediaStream stream,
--- a/gfx/ipc/GPUProcessManager.cpp
+++ b/gfx/ipc/GPUProcessManager.cpp
@@ -1,16 +1,17 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 tw=99: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 #include "GPUProcessManager.h"
 #include "GPUProcessHost.h"
 #include "GPUProcessListener.h"
+#include "mozilla/Sprintf.h"
 #include "mozilla/StaticPtr.h"
 #include "mozilla/dom/ContentParent.h"
 #include "mozilla/layers/APZCTreeManager.h"
 #include "mozilla/layers/APZCTreeManagerChild.h"
 #include "mozilla/layers/CompositorBridgeParent.h"
 #include "mozilla/layers/ImageBridgeChild.h"
 #include "mozilla/layers/ImageBridgeParent.h"
 #include "mozilla/layers/InProcessCompositorSession.h"
--- a/js/src/devtools/Instruments.cpp
+++ b/js/src/devtools/Instruments.cpp
@@ -1,13 +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/. */
 
 #include "Instruments.h"
+#include "mozilla/Attributes.h"
 
 #ifdef __APPLE__
 
 #include <dlfcn.h>
 #include <CoreFoundation/CoreFoundation.h>
 #include <unistd.h>
 
 // There are now 2 paths to the DTPerformanceSession framework. We try to load
@@ -37,17 +38,17 @@ typedef bool (*DTPerformanceSessionSaveF
 namespace Instruments {
 
 static const int kSamplingInterval = 20; // microseconds
 
 template<typename T>
 class AutoReleased
 {
 public:
-  AutoReleased(T aTypeRef) : mTypeRef(aTypeRef)
+  MOZ_IMPLICIT AutoReleased(T aTypeRef) : mTypeRef(aTypeRef)
   {
   }
   ~AutoReleased()
   {
     if (mTypeRef) {
       CFRelease(mTypeRef);
     }
   }
--- a/js/src/jit/shared/Assembler-shared.h
+++ b/js/src/jit/shared/Assembler-shared.h
@@ -502,17 +502,17 @@ class CodeOffsetJump
 #ifdef JS_SMALL_BRANCH
     CodeOffsetJump(size_t offset, size_t jumpTableIndex)
         : offset_(offset), jumpTableIndex_(jumpTableIndex)
     {}
     size_t jumpTableIndex() const {
         return jumpTableIndex_;
     }
 #else
-    CodeOffsetJump(size_t offset) : offset_(offset) {}
+    explicit CodeOffsetJump(size_t offset) : offset_(offset) {}
 #endif
 
     CodeOffsetJump() {
         mozilla::PodZero(this);
     }
 
     size_t offset() const {
         return offset_;
--- a/js/src/jit/x86/Assembler-x86.cpp
+++ b/js/src/jit/x86/Assembler-x86.cpp
@@ -66,17 +66,17 @@ Assembler::executableCopy(uint8_t* buffe
 }
 
 class RelocationIterator
 {
     CompactBufferReader reader_;
     uint32_t offset_;
 
   public:
-    RelocationIterator(CompactBufferReader& reader)
+    explicit RelocationIterator(CompactBufferReader& reader)
       : reader_(reader)
     { }
 
     bool read() {
         if (!reader_.more())
             return false;
         offset_ = reader_.readUnsigned();
         return true;
--- a/js/src/jit/x86/Assembler-x86.h
+++ b/js/src/jit/x86/Assembler-x86.h
@@ -155,24 +155,24 @@ static_assert(CodeAlignment % SimdMemory
 static_assert(JitStackAlignment % SimdMemoryAlignment == 0,
   "Stack alignment should be larger than any of the alignments which are used for "
   "spilled values.  Thus it should be larger than the alignment for SIMD accesses.");
 
 static const uint32_t WasmStackAlignment = SimdMemoryAlignment;
 
 struct ImmTag : public Imm32
 {
-    ImmTag(JSValueTag mask)
+    explicit ImmTag(JSValueTag mask)
       : Imm32(int32_t(mask))
     { }
 };
 
 struct ImmType : public ImmTag
 {
-    ImmType(JSValueType type)
+    explicit ImmType(JSValueType type)
       : ImmTag(JSVAL_TYPE_TO_TAG(type))
     { }
 };
 
 static const Scale ScalePointer = TimesFour;
 
 } // namespace jit
 } // namespace js
--- a/js/src/jit/x86/CodeGenerator-x86.cpp
+++ b/js/src/jit/x86/CodeGenerator-x86.cpp
@@ -731,34 +731,34 @@ CodeGeneratorX86::visitWasmStoreGlobalVa
 namespace js {
 namespace jit {
 
 class OutOfLineTruncate : public OutOfLineCodeBase<CodeGeneratorX86>
 {
     LTruncateDToInt32* ins_;
 
   public:
-    OutOfLineTruncate(LTruncateDToInt32* ins)
+    explicit OutOfLineTruncate(LTruncateDToInt32* ins)
       : ins_(ins)
     { }
 
     void accept(CodeGeneratorX86* codegen) {
         codegen->visitOutOfLineTruncate(this);
     }
     LTruncateDToInt32* ins() const {
         return ins_;
     }
 };
 
 class OutOfLineTruncateFloat32 : public OutOfLineCodeBase<CodeGeneratorX86>
 {
     LTruncateFToInt32* ins_;
 
   public:
-    OutOfLineTruncateFloat32(LTruncateFToInt32* ins)
+    explicit OutOfLineTruncateFloat32(LTruncateFToInt32* ins)
       : ins_(ins)
     { }
 
     void accept(CodeGeneratorX86* codegen) {
         codegen->visitOutOfLineTruncateFloat32(this);
     }
     LTruncateFToInt32* ins() const {
         return ins_;
--- a/js/src/wasm/WasmBaselineCompile.cpp
+++ b/js/src/wasm/WasmBaselineCompile.cpp
@@ -249,27 +249,27 @@ class BaseCompiler
 #if defined(JS_CODEGEN_X64)
     typedef ScratchRegisterScope ScratchI32;
 #elif defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_ARM)
     class ScratchI32
     {
 # ifdef DEBUG
         BaseCompiler& bc;
       public:
-        ScratchI32(BaseCompiler& bc) : bc(bc) {
+        explicit ScratchI32(BaseCompiler& bc) : bc(bc) {
             MOZ_ASSERT(!bc.scratchRegisterTaken());
             bc.setScratchRegisterTaken(true);
         }
         ~ScratchI32() {
             MOZ_ASSERT(bc.scratchRegisterTaken());
             bc.setScratchRegisterTaken(false);
         }
 # else
       public:
-        ScratchI32(BaseCompiler& bc) {}
+        explicit ScratchI32(BaseCompiler& bc) {}
 # endif
         operator Register() const {
 # ifdef JS_CODEGEN_X86
             return ScratchRegX86;
 # else
             return ScratchRegARM;
 # endif
         }
--- a/layout/base/FrameLayerBuilder.cpp
+++ b/layout/base/FrameLayerBuilder.cpp
@@ -1562,102 +1562,54 @@ struct MaskLayerUserData : public LayerU
 };
 
 /*
  * User data for layers which will be used as masks for css positioned mask.
  */
 struct CSSMaskLayerUserData : public LayerUserData
 {
   CSSMaskLayerUserData()
-    : mImageLayers(nsStyleImageLayers::LayerType::Mask)
+    : mFrame(nullptr)
   { }
 
-  CSSMaskLayerUserData(nsIFrame* aFrame, const nsIntRect& aBounds)
-    : mImageLayers(aFrame->StyleSVGReset()->mMask),
-      mContentRect(aFrame->GetContentRectRelativeToSelf()),
-      mPaddingRect(aFrame->GetPaddingRectRelativeToSelf()),
-      mBorderRect(aFrame->GetRectRelativeToSelf()),
-      mMarginRect(aFrame->GetMarginRectRelativeToSelf()),
-      mBounds(aBounds)
-  {
-    Hash(aFrame);
-  }
+  CSSMaskLayerUserData(nsIFrame* aFrame, const nsIntSize& aMaskSize)
+    : mFrame(aFrame),
+      mMaskSize(aMaskSize)
+  { }
 
   CSSMaskLayerUserData& operator=(const CSSMaskLayerUserData& aOther)
   {
-    mImageLayers = aOther.mImageLayers;
-
-    mContentRect = aOther.mContentRect;
-    mPaddingRect = aOther.mPaddingRect;
-    mBorderRect = aOther.mBorderRect;
-    mMarginRect = aOther.mMarginRect;
-
-    mBounds = aOther.mBounds;
-
-    mHash = aOther.mHash;
+    mFrame = aOther.mFrame;
+    mMaskSize = aOther.mMaskSize;
 
     return *this;
   }
 
   bool
   operator==(const CSSMaskLayerUserData& aOther) const
   {
-    if (mHash != aOther.mHash) {
-      return false;
-    }
-
-    if (mImageLayers.mLayers != aOther.mImageLayers.mLayers) {
+    if (mFrame != aOther.mFrame) {
       return false;
     }
 
-    if (!mContentRect.IsEqualEdges(aOther.mContentRect) ||
-        !mPaddingRect.IsEqualEdges(aOther.mPaddingRect) ||
-        !mBorderRect.IsEqualEdges(aOther.mBorderRect) ||
-        !mMarginRect.IsEqualEdges(aOther.mMarginRect)) {
-      return false;
-    }
-
-    if (!mBounds.IsEqualEdges(aOther.mBounds)) {
+    // Even if the frame is valid, check the size of the display item's
+    // boundary is still necessary. For example, if we scale the masked frame
+    // by adding a transform property on it, the masked frame is valid itself
+    // but we have to regenerate mask according to the new size in device
+    // space.
+    if (mMaskSize != aOther.mMaskSize) {
       return false;
     }
 
     return true;
   }
 
 private:
-  void Hash(nsIFrame* aFrame)
-  {
-    uint32_t hash = 0;
-
-    const nsStyleImageLayers& imageLayers = aFrame->StyleSVGReset()->mMask;
-    for (uint32_t i = 0; i < imageLayers.mLayers.Length(); i++) {
-      const nsStyleImageLayers::Layer& newLayer = imageLayers.mLayers[i];
-      hash = AddToHash(hash, HashBytes(&newLayer, sizeof(newLayer)));
-    }
-
-    hash = AddToHash(hash, HashBytes(&mContentRect, sizeof(mContentRect)));
-    hash = AddToHash(hash, HashBytes(&mPaddingRect, sizeof(mPaddingRect)));
-    hash = AddToHash(hash, HashBytes(&mBorderRect, sizeof(mBorderRect)));
-    hash = AddToHash(hash, HashBytes(&mMarginRect, sizeof(mMarginRect)));
-
-    hash = AddToHash(hash, HashBytes(&mBounds, sizeof(mBounds)));
-
-    mHash = hash;
-  }
-
-  nsStyleImageLayers mImageLayers;
-
-  nsRect mContentRect;
-  nsRect mPaddingRect;
-  nsRect mBorderRect;
-  nsRect mMarginRect;
-
-  nsIntRect mBounds;
-
-  uint32_t mHash;
+  nsIFrame* mFrame;
+  nsIntSize mMaskSize;
 };
 
 /*
  * A helper object to create a draw target for painting mask and create a
  * image container to hold the drawing result. The caller can then bind this
  * image container with a image mask layer via ImageLayer::SetContainer.
  */
 class MaskImageData
@@ -3910,18 +3862,19 @@ ContainerState::SetupMaskLayerForCSSMask
     );
 
   CSSMaskLayerUserData* oldUserData =
     static_cast<CSSMaskLayerUserData*>(maskLayer->GetUserData(&gCSSMaskLayerUserData));
 
   bool snap;
   nsRect bounds = aMaskItem->GetBounds(mBuilder, &snap);
   nsIntRect itemRect = ScaleToOutsidePixels(bounds, snap);
-  CSSMaskLayerUserData newUserData(aMaskItem->Frame(), itemRect);
-  if (*oldUserData == newUserData) {
+  CSSMaskLayerUserData newUserData(aMaskItem->Frame(), itemRect.Size());
+  nsRect dirtyRect;
+  if (!aMaskItem->IsInvalid(dirtyRect) && *oldUserData == newUserData) {
     aLayer->SetMaskLayer(maskLayer);
     return;
   }
 
   int32_t maxSize = mManager->GetMaxTextureSize();
   IntSize surfaceSize(std::min(itemRect.width, maxSize),
                       std::min(itemRect.height, maxSize));
 
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -7135,41 +7135,30 @@ bool nsDisplayMask::ShouldPaintOnMaskLay
 {
   if (!aManager->IsCompositingCheap()) {
     return false;
   }
 
   nsSVGUtils::MaskUsage maskUsage;
   nsSVGUtils::DetermineMaskUsage(mFrame, mHandleOpacity, maskUsage);
 
-  if (!maskUsage.shouldGenerateMaskLayer ||
-      maskUsage.opacity != 1.0 || maskUsage.shouldApplyClipPath ||
-      maskUsage.shouldApplyBasicShape ||
-      maskUsage.shouldGenerateClipMaskLayer) {
+  if (!maskUsage.shouldGenerateMaskLayer &&
+      !maskUsage.shouldGenerateClipMaskLayer) {
+    return false;
+  }
+
+  if (maskUsage.opacity != 1.0 || maskUsage.shouldApplyClipPath ||
+      maskUsage.shouldApplyBasicShape) {
     return false;
   }
 
   if (!nsSVGIntegrationUtils::IsMaskResourceReady(mFrame)) {
     return false;
   }
 
-  // XXX temporary disable drawing SVG mask onto mask layer before bug 1313877
-  // been fixed.
-  nsIFrame* firstFrame =
-    nsLayoutUtils::FirstContinuationOrIBSplitSibling(mFrame);
-  nsSVGEffects::EffectProperties effectProperties =
-    nsSVGEffects::GetEffectProperties(firstFrame);
-  nsTArray<nsSVGMaskFrame *> maskFrames = effectProperties.GetMaskFrames();
-  for (size_t i = 0; i < maskFrames.Length() ; i++) {
-    nsSVGMaskFrame *maskFrame = maskFrames[i];
-    if (maskFrame) {
-      return false; // Found SVG mask.
-    }
-  }
-
   if (gfxPrefs::DrawMaskLayer()) {
     return false;
   }
 
   return true;
 }
 
 bool nsDisplayMask::ComputeVisibility(nsDisplayListBuilder* aBuilder,
--- a/layout/base/nsIPresShell.h
+++ b/layout/base/nsIPresShell.h
@@ -1272,21 +1272,23 @@ public:
   };
 
   class PointerInfo final
   {
   public:
     uint16_t mPointerType;
     bool mActiveState;
     bool mPrimaryState;
+    bool mPreventMouseEventByContent;
     explicit PointerInfo(bool aActiveState, uint16_t aPointerType,
                          bool aPrimaryState)
       : mPointerType(aPointerType)
       , mActiveState(aActiveState)
       , mPrimaryState(aPrimaryState)
+      , mPreventMouseEventByContent(false)
     {
     }
   };
 
   static void DispatchGotOrLostPointerCaptureEvent(bool aIsGotCapture,
                                                    uint32_t aPointerId,
                                                    uint16_t aPointerType,
                                                    bool aIsPrimary,
--- a/layout/base/nsPresShell.cpp
+++ b/layout/base/nsPresShell.cpp
@@ -6829,16 +6829,92 @@ FlushThrottledStyles(nsIDocument *aDocum
       }
     }
   }
 
   aDocument->EnumerateSubDocuments(FlushThrottledStyles, nullptr);
   return true;
 }
 
+/*
+ * This function handles the preventDefault behavior of pointerdown. When user
+ * preventDefault on pointerdown, We have to mark the active pointer to prevent
+ * sebsequent mouse events (except mouse transition events) and default
+ * behaviors.
+ *
+ * We add mPreventMouseEventByContent flag in PointerInfo to represent the
+ * active pointer won't firing compatible mouse events. It's set to true when
+ * content preventDefault on pointerdown
+ */
+static void
+PostHandlePointerEventsPreventDefault(WidgetPointerEvent* aPointerEvent,
+                                      WidgetGUIEvent* aMouseOrTouchEvent)
+{
+  if (!aPointerEvent->mIsPrimary || aPointerEvent->mMessage != ePointerDown ||
+      !aPointerEvent->DefaultPreventedByContent()) {
+    return;
+  }
+  nsIPresShell::PointerInfo* pointerInfo = nullptr;
+  if (!sActivePointersIds->Get(aPointerEvent->pointerId, &pointerInfo) ||
+      !pointerInfo) {
+    // We already added the PointerInfo for active pointer when
+    // PresShell::HandleEvent handling pointerdown event.
+#ifdef DEBUG
+    MOZ_CRASH("Got ePointerDown w/o active pointer info!!");
+#endif // #ifdef DEBUG
+    return;
+  }
+  // PreventDefault only applied for active pointers.
+  if (!pointerInfo->mActiveState) {
+    return;
+  }
+  aMouseOrTouchEvent->PreventDefault(false);
+  pointerInfo->mPreventMouseEventByContent = true;
+}
+
+/*
+ * This function handles the case when content had called preventDefault on the
+ * active pointer. In that case we have to prevent firing subsequent mouse
+ * to content. We check the flag PointerInfo::mPreventMouseEventByContent and
+ * call PreventDefault(false) to stop default behaviors and stop firing mouse
+ * events to content and chrome.
+ *
+ * note: mouse transition events are excluded
+ * note: we have to clean mPreventMouseEventByContent on pointerup for those
+ *       devices support hover
+ * note: we don't suppress firing mouse events to chrome and system group
+ *       handlers because they may implement default behaviors
+ */
+static void
+PreHandlePointerEventsPreventDefault(WidgetPointerEvent* aPointerEvent,
+                                     WidgetGUIEvent* aMouseOrTouchEvent)
+{
+  if (!aPointerEvent->mIsPrimary || aPointerEvent->mMessage == ePointerDown) {
+    return;
+  }
+  nsIPresShell::PointerInfo* pointerInfo = nullptr;
+  if (!sActivePointersIds->Get(aPointerEvent->pointerId, &pointerInfo) ||
+      !pointerInfo) {
+    // The PointerInfo for active pointer should be added for normal cases. But
+    // in some cases, we may receive mouse events before adding PointerInfo in
+    // sActivePointersIds. (e.g. receive mousemove before eMouseEnterIntoWidget
+    // or change preference 'dom.w3c_pointer_events.enabled' from off to on).
+    // In these cases, we could ignore them because they are not the events
+    // between a DefaultPrevented pointerdown and the corresponding pointerup.
+    return;
+  }
+  if (!pointerInfo->mPreventMouseEventByContent) {
+    return;
+  }
+  aMouseOrTouchEvent->PreventDefault(false);
+  if (aPointerEvent->mMessage == ePointerUp) {
+    pointerInfo->mPreventMouseEventByContent = false;
+  }
+}
+
 static nsresult
 DispatchPointerFromMouseOrTouch(PresShell* aShell,
                                 nsIFrame* aFrame,
                                 WidgetGUIEvent* aEvent,
                                 bool aDontRetargetEvents,
                                 nsEventStatus* aStatus,
                                 nsIContent** aTargetContent)
 {
@@ -6875,18 +6951,20 @@ DispatchPointerFromMouseOrTouch(PresShel
     event.inputSource = mouseEvent->inputSource;
     event.mMessage = pointerMessage;
     event.button = button;
     event.buttons = mouseEvent->buttons;
     event.pressure = event.buttons ?
                      mouseEvent->pressure ? mouseEvent->pressure : 0.5f :
                      0.0f;
     event.convertToPointer = mouseEvent->convertToPointer = false;
+    PreHandlePointerEventsPreventDefault(&event, aEvent);
     aShell->HandleEvent(aFrame, &event, aDontRetargetEvents, aStatus,
                         aTargetContent);
+    PostHandlePointerEventsPreventDefault(&event, aEvent);
   } else if (aEvent->mClass == eTouchEventClass) {
     WidgetTouchEvent* touchEvent = aEvent->AsTouchEvent();
     // loop over all touches and dispatch pointer events on each touch
     // copy the event
     switch (touchEvent->mMessage) {
     case eTouchMove:
       pointerMessage = ePointerMove;
       break;
@@ -6921,18 +6999,20 @@ DispatchPointerFromMouseOrTouch(PresShel
       event.tiltY = touch->tiltY;
       event.mTime = touchEvent->mTime;
       event.mTimeStamp = touchEvent->mTimeStamp;
       event.mFlags = touchEvent->mFlags;
       event.button = WidgetMouseEvent::eLeftButton;
       event.buttons = WidgetMouseEvent::eLeftButtonFlag;
       event.inputSource = nsIDOMMouseEvent::MOZ_SOURCE_TOUCH;
       event.convertToPointer = touch->convertToPointer = false;
+      PreHandlePointerEventsPreventDefault(&event, aEvent);
       aShell->HandleEvent(aFrame, &event, aDontRetargetEvents, aStatus,
                           aTargetContent);
+      PostHandlePointerEventsPreventDefault(&event, aEvent);
     }
   }
   return NS_OK;
 }
 
 class ReleasePointerCaptureCaller
 {
 public:
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/clip-path-invalidation-1a.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: clipPath invalidation.</title>
+    <style type="text/css">
+      div.outer {
+        position: absolute;
+        background-color: purple;
+        border: solid purple;
+        width: 10px;
+        height: 10px;
+        transform: scale(20);
+        transform-origin: top left;
+      }
+
+      div.clipped {
+        clip-path: url(#cp1);
+      }
+    </style>
+  </head>
+  <body>
+    <div id="d1" class="outer clipped"></div>
+    <script type="text/javascript">
+      function changeTransform()
+      {
+        document.getElementById("d1").style.transform = "scale(10)";
+        document.documentElement.removeAttribute("class");
+      }
+
+      document.addEventListener("MozReftestInvalidate",
+                                changeTransform, false);
+    </script>
+    <svg height="0">
+      <clipPath id="cp1">
+        <rect x="10" y="10" width="5" height="5"/>
+      </clipPath>
+    </svg>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/clip-path-invalidation-1b.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: clipPath invalidation.</title>
+    <style type="text/css">
+      div.outer {
+        position: absolute;
+        background-color: purple;
+        border: solid purple;
+        width: 10px;
+        height: 10px;
+        transform: scale(20);
+        transform-origin: top left;
+      }
+
+      div.clipped {
+        clip-path: url(#cp1);
+      }
+
+      div.inner {
+        width: 5px;
+        height: 5px;
+        border: 1px solid transparent;
+        will-change: transform;
+      }
+    </style>
+  </head>
+  <body>
+    <div id="d1" class="outer clipped"><div class="inner"></div></div>
+    <script type="text/javascript">
+      function changeTransform()
+      {
+        document.getElementById("d1").style.transform = "scale(10)";
+        document.documentElement.removeAttribute("class");
+      }
+
+      document.addEventListener("MozReftestInvalidate",
+                                changeTransform, false);
+    </script>
+    <svg height="0">
+      <clipPath id="cp1">
+       <rect x="10" y="10" width="5" height="5"/>
+      </clipPath>
+    </svg>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/clip-path-invalidation-1c.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: clipPath invalidation.</title>
+    <style type="text/css">
+      div.outer {
+        position: absolute;
+        background-color: purple;
+        border: solid purple;
+        width: 200px;
+        height: 200px;
+      }
+
+      div.clipped {
+        clip-path: url(#cp1);
+      }
+    </style>
+  </head>
+  <body>
+    <div id="d1" class="outer clipped"></div>
+    <script type="text/javascript">
+      function changeClipPath()
+      {
+        document.getElementById("r1").setAttribute("width", "50");
+        document.getElementById("r1").setAttribute("height", "50");
+        document.getElementById("r1").setAttribute("x", "100");
+        document.getElementById("r1").setAttribute("y", "100");
+
+        document.documentElement.removeAttribute("class");
+      }
+
+      document.addEventListener("MozReftestInvalidate",
+                                changeClipPath, false);
+    </script>
+    <svg height="0">
+      <clipPath id="cp1">
+        <rect id="r1" x="50" y="50" width="100" height="100"/>
+      </clipPath>
+    </svg>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/clip-path-invalidation-1d.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: clipPath invalidation.</title>
+    <style type="text/css">
+      div.outer {
+        position: absolute;
+        background-color: purple;
+        border: solid purple;
+        width: 200px;
+        height: 200px;
+      }
+
+      div.clipped {
+        clip-path: url(#cp1);
+      }
+
+      div.inner {
+        width: 5px;
+        height: 5px;
+        border: 1px solid transparent;
+        will-change: transform;
+      }
+
+    </style>
+  </head>
+  <body>
+    <div id="d1" class="outer clipped"><div class="inner"></div></div>
+    <script type="text/javascript">
+      function changeClipPath()
+      {
+        document.getElementById("r1").setAttribute("width", "50");
+        document.getElementById("r1").setAttribute("height", "50");
+        document.getElementById("r1").setAttribute("x", "100");
+        document.getElementById("r1").setAttribute("y", "100");
+
+        document.documentElement.removeAttribute("class");
+      }
+
+      document.addEventListener("MozReftestInvalidate",
+                                changeClipPath, false);
+    </script>
+    <svg height="0">
+      <clipPath id="cp1">
+        <rect id="r1" x="50" y="50" width="100" height="100"/>
+      </clipPath>
+    </svg>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/mask-invalidation-1-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: mask repainting.</title>
+    <style type="text/css">
+      div {
+        background-color: purple;
+        position: absolute;
+        margin: 1px 2px 3px 4px;
+        border: solid purple;
+        width: 44px;
+        height: 9px;
+      }
+    </style>
+  </head>
+  <body>
+    <div class="outer" style="top: 15px; left: 15px;"></div>
+    <div class="outer" style="top: 15px; left: 115px;"></div>
+    <div class="outer" style="top: 15px; left: 215px;"></div>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/mask-invalidation-1a.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: mask invalidation.</title>
+    <style type="text/css">
+      div.outer {
+        background-color: purple;
+        position: absolute;
+        margin: 1px 2px 3px 4px;
+        border: solid purple;
+        width: 40px;
+        height: 20px;
+      }
+
+      div.mask {
+        mask-size: 100% 100%;
+        mask-origin: border-box;
+        mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><rect x="0" y="0"  width="100%" height="50%" fill="blue" fill-opacity="1"/><rect x="0" y="50%" width="100%" height="50%" fill="blue" fill-opacity="0"/></svg>');
+      }
+
+      #d1 {
+        top: 10px;
+        left: 10px;
+        mask-clip: padding-box;
+        border-width: 10px;
+        padding: 0px;
+      }
+
+      #d2 {
+        top: 10px;
+        left: 110px;
+        mask-clip: padding-box;
+        border-width: 0px;
+        padding: 10px;
+      }
+
+      #d3 {
+        top: 15px;
+        left: 215px;
+        mask-clip: content-box;
+        border-width: 10px;
+        padding: 0px;
+      }
+    </style>
+  </head>
+  <body>
+    <div id="d1" class="outer mask"></div>
+    <div id="d2" class="outer mask"></div>
+    <div id="d3" class="outer mask"></div>
+    <script type="text/javascript">
+      function invalidateMaskedElements()
+      {
+        // Shrink border area, thicken padding area. Keep ths size of this
+        // division unchanged.
+        document.getElementById("d1").style.borderWidth = "5px";
+        document.getElementById("d1").style.padding = "5px";
+
+        // Shrink padding area, thicken border area. Keep ths size of this
+        // division unchanged.
+        document.getElementById("d2").style.borderWidth = "5px";
+        document.getElementById("d2").style.padding = "5px";
+
+        // Shrink border area, thicken content area. Keep ths size of this
+        // division unchanged.
+        document.getElementById("d3").style.width = "50px";
+        document.getElementById("d3").style.height = "30px";
+        document.getElementById("d3").style.borderWidth = "0px";
+
+        document.documentElement.removeAttribute("class");
+      }
+
+      document.addEventListener("MozReftestInvalidate",
+                                invalidateMaskedElements, false);
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/mask-invalidation-1b.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: mask invalidation.</title>
+    <style type="text/css">
+      div.outer {
+        background-color: purple;
+        position: absolute;
+        margin: 1px 2px 3px 4px;
+        border: solid purple;
+        width: 40px;
+        height: 20px;
+      }
+
+      div.inner {
+        width: 10px;
+        height: 10px;
+        border: 1px solid transparent;
+        will-change: transform;
+      }
+
+      div.mask {
+        mask-size: 100% 100%;
+        mask-origin: border-box;
+        mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><rect x="0" y="0"  width="100%" height="50%" fill="blue" fill-opacity="1"/><rect x="0" y="50%" width="100%" height="50%" fill="blue" fill-opacity="0"/></svg>');
+      }
+
+      #d1 {
+        top: 10px;
+        left: 10px;
+        mask-clip: padding-box;
+        border-width: 10px;
+        padding: 0px;
+      }
+
+      #d2 {
+        top: 10px;
+        left: 110px;
+        mask-clip: padding-box;
+        border-width: 0px;
+        padding: 10px;
+      }
+
+      #d3 {
+        top: 15px;
+        left: 215px;
+        mask-clip: content-box;
+        border-width: 10px;
+        padding: 0px;
+      }
+    </style>
+  </head>
+  <body>
+    <div id="d1" class="outer mask"><div class="inner"></div></div>
+    <div id="d2" class="outer mask"><div class="inner"></div></div>
+    <div id="d3" class="outer mask"><div class="inner"></div></div>
+    <script type="text/javascript">
+      function invalidateMaskedElements()
+      {
+        // Shrink border area, thicken padding area. Keep ths size of this
+        // division unchanged.
+        document.getElementById("d1").style.borderWidth = "5px";
+        document.getElementById("d1").style.padding = "5px";
+
+        // Shrink padding area, thicken border area. Keep ths size of this
+        // division unchanged.
+        document.getElementById("d2").style.borderWidth = "5px";
+        document.getElementById("d2").style.padding = "5px";
+
+        // Shrink border area, thicken content area. Keep ths size of this
+        // division unchanged.
+        document.getElementById("d3").style.width = "50px";
+        document.getElementById("d3").style.height = "30px";
+        document.getElementById("d3").style.borderWidth = "0px";
+
+        document.documentElement.removeAttribute("class");
+      }
+
+      document.addEventListener("MozReftestInvalidate",
+                                invalidateMaskedElements, false);
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/mask-invalidation-2-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: mask repainting.</title>
+    <link rel="author" title="CJ Ku" href="mailto:cku@mozilla.com">
+    <link rel="author" title="Mozilla" href="https://www.mozilla.org">
+  </head>
+  <body>
+    <svg width="200" height="200">
+      <rect x="100" y="100" width="50" height="50" style="stroke:none; fill: purple;"/>
+    </svg>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/mask-invalidation-2a.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: mask invalidation.</title>
+    <style type="text/css">
+      div.outer {
+        position: absolute;
+        background-color: purple;
+        border: solid purple;
+        width: 10px;
+        height: 10px;
+        transform: scale(20);
+        transform-origin: top left;
+      }
+
+      div.mask {
+        mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 10 10"><rect x="10" y="10" width="5" height="5" fill="black"/></svg>');
+      }
+
+    </style>
+  </head>
+  <body>
+    <div id="d1" class="outer mask"></div>
+    <script type="text/javascript">
+      function changeTransform()
+      {
+        document.getElementById("d1").style.transform = "scale(10)";
+        document.documentElement.removeAttribute("class");
+      }
+
+      document.addEventListener("MozReftestInvalidate",
+                                changeTransform, false);
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/mask-invalidation-2b.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: mask invalidation.</title>
+    <style type="text/css">
+      div.outer {
+        position: absolute;
+        background-color: purple;
+        border: solid purple;
+        width: 10px;
+        height: 10px;
+        transform: scale(20);
+        transform-origin: top left;
+      }
+
+      div.mask {
+        mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 10 10"><rect x="10" y="10" width="5" height="5" fill="black"/></svg>');
+      }
+
+      div.inner {
+        width: 5px;
+        height: 5px;
+        border: 1px solid transparent;
+        will-change: transform;
+      }
+
+    </style>
+  </head>
+  <body>
+    <div id="d1" class="outer mask"><div class="inner"></div></div>
+    <script type="text/javascript">
+      function changeTransform()
+      {
+        document.getElementById("d1").style.transform = "scale(10)";
+        document.documentElement.removeAttribute("class");
+      }
+
+      document.addEventListener("MozReftestInvalidate",
+                                changeTransform, false);
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/mask-invalidation-2c.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: mask invalidation.</title>
+    <style type="text/css">
+      div.outer {
+        position: absolute;
+        background-color: purple;
+        border: solid purple;
+        width: 200px;
+        height: 200px;
+      }
+
+      div.mask {
+        mask-image: url(#m1);
+      }
+    </style>
+  </head>
+  <body>
+    <div id="d1" class="outer mask"></div>
+    <script type="text/javascript">
+      function changeMask()
+      {
+        document.getElementById("r1").setAttribute("width", "50");
+        document.getElementById("r1").setAttribute("height", "50");
+        document.getElementById("r1").setAttribute("x", "100");
+        document.getElementById("r1").setAttribute("y", "100");
+
+        document.documentElement.removeAttribute("class");
+      }
+
+      document.addEventListener("MozReftestInvalidate",
+                                changeMask, false);
+    </script>
+    <svg height="0">
+      <mask id="m1" x="0" y="0" width="1" height="1">
+        <rect id="r1" x="50" y="50" width="100" height="100" style="stroke:none; fill: #ffffff;"/>
+      </mask>
+    </svg>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/invalidation/mask-invalidation-2d.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: mask invalidation.</title>
+    <style type="text/css">
+      div.outer {
+        position: absolute;
+        background-color: purple;
+        border: solid purple;
+        width: 200px;
+        height: 200px;
+      }
+
+      div.mask {
+        mask-image: url(#m1);
+      }
+
+      div.inner {
+        width: 5px;
+        height: 5px;
+        border: 1px solid transparent;
+        will-change: transform;
+      }
+
+    </style>
+  </head>
+  <body>
+    <div id="d1" class="outer mask"><div class="inner"></div></div>
+    <script type="text/javascript">
+      function changeMask()
+      {
+        document.getElementById("r1").setAttribute("width", "50");
+        document.getElementById("r1").setAttribute("height", "50");
+        document.getElementById("r1").setAttribute("x", "100");
+        document.getElementById("r1").setAttribute("y", "100");
+
+        document.documentElement.removeAttribute("class");
+      }
+
+      document.addEventListener("MozReftestInvalidate",
+                                changeMask, false);
+    </script>
+    <svg height="0">
+      <mask id="m1" x="0" y="0" width="1" height="1">
+        <rect id="r1" x="50" y="50" width="100" height="100" style="stroke:none; fill: #ffffff;"/>
+      </mask>
+    </svg>
+  </body>
+</html>
--- a/layout/reftests/invalidation/reftest.list
+++ b/layout/reftests/invalidation/reftest.list
@@ -73,8 +73,21 @@ pref(layers.single-tile.enabled,false) !
 == background-position-2b.html background-position-2-ref.html
 == background-position-2c.html background-position-2-ref.html
 == background-position-2d.html background-position-2-ref.html
 == background-position-2e.html background-position-2-ref.html
 == background-position-2f.html background-position-2-ref.html
 == zero-opacity-animation.html about:blank
 == zero-opacity-text.html about:blank
 == negative-w-component.html negative-w-component-ref.html
+
+== mask-invalidation-1a.html mask-invalidation-1-ref.html
+== mask-invalidation-1b.html mask-invalidation-1-ref.html
+
+== mask-invalidation-2a.html mask-invalidation-2-ref.html
+== mask-invalidation-2b.html mask-invalidation-2-ref.html
+== mask-invalidation-2c.html mask-invalidation-2-ref.html
+== mask-invalidation-2d.html mask-invalidation-2-ref.html
+
+== clip-path-invalidation-1a.html mask-invalidation-2-ref.html
+== clip-path-invalidation-1b.html mask-invalidation-2-ref.html
+== clip-path-invalidation-1c.html mask-invalidation-2-ref.html
+== clip-path-invalidation-1d.html mask-invalidation-2-ref.html
--- a/layout/style/CSSCalc.h
+++ b/layout/style/CSSCalc.h
@@ -22,60 +22,65 @@ namespace css {
  *   // expectations (which happen to be met by two classes (nsCSSValue
  *   // and nsStyleCoord).  There must be methods (roughly):
  *   //   input_array_type* input_type::GetArrayValue();
  *   //   uint32_t input_array_type::Count() const;
  *   //   input_type& input_array_type::Item(uint32_t);
  *   typedef ... input_type;
  *   typedef ... input_array_type;
  *
+ *   typedef ... coeff_type;
+ *
  *   typedef ... result_type;
  *
  *   // GetUnit(avalue) must return the correct nsCSSUnit for any
  *   // value that represents a calc tree node (eCSSUnit_Calc*).  For
  *   // other nodes, it may return any non eCSSUnit_Calc* unit.
  *   static nsCSSUnit GetUnit(const input_type& aValue);
  *
  *   result_type
  *   MergeAdditive(nsCSSUnit aCalcFunction,
  *                 result_type aValue1, result_type aValue2);
  *
  *   result_type
  *   MergeMultiplicativeL(nsCSSUnit aCalcFunction,
- *                        float aValue1, result_type aValue2);
+ *                        coeff_type aValue1, result_type aValue2);
  *
  *   result_type
  *   MergeMultiplicativeR(nsCSSUnit aCalcFunction,
- *                        result_type aValue1, float aValue2);
+ *                        result_type aValue1, coeff_type aValue2);
  *
  *   result_type
  *   ComputeLeafValue(const input_type& aValue);
  *
- *   float
- *   ComputeNumber(const input_type& aValue);
+ *   coeff_type
+ *   ComputeCoefficient(const coeff_type& aValue);
  *
  * The CalcOps methods might compute the calc() expression down to a
  * number, reduce some parts of it to a number but replicate other
  * parts, or produce a tree with a different data structure (for
  * example, nsCSS* for specified values vs nsStyle* for computed
  * values).
  *
  * For each leaf in the calc() expression, ComputeCalc will call either
- * ComputeNumber (when the leaf is the left side of a Times_L or the
+ * ComputeCoefficient (when the leaf is the left side of a Times_L or the
  * right side of a Times_R or Divided) or ComputeLeafValue (otherwise).
  * (The CalcOps in the CSS parser that reduces purely numeric
  * expressions in turn calls ComputeCalc on numbers; other ops can
- * presume that expressions in the number positions have already been
- * normalized to a single numeric value and derive from
- * NumbersAlreadyNormalizedCalcOps.)
+ * presume that expressions in the coefficient positions have already been
+ * normalized to a single numeric value and derive from, if their coefficient
+ * types are floats, FloatCoeffsAlreadyNormalizedCalcOps.)
+ *
+ * coeff_type will be float most of the time, but it's templatized so that
+ * ParseCalc can be used with <integer>s too.
  *
  * For non-leaves, one of the Merge functions will be called:
  *   MergeAdditive for Plus and Minus
- *   MergeMultiplicativeL for Times_L (number * value)
- *   MergeMultiplicativeR for Times_R (value * number) and Divided
+ *   MergeMultiplicativeL for Times_L (coeff * value)
+ *   MergeMultiplicativeR for Times_R (value * coeff) and Divided
  */
 template <class CalcOps>
 static typename CalcOps::result_type
 ComputeCalc(const typename CalcOps::input_type& aValue, CalcOps &aOps)
 {
   switch (CalcOps::GetUnit(aValue)) {
     case eCSSUnit_Calc: {
       typename CalcOps::input_array_type *arr = aValue.GetArrayValue();
@@ -88,26 +93,26 @@ ComputeCalc(const typename CalcOps::inpu
       MOZ_ASSERT(arr->Count() == 2, "unexpected length");
       typename CalcOps::result_type lhs = ComputeCalc(arr->Item(0), aOps),
                                     rhs = ComputeCalc(arr->Item(1), aOps);
       return aOps.MergeAdditive(CalcOps::GetUnit(aValue), lhs, rhs);
     }
     case eCSSUnit_Calc_Times_L: {
       typename CalcOps::input_array_type *arr = aValue.GetArrayValue();
       MOZ_ASSERT(arr->Count() == 2, "unexpected length");
-      float lhs = aOps.ComputeNumber(arr->Item(0));
+      typename CalcOps::coeff_type lhs = aOps.ComputeCoefficient(arr->Item(0));
       typename CalcOps::result_type rhs = ComputeCalc(arr->Item(1), aOps);
       return aOps.MergeMultiplicativeL(CalcOps::GetUnit(aValue), lhs, rhs);
     }
     case eCSSUnit_Calc_Times_R:
     case eCSSUnit_Calc_Divided: {
       typename CalcOps::input_array_type *arr = aValue.GetArrayValue();
       MOZ_ASSERT(arr->Count() == 2, "unexpected length");
       typename CalcOps::result_type lhs = ComputeCalc(arr->Item(0), aOps);
-      float rhs = aOps.ComputeNumber(arr->Item(1));
+      typename CalcOps::coeff_type rhs = aOps.ComputeCoefficient(arr->Item(1));
       return aOps.MergeMultiplicativeR(CalcOps::GetUnit(aValue), lhs, rhs);
     }
     default: {
       return aOps.ComputeLeafValue(aValue);
     }
   }
 }
 
@@ -130,97 +135,141 @@ struct CSSValueInputCalcOps
  * Basic*CalcOps provide a partial implementation of the CalcOps
  * template parameter to ComputeCalc, for those callers whose merging
  * just consists of mathematics (rather than tree construction).
  */
 
 struct BasicCoordCalcOps
 {
   typedef nscoord result_type;
+  typedef float coeff_type;
 
   result_type
   MergeAdditive(nsCSSUnit aCalcFunction,
                 result_type aValue1, result_type aValue2)
   {
     if (aCalcFunction == eCSSUnit_Calc_Plus) {
       return NSCoordSaturatingAdd(aValue1, aValue2);
     }
     MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Minus,
                "unexpected unit");
     return NSCoordSaturatingSubtract(aValue1, aValue2, 0);
   }
 
   result_type
   MergeMultiplicativeL(nsCSSUnit aCalcFunction,
-                       float aValue1, result_type aValue2)
+                       coeff_type aValue1, result_type aValue2)
   {
     MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Times_L,
                "unexpected unit");
     return NSCoordSaturatingMultiply(aValue2, aValue1);
   }
 
   result_type
   MergeMultiplicativeR(nsCSSUnit aCalcFunction,
-                       result_type aValue1, float aValue2)
+                       result_type aValue1, coeff_type aValue2)
   {
     MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Times_R ||
                aCalcFunction == eCSSUnit_Calc_Divided,
                "unexpected unit");
     if (aCalcFunction == eCSSUnit_Calc_Divided) {
       aValue2 = 1.0f / aValue2;
     }
     return NSCoordSaturatingMultiply(aValue1, aValue2);
   }
 };
 
 struct BasicFloatCalcOps
 {
   typedef float result_type;
+  typedef float coeff_type;
 
   result_type
   MergeAdditive(nsCSSUnit aCalcFunction,
                 result_type aValue1, result_type aValue2)
   {
     if (aCalcFunction == eCSSUnit_Calc_Plus) {
       return aValue1 + aValue2;
     }
     MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Minus,
                "unexpected unit");
     return aValue1 - aValue2;
   }
 
   result_type
   MergeMultiplicativeL(nsCSSUnit aCalcFunction,
-                       float aValue1, result_type aValue2)
+                       coeff_type aValue1, result_type aValue2)
   {
     MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Times_L,
                "unexpected unit");
     return aValue1 * aValue2;
   }
 
   result_type
   MergeMultiplicativeR(nsCSSUnit aCalcFunction,
-                       result_type aValue1, float aValue2)
+                       result_type aValue1, coeff_type aValue2)
   {
     if (aCalcFunction == eCSSUnit_Calc_Times_R) {
       return aValue1 * aValue2;
     }
     MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Divided,
                "unexpected unit");
     return aValue1 / aValue2;
   }
 };
 
+struct BasicIntegerCalcOps
+{
+  typedef int result_type;
+  typedef int coeff_type;
+
+  result_type
+  MergeAdditive(nsCSSUnit aCalcFunction,
+                result_type aValue1, result_type aValue2)
+  {
+    if (aCalcFunction == eCSSUnit_Calc_Plus) {
+      return aValue1 + aValue2;
+    }
+    MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Minus,
+               "unexpected unit");
+    return aValue1 - aValue2;
+  }
+
+  result_type
+  MergeMultiplicativeL(nsCSSUnit aCalcFunction,
+                       coeff_type aValue1, result_type aValue2)
+  {
+    MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Times_L,
+               "unexpected unit");
+    return aValue1 * aValue2;
+  }
+
+  result_type
+  MergeMultiplicativeR(nsCSSUnit aCalcFunction,
+                       result_type aValue1, coeff_type aValue2)
+  {
+    if (aCalcFunction == eCSSUnit_Calc_Times_R) {
+      return aValue1 * aValue2;
+    }
+    MOZ_ASSERT_UNREACHABLE("We should catch and prevent divisions in integer "
+                           "calc()s in the parser.");
+    return 1;
+  }
+};
+
 /**
- * A ComputeNumber implementation for callers that can assume numbers
- * are already normalized (i.e., anything past the parser).
+ * A ComputeCoefficient implementation for callers that can assume coefficients
+ * are floats and are already normalized (i.e., anything past the parser except
+ * pure-integer calcs, whose coefficients are integers).
  */
-struct NumbersAlreadyNormalizedOps : public CSSValueInputCalcOps
+struct FloatCoeffsAlreadyNormalizedOps : public CSSValueInputCalcOps
 {
-  float ComputeNumber(const nsCSSValue& aValue)
+  typedef float coeff_type;
+
+  coeff_type ComputeCoefficient(const nsCSSValue& aValue)
   {
     MOZ_ASSERT(aValue.GetUnit() == eCSSUnit_Number, "unexpected unit");
     return aValue.GetFloatValue();
   }
 };
 
 /**
  * SerializeCalc appends the serialization of aValue to a string.
@@ -235,17 +284,21 @@ struct NumbersAlreadyNormalizedOps : pub
  *   //   input_type& input_array_type::Item(uint32_t);
  *   typedef ... input_type;
  *   typedef ... input_array_type;
  *
  *   static nsCSSUnit GetUnit(const input_type& aValue);
  *
  *   void Append(const char* aString);
  *   void AppendLeafValue(const input_type& aValue);
- *   void AppendNumber(const input_type& aValue);
+ *
+ *   // AppendCoefficient accepts an input_type value, which represents a
+ *   // value in the coefficient position, not a value of coeff_type,
+ *   // because we're serializing the calc() expression itself.
+ *   void AppendCoefficient(const input_type& aValue);
  *
  * Data structures given may or may not have a toplevel eCSSUnit_Calc
  * node representing a calc whose toplevel is not min() or max().
  */
 
 template <class CalcOps>
 static void
 SerializeCalcInternal(const typename CalcOps::input_type& aValue, CalcOps &aOps);
@@ -315,17 +368,17 @@ SerializeCalcInternal(const typename Cal
     const typename CalcOps::input_array_type *array = aValue.GetArrayValue();
     MOZ_ASSERT(array->Count() == 2, "unexpected length");
 
     bool needParens = IsCalcAdditiveUnit(CalcOps::GetUnit(array->Item(0)));
     if (needParens) {
       aOps.Append("(");
     }
     if (unit == eCSSUnit_Calc_Times_L) {
-      aOps.AppendNumber(array->Item(0));
+      aOps.AppendCoefficient(array->Item(0));
     } else {
       SerializeCalcInternal(array->Item(0), aOps);
     }
     if (needParens) {
       aOps.Append(")");
     }
 
     if (eCSSUnit_Calc_Times_L == unit || eCSSUnit_Calc_Times_R == unit) {
@@ -339,23 +392,65 @@ SerializeCalcInternal(const typename Cal
     needParens = IsCalcAdditiveUnit(subUnit) ||
                  IsCalcMultiplicativeUnit(subUnit);
     if (needParens) {
       aOps.Append("(");
     }
     if (unit == eCSSUnit_Calc_Times_L) {
       SerializeCalcInternal(array->Item(1), aOps);
     } else {
-      aOps.AppendNumber(array->Item(1));
+      aOps.AppendCoefficient(array->Item(1));
     }
     if (needParens) {
       aOps.Append(")");
     }
   } else {
     aOps.AppendLeafValue(aValue);
   }
 }
 
+/**
+ * ReduceNumberCalcOps is a CalcOps implementation for pure-number calc()
+ * (sub-)expressions, input as nsCSSValues.
+ * For example, nsCSSParser::ParseCalcMultiplicativeExpression uses it to
+ * simplify numeric sub-expressions in order to check for division-by-zero.
+ */
+struct ReduceNumberCalcOps : public mozilla::css::BasicFloatCalcOps,
+                             public mozilla::css::CSSValueInputCalcOps
+{
+  result_type ComputeLeafValue(const nsCSSValue& aValue)
+  {
+    MOZ_ASSERT(aValue.GetUnit() == eCSSUnit_Number, "unexpected unit");
+    return aValue.GetFloatValue();
+  }
+
+  coeff_type ComputeCoefficient(const nsCSSValue& aValue)
+  {
+    return mozilla::css::ComputeCalc(aValue, *this);
+  }
+};
+
+/**
+ * ReduceIntegerCalcOps is a CalcOps implementation for pure-integer calc()
+ * (sub-)expressions, input as nsCSSValues.
+ */
+struct ReduceIntegerCalcOps : public mozilla::css::BasicIntegerCalcOps,
+                              public mozilla::css::CSSValueInputCalcOps
+{
+  result_type
+  ComputeLeafValue(const nsCSSValue& aValue)
+  {
+    MOZ_ASSERT(aValue.GetUnit() == eCSSUnit_Integer, "unexpected unit");
+    return aValue.GetIntValue();
+  }
+
+  coeff_type
+  ComputeCoefficient(const nsCSSValue& aValue)
+  {
+    return mozilla::css::ComputeCalc(aValue, *this);
+  }
+};
+
 } // namespace css
 
 } // namespace mozilla
 
 #endif /* !defined(CSSCalc_h_) */
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -8143,20 +8143,24 @@ CSSParserImpl::ParseVariant(nsCSSValue& 
         SkipUntil(')');
         return CSSParseResult::Error;
       }
       return CSSParseResult::Ok;
     }
   }
   if ((aVariantMask & VARIANT_CALC) &&
       IsCSSTokenCalcFunction(*tk)) {
-    // calc() currently allows only lengths and percents and number inside it.
-    // And note that in current implementation, number cannot be mixed with
-    // length and percent.
-    if (!ParseCalc(aValue, aVariantMask & VARIANT_LPN)) {
+    // calc() currently allows only lengths, percents, numbers, and integers.
+    //
+    // Note that VARIANT_NUMBER can be mixed with VARIANT_LENGTH and
+    // VARIANT_PERCENTAGE in the list of allowed types (numbers can be used as
+    // coefficients).
+    // However, the the resulting type is not a mixed type with number.
+    // VARIANT_INTEGER can't be mixed with anything else.
+    if (!ParseCalc(aValue, aVariantMask & (VARIANT_LPN | VARIANT_INTEGER))) {
       return CSSParseResult::Error;
     }
     return CSSParseResult::Ok;
   }
 
   UngetToken();
   AssertNextTokenAt(lineBefore, colBefore);
   return CSSParseResult::NotFound;
@@ -13633,16 +13637,19 @@ CSSParserImpl::ParseBorderColors(nsCSSPr
 bool
 CSSParserImpl::ParseCalc(nsCSSValue &aValue, uint32_t aVariantMask)
 {
   // Parsing calc expressions requires, in a number of cases, looking
   // for a token that is *either* a value of the property or a number.
   // This can be done without lookahead when we assume that the property
   // values cannot themselves be numbers.
   MOZ_ASSERT(aVariantMask != 0, "unexpected variant mask");
+  MOZ_ASSERT(!(aVariantMask & VARIANT_LPN) != !(aVariantMask & VARIANT_INTEGER),
+             "variant mask must intersect with exactly one of VARIANT_LPN "
+             "or VARIANT_INTEGER");
 
   bool oldUnitlessLengthQuirk = mUnitlessLengthQuirk;
   mUnitlessLengthQuirk = false;
 
   // One-iteration loop so we can break to the error-handling case.
   do {
     // The toplevel of a calc() is always an nsCSSValue::Array of length 1.
     RefPtr<nsCSSValue::Array> arr = nsCSSValue::Array::Create(1);
@@ -13703,31 +13710,16 @@ CSSParserImpl::ParseCalcAdditiveExpressi
 
     RefPtr<nsCSSValue::Array> arr = nsCSSValue::Array::Create(2);
     arr->Item(0) = aValue;
     storage = &arr->Item(1);
     aValue.SetArrayValue(arr, unit);
   }
 }
 
-struct ReduceNumberCalcOps : public mozilla::css::BasicFloatCalcOps,
-                             public mozilla::css::CSSValueInputCalcOps
-{
-  result_type ComputeLeafValue(const nsCSSValue& aValue)
-  {
-    MOZ_ASSERT(aValue.GetUnit() == eCSSUnit_Number, "unexpected unit");
-    return aValue.GetFloatValue();
-  }
-
-  float ComputeNumber(const nsCSSValue& aValue)
-  {
-    return mozilla::css::ComputeCalc(aValue, *this);
-  }
-};
-
 //  * If aVariantMask is VARIANT_NUMBER, this function parses the
 //    <number-multiplicative-expression> production.
 //  * If aVariantMask does not contain VARIANT_NUMBER, this function
 //    parses the <value-multiplicative-expression> production.
 //  * Otherwise (VARIANT_NUMBER and other bits) this function parses
 //    whichever one of the productions matches ***and modifies
 //    aVariantMask*** to reflect which one it has parsed by either
 //    removing VARIANT_NUMBER or removing all other bits.
@@ -13743,62 +13735,90 @@ CSSParserImpl::ParseCalcMultiplicativeEx
 {
   MOZ_ASSERT(aVariantMask != 0, "unexpected variant mask");
   bool gotValue = false; // already got the part with the unit
   bool afterDivision = false;
 
   nsCSSValue *storage = &aValue;
   for (;;) {
     uint32_t variantMask;
-    if (afterDivision || gotValue) {
+    if (aVariantMask & VARIANT_INTEGER) {
+      MOZ_ASSERT(aVariantMask == VARIANT_INTEGER,
+                 "integers in calc expressions can't be mixed with anything "
+                 "else.");
+      variantMask = aVariantMask;
+    } else if (afterDivision || gotValue) {
+      // At this point in the calc expression, we expect a coefficient or a
+      // divisor, which must be a number. (Not a length/%/etc.)
       variantMask = VARIANT_NUMBER;
     } else {
+      // At this point in the calc expression, we'll accept a coefficient
+      // (a number) or a value of whatever type |aVariantMask| specifies.
       variantMask = aVariantMask | VARIANT_NUMBER;
     }
     if (!ParseCalcTerm(*storage, variantMask))
       return false;
     MOZ_ASSERT(variantMask != 0,
                "ParseCalcTerm did not set variantMask appropriately");
     MOZ_ASSERT(!(variantMask & VARIANT_NUMBER) ||
                !(variantMask & ~int32_t(VARIANT_NUMBER)),
                "ParseCalcTerm did not set variantMask appropriately");
 
     if (variantMask & VARIANT_NUMBER) {
       // Simplify the value immediately so we can check for division by
       // zero.
-      ReduceNumberCalcOps ops;
+      mozilla::css::ReduceNumberCalcOps ops;
       float number = mozilla::css::ComputeCalc(*storage, ops);
       if (number == 0.0 && afterDivision)
         return false;
       storage->SetFloatValue(number, eCSSUnit_Number);
     } else {
       gotValue = true;
 
       if (storage != &aValue) {
         // Simplify any numbers in the Times_L position (which are
         // not simplified by the check above).
         MOZ_ASSERT(storage == &aValue.GetArrayValue()->Item(1),
                    "unexpected relationship to current storage");
         nsCSSValue &leftValue = aValue.GetArrayValue()->Item(0);
-        ReduceNumberCalcOps ops;
-        float number = mozilla::css::ComputeCalc(leftValue, ops);
-        leftValue.SetFloatValue(number, eCSSUnit_Number);
+        if (variantMask & VARIANT_INTEGER) {
+          mozilla::css::ReduceIntegerCalcOps ops;
+          int integer = mozilla::css::ComputeCalc(leftValue, ops);
+          leftValue.SetIntValue(integer, eCSSUnit_Integer);
+        } else {
+          mozilla::css::ReduceNumberCalcOps ops;
+          float number = mozilla::css::ComputeCalc(leftValue, ops);
+          leftValue.SetFloatValue(number, eCSSUnit_Number);
+        }
       }
     }
 
     bool hadWS = RequireWhitespace();
     if (!GetToken(false)) {
       *aHadFinalWS = hadWS;
       break;
     }
     nsCSSUnit unit;
     if (mToken.IsSymbol('*')) {
       unit = gotValue ? eCSSUnit_Calc_Times_R : eCSSUnit_Calc_Times_L;
       afterDivision = false;
     } else if (mToken.IsSymbol('/')) {
+      if (variantMask & VARIANT_INTEGER) {
+        // Integers aren't mixed with anything else (see the assert at the top
+        // of CSSParserImpl::ParseCalc).
+        // We don't allow division at all in calc()s for expressions where an
+        // integer is expected, because calc() division can't be resolved to
+        // an integer, as implied by spec text about '/' here:
+        // https://drafts.csswg.org/css-values-3/#calc-type-checking
+        // We've consumed the '/' token, but it doesn't matter as we're in an
+        // error-handling situation where we've already consumed a lot of
+        // other tokens (e.g. the token before the '/'). ParseVariant will
+        // indicate this with CSSParseResult::Error.
+        return false;
+      }
       unit = eCSSUnit_Calc_Divided;
       afterDivision = true;
     } else {
       UngetToken();
       *aHadFinalWS = hadWS;
       break;
     }
 
@@ -13848,25 +13868,34 @@ CSSParserImpl::ParseCalcTerm(nsCSSValue&
         !ExpectSymbol(')', true)) {
       SkipUntil(')');
       return false;
     }
     return true;
   }
   // ... or just a value
   UngetToken();
-  // Always pass VARIANT_NUMBER to ParseVariant so that unitless zero
-  // always gets picked up
-  if (ParseVariant(aValue, aVariantMask | VARIANT_NUMBER, nullptr) !=
-      CSSParseResult::Ok) {
-    return false;
-  }
-  // ...and do the VARIANT_NUMBER check ourselves.
-  if (!(aVariantMask & VARIANT_NUMBER) && aValue.GetUnit() == eCSSUnit_Number) {
-    return false;
+  if (aVariantMask & VARIANT_INTEGER) {
+    // Integers aren't mixed with anything else (see the assert at the
+    // top of CSSParserImpl::ParseCalc).
+    if (ParseVariant(aValue, aVariantMask, nullptr) != CSSParseResult::Ok) {
+      return false;
+    }
+  } else {
+    // Always pass VARIANT_NUMBER to ParseVariant so that unitless zero
+    // always gets picked up (we want to catch unitless zeroes using
+    // VARIANT_NUMBER and then error out)
+    if (ParseVariant(aValue, aVariantMask | VARIANT_NUMBER, nullptr) !=
+        CSSParseResult::Ok) {
+      return false;
+    }
+    // ...and do the VARIANT_NUMBER check ourselves.
+    if (!(aVariantMask & VARIANT_NUMBER) && aValue.GetUnit() == eCSSUnit_Number) {
+      return false;
+    }
   }
   // If we did the value parsing, we need to adjust aVariantMask to
   // reflect which option we took (see above).
   if (aVariantMask & VARIANT_NUMBER) {
     if (aValue.GetUnit() == eCSSUnit_Number) {
       aVariantMask = VARIANT_NUMBER;
     } else {
       aVariantMask &= ~int32_t(VARIANT_NUMBER);
--- a/layout/style/nsCSSValue.cpp
+++ b/layout/style/nsCSSValue.cpp
@@ -948,17 +948,17 @@ struct CSSValueSerializeCalcOps {
   {
     MOZ_ASSERT(aValue.GetUnit() == eCSSUnit_Percent ||
                aValue.IsLengthUnit() ||
                aValue.GetUnit() == eCSSUnit_Number,
                "unexpected unit");
     aValue.AppendToString(mProperty, mResult, mValueSerialization);
   }
 
-  void AppendNumber(const input_type& aValue)
+  void AppendCoefficient(const input_type& aValue)
   {
     MOZ_ASSERT(aValue.GetUnit() == eCSSUnit_Number, "unexpected unit");
     aValue.AppendToString(mProperty, mResult, mValueSerialization);
   }
 
 private:
   nsCSSPropertyID mProperty;
   nsAString &mResult;
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -322,18 +322,23 @@ static nscoord CalcLengthWith(const nsCS
                               const nsStyleFont* aStyleFont,
                               nsStyleContext* aStyleContext,
                               nsPresContext* aPresContext,
                               bool aUseProvidedRootEmSize,
                               bool aUseUserFontSet,
                               RuleNodeCacheConditions& aConditions);
 
 struct CalcLengthCalcOps : public css::BasicCoordCalcOps,
-                           public css::NumbersAlreadyNormalizedOps
-{
+                           public css::FloatCoeffsAlreadyNormalizedOps
+{
+  // Declare that we have floats as coefficients so that we unambiguously
+  // resolve coeff_type (BasicCoordCalcOps and FloatCoeffsAlreadyNormalizedOps
+  // both have |typedef float coeff_type|).
+  typedef float coeff_type;
+
   // All of the parameters to CalcLengthWith except aValue.
   const nscoord mFontSize;
   const nsStyleFont* const mStyleFont;
   nsStyleContext* const mStyleContext;
   nsPresContext* const mPresContext;
   const bool mUseProvidedRootEmSize;
   const bool mUseUserFontSet;
   RuleNodeCacheConditions& mConditions;
@@ -662,17 +667,17 @@ nsRuleNode::CalcLengthWithInitialFont(ns
 {
   nsStyleFont defaultFont(aPresContext); // FIXME: best language?
   RuleNodeCacheConditions conditions;
   return CalcLengthWith(aValue, -1, &defaultFont,
                         nullptr, aPresContext,
                         true, false, conditions);
 }
 
-struct LengthPercentPairCalcOps : public css::NumbersAlreadyNormalizedOps
+struct LengthPercentPairCalcOps : public css::FloatCoeffsAlreadyNormalizedOps
 {
   typedef nsRuleNode::ComputedCalc result_type;
 
   LengthPercentPairCalcOps(nsStyleContext* aContext,
                            nsPresContext* aPresContext,
                            RuleNodeCacheConditions& aConditions)
     : mContext(aContext),
       mPresContext(aPresContext),
@@ -3313,18 +3318,23 @@ nsRuleNode::FindNextLargerFontSize(nscoo
   }
   else { // smaller than HTML table, increase by 1px
     largerSize = NSCoordSaturatingAdd(aFontSize, onePx);
   }
   return largerSize;
 }
 
 struct SetFontSizeCalcOps : public css::BasicCoordCalcOps,
-                            public css::NumbersAlreadyNormalizedOps
-{
+                            public css::FloatCoeffsAlreadyNormalizedOps
+{
+  // Declare that we have floats as coefficients so that we unambiguously
+  // resolve coeff_type (BasicCoordCalcOps and FloatCoeffsAlreadyNormalizedOps
+  // both have |typedef float coeff_type|).
+  typedef float coeff_type;
+
   // The parameters beyond aValue that we need for CalcLengthWith.
   const nscoord mParentSize;
   const nsStyleFont* const mParentFont;
   nsPresContext* const mPresContext;
   const bool mAtRoot;
   RuleNodeCacheConditions& mConditions;
 
   SetFontSizeCalcOps(nscoord aParentSize, const nsStyleFont* aParentFont,
@@ -4444,17 +4454,17 @@ TruncateStringToSingleGrapheme(nsAString
 }
 
 struct LineHeightCalcObj
 {
   float mLineHeight;
   bool mIsNumber;
 };
 
-struct SetLineHeightCalcOps : public css::NumbersAlreadyNormalizedOps
+struct SetLineHeightCalcOps : public css::FloatCoeffsAlreadyNormalizedOps
 {
   typedef LineHeightCalcObj result_type;
   nsStyleContext* const mStyleContext;
   nsPresContext* const mPresContext;
   RuleNodeCacheConditions& mConditions;
 
   SetLineHeightCalcOps(nsStyleContext* aStyleContext,
                        nsPresContext* aPresContext,
--- a/layout/svg/nsSVGIntegrationUtils.cpp
+++ b/layout/svg/nsSVGIntegrationUtils.cpp
@@ -473,20 +473,19 @@ PaintMaskSurface(const PaintFramesParams
                                          cssPxToDevPxMatrix,
                                          aOpacity,
                                          &svgMaskMatrix,
                                          svgReset->mMask.mLayers[i].mMaskMode);
       if (svgMask) {
         gfxContextMatrixAutoSaveRestore matRestore(maskContext);
 
         maskContext->Multiply(ThebesMatrix(svgMaskMatrix));
-        Rect drawRect = IntRectToRect(IntRect(IntPoint(0, 0), svgMask->GetSize()));
         aMaskDT->MaskSurface(ColorPattern(Color(0.0, 0.0, 0.0, 1.0)), svgMask,
-                            drawRect.TopLeft(),
-                            DrawOptions(1.0, compositionOp));
+                             Point(0, 0),
+                             DrawOptions(1.0, compositionOp));
       }
     } else {
       gfxContextMatrixAutoSaveRestore matRestore(maskContext);
 
       maskContext->Multiply(gfxMatrix::Translation(-devPixelOffsetToUserSpace));
       nsRenderingContext rc(maskContext);
       nsCSSRendering::PaintBGParams  params =
         nsCSSRendering::PaintBGParams::ForSingleLayer(*presContext,
@@ -699,47 +698,100 @@ nsSVGIntegrationUtils::IsMaskResourceRea
 }
 
 DrawResult
 nsSVGIntegrationUtils::PaintMask(const PaintFramesParams& aParams)
 {
   nsSVGUtils::MaskUsage maskUsage;
   nsSVGUtils::DetermineMaskUsage(aParams.frame, aParams.handleOpacity,
                                  maskUsage);
-  MOZ_ASSERT(maskUsage.shouldGenerateMaskLayer);
+  MOZ_ASSERT(maskUsage.shouldGenerateMaskLayer ||
+             maskUsage.shouldGenerateClipMaskLayer);
 
   nsIFrame* frame = aParams.frame;
   if (!ValidateSVGFrame(frame)) {
     return DrawResult::SUCCESS;
   }
 
   if (maskUsage.opacity == 0.0f) {
     return DrawResult::SUCCESS;
   }
 
   gfxContext& ctx = aParams.ctx;
-
-  gfxContextMatrixAutoSaveRestore matSR(&ctx);
-
   nsIFrame* firstFrame =
     nsLayoutUtils::FirstContinuationOrIBSplitSibling(frame);
   nsSVGEffects::EffectProperties effectProperties =
     nsSVGEffects::GetEffectProperties(firstFrame);
-  nsTArray<nsSVGMaskFrame *> maskFrames = effectProperties.GetMaskFrames();
-  bool opacityApplied = !HasNonSVGMask(maskFrames);
 
+  DrawResult result = DrawResult::SUCCESS;
   nsPoint offsetToBoundingBox;
   nsPoint offsetToUserSpace;
-  SetupContextMatrix(frame, aParams, offsetToBoundingBox,
-                     offsetToUserSpace, false);
+  gfxContextMatrixAutoSaveRestore matSR;
+  DrawTarget* target = ctx.GetDrawTarget();
+
+  // Paint mask onto ctx.
+  if (maskUsage.shouldGenerateMaskLayer) {
+    matSR.SetContext(&ctx);
+
+    SetupContextMatrix(frame, aParams, offsetToBoundingBox,
+                       offsetToUserSpace, false);
+    nsTArray<nsSVGMaskFrame *> maskFrames = effectProperties.GetMaskFrames();
+    bool opacityApplied = !HasNonSVGMask(maskFrames);
+    result = PaintMaskSurface(aParams, target,
+                              opacityApplied ? maskUsage.opacity : 1.0,
+                              firstFrame->StyleContext(), maskFrames,
+                              ctx.CurrentMatrix(), offsetToUserSpace);
+    if (result != DrawResult::SUCCESS) {
+      return result;
+    }
+  }
+
+  // Paint clip-path onto ctx.
+  if (maskUsage.shouldGenerateClipMaskLayer) {
+    matSR.Restore();
+    matSR.SetContext(&ctx);
+
+    SetupContextMatrix(firstFrame, aParams, offsetToBoundingBox,
+                       offsetToUserSpace, false);
+    Matrix clipMaskTransform;
+    gfxMatrix cssPxToDevPxMatrix = GetCSSPxToDevPxMatrix(frame);
 
-  return PaintMaskSurface(aParams, ctx.GetDrawTarget(),
-                            opacityApplied ? maskUsage.opacity : 1.0,
-                            firstFrame->StyleContext(), maskFrames,
-                            ctx.CurrentMatrix(), offsetToUserSpace);
+    bool isOK = true;
+    nsSVGClipPathFrame *clipPathFrame =
+      effectProperties.GetClipPathFrame(&isOK);
+    // XXX Bug 1317636. Split nsSVGClipPathFrame::GetClipMask into two
+    // functions:
+    // 1. nsSVGClipPathFrame::CreateClipMask
+    //    Create an A8 surface with right size for painting clip-path mask.
+    // 2. nsSVGClipPathFrame::PaintClipMask
+    //    Paint the content of clip-path _direct_ onto a given A8 surface.
+    // With this change, we can skip one extra draw call
+    // (DrawTarget::MaskSurface) bellow.
+    RefPtr<SourceSurface> clipMaskSurface =
+      clipPathFrame->GetClipMask(ctx, frame, cssPxToDevPxMatrix,
+                                 &clipMaskTransform, nullptr,
+                                 ToMatrix(ctx.CurrentMatrix()), &result);
+
+    if (clipMaskSurface) {
+      gfxContextMatrixAutoSaveRestore matRestore(&ctx);
+      ctx.Multiply(ThebesMatrix(clipMaskTransform));
+      CompositionOp op = maskUsage.shouldGenerateMaskLayer
+                         ? CompositionOp::OP_IN : CompositionOp::OP_OVER;
+      target->MaskSurface(ColorPattern(Color(0.0, 0.0, 0.0, 1.0)),
+                          clipMaskSurface,
+                          Point(),
+                          DrawOptions(1.0, op));
+    } else {
+      // Either entire surface is clipped out, or gfx buffer allocation
+      // failure in nsSVGClipPathFrame::GetClipMask.
+      return result;
+    }
+  }
+
+  return result;
 }
 
 DrawResult
 nsSVGIntegrationUtils::PaintMaskAndClipPath(const PaintFramesParams& aParams)
 {
   MOZ_ASSERT(UsingMaskOrClipPathForFrame(aParams.frame),
              "Should not use this method when no mask or clipPath effect"
              "on this frame");
@@ -823,25 +875,25 @@ nsSVGIntegrationUtils::PaintMaskAndClipP
     }
 
     if (maskUsage.shouldGenerateClipMaskLayer) {
       matSR.Restore();
       matSR.SetContext(&context);
 
       SetupContextMatrix(firstFrame, aParams, offsetToBoundingBox,
                          offsetToUserSpace, false);
-      Matrix clippedMaskTransform;
+      Matrix clipMaskTransform;
       RefPtr<SourceSurface> clipMaskSurface =
         clipPathFrame->GetClipMask(context, frame, cssPxToDevPxMatrix,
-                                   &clippedMaskTransform, maskSurface,
+                                   &clipMaskTransform, maskSurface,
                                    maskTransform, &result);
 
       if (clipMaskSurface) {
         maskSurface = clipMaskSurface;
-        maskTransform = clippedMaskTransform;
+        maskTransform = clipMaskTransform;
       } else {
         // Either entire surface is clipped out, or gfx buffer allocation
         // failure in nsSVGClipPathFrame::GetClipMask.
         return result;
       }
     }
 
     // opacity != 1.0f.
--- a/media/webrtc/moz.build
+++ b/media/webrtc/moz.build
@@ -117,9 +117,10 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'gonk
         GYP_DIRS['signalingtest'].variables.update(
             build_for_test=1,
             moz_webrtc_mediacodec=0,
             build_for_standalone=0
         )
         GYP_DIRS['signalingtest'].sandbox_vars['ALLOW_COMPILER_WARNINGS'] = True
         GYP_DIRS['signalingtest'].non_unified_sources += signaling_non_unified_sources
 
-DIRS += ['signaling/fuzztest']
+if CONFIG['ENABLE_TESTS']:
+    DIRS += ['signaling/fuzztest']
rename from media/webrtc/signaling/test/jsep_session_unittest.cpp
rename to media/webrtc/signaling/gtest/jsep_session_unittest.cpp
--- a/media/webrtc/signaling/test/jsep_session_unittest.cpp
+++ b/media/webrtc/signaling/gtest/jsep_session_unittest.cpp
@@ -11,43 +11,36 @@
 #include "nss.h"
 #include "ssl.h"
 
 #include "mozilla/RefPtr.h"
 #include "mozilla/Tuple.h"
 
 #define GTEST_HAS_RTTI 0
 #include "gtest/gtest.h"
-#include "gtest_utils.h"
-
-#include "FakeMediaStreams.h"
-#include "FakeMediaStreamsImpl.h"
-#include "FakeLogging.h"
 
 #include "signaling/src/sdp/SdpMediaSection.h"
 #include "signaling/src/sdp/SipccSdpParser.h"
 #include "signaling/src/jsep/JsepCodecDescription.h"
 #include "signaling/src/jsep/JsepTrack.h"
 #include "signaling/src/jsep/JsepSession.h"
 #include "signaling/src/jsep/JsepSessionImpl.h"
 #include "signaling/src/jsep/JsepTrack.h"
 
-#include "mtransport_test_utils.h"
-
-#include "FakeIPC.h"
-#include "FakeIPC.cpp"
-
-#include "TestHarness.h"
-
 namespace mozilla {
 static std::string kAEqualsCandidate("a=candidate:");
 const static size_t kNumCandidatesPerComponent = 3;
 
 class JsepSessionTestBase : public ::testing::Test
 {
+public:
+  static void SetUpTestCase() {
+    NSS_NoDB_Init(nullptr);
+    NSS_SetDomesticPolicy();
+  }
 };
 
 class FakeUuidGenerator : public mozilla::JsepUuidGenerator
 {
 public:
   bool
   Generate(std::string* str)
   {
@@ -4215,21 +4208,8 @@ TEST_F(JsepSessionTest, TestNonDefaultPr
   ASSERT_EQ(3U, parsedOffer->GetMediaSectionCount());
   ASSERT_EQ(SdpMediaSection::kRtpSavpf,
             parsedOffer->GetMediaSection(0).GetProtocol());
   ASSERT_EQ(SdpMediaSection::kRtpSavpf,
             parsedOffer->GetMediaSection(1).GetProtocol());
 }
 
 } // namespace mozilla
-
-int
-main(int argc, char** argv)
-{
-  // Prevents some log spew
-  ScopedXPCOM xpcom("jsep_session_unittest");
-
-  NSS_NoDB_Init(nullptr);
-  NSS_SetDomesticPolicy();
-
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
rename from media/webrtc/signaling/test/jsep_track_unittest.cpp
rename to media/webrtc/signaling/gtest/jsep_track_unittest.cpp
--- a/media/webrtc/signaling/test/jsep_track_unittest.cpp
+++ b/media/webrtc/signaling/gtest/jsep_track_unittest.cpp
@@ -1,34 +1,21 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=2 et sw=2 tw=80: */
 /* 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/. */
 
 #define GTEST_HAS_RTTI 0
 #include "gtest/gtest.h"
-#include "gtest_utils.h"
-
-// Magic linker includes :(
-#include "FakeMediaStreams.h"
-#include "FakeMediaStreamsImpl.h"
-#include "FakeLogging.h"
 
 #include "signaling/src/jsep/JsepTrack.h"
 #include "signaling/src/sdp/SipccSdp.h"
 #include "signaling/src/sdp/SdpHelper.h"
 
-#include "mtransport_test_utils.h"
-
-#include "FakeIPC.h"
-#include "FakeIPC.cpp"
-
-#include "TestHarness.h"
-
 namespace mozilla {
 
 class JsepTrackTest : public ::testing::Test
 {
   public:
     JsepTrackTest() {}
 
     std::vector<JsepCodecDescription*>
@@ -1251,19 +1238,8 @@ TEST_F(JsepTrackTest, NonDefaultOpusPara
   VERIFY_OPUS_FORCE_MONO(*mSendAns, false);
   VERIFY_OPUS_MAX_PLAYBACK_RATE(*mRecvOff, 0U);
   VERIFY_OPUS_FORCE_MONO(*mRecvOff, false);
   VERIFY_OPUS_MAX_PLAYBACK_RATE(*mRecvAns, 16000U);
   VERIFY_OPUS_FORCE_MONO(*mRecvAns, true);
 }
 
 } // namespace mozilla
-
-int
-main(int argc, char** argv)
-{
-  // Prevents some log spew
-  ScopedXPCOM xpcom("jsep_track_unittest");
-
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
--- a/media/webrtc/signaling/gtest/moz.build
+++ b/media/webrtc/signaling/gtest/moz.build
@@ -12,16 +12,18 @@ if CONFIG['OS_TARGET'] != 'WINNT' and CO
       '/ipc/chromium/src',
       '/media/mtransport',
       '/media/webrtc/',
       '/media/webrtc/signaling/src/common/time_profiling',
       '/media/webrtc/signaling/src/peerconnection',
     ]
 
     SOURCES += [
+        'jsep_session_unittest.cpp',
+        'jsep_track_unittest.cpp',
         'sdp_unittests.cpp',
     ]
 
     FINAL_LIBRARY = 'xul-gtest'
 
 if CONFIG['GNU_CXX']:
     CXXFLAGS += ['-Wno-error=shadow']
 
--- a/media/webrtc/signaling/test/moz.build
+++ b/media/webrtc/signaling/test/moz.build
@@ -2,18 +2,16 @@
 # vim: set filetype=python:
 # 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/.
 
 # TODO: bug 1172551 - get these tests working on iOS
 if CONFIG['OS_TARGET'] != 'WINNT' and CONFIG['MOZ_WIDGET_TOOLKIT'] != 'gonk' and CONFIG['MOZ_WIDGET_TOOLKIT'] != 'uikit':
     GeckoCppUnitTests([
-        'jsep_session_unittest',
-        'jsep_track_unittest',
         'mediaconduit_unittests',
         'mediapipeline_unittest',
         'signaling_unittests',
     ])
 
 include('/ipc/chromium/chromium-config.mozbuild')
 include('common.build')
 
--- a/mobile/android/base/aidl/org/mozilla/gecko/media/ICodec.aidl
+++ b/mobile/android/base/aidl/org/mozilla/gecko/media/ICodec.aidl
@@ -8,17 +8,17 @@ package org.mozilla.gecko.media;
 import android.os.Bundle;
 import android.view.Surface;
 import org.mozilla.gecko.media.FormatParam;
 import org.mozilla.gecko.media.ICodecCallbacks;
 import org.mozilla.gecko.media.Sample;
 
 interface ICodec {
     void setCallbacks(in ICodecCallbacks callbacks);
-    boolean configure(in FormatParam format, inout Surface surface, int flags);
+    boolean configure(in FormatParam format, inout Surface surface, int flags, in String drmStubId);
     oneway void start();
     oneway void stop();
     oneway void flush();
     oneway void release();
 
     Sample dequeueInput(int size);
     oneway void queueInput(in Sample sample);
 
--- a/mobile/android/base/java/org/mozilla/gecko/home/HomeAdapter.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/HomeAdapter.java
@@ -195,17 +195,17 @@ public class HomeAdapter extends Fragmen
             return mPanelConfig.getTitle();
         }
 
         public String getClassName(Context context) {
             final PanelType type = mPanelConfig.getType();
 
             // Override top_sites with ActivityStream panel when enabled
             // PanelType.toString() returns the panel id
-            if (type.toString() == "top_sites" &&
+            if ("top_sites".equals(type.toString()) &&
                 ActivityStream.isEnabled(context) &&
                 ActivityStream.isHomePanel()) {
                 return ActivityStreamHomeFragment.class.getName();
             }
             return type.getPanelClass().getName();
         }
 
         public Bundle getArgs() {
--- a/mobile/android/base/java/org/mozilla/gecko/javaaddons/JavaAddonManagerV1.java
+++ b/mobile/android/base/java/org/mozilla/gecko/javaaddons/JavaAddonManagerV1.java
@@ -121,19 +121,20 @@ public class JavaAddonManagerV1 implemen
                     if (callback == null) {
                         throw new IllegalArgumentException("callback must not be null");
                     }
                     final String guid = message.getString("guid");
                     final EventDispatcherImpl dispatcher = mGUIDToDispatcherMap.remove(guid);
                     if (dispatcher == null) {
                         Log.w(LOGTAG, "Attempting to unload addon with unknown associated dispatcher; ignoring.");
                         callback.sendSuccess(false);
+                    } else {
+                        dispatcher.unregisterAllEventListeners();
+                        callback.sendSuccess(true);
                     }
-                    dispatcher.unregisterAllEventListeners();
-                    callback.sendSuccess(true);
                 }
                 break;
             }
         } catch (Exception e) {
             Log.e(LOGTAG, "Exception handling message [" + event + "]", e);
             if (callback != null) {
                 callback.sendError("Exception handling message [" + event + "]: " + e.toString());
             }
--- a/mobile/android/base/java/org/mozilla/gecko/media/AsyncCodec.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/AsyncCodec.java
@@ -1,15 +1,17 @@
 /* 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/. */
 
 package org.mozilla.gecko.media;
 
 import android.media.MediaCodec.BufferInfo;
+import android.media.MediaCodec.CryptoInfo;
+import android.media.MediaCrypto;
 import android.media.MediaFormat;
 import android.os.Handler;
 import android.view.Surface;
 
 import java.nio.ByteBuffer;
 
 // A wrapper interface that mimics the new {@link android.media.MediaCodec}
 // asynchronous mode API in Lollipop.
@@ -17,18 +19,19 @@ public interface AsyncCodec {
     public interface Callbacks {
         void onInputBufferAvailable(AsyncCodec codec, int index);
         void onOutputBufferAvailable(AsyncCodec codec, int index, BufferInfo info);
         void onError(AsyncCodec codec, int error);
         void onOutputFormatChanged(AsyncCodec codec, MediaFormat format);
     }
 
     public abstract void setCallbacks(Callbacks callbacks, Handler handler);
-    public abstract void configure(MediaFormat format, Surface surface, int flags);
+    public abstract void configure(MediaFormat format, Surface surface, MediaCrypto crypto, int flags);
     public abstract void start();
     public abstract void stop();
     public abstract void flush();
     public abstract void release();
     public abstract ByteBuffer getInputBuffer(int index);
     public abstract ByteBuffer getOutputBuffer(int index);
     public abstract void queueInputBuffer(int index, int offset, int size, long presentationTimeUs, int flags);
+    public abstract void queueSecureInputBuffer(int index, int offset, CryptoInfo info, long presentationTimeUs, int flags);
     public abstract void releaseOutputBuffer(int index, boolean render);
 }
--- a/mobile/android/base/java/org/mozilla/gecko/media/Codec.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/Codec.java
@@ -2,16 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.media;
 
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecList;
+import android.media.MediaCrypto;
 import android.media.MediaFormat;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.TransactionTooLargeException;
 import android.util.Log;
 import android.view.Surface;
 
 import java.io.IOException;
@@ -162,30 +163,36 @@ import java.util.concurrent.ConcurrentLi
 
         private void feedSampleToBuffer() {
             while (!mAvailableInputBuffers.isEmpty() && !mInputSamples.isEmpty()) {
                 int index = mAvailableInputBuffers.poll();
                 int len = 0;
                 Sample sample = mInputSamples.poll();
                 long pts = sample.info.presentationTimeUs;
                 int flags = sample.info.flags;
+                MediaCodec.CryptoInfo cryptoInfo = sample.cryptoInfo;
                 if (!sample.isEOS() && sample.buffer != null) {
                     len = sample.info.size;
                     ByteBuffer buf = mCodec.getInputBuffer(index);
                     try {
                         sample.writeToByteBuffer(buf);
                         mCallbacks.onInputExhausted();
                     } catch (IOException e) {
                         e.printStackTrace();
                     } catch (RemoteException e) {
                         e.printStackTrace();
                     }
                     mSamplePool.recycleInput(sample);
                 }
-                mCodec.queueInputBuffer(index, 0, len, pts, flags);
+
+                if (cryptoInfo != null) {
+                    mCodec.queueSecureInputBuffer(index, 0, cryptoInfo, pts, flags);
+                } else {
+                    mCodec.queueInputBuffer(index, 0, len, pts, flags);
+                }
             }
         }
 
         private synchronized void reset() {
             mInputSamples.clear();
             mAvailableInputBuffers.clear();
         }
    }
@@ -209,17 +216,20 @@ import java.util.concurrent.ConcurrentLi
         try {
             release();
         } catch (RemoteException e) {
             // Nowhere to report the error.
         }
     }
 
     @Override
-    public synchronized boolean configure(FormatParam format, Surface surface, int flags) throws RemoteException {
+    public synchronized boolean configure(FormatParam format,
+                                          Surface surface,
+                                          int flags,
+                                          String drmStubId) throws RemoteException {
         if (mCallbacks == null) {
             Log.e(LOGTAG, "FAIL: callbacks must be set before calling configure()");
             return false;
         }
 
         if (mCodec != null) {
             if (DEBUG) Log.d(LOGTAG, "release existing codec: " + mCodec);
             releaseCodec();
@@ -231,18 +241,25 @@ import java.util.concurrent.ConcurrentLi
         String codecName = getDecoderForFormat(fmt);
         if (codecName == null) {
             Log.e(LOGTAG, "FAIL: cannot find codec");
             return false;
         }
 
         try {
             AsyncCodec codec = AsyncCodecFactory.create(codecName);
+
+            MediaCrypto crypto = RemoteMediaDrmBridgeStub.getMediaCrypto(drmStubId);
+            if (DEBUG) {
+                boolean hasCrypto = crypto != null;
+                Log.d(LOGTAG, "configure mediacodec with crypto(" + hasCrypto + ") / Id :" + drmStubId);
+            }
+
             codec.setCallbacks(new Callbacks(mCallbacks), null);
-            codec.configure(fmt, surface, flags);
+            codec.configure(fmt, surface, crypto, flags);
             mCodec = codec;
             mInputProcessor = new InputProcessor();
             mSamplePool = new SamplePool(codecName);
             if (DEBUG) Log.d(LOGTAG, codec.toString() + " created");
             return true;
         } catch (Exception e) {
             if (DEBUG) Log.d(LOGTAG, "FAIL: cannot create codec -- " + codecName);
             e.printStackTrace();
--- a/mobile/android/base/java/org/mozilla/gecko/media/CodecProxy.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/CodecProxy.java
@@ -23,16 +23,17 @@ import java.nio.ByteBuffer;
 public final class CodecProxy {
     private static final String LOGTAG = "GeckoRemoteCodecProxy";
     private static final boolean DEBUG = false;
 
     private ICodec mRemote;
     private FormatParam mFormat;
     private Surface mOutputSurface;
     private CallbacksForwarder mCallbacks;
+    private String mRemoteDrmStubId;
 
     public interface Callbacks {
         void onInputExhausted();
         void onOutputFormatChanged(MediaFormat format);
         void onOutput(Sample output);
         void onError(boolean fatal);
     }
 
@@ -77,34 +78,41 @@ public final class CodecProxy {
         }
 
         public void reportError(boolean fatal) {
             mCallbacks.onError(fatal);
         }
     }
 
     @WrapForJNI
-    public static CodecProxy create(MediaFormat format, Surface surface, Callbacks callbacks) {
-        return RemoteManager.getInstance().createCodec(format, surface, callbacks);
+    public static CodecProxy create(MediaFormat format,
+                                    Surface surface,
+                                    Callbacks callbacks,
+                                    String drmStubId) {
+        return RemoteManager.getInstance().createCodec(format, surface, callbacks, drmStubId);
     }
 
-    public static CodecProxy createCodecProxy(MediaFormat format, Surface surface, Callbacks callbacks) {
-        return new CodecProxy(format, surface, callbacks);
+    public static CodecProxy createCodecProxy(MediaFormat format,
+                                              Surface surface,
+                                              Callbacks callbacks,
+                                              String drmStubId) {
+        return new CodecProxy(format, surface, callbacks, drmStubId);
     }
 
-    private CodecProxy(MediaFormat format, Surface surface, Callbacks callbacks) {
+    private CodecProxy(MediaFormat format, Surface surface, Callbacks callbacks, String drmStubId) {
         mFormat = new FormatParam(format);
         mOutputSurface = surface;
+        mRemoteDrmStubId = drmStubId;
         mCallbacks = new CallbacksForwarder(callbacks);
     }
 
     boolean init(ICodec remote) {
         try {
             remote.setCallbacks(mCallbacks);
-            remote.configure(mFormat, mOutputSurface, 0);
+            remote.configure(mFormat, mOutputSurface, 0, mRemoteDrmStubId);
             remote.start();
         } catch (RemoteException e) {
             e.printStackTrace();
             return false;
         }
 
         mRemote = remote;
         return true;
@@ -123,17 +131,16 @@ public final class CodecProxy {
     }
 
     @WrapForJNI
     public synchronized boolean input(ByteBuffer bytes, BufferInfo info, CryptoInfo cryptoInfo) {
         if (mRemote == null) {
             Log.e(LOGTAG, "cannot send input to an ended codec");
             return false;
         }
-
         try {
             Sample sample = (info.flags == MediaCodec.BUFFER_FLAG_END_OF_STREAM) ?
                     Sample.EOS : mRemote.dequeueInput(info.size).set(bytes, info, cryptoInfo);
             mRemote.queueInput(sample);
             sample.dispose();
         } catch (IOException e) {
             e.printStackTrace();
             return false;
--- a/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
@@ -16,24 +16,26 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.UUID;
 import java.util.ArrayDeque;
 
 import android.annotation.SuppressLint;
 import android.os.AsyncTask;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.media.DeniedByServerException;
 import android.media.MediaCrypto;
 import android.media.MediaCryptoException;
 import android.media.MediaDrm;
 import android.media.MediaDrmException;
+import android.media.NotProvisionedException;
 import android.util.Log;
 
 public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm {
-    private static final String LOGTAG = "GeckoMediaDrmBridgeV21";
+    protected final String LOGTAG;
     private static final String INVALID_SESSION_ID = "Invalid";
     private static final String WIDEVINE_KEY_SYSTEM = "com.widevine.alpha";
     private static final boolean DEBUG = false;
     private static final UUID WIDEVINE_SCHEME_UUID =
         new UUID(0xedef8ba979d64aceL, 0xa3c827dcd51d21edL);
     // MediaDrm.KeyStatus information listener is supported on M+, adding a
     // dummy key id to report key status.
     private static final byte[] DUMMY_KEY_ID = new byte[] {0};
@@ -93,17 +95,18 @@ public class GeckoMediaDrmBridgeV21 impl
         mDrm.setPropertyString("securityLevel", "L3");
         // Refer to chromium, set multi-session mode for Widevine.
         if (mSchemeUUID.equals(WIDEVINE_SCHEME_UUID)) {
             mDrm.setPropertyString("sessionSharing", "enable");
         }
     }
 
     GeckoMediaDrmBridgeV21(String keySystem) throws Exception {
-        if (DEBUG) Log.d(LOGTAG, "GeckoMediaDrmBridgeV21()");
+        LOGTAG = getClass().getSimpleName();
+        if (DEBUG) Log.d(LOGTAG, "GeckoMediaDrmBridgeV21 ctor");
 
         mProvisioningPromiseId = 0;
         mSessionIds = new HashSet<ByteBuffer>();
         mSessionMIMETypes = new HashMap<ByteBuffer, String>();
         mPendingCreateSessionDataQueue = new ArrayDeque<PendingCreateSessionData>();
 
         mSchemeUUID = convertKeySystemToSchemeUUID(keySystem);
         mCryptoSessionId = null;
@@ -137,17 +140,16 @@ public class GeckoMediaDrmBridgeV21 impl
         if (mProvisioningPromiseId > 0 && mCrypto == null) {
             if (DEBUG) Log.d(LOGTAG, "Pending createSession because it's provisioning !");
             savePendingCreateSessionData(createSessionToken, promiseId,
                                          initData, initDataType);
             return;
         }
 
         ByteBuffer sessionId = null;
-        String strSessionId = null;
         try {
             boolean hasMediaCrypto = ensureMediaCryptoCreated();
             if (!hasMediaCrypto) {
                 onRejectPromise(promiseId, "MediaCrypto intance is not created !");
                 return;
             }
 
             sessionId = openSession();
@@ -165,19 +167,18 @@ public class GeckoMediaDrmBridgeV21 impl
             onSessionCreated(createSessionToken,
                              promiseId,
                              sessionId.array(),
                              request.getData());
             onSessionMessage(sessionId.array(),
                              LICENSE_REQUEST_INITIAL,
                              request.getData());
             mSessionMIMETypes.put(sessionId, initDataType);
-            strSessionId = new String(sessionId.array());
             mSessionIds.add(sessionId);
-            if (DEBUG) Log.d(LOGTAG, " StringID : " + strSessionId + " is put into mSessionIds ");
+            if (DEBUG) Log.d(LOGTAG, " StringID : " + new String(sessionId.array()) + " is put into mSessionIds ");
         } catch (android.media.NotProvisionedException e) {
             if (DEBUG) Log.d(LOGTAG, "Device not provisioned:" + e.getMessage());
             if (sessionId != null) {
                 // The promise of this createSession will be either resolved
                 // or rejected after provisioning.
                 mDrm.closeSession(sessionId.array());
             }
             savePendingCreateSessionData(createSessionToken, promiseId,
@@ -213,28 +214,20 @@ public class GeckoMediaDrmBridgeV21 impl
             }
             SessionKeyInfo[] keyInfos = new SessionKeyInfo[1];
             keyInfos[0] = new SessionKeyInfo(DUMMY_KEY_ID,
                                              MediaDrm.KeyStatus.STATUS_USABLE);
             onSessionBatchedKeyChanged(session.array(), keyInfos);
             if (DEBUG) Log.d(LOGTAG, "Key successfully added for session " + sessionId);
             onSessionUpdated(promiseId, session.array());
             return;
-        } catch (android.media.NotProvisionedException e) {
-            if (DEBUG) Log.d(LOGTAG, "Failed to provide key response:" + e.getMessage());
-            onSessionError(session.array(), "Got NotProvisionedException.");
-            onRejectPromise(promiseId, "Not provisioned during updateSession.");
-        } catch (android.media.DeniedByServerException e) {
-            if (DEBUG) Log.d(LOGTAG, "Failed to provide key response:" + e.getMessage());
-            onSessionError(session.array(), "Got DeniedByServerException.");
-            onRejectPromise(promiseId, "Denied by server during updateSession.");
-        } catch (java.lang.IllegalStateException e) {
-            if (DEBUG) Log.d(LOGTAG, "Exception when calling provideKeyResponse():" + e.getMessage());
-            onSessionError(session.array(), "Got IllegalStateException.");
-            onRejectPromise(promiseId, "Rejected during updateSession.");
+        } catch (final NotProvisionedException | DeniedByServerException | IllegalStateException e) {
+            if (DEBUG) Log.d(LOGTAG, "Failed to provide key response:", e);
+            onSessionError(session.array(), "Got exception during updateSession.");
+            onRejectPromise(promiseId, "Got exception during updateSession.");
         }
         release();
         return;
     }
 
     @Override
     public void closeSession(int promiseId, String sessionId) {
         if (DEBUG) Log.d(LOGTAG, "closeSession()");
@@ -366,30 +359,29 @@ public class GeckoMediaDrmBridgeV21 impl
             }
             ByteBuffer session = ByteBuffer.wrap(sessionArray);
             if (!sessionExists(session)) {
                 if (DEBUG) Log.d(LOGTAG, "MediaDrmListener: Invalid session.");
                 return;
             }
             // On L, these events are treated as exceptions and handled correspondingly.
             // Leaving this code block for logging message.
-            String sessionId = new String(session.array());
             switch (event) {
                 case MediaDrm.EVENT_PROVISION_REQUIRED:
                     if (DEBUG) Log.d(LOGTAG, "MediaDrm.EVENT_PROVISION_REQUIRED");
                     break;
                 case MediaDrm.EVENT_KEY_REQUIRED:
                     if (DEBUG) Log.d(LOGTAG, "MediaDrm.EVENT_KEY_REQUIRED");
                     // No need to handle here if we're not in privacy mode.
                     break;
                 case MediaDrm.EVENT_KEY_EXPIRED:
-                    if (DEBUG) Log.d(LOGTAG, "MediaDrm.EVENT_KEY_EXPIRED, sessionId=" + sessionId);
+                    if (DEBUG) Log.d(LOGTAG, "MediaDrm.EVENT_KEY_EXPIRED, sessionId=" + new String(session.array()));
                     break;
                 case MediaDrm.EVENT_VENDOR_DEFINED:
-                    if (DEBUG) Log.d(LOGTAG, "MediaDrm.EVENT_VENDOR_DEFINED, sessionId=" + sessionId);
+                    if (DEBUG) Log.d(LOGTAG, "MediaDrm.EVENT_VENDOR_DEFINED, sessionId=" + new String(session.array()));
                     break;
                 default:
                     if (DEBUG) Log.d(LOGTAG, "Invalid DRM event " + event);
                     return;
             }
         }
     }
 
@@ -409,17 +401,17 @@ public class GeckoMediaDrmBridgeV21 impl
         } catch (android.media.MediaDrmException e) {
             // Other MediaDrmExceptions (e.g. ResourceBusyException) are not
             // recoverable.
             release();
             return null;
         }
     }
 
-    private boolean sessionExists(ByteBuffer session) {
+    protected boolean sessionExists(ByteBuffer session) {
         if (mCryptoSessionId == null) {
             if (DEBUG) Log.d(LOGTAG, "Session doesn't exist because media crypto session is not created.");
             return false;
         }
         if (session == null) {
             if (DEBUG) Log.d(LOGTAG, "Session is null, not in map !");
             return false;
         }
@@ -587,19 +579,18 @@ public class GeckoMediaDrmBridgeV21 impl
             if (mCryptoSessionId == null) {
                 if (DEBUG) Log.d(LOGTAG, "Cannot open session for MediaCrypto");
                 return false;
             }
 
             if (MediaCrypto.isCryptoSchemeSupported(mSchemeUUID)) {
                 final byte [] cryptoSessionId = mCryptoSessionId.array();
                 mCrypto = new MediaCrypto(mSchemeUUID, cryptoSessionId);
-                String strCryptoSessionId = new String(cryptoSessionId);
                 mSessionIds.add(mCryptoSessionId);
-                if (DEBUG) Log.d(LOGTAG, "MediaCrypto successfully created! - SId " + INVALID_SESSION_ID + ", " + strCryptoSessionId);
+                if (DEBUG) Log.d(LOGTAG, "MediaCrypto successfully created! - SId " + INVALID_SESSION_ID + ", " + new String(cryptoSessionId));
                 return true;
             } else {
                 if (DEBUG) Log.d(LOGTAG, "Cannot create MediaCrypto for unsupported scheme.");
                 return false;
             }
         } catch (android.media.MediaCryptoException e) {
             if (DEBUG) Log.d(LOGTAG, "Cannot create MediaCrypto:" + e.getMessage());
             release();
--- a/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV23.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV23.java
@@ -1,23 +1,27 @@
 /* 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/. */
 
 package org.mozilla.gecko.media;
 
 import android.annotation.TargetApi;
+import android.media.DeniedByServerException;
+import android.media.NotProvisionedException;
+
 import static android.os.Build.VERSION_CODES.M;
 import android.media.MediaDrm;
 import android.util.Log;
+import java.lang.IllegalStateException;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
 import java.util.List;
 
 public class GeckoMediaDrmBridgeV23 extends GeckoMediaDrmBridgeV21 {
-
-    private static final String LOGTAG = "GeckoMediaDrmBridgeV23";
     private static final boolean DEBUG = false;
 
     GeckoMediaDrmBridgeV23(String keySystem) throws Exception {
         super(keySystem);
         if (DEBUG) Log.d(LOGTAG, "GeckoMediaDrmBridgeV23 ctor");
         mDrm.setOnKeyStatusChangeListener(new KeyStatusChangeListener(), null);
     }
 
@@ -34,11 +38,48 @@ public class GeckoMediaDrmBridgeV23 exte
             }
             SessionKeyInfo[] keyInfos = new SessionKeyInfo[keyInformation.size()];
             for (int i = 0; i < keyInformation.size(); i++) {
                 MediaDrm.KeyStatus keyStatus = keyInformation.get(i);
                 keyInfos[i] = new SessionKeyInfo(keyStatus.getKeyId(),
                                                  keyStatus.getStatusCode());
             }
             onSessionBatchedKeyChanged(sessionId, keyInfos);
+            if (DEBUG) Log.d(LOGTAG, "Key successfully added for session " + new String(sessionId));
         }
     }
+
+    @Override
+    public void updateSession(int promiseId,
+                              String sessionId,
+                              byte[] response) {
+        if (DEBUG) Log.d(LOGTAG, "updateSession(), sessionId = " + sessionId);
+        if (mDrm == null) {
+            onRejectPromise(promiseId, "MediaDrm instance doesn't exist !!");
+            return;
+        }
+
+        ByteBuffer session = ByteBuffer.wrap(sessionId.getBytes());
+        if (!sessionExists(session)) {
+            onRejectPromise(promiseId, "Invalid session during updateSession.");
+            return;
+        }
+
+        try {
+            final byte [] keySetId = mDrm.provideKeyResponse(session.array(), response);
+            if (DEBUG) {
+                HashMap<String, String> infoMap = mDrm.queryKeyStatus(session.array());
+                for (String strKey : infoMap.keySet()) {
+                    String strValue = infoMap.get(strKey);
+                    Log.d(LOGTAG, "InfoMap : key(" + strKey + ")/value(" + strValue + ")");
+                }
+            }
+            onSessionUpdated(promiseId, session.array());
+            return;
+        } catch (final NotProvisionedException | DeniedByServerException | IllegalStateException e) {
+            if (DEBUG) Log.d(LOGTAG, "Failed to provide key response:", e);
+            onSessionError(session.array(), "Got exception during updateSession.");
+            onRejectPromise(promiseId, "Got exception during updateSession.");
+        }
+        release();
+        return;
+    }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/media/JellyBeanAsyncCodec.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/JellyBeanAsyncCodec.java
@@ -1,15 +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/. */
 
 package org.mozilla.gecko.media;
 
 import android.media.MediaCodec;
+import android.media.MediaCrypto;
 import android.media.MediaFormat;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Message;
 import android.util.Log;
 import android.view.Surface;
 
@@ -289,20 +290,20 @@ final class JellyBeanAsyncCodec implemen
             // This thread has no looper. Use poller thread.
             looper = mBufferPoller.getLooper();
         }
         mCallbackSender = new CallbackSender(looper, callbacks);
         if (DEBUG) Log.d(LOGTAG, "setCallbacks(): sender=" + mCallbackSender);
     }
 
     @Override
-    public void configure(MediaFormat format, Surface surface, int flags) {
+    public void configure(MediaFormat format, Surface surface, MediaCrypto crypto, int flags) {
         assertCallbacks();
 
-        mCodec.configure(format, surface, null, flags);
+        mCodec.configure(format, surface, crypto, flags);
     }
 
     private void assertCallbacks() {
         if (mCallbackSender == null) {
             throw new IllegalStateException(LOGTAG + ": callback must be supplied with setCallbacks().");
         }
     }
 
@@ -332,16 +333,38 @@ final class JellyBeanAsyncCodec implemen
             return;
         }
 
         mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS);
         mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_OUTPUT_BUFFERS);
     }
 
     @Override
+    public final void queueSecureInputBuffer(int index,
+                                             int offset,
+                                             MediaCodec.CryptoInfo cryptoInfo,
+                                             long presentationTimeUs,
+                                             int flags) {
+        assertCallbacks();
+
+        mInputEnded = (flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0;
+
+        try {
+            mCodec.queueSecureInputBuffer(index, offset, cryptoInfo, presentationTimeUs, flags);
+        } catch (IllegalStateException e) {
+            e.printStackTrace();
+            mCallbackSender.notifyError(ERROR_CODEC);
+            return;
+        }
+
+        mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS);
+        mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_OUTPUT_BUFFERS);
+    }
+
+    @Override
     public final void releaseOutputBuffer(int index, boolean render) {
         assertCallbacks();
 
         mCodec.releaseOutputBuffer(index, render);
     }
 
     @Override
     public final ByteBuffer getInputBuffer(int index) {
--- a/mobile/android/base/java/org/mozilla/gecko/media/MediaDrmProxy.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/MediaDrmProxy.java
@@ -34,20 +34,22 @@ public final class MediaDrmProxy {
     private static final String VORBIS = "audio/vorbis";
     @WrapForJNI
     private static final String VP8 = "video/x-vnd.on2.vp8";
     @WrapForJNI
     private static final String VP9 = "video/x-vnd.on2.vp9";
     @WrapForJNI
     private static final String OPUS = "audio/opus";
 
+    public static ArrayList<MediaDrmProxy> sProxyList = new ArrayList<MediaDrmProxy>();
+
     // A flag to avoid using the native object that has been destroyed.
     private boolean mDestroyed;
     private GeckoMediaDrm mImpl;
-    public static ArrayList<MediaDrmProxy> mProxyList = new ArrayList<MediaDrmProxy>();
+    private String mDrmStubId;
 
     private static boolean isSystemSupported() {
         // Support versions >= LOLLIPOP
         if (AppConstants.Versions.preLollipop) {
             if (DEBUG) Log.d(LOGTAG, "System Not supported !!, current SDK version is " + Build.VERSION.SDK_INT);
             return false;
         }
         return true;
@@ -245,29 +247,36 @@ public final class MediaDrmProxy {
     public boolean isDestroyed() {
         return mDestroyed;
     }
 
     @WrapForJNI(calledFrom = "gecko")
     public static MediaDrmProxy create(String keySystem,
                                        Callbacks nativeCallbacks,
                                        boolean isRemote) {
-        // TODO: Will implement {Local,Remote}MediaDrmBridge instantiation by
-        // '''isRemote''' flag in Bug 1307818.
-        MediaDrmProxy proxy = new MediaDrmProxy(keySystem, nativeCallbacks);
+        MediaDrmProxy proxy = new MediaDrmProxy(keySystem, nativeCallbacks, isRemote);
         return proxy;
     }
 
-    MediaDrmProxy(String keySystem, Callbacks nativeCallbacks) {
+    MediaDrmProxy(String keySystem, Callbacks nativeCallbacks, boolean isRemote) {
         if (DEBUG) Log.d(LOGTAG, "Constructing MediaDrmProxy");
-        // TODO: Bug 1306185 will implement the LocalMediaDrmBridge as an impl
-        // of GeckoMediaDrm for in-process decoding mode.
-        //mImpl = new LocalMediaDrmBridge(keySystem);
-        mImpl.setCallbacks(new MediaDrmProxyCallbacks(this, nativeCallbacks));
-        mProxyList.add(this);
+        try {
+            mDrmStubId = UUID.randomUUID().toString();
+            if (isRemote) {
+                IMediaDrmBridge remoteBridge =
+                    RemoteManager.getInstance().createRemoteMediaDrmBridge(keySystem, mDrmStubId);
+                mImpl = new RemoteMediaDrmBridge(remoteBridge);
+            } else {
+                mImpl = new LocalMediaDrmBridge(keySystem);
+            }
+            mImpl.setCallbacks(new MediaDrmProxyCallbacks(this, nativeCallbacks));
+            sProxyList.add(this);
+        } catch (Exception e) {
+            Log.e(LOGTAG, "Constructing MediaDrmProxy ... error", e);
+        }
     }
 
     @WrapForJNI
     private void createSession(int createSessionToken,
                                int promiseId,
                                String initDataType,
                                byte[] initData) {
         if (DEBUG) Log.d(LOGTAG, "createSession, promiseId = " + promiseId);
@@ -284,24 +293,46 @@ public final class MediaDrmProxy {
     }
 
     @WrapForJNI
     private void closeSession(int promiseId, String sessionId) {
         if (DEBUG) Log.d(LOGTAG, "closeSession, primiseId(" + promiseId  + "sessionId(" + sessionId + ")");
         mImpl.closeSession(promiseId, sessionId);
     }
 
+    @WrapForJNI(calledFrom = "gecko")
+    private String getStubId() {
+        return mDrmStubId;
+    }
+
+    // Get corresponding MediaCrypto object by a generated UUID for MediaCodec.
+    // Will be called on MediaFormatReader's TaskQueue.
+    @WrapForJNI
+    public static MediaCrypto getMediaCrypto(String stubId) {
+        for (MediaDrmProxy proxy : sProxyList) {
+            if (proxy.getStubId().equals(stubId)) {
+                return proxy.getMediaCryptoFromBridge();
+            }
+        }
+        if (DEBUG) Log.d(LOGTAG, " NULL crytpo ");
+        return null;
+    }
+
     @WrapForJNI // Called when natvie object is destroyed.
     private void destroy() {
         if (DEBUG) Log.d(LOGTAG, "destroy!! Native object is destroyed.");
         if (mDestroyed) {
             return;
         }
         mDestroyed = true;
         release();
     }
 
     private void release() {
         if (DEBUG) Log.d(LOGTAG, "release");
-        mProxyList.remove(this);
+        sProxyList.remove(this);
         mImpl.release();
     }
+
+    private MediaCrypto getMediaCryptoFromBridge() {
+        return mImpl != null ? mImpl.getMediaCrypto() : null;
+    }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/media/RemoteManager.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/RemoteManager.java
@@ -115,24 +115,25 @@ public final class RemoteManager impleme
         }
         mConnectionLatch = null;
 
         return ok;
     }
 
     public synchronized CodecProxy createCodec(MediaFormat format,
                                                Surface surface,
-                                               CodecProxy.Callbacks callbacks) {
+                                               CodecProxy.Callbacks callbacks,
+                                               String drmStubId) {
         if (mRemote == null) {
             if (DEBUG) Log.d(LOGTAG, "createCodec failed due to not initialize");
             return null;
         }
         try {
             ICodec remote = mRemote.createCodec();
-            CodecProxy proxy = CodecProxy.createCodecProxy(format, surface, callbacks);
+            CodecProxy proxy = CodecProxy.createCodecProxy(format, surface, callbacks, drmStubId);
             if (proxy.init(remote)) {
                 mProxies.add(proxy);
                 return proxy;
             } else {
                 return null;
             }
         } catch (RemoteException e) {
             e.printStackTrace();
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -887,34 +887,49 @@ var BrowserApp = {
           type: "Image:SetAs",
           url: src
         });
       });
 
     NativeWindow.contextmenus.add(
       function(aTarget) {
         if (aTarget instanceof HTMLVideoElement) {
-          // If a video element is zero width or height, its essentially
-          // an HTMLAudioElement.
-          if (aTarget.videoWidth == 0 || aTarget.videoHeight == 0 )
+          if (aTarget.readyState == aTarget.HAVE_NOTHING) {
+            // We don't know if the height/width of the video,
+            // show a generic string.
+            return Strings.browser.GetStringFromName("contextmenu.saveMedia");
+          } else if (aTarget.videoWidth == 0 || aTarget.videoHeight == 0) {
+            // If a video element is zero width or height, its essentially
+            // an HTMLAudioElement.
             return Strings.browser.GetStringFromName("contextmenu.saveAudio");
+          }
           return Strings.browser.GetStringFromName("contextmenu.saveVideo");
         } else if (aTarget instanceof HTMLAudioElement) {
           return Strings.browser.GetStringFromName("contextmenu.saveAudio");
         }
         return Strings.browser.GetStringFromName("contextmenu.saveVideo");
       }, NativeWindow.contextmenus.mediaSaveableContext,
       function(aTarget) {
         UITelemetry.addEvent("action.1", "contextmenu", null, "web_save_media");
         UITelemetry.addEvent("save.1", "contextmenu", null, "media");
 
         let url = aTarget.currentSrc || aTarget.src;
-        let filePickerTitleKey = (aTarget instanceof HTMLVideoElement &&
-                                  (aTarget.videoWidth != 0 && aTarget.videoHeight != 0))
-                                  ? "SaveVideoTitle" : "SaveAudioTitle";
+
+        let filePickerTitleKey;
+        if (aTarget instanceof HTMLVideoElement) {
+          if (aTarget.readyState == aTarget.HAVE_NOTHING) {
+            filePickerTitleKey = "SaveMediaTitle";
+          } else if (aTarget.videoWidth == 0 || aTarget.videoHeight == 0) {
+            filePickerTitleKey = "SaveAudioTitle";
+          }
+          filePickerTitleKey = "SaveVideoTitle";
+        } else {
+          filePickerTitleKey = "SaveAudioTitle";
+        }
+
         // Skipped trying to pull MIME type out of cache for now
         ContentAreaUtils.internalSave(url, null, null, null, null, false,
                                       filePickerTitleKey, null, aTarget.ownerDocument.documentURIObject,
                                       aTarget.ownerDocument, true, null);
       });
 
     NativeWindow.contextmenus.add(stringGetter("contextmenu.showImage"),
       NativeWindow.contextmenus.imageBlockingPolicyContext,
--- a/mobile/android/locales/en-US/chrome/browser.properties
+++ b/mobile/android/locales/en-US/chrome/browser.properties
@@ -274,16 +274,20 @@ contextmenu.addSearchEngine3=Add Search 
 contextmenu.playMedia=Play
 contextmenu.pauseMedia=Pause
 contextmenu.shareMedia=Share Video
 contextmenu.showControls2=Show Controls
 contextmenu.mute=Mute
 contextmenu.unmute=Unmute
 contextmenu.saveVideo=Save Video
 contextmenu.saveAudio=Save Audio
+# LOCALIZATION NOTE (contextmenu.saveMedia):
+# The label that will be used in the contextmenu in place of "Save Video" or "Save Audio", for
+# unloaded video elements.
+contextmenu.saveMedia=Save Media
 contextmenu.addToContacts=Add to Contacts
 # LOCALIZATION NOTE (contextmenu.sendToDevice):
 # The label that will be used in the contextmenu and the pageaction
 contextmenu.sendToDevice=Send to Device
 
 contextmenu.copy=Copy
 contextmenu.cut=Cut
 contextmenu.selectAll=Select All
--- a/mobile/android/themes/core/config.css
+++ b/mobile/android/themes/core/config.css
@@ -56,17 +56,17 @@ body {
     width: 12em;
     min-width: 0;
     color: #000000;
     opacity: 1;
     flex: 1 1 auto;
 }
 
 #filter-input::placeholder {
-    color: rgba(255,255,255,0.5);
+    color: #777777;
 }
 
 .toolbar input {
     display: inline-block;
     height: 100%;
     min-width: 3em;
     box-sizing: border-box;
     opacity: 0.75;
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -1106,20 +1106,17 @@ pref("print.print_unwriteable_margin_bot
 // This is used by both Printing and Print Preview
 // Units are in 1/100ths of an inch.
 pref("print.print_edge_top", 0);
 pref("print.print_edge_left", 0);
 pref("print.print_edge_right", 0);
 pref("print.print_edge_bottom", 0);
 
 // Print via the parent process. This is only used when e10s is enabled.
-// For Mac, limit to Nightly.
-#if defined(XP_WIN)
-pref("print.print_via_parent", true);
-#elif defined(XP_MACOSX) && defined(NIGHTLY_BUILD)
+#if defined(XP_WIN) || defined(XP_MACOSX)
 pref("print.print_via_parent", true);
 #else
 pref("print.print_via_parent", false);
 #endif
 
 // Pref used by the spellchecker extension to control the
 // maximum number of misspelled words that will be underlined
 // in a document.
--- a/python/mozbuild/mozbuild/frontend/context.py
+++ b/python/mozbuild/mozbuild/frontend/context.py
@@ -1530,20 +1530,16 @@ VARIABLES = {
     'MARIONETTE_LAYOUT_MANIFESTS': (ManifestparserManifestList, list,
         """List of manifest files defining marionette-layout tests.
         """),
 
     'MARIONETTE_UNIT_MANIFESTS': (ManifestparserManifestList, list,
         """List of manifest files defining marionette-unit tests.
         """),
 
-    'MARIONETTE_UPDATE_MANIFESTS': (ManifestparserManifestList, list,
-        """List of manifest files defining marionette-update tests.
-        """),
-
     'MARIONETTE_WEBAPI_MANIFESTS': (ManifestparserManifestList, list,
         """List of manifest files defining marionette-webapi tests.
         """),
 
     'METRO_CHROME_MANIFESTS': (ManifestparserManifestList, list,
         """List of manifest files defining metro browser chrome tests.
         """),
 
--- a/python/mozbuild/mozbuild/frontend/emitter.py
+++ b/python/mozbuild/mozbuild/frontend/emitter.py
@@ -130,18 +130,16 @@ ALLOWED_XPCOM_GLUE = {
     ('test_service_init_background_thread', 'storage/test'),
     ('test_statement_scoper', 'storage/test'),
     ('test_StatementCache', 'storage/test'),
     ('test_transaction_helper', 'storage/test'),
     ('test_true_async', 'storage/test'),
     ('test_unlock_notify', 'storage/test'),
     ('test_IHistory', 'toolkit/components/places/tests/cpp'),
     ('testcrasher', 'toolkit/crashreporter/test'),
-    ('jsep_session_unittest', 'media/webrtc/signaling/test'),
-    ('jsep_track_unittest', 'media/webrtc/signaling/test'),
     ('mediaconduit_unittests', 'media/webrtc/signaling/test'),
     ('mediapipeline_unittest', 'media/webrtc/signaling/test'),
     ('sdp_file_parser', 'media/webrtc/signaling/fuzztest'),
     ('signaling_unittests', 'media/webrtc/signaling/test'),
     ('TestMailCookie', 'mailnews/base/test'),
     ('calbasecomps', 'calendar/base/backend/libical/build'),
     ('purplexpcom', 'extensions/purple/purplexpcom/src'),
 }
--- a/python/mozbuild/mozbuild/testing.py
+++ b/python/mozbuild/mozbuild/testing.py
@@ -288,17 +288,16 @@ TEST_MANIFESTS = dict(
     FIREFOX_UI_FUNCTIONAL=('firefox-ui-functional', 'firefox-ui', '.', False),
     FIREFOX_UI_UPDATE=('firefox-ui-update', 'firefox-ui', '.', False),
     PUPPETEER_FIREFOX=('firefox-ui-functional', 'firefox-ui', '.', False),
 
     # marionette tests are run from the srcdir
     # TODO(ato): make packaging work as for other test suites
     MARIONETTE=('marionette', 'marionette', '.', False),
     MARIONETTE_UNIT=('marionette', 'marionette', '.', False),
-    MARIONETTE_UPDATE=('marionette', 'marionette', '.', False),
     MARIONETTE_WEBAPI=('marionette', 'marionette', '.', False),
 
     METRO_CHROME=('metro-chrome', 'testing/mochitest', 'metro', True),
     MOCHITEST=('mochitest', 'testing/mochitest', 'tests', True),
     MOCHITEST_CHROME=('chrome', 'testing/mochitest', 'chrome', True),
     WEBRTC_SIGNALLING_TEST=('steeplechase', 'steeplechase', '.', True),
     XPCSHELL_TESTS=('xpcshell', 'xpcshell', '.', True),
 )
--- a/python/mozbuild/mozpack/unify.py
+++ b/python/mozbuild/mozpack/unify.py
@@ -17,16 +17,17 @@ from mozpack.executables import (
 from mozpack.mozjar import JarReader
 from mozpack.errors import errors
 from tempfile import mkstemp
 import mozpack.path as mozpath
 import struct
 import os
 import re
 import subprocess
+import buildconfig
 from collections import OrderedDict
 
 # Regular expressions for unifying install.rdf
 FIND_TARGET_PLATFORM = re.compile(r"""
     <(?P<ns>[-._0-9A-Za-z]+:)?targetPlatform>       # The targetPlatform tag, with any namespace
     (?P<platform>[^<]*)                             # The actual platform value
     </(?P=ns)?targetPlatform>                       # The closing tag
     """, re.X)
@@ -75,17 +76,18 @@ class UnifiedExecutableFile(BaseFile):
         assert isinstance(dest, basestring)
         tmpfiles = []
         try:
             for e in self._executables:
                 fd, f = mkstemp()
                 os.close(fd)
                 tmpfiles.append(f)
                 e.copy(f, skip_if_older=False)
-            subprocess.call(['lipo', '-create'] + tmpfiles + ['-output', dest])
+            lipo = buildconfig.substs.get('LIPO') or 'lipo'
+            subprocess.call([lipo, '-create'] + tmpfiles + ['-output', dest])
         finally:
             for f in tmpfiles:
                 os.unlink(f)
 
 
 class UnifiedFinder(BaseFinder):
     '''
     Helper to get unified BaseFile instances from two distinct trees on the
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1159,9 +1159,9 @@ static const TransportSecurityPreload kP
   { "za.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "zh.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
 };
 
 // Pinning Preload List Length = 463;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1487772989705000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1487858535382000);
--- a/security/manager/ssl/nsSTSPreloadList.errors
+++ b/security/manager/ssl/nsSTSPreloadList.errors
@@ -30,16 +30,17 @@ 420dongstorm.com: could not connect to h
 42ms.org: could not connect to host
 4455software.com: did not receive HSTS header
 4679.space: could not connect to host
 47ronin.com: did not receive HSTS header
 4elements.com: did not receive HSTS header
 4eyes.ch: did not receive HSTS header
 4mm.org: could not connect to host
 4sqsu.eu: could not connect to host
+4vf.de: could not connect to host
 50millionablaze.org: did not receive HSTS header
 56ct.com: could not connect to host
 60ych.net: did not receive HSTS header
 7kovrikov.ru: did not receive HSTS header
 808.lv: could not connect to host
 83i.net: could not connect to host
 8ack.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 911911.pw: could not connect to host
@@ -59,17 +60,16 @@ abnerchou.me: could not connect to host
 about.ge: could not connect to host
 aboutyou-deals.de: did not receive HSTS header
 abtom.de: did not receive HSTS header
 abury.fr: did not receive HSTS header
 abury.me: did not receive HSTS header
 accelerole.com: did not receive HSTS header
 accountradar.com: could not connect to host
 accuenergy.com: max-age too low: 0
-acg.sb: could not connect to host
 acisonline.net: could not connect to host
 acorns.com: did not receive HSTS header
 acr.im: could not connect to host
 acslimited.co.uk: did not receive HSTS header
 activeweb.top: could not connect to host
 activiti.alfresco.com: did not receive HSTS header
 acuve.jp: could not connect to host
 ada.is: max-age too low: 2592000
@@ -190,17 +190,16 @@ animeday.ml: could not connect to host
 animesfusion.com.br: could not connect to host
 animesharp.com: could not connect to host
 animurecs.com: could not connect to host
 aniplus.cf: could not connect to host
 aniplus.gq: could not connect to host
 aniplus.ml: could not connect to host
 ankakaak.com: could not connect to host
 ankaraprofesyonelnakliyat.com: did not receive HSTS header
-ankaraprofesyonelnakliyat.com.tr: did not receive HSTS header
 annabellaw.com: max-age too low: 0
 anomaly.ws: did not receive HSTS header
 anonboards.com: did not receive HSTS header
 anook.com: max-age too low: 0
 ant.land: could not connect to host
 anthenor.co.uk: could not connect to host
 antimine.kr: could not connect to host
 antocom.com: did not receive HSTS header
@@ -229,31 +228,30 @@ appraisal-comps.com: could not connect t
 appreciationkards.com: could not connect to host
 approlys.fr: did not receive HSTS header
 apps-for-fishing.com: could not connect to host
 appseccalifornia.org: did not receive HSTS header
 arabdigitalexpression.org: did not receive HSTS header
 aradulconteaza.ro: could not connect to host
 aran.me.uk: did not receive HSTS header
 arboineuropa.nl: did not receive HSTS header
-arbu.eu: could not connect to host
+arbu.eu: max-age too low: 2419200
 arlen.se: could not connect to host
 armory.consulting: could not connect to host
 armory.supplies: could not connect to host
 armytricka.cz: did not receive HSTS header
 arnetdigital.eu: did not receive HSTS header
 arrayify.com: could not connect to host
 ars-design.net: could not connect to host
 ars.toscana.it: max-age too low: 0
 artistnetwork.nl: did not receive HSTS header
 arturkohut.com: could not connect to host
 asasuou.pw: could not connect to host
 asc16.com: could not connect to host
 asdpress.cn: could not connect to host
-ashleymedway.com: could not connect to host
 asrob.eu: could not connect to host
 ass.org.au: did not receive HSTS header
 assdecoeur.org: could not connect to host
 asset-alive.com: did not receive HSTS header
 asset-alive.net: did not receive HSTS header
 astrolpost.com: could not connect to host
 atavio.at: could not connect to host
 atavio.ch: could not connect to host
@@ -277,22 +275,21 @@ authentication.io: could not connect to 
 auto-serwis.zgorzelec.pl: did not receive HSTS header
 auto4trade.nl: could not connect to host
 autojuhos.sk: did not receive HSTS header
 autokovrik-diskont.ru: did not receive HSTS header
 automacity.com: could not connect to host
 autotsum.com: could not connect to host
 autumnwindsagility.com: could not connect to host
 auverbox.ovh: did not receive HSTS header
-auxiliumincrementum.co.uk: could not connect to host
+auxiliumincrementum.co.uk: did not receive HSTS header
 av.de: did not receive HSTS header
 avec-ou-sans-ordonnance.fr: could not connect to host
 avinet.com: max-age too low: 0
 awg-mode.de: did not receive HSTS header
-awxg.com: could not connect to host
 axado.com.br: did not receive HSTS header
 axeny.com: did not receive HSTS header
 az.search.yahoo.com: did not receive HSTS header
 azprep.us: could not connect to host
 b3orion.com: max-age too low: 0
 babak.de: did not receive HSTS header
 baby-click.de: did not receive HSTS header
 babybic.hu: did not receive HSTS header
@@ -302,29 +299,29 @@ back-bone.nl: did not receive HSTS heade
 badcronjob.com: could not connect to host
 baff.lu: did not receive HSTS header
 baiduaccount.com: could not connect to host
 bakkerdesignandbuild.com: did not receive HSTS header
 balcan-underground.net: could not connect to host
 baldwinkoo.com: could not connect to host
 bandb.xyz: could not connect to host
 bannisbierblog.de: could not connect to host
+banqingdiao.com: could not connect to host
 barely.sexy: did not receive HSTS header
 bashcode.ninja: could not connect to host
 basicsolutionsus.com: did not receive HSTS header
 bassh.net: did not receive HSTS header
 baumstark.ca: did not receive HSTS header
 bazarstupava.sk: did not receive HSTS header
 bcbsmagentprofile.com: could not connect to host
 bccx.com: could not connect to host
 bckp.de: could not connect to host
 bcm.com.au: max-age too low: 0
 bcnx.de: max-age too low: 0
 bcsytv.com: could not connect to host
-bdikaros-network.net: could not connect to host
 be.search.yahoo.com: did not receive HSTS header
 beach-inspector.com: did not receive HSTS header
 beachi.es: could not connect to host
 beaglewatch.com: did not receive HSTS header
 beardydave.com: did not receive HSTS header
 beastowner.com: did not receive HSTS header
 beavers.io: could not connect to host
 bebesurdoue.com: could not connect to host
@@ -404,28 +401,29 @@ blacklane.com: did not receive HSTS head
 blackly.uk: could not connect to host
 blackpayment.ru: could not connect to host
 blackunicorn.wtf: could not connect to host
 blantik.net: could not connect to host
 blaudev.es: could not connect to host
 blenheimchalcot.com: did not receive HSTS header
 blha303.com.au: could not connect to host
 blindsexdate.nl: could not connect to host
-blitzprog.org: could not connect to host
 blog.cyveillance.com: did not receive HSTS header
 blog.lookout.com: did not receive HSTS header
 blubbablasen.de: could not connect to host
 blucas.org: did not receive HSTS header
 blueliv.com: did not receive HSTS header
+bluescloud.xyz: did not receive HSTS header
 bluetenmeer.com: did not receive HSTS header
 bm-trading.nl: did not receive HSTS header
 bngsecure.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 bobiji.com: did not receive HSTS header
 bodyblog.nl: did not receive HSTS header
 bodybuilding-legends.com: could not connect to host
+bodyweightsolution.com: did not receive HSTS header
 boensou.com: did not receive HSTS header
 bogosity.se: could not connect to host
 bohan.life: could not connect to host
 boltdata.io: did not receive HSTS header
 bonapp.restaurant: could not connect to host
 bonfi.net: did not receive HSTS header
 bonigo.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 bonitabrazilian.co.nz: did not receive HSTS header
@@ -455,30 +453,28 @@ brianmwaters.net: could not connect to h
 brickoo.com: could not connect to host
 brideandgroomdirect.ie: did not receive HSTS header
 brks.xyz: could not connect to host
 broken-oak.com: could not connect to host
 brokenhands.io: did not receive HSTS header
 brookechase.com: did not receive HSTS header
 browserid.org: did not receive HSTS header
 brunix.net: did not receive HSTS header
-bryn.xyz: could not connect to host
 bsagan.fr: could not connect to host
 bsdtips.com: could not connect to host
 btcdlc.com: could not connect to host
 buch-cuber.de: could not connect to host
 buchheld.at: did not receive HSTS header
 budgetthostels.nl: did not receive HSTS header
 budskap.eu: could not connect to host
 bugtrack.io: did not receive HSTS header
 buhler.pro: did not receive HSTS header
 buildsaver.co.za: did not receive HSTS header
 built.by: did not receive HSTS header
 bulletpoint.cz: did not receive HSTS header
-bulmafox.com: could not connect to host
 bumarkamoda.com: could not connect to host
 bunaken.asia: could not connect to host
 burian-server.cz: could not connect to host
 burrow.ovh: could not connect to host
 business.lookout.com: could not connect to host
 businesshosting.nl: did not receive HSTS header
 busold.ws: could not connect to host
 bustimes.org: could not connect to host
@@ -501,27 +497,29 @@ caconnect.org: could not connect to host
 cadao.me: did not receive HSTS header
 cadusilva.com: did not receive HSTS header
 cafe-scientifique.org.ec: could not connect to host
 caim.cz: did not receive HSTS header
 cajapopcorn.com: did not receive HSTS header
 cake.care: could not connect to host
 calgaryconstructionjobs.com: could not connect to host
 calix.com: max-age too low: 0
+call.me: did not receive HSTS header
 calltrackingreports.com: could not connect to host
 calvin.me: max-age too low: 2592000
 calvinallen.net: could not connect to host
 calyxinstitute.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 camolist.com: could not connect to host
 campbellsoftware.co.uk: could not connect to host
 canadiangamblingchoice.com: did not receive HSTS header
 cancelmyprofile.com: did not receive HSTS header
 candicontrols.com: did not receive HSTS header
 candratech.com: could not connect to host
 candylion.rocks: could not connect to host
+cannyfoxx.me: could not connect to host
 canyonshoa.com: did not receive HSTS header
 capecycles.co.za: did not receive HSTS header
 captchatheprize.com: could not connect to host
 car-navi.ph: did not receive HSTS header
 carano-service.de: did not receive HSTS header
 caraudio69.cz: could not connect to host
 carboneselectricosnettosl.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 cardoni.net: did not receive HSTS header
@@ -652,16 +650,17 @@ code.google.com: did not receive HSTS he
 codeco.pw: could not connect to host
 codeforce.io: did not receive HSTS header
 codepx.com: did not receive HSTS header
 codewiththepros.org: could not connect to host
 codiva.io: max-age too low: 2592000
 coffeeetc.co.uk: did not receive HSTS header
 coffeestrategies.com: max-age too low: 2592000
 coiffeurschnittstelle.ch: did not receive HSTS header
+coimmvest.com: could not connect to host
 coindam.com: could not connect to host
 colisfrais.com: did not receive HSTS header
 collies.eu: did not receive HSTS header
 collins.kg: did not receive HSTS header
 colmexpro.com: did not receive HSTS header
 colo-tech.com: could not connect to host
 colognegaming.net: could not connect to host
 coloradocomputernetworking.net: could not connect to host
@@ -684,17 +683,17 @@ content-api-dev.azurewebsites.net: could
 continuumgaming.com: could not connect to host
 controlcenter.gigahost.dk: did not receive HSTS header
 coolchevy.org.ua: could not connect to host
 coopens.com: could not connect to host
 coralproject.net: did not receive HSTS header
 coralrosado.com.br: did not receive HSTS header
 cordial-restaurant.com: did not receive HSTS header
 core.mx: could not connect to host
-core4system.de: could not connect to host
+core4system.de: did not receive HSTS header
 corenetworking.de: could not connect to host
 corgicloud.com: could not connect to host
 cormactagging.ie: could not connect to host
 cormilu.com.br: did not receive HSTS header
 cornodo.com: could not connect to host
 correctpaardbatterijnietje.nl: did not receive HSTS header
 corruption-mc.net: could not connect to host
 corruption-rsps.net: could not connect to host
@@ -712,23 +711,21 @@ craftedge.xyz: could not connect to host
 crate.io: did not receive HSTS header
 cravelyrics.com: did not receive HSTS header
 crazifyngers.com: could not connect to host
 crazycen.com: did not receive HSTS header
 crazyhotseeds.com: did not receive HSTS header
 creativephysics.ml: could not connect to host
 creativeplayuk.com: did not receive HSTS header
 crendontech.com: could not connect to host
-crestasantos.com: could not connect to host
 crestoncottage.com: could not connect to host
 criena.net: could not connect to host
 critical.today: could not connect to host
 crizk.com: could not connect to host
 crosssec.com: did not receive HSTS header
-crow.tw: could not connect to host
 crowd.supply: could not connect to host
 crowdcurity.com: did not receive HSTS header
 crowdjuris.com: could not connect to host
 crtvmgmt.com: could not connect to host
 crudysql.com: could not connect to host
 cruzr.xyz: could not connect to host
 crypt.guru: could not connect to host
 cryptify.eu: did not receive HSTS header
@@ -767,17 +764,16 @@ dailystormerpodcasts.com: did not receiv
 daimadi.com: could not connect to host
 dakrib.net: could not connect to host
 dalingk.co: could not connect to host
 dango.in: did not receive HSTS header
 daniel-steuer.de: did not receive HSTS header
 danieldk.eu: did not receive HSTS header
 danielworthy.com: did not receive HSTS header
 danijobs.com: could not connect to host
-dannyrohde.de: could not connect to host
 danpiel.net: could not connect to host
 danrl.de: did not receive HSTS header
 daolerp.xyz: could not connect to host
 dargasia.is: could not connect to host
 dario.im: could not connect to host
 dark-x.cf: could not connect to host
 darkengine.io: could not connect to host
 darkhole.cn: could not connect to host
@@ -796,17 +792,17 @@ datenreiter.gq: could not connect to hos
 datenreiter.ml: could not connect to host
 datenreiter.tk: could not connect to host
 datewon.net: did not receive HSTS header
 david-schiffmann.de: did not receive HSTS header
 davidhunter.scot: did not receive HSTS header
 davidreinhardt.de: could not connect to host
 davidscherzer.at: could not connect to host
 daylightcompany.com: did not receive HSTS header
-db.gy: could not connect to host
+db.gy: did not receive HSTS header
 dbx.ovh: did not receive HSTS header
 dccode.gov: could not connect to host
 dcurt.is: did not receive HSTS header
 ddatsh.com: did not receive HSTS header
 dden.ca: could not connect to host
 debank.tv: did not receive HSTS header
 debtkit.co.uk: did not receive HSTS header
 decafu.co: could not connect to host
@@ -844,29 +840,30 @@ devincrow.me: could not connect to host
 devinfo.net: did not receive HSTS header
 devmsg.com: did not receive HSTS header
 devtub.com: did not receive HSTS header
 devuan.org: did not receive HSTS header
 diablotine.rocks: could not connect to host
 diarbag.us: did not receive HSTS header
 diasp.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 diasp.org: did not receive HSTS header
+diasporadialogues.com: could not connect to host
 diedrich.co: could not connect to host
 digitaldaddy.net: could not connect to host
 digitalriver.tk: could not connect to host
 digitalskillswap.com: could not connect to host
 dinamoelektrik.com: max-age too low: 0
 discoveringdocker.com: did not receive HSTS header
 discovery.lookout.com: did not receive HSTS header
 dislocated.de: did not receive HSTS header
 dissimulo.me: could not connect to host
 dittvertshus.no: could not connect to host
 dizihocasi.com: did not receive HSTS header
 dizorg.net: could not connect to host
-dj4et.de: could not connect to host
+dj4et.de: did not receive HSTS header
 dl.google.com: did not receive HSTS header (error ignored - included regardless)
 dmxledlights.com: could not connect to host
 dn42.eu: could not connect to host
 dns.google.com: did not receive HSTS header (error ignored - included regardless)
 do-do.tk: could not connect to host
 do.search.yahoo.com: did not receive HSTS header
 dobet.in: could not connect to host
 docket.news: could not connect to host
@@ -908,22 +905,23 @@ dreamlinehost.com: did not receive HSTS 
 drishti.guru: could not connect to host
 drive.google.com: did not receive HSTS header (error ignored - included regardless)
 driving-lessons.co.uk: did not receive HSTS header
 droidboss.com: could not connect to host
 dropcam.com: did not receive HSTS header
 drtroyhendrickson.com: could not connect to host
 drumbandesperanto.nl: could not connect to host
 dshiv.io: could not connect to host
+dubrovskiy.net: could not connect to host
+dubrovskiy.pro: could not connect to host
 duch.cloud: could not connect to host
-duckasylum.com: could not connect to host
 duesee.org: could not connect to host
 duria.de: max-age too low: 3600
 dwhd.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
-dwnld.me: could not connect to host
+dworzak.ch: could not connect to host
 dycontrol.de: could not connect to host
 dylanscott.com.au: did not receive HSTS header
 dymersion.com: did not receive HSTS header
 dynamize.solutions: did not receive HSTS header
 dzimejl.sk: did not receive HSTS header
 dzlibs.io: could not connect to host
 e-aut.net: could not connect to host
 e-deca2.org: did not receive HSTS header
@@ -991,16 +989,17 @@ encoder.pw: could not connect to host
 encrypted.google.com: did not receive HSTS header (error ignored - included regardless)
 endohaus.ca: could not connect to host
 endohaus.com: could not connect to host
 endohaus.eu: could not connect to host
 endohaus.us: could not connect to host
 endzeit-architekten.com: did not receive HSTS header
 engelwerbung.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 englishforums.com: could not connect to host
+enigmacpt.com: did not receive HSTS header
 enigmail.net: did not receive HSTS header
 enteente.club: could not connect to host
 enteente.space: could not connect to host
 enteente.xyz: could not connect to host
 enterdev.co: did not receive HSTS header
 enterprise-threat-monitor.com: max-age too low: 0
 entersynapse.com: could not connect to host
 entrepreneur.or.id: did not receive HSTS header
@@ -1013,27 +1012,26 @@ ephry.com: could not connect to host
 epoxate.com: did not receive HSTS header
 eq8.net.au: could not connect to host
 equate.net.au: max-age too low: 3600
 equatetechnologies.com.au: max-age too low: 3600
 equilibre-yoga-jennifer-will.com: could not connect to host
 erawanarifnugroho.com: did not receive HSTS header
 eressea.xyz: could not connect to host
 ericyl.com: did not receive HSTS header
-erikhubers.nl: could not connect to host
 eromixx.com: did not receive HSTS header
 erotalia.es: could not connect to host
 eroticen.com: did not receive HSTS header
 erotische-aanbiedingen.nl: could not connect to host
 errlytics.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 errolz.com: could not connect to host
 errors.zenpayroll.com: could not connect to host
 ersindemirtas.com: did not receive HSTS header
 esclear.de: did not receive HSTS header
-escotour.com: could not connect to host
+escotour.com: did not receive HSTS header
 esec.rs: did not receive HSTS header
 espra.com: could not connect to host
 essexcosmeticdentists.co.uk: did not receive HSTS header
 essexghosthunters.co.uk: did not receive HSTS header
 estilosapeca.com: could not connect to host
 estoic.net: could not connect to host
 etdonline.co.uk: could not connect to host
 eternitylove.us: could not connect to host
@@ -1120,18 +1118,17 @@ fig.co: did not receive HSTS header
 fightr.co: could not connect to host
 filmipop.com: max-age too low: 0
 finalgear.com: did not receive HSTS header
 finanzkontor.net: could not connect to host
 findtutorsnearme.com: did not receive HSTS header
 finpt.com: could not connect to host
 firebaseio-demo.com: could not connect to host
 firebaseio.com: could not connect to host (error ignored - included regardless)
-firebird.io: could not connect to host
-firefall.rocks: did not receive HSTS header
+firefall.rocks: could not connect to host
 firemail.io: could not connect to host
 firstforex.co.uk: did not receive HSTS header
 fish2.me: did not receive HSTS header
 fit4medien.de: did not receive HSTS header
 fitnesswerk.de: could not connect to host
 fivestarsitters.com: did not receive HSTS header
 fixatom.com: did not receive HSTS header
 fixingdns.com: did not receive HSTS header
@@ -1151,17 +1148,16 @@ flowersandclouds.com: could not connect 
 flushstudios.com: did not receive HSTS header
 flyaces.com: did not receive HSTS header
 flyss.net: did not receive HSTS header
 fm83.nl: did not receive HSTS header
 fndout.com: did not receive HSTS header
 fnvsecurity.com: could not connect to host
 fonetiq.io: could not connect to host
 food4health.guide: could not connect to host
-fooster.io: could not connect to host
 footballmapped.com: could not connect to host
 foraje-profesionale.ro: did not receive HSTS header
 forbook.net: could not connect to host
 foreignexchangeresource.com: did not receive HSTS header
 foreveralone.io: could not connect to host
 forex-dan.com: did not receive HSTS header
 formbetter.com: could not connect to host
 formini.dz: did not receive HSTS header
@@ -1243,29 +1239,30 @@ gampenhof.de: did not receive HSTS heade
 gaptek.id: did not receive HSTS header
 garciamartin.me: could not connect to host
 gatilagata.com.br: did not receive HSTS header
 gdpventure.com: max-age too low: 0
 gedankenbude.info: did not receive HSTS header
 geekcast.co.uk: could not connect to host
 geli-graphics.com: did not receive HSTS header
 gem-indonesia.net: could not connect to host
+genie-seiner-generation.de: could not connect to host
 genuu.com: could not connect to host
 genuxation.com: could not connect to host
 genyaa.com: could not connect to host
 gerencianet.com.br: did not receive HSTS header
 get.zenpayroll.com: did not receive HSTS header
 getable.com: did not receive HSTS header
 getblys.com.au: did not receive HSTS header
 getbooks.co.il: did not receive HSTS header
 getcarefirst.com: did not receive HSTS header
 getcolor.com: did not receive HSTS header
 getinternet.de: max-age too low: 0
 getlantern.org: did not receive HSTS header
-getlifti.com: could not connect to host
+getlifti.com: did not receive HSTS header
 getlolaccount.com: could not connect to host
 getmassage.com.ng: did not receive HSTS header
 getsello.com: did not receive HSTS header
 getwashdaddy.com: did not receive HSTS header
 gfhgiro.nl: max-age too low: 604800
 gfm.tech: could not connect to host
 gfournier.ca: could not connect to host
 gfwsb.ml: could not connect to host
@@ -1313,37 +1310,36 @@ gogold-g.com: could not connect to host
 gold24.in: did not receive HSTS header
 goldendata.io: could not connect to host
 golocal-media.de: did not receive HSTS header
 gonzalosanchez.mx: did not receive HSTS header
 goodenough.nz: did not receive HSTS header
 goodwin43.ru: did not receive HSTS header
 google: could not connect to host (error ignored - included regardless)
 googlemail.com: did not receive HSTS header (error ignored - included regardless)
-googleplex.com: could not connect to host (error ignored - included regardless)
+googleplex.com: did not receive HSTS header (error ignored - included regardless)
 gorilla-gym.site: could not connect to host
 goto.google.com: did not receive HSTS header (error ignored - included regardless)
 gottcode.org: did not receive HSTS header
 govillemo.ca: did not receive HSTS header
 gowe.wang: could not connect to host
 gparent.org: did not receive HSTS header
 gpsfix.cz: could not connect to host
 gpstuner.com: did not receive HSTS header
 gracesofgrief.com: max-age too low: 86400
+grademymac.com: could not connect to host
 grandmascookieblog.com: did not receive HSTS header
 graph.no: did not receive HSTS header
 gravity-net.de: could not connect to host
 graycell.net: could not connect to host
 grazetech.com: could not connect to host
 greenhillantiques.co.uk: did not receive HSTS header
 greenvines.com.tw: did not receive HSTS header
-gregmilton.com: could not connect to host
-gregmilton.org: could not connect to host
 gregorytlee.me: did not receive HSTS header
-gremots.com: did not receive HSTS header
+gremots.com: could not connect to host
 greplin.com: could not connect to host
 gribani.com: could not connect to host
 grigalanzsoftware.com: could not connect to host
 groups.google.com: did not receive HSTS header (error ignored - included regardless)
 grunex.com: did not receive HSTS header
 gryffin.ga: could not connect to host
 gryffin.ml: could not connect to host
 gryffin.tk: could not connect to host
@@ -1365,23 +1361,22 @@ gyboche.science: could not connect to ho
 gycis.me: could not connect to host
 gypthecat.com: max-age too low: 604800
 gyz.io: could not connect to host
 h2check.org: could not connect to host
 haarkliniek.com: did not receive HSTS header
 habanaavenue.com: did not receive HSTS header
 hablemosdetecnologia.com.ve: could not connect to host
 hack.cz: could not connect to host
-hack.li: could not connect to host
+hack.li: did not receive HSTS header
 hacker.one: could not connect to host
 hackerforever.com: did not receive HSTS header
 hackerone-ext-adroll.com: could not connect to host
 hackest.org: could not connect to host
 hackit.im: could not connect to host
-hacktivis.me: could not connect to host
 hadzic.co: could not connect to host
 hahayidu.org: could not connect to host
 haitschi.com: could not connect to host
 haitschi.de: could not connect to host
 haitschi.net: could not connect to host
 haitschi.org: could not connect to host
 haktec.de: could not connect to host
 haku.moe: could not connect to host
@@ -1477,25 +1472,24 @@ howrandom.org: could not connect to host
 hr-intranet.com: did not receive HSTS header
 hsir.me: could not connect to host
 hsts.date: could not connect to host
 hszhyy120.com: could not connect to host
 http418.xyz: could not connect to host
 httpstatuscode418.xyz: could not connect to host
 hu.search.yahoo.com: did not receive HSTS header
 huarongdao.com: did not receive HSTS header
+hugofs.com: could not connect to host
 hugosleep.com.au: did not receive HSTS header
 humblefinances.com: could not connect to host
 humeurs.net: could not connect to host
 humpteedumptee.in: did not receive HSTS header
-hup.blue: could not connect to host
 hurricanelabs.com: did not receive HSTS header
 hydra.ws: could not connect to host
 hyper69.com: did not receive HSTS header
-hzsh.xyz: could not connect to host
 i-jp.net: could not connect to host
 i-partners.sk: did not receive HSTS header
 iamokay.nl: did not receive HSTS header
 iamveto.com: could not connect to host
 iapws.com: did not receive HSTS header
 iban.is: could not connect to host
 iceloch.com: could not connect to host
 icewoman.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
@@ -1512,17 +1506,17 @@ ideation-inc.co.jp: did not receive HSTS
 identitylabs.uk: did not receive HSTS header
 idgsupply.com: could not connect to host
 idlekernel.com: could not connect to host
 ie.search.yahoo.com: did not receive HSTS header
 ies-italia.it: did not receive HSTS header
 ies.id.lv: could not connect to host
 ifad.org: did not receive HSTS header
 ifleurs.com: could not connect to host
-igforums.com: could not connect to host
+ifoss.me: could not connect to host
 ignatisd.gr: did not receive HSTS header
 igule.net: could not connect to host
 ihrlotto.de: could not connect to host
 ihrnationalrat.ch: could not connect to host
 ihsbsd.me: could not connect to host
 ihuanmeng.com: did not receive HSTS header
 iirii.com: could not connect to host
 ikujii.com: max-age too low: 0
@@ -1610,39 +1604,38 @@ irccloud.com: did not receive HSTS heade
 ircmett.de: did not receive HSTS header
 ischool.co.jp: did not receive HSTS header
 isdown.cz: could not connect to host
 iseek.biz: max-age too low: 0
 iskaz.rs: did not receive HSTS header
 isogram.nl: could not connect to host
 ispire.me: max-age too low: 0
 israkurort.com: did not receive HSTS header
-issuesofconcern.in: could not connect to host
 istaspirtslietas.lv: did not receive HSTS header
 it-go.net: did not receive HSTS header
 itechgeek.com: max-age too low: 0
 itfh.eu: could not connect to host
 itos.asia: did not receive HSTS header
 itos.pl: did not receive HSTS header
 its4living.com: could not connect to host
 itsadog.co.uk: did not receive HSTS header
 itsamurai.ru: max-age too low: 2592000
 itsecurityassurance.pw: did not receive HSTS header
 itshost.ru: could not connect to host
 ivancacic.com: could not connect to host
 ivi-fertility.com: max-age too low: 0
 ivi.es: max-age too low: 0
 ivk.website: could not connect to host
-iww.me: did not receive HSTS header
+iww.me: could not connect to host
 iww.mx: could not connect to host
 izdiwho.com: could not connect to host
 izoox.com: did not receive HSTS header
 izzzorgconcerten.nl: could not connect to host
 ja-publications.com: did not receive HSTS header
-jaba.hosting: did not receive HSTS header
+jaba.hosting: max-age too low: 0
 jabbari.io: did not receive HSTS header
 jackalworks.com: could not connect to host
 jacobparry.ca: did not receive HSTS header
 jahliveradio.com: could not connect to host
 jakenbake.com: did not receive HSTS header
 jakubtopic.cz: could not connect to host
 jamesbradach.com: did not receive HSTS header
 jamesburton.london: could not connect to host
@@ -1672,16 +1665,17 @@ jayschulman.com: could not connect to ho
 jayscoaching.com: could not connect to host
 jayshao.com: did not receive HSTS header
 jazzinutrecht.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 jbbd.fr: could not connect to host
 jbfp.dk: could not connect to host
 jbn.mx: could not connect to host
 jbradaric.me: could not connect to host
 jcch.de: could not connect to host
+jcor.me: did not receive HSTS header
 jctf.io: could not connect to host
 jeff393.com: could not connect to host
 jenjoit.de: could not connect to host
 jensenbanden.no: could not connect to host
 jeremye77.com: could not connect to host
 jesorsenville.com: did not receive HSTS header
 jessicabenedictus.nl: could not connect to host
 jetaprices.com: could not connect to host
@@ -1698,16 +1692,19 @@ jhejderup.me: could not connect to host
 jhermsmeier.de: could not connect to host
 jikken.de: could not connect to host
 jimas.eu: did not receive HSTS header
 jimmycai.org: max-age too low: 10368000
 jinbo123.com: did not receive HSTS header
 jkb.pics: could not connect to host
 jkbuster.com: could not connect to host
 jmdekker.it: could not connect to host
+jncde.de: could not connect to host
+jncie.eu: could not connect to host
+jncip.de: could not connect to host
 joakimalgroy.com: could not connect to host
 jobmedic.com: did not receive HSTS header
 joedavison.me: could not connect to host
 johnbrownphotography.ch: did not receive HSTS header
 johners.me: could not connect to host
 johners.tech: did not receive HSTS header
 johnhgaunt.com: did not receive HSTS header
 johnrom.com: did not receive HSTS header
@@ -1781,17 +1778,17 @@ kermadec.net: could not connect to host
 kernl.us: did not receive HSTS header
 kevinapease.com: could not connect to host
 keymaster.lookout.com: did not receive HSTS header
 kg-rating.com: did not receive HSTS header
 kgxtech.com: max-age too low: 2592000
 kickass.al: could not connect to host
 kid-dachau.de: did not receive HSTS header
 kiel-media.de: did not receive HSTS header
-kilianvalkhof.com: did not receive HSTS header
+kilobyte22.de: could not connect to host
 kimpost.org: could not connect to host
 kinderwagen-test24.de: could not connect to host
 kingmanhall.org: could not connect to host
 kinnon.enterprises: could not connect to host
 kinogb.net: max-age too low: 0
 kionetworks.com: did not receive HSTS header
 kipira.com: could not connect to host
 kirkforcongress.com: could not connect to host
@@ -1866,25 +1863,23 @@ laf.in.net: did not receive HSTS header
 lagalerievirtuelle.fr: did not receive HSTS header
 lagoza.name: could not connect to host
 lambdafive.co.uk: could not connect to host
 lampl.info: did not receive HSTS header
 landscape.canonical.com: max-age too low: 2592000
 langenbach.rocks: could not connect to host
 langhun.me: did not receive HSTS header
 laozhu.me: did not receive HSTS header
-lasercloud.ml: could not connect to host
 laserfuchs.de: did not receive HSTS header
 lashstuff.com: did not receive HSTS header
 lask.in: did not receive HSTS header
 latinred.com: did not receive HSTS header
 latus.xyz: could not connect to host
 lauftrainer-ausbildung.com: did not receive HSTS header
 lavabit.no: could not connect to host
-lavinya.net: could not connect to host
 lavval.com: could not connect to host
 laxatus.com: did not receive HSTS header
 laxiongames.es: could not connect to host
 lbrt.xyz: could not connect to host
 ldarby.me.uk: could not connect to host
 leadership9.com: could not connect to host
 leardev.de: did not receive HSTS header
 learnfrenchfluently.com: did not receive HSTS header
@@ -1938,16 +1933,17 @@ limpido.it: could not connect to host
 lindberg.io: did not receive HSTS header
 lingros-test.tk: could not connect to host
 linguaquote.com: did not receive HSTS header
 linmi.cc: did not receive HSTS header
 linorman1997.me: could not connect to host
 linuxeyecandy.com: could not connect to host
 linuxfixed.it: could not connect to host
 linuxgeek.ro: could not connect to host
+linuxmonitoring.net: could not connect to host
 linuxwebservertips.in: could not connect to host
 liquorsanthe.in: could not connect to host
 listafirmelor.com: could not connect to host
 litespeed.io: could not connect to host
 livedemo.io: could not connect to host
 livej.am: could not connect to host
 livi.co: did not receive HSTS header
 loafbox.com: could not connect to host
@@ -1992,32 +1988,31 @@ lukeng.me: could not connect to host
 lukeng.net: could not connect to host
 lukonet.com: did not receive HSTS header
 lumi.do: did not receive HSTS header
 lunix.io: did not receive HSTS header
 luoe.ml: could not connect to host
 luoxiao.im: could not connect to host
 lusis.fr: did not receive HSTS header
 lusis.net: did not receive HSTS header
-lustrumxi.nl: could not connect to host
+lustrumxi.nl: did not receive HSTS header
 luxus-russen.de: did not receive HSTS header
 luxwatch.com: could not connect to host
 lv.search.yahoo.com: did not receive HSTS header
 lzkill.com: did not receive HSTS header
 m-ali.xyz: did not receive HSTS header
 m.gparent.org: could not connect to host
 m.nu: did not receive HSTS header
 m3-gmbh.de: did not receive HSTS header
 m82labs.com: did not receive HSTS header
 maarten.nyc: did not receive HSTS header
 maartenvandekamp.nl: did not receive HSTS header
 macbolo.com: could not connect to host
 macchaberrycream.com: could not connect to host
 macchedil.com: did not receive HSTS header
-macosxfilerecovery.com: did not receive HSTS header
 madars.org: did not receive HSTS header
 maddin.ga: could not connect to host
 madebymagnitude.com: did not receive HSTS header
 maderwin.com: did not receive HSTS header
 madusecurity.com: could not connect to host
 mafamane.com: could not connect to host
 mafiareturns.com: max-age too low: 2592000
 magenx.com: did not receive HSTS header
@@ -2076,37 +2071,36 @@ mcc.re: could not connect to host
 mcdonalds.ru: did not receive HSTS header
 mclab.su: could not connect to host
 mctherealm.net: could not connect to host
 mdewendt.de: could not connect to host
 mdfnet.se: did not receive HSTS header
 mdscomp.net: did not receive HSTS header
 mea.in.ua: could not connect to host
 meap.xyz: max-age too low: 0
-mebio.us: did not receive HSTS header
 mechanus.io: max-age too low: 2592000
 medallia.io: could not connect to host
 media-courses.com: did not receive HSTS header
 mediacru.sh: could not connect to host
 mediastorm.us: could not connect to host
 mediawikicn.org: could not connect to host
 medwayindia.com: did not receive HSTS header
 meetings2.com: did not receive HSTS header
 meetscompany.jp: did not receive HSTS header
 megashur.se: did not receive HSTS header
 megasslstore.com: did not receive HSTS header
 megaxchange.com: did not receive HSTS header
 meghudson.com: could not connect to host
-megumico.net: did not receive HSTS header
 mein-gesundheitsmanager.com: did not receive HSTS header
 meincenter-meinemeinung.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 meinebo.it: could not connect to host
 meizufans.eu: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 melted.pw: could not connect to host
 members.mayfirst.org: did not receive HSTS header
+mencap.org.uk: did not receive HSTS header
 mensmaximus.de: did not receive HSTS header
 menthix.net: could not connect to host
 mereckas.com: did not receive HSTS header
 meritz.rocks: could not connect to host
 mersinunivercity.com: did not receive HSTS header
 merson.me: could not connect to host
 meshok.ru: did not receive HSTS header
 mesmoque.com: did not receive HSTS header
@@ -2250,16 +2244,17 @@ mypagella.it: could not connect to host
 myplaceonline.com: did not receive HSTS header
 mysecretrewards.com: did not receive HSTS header
 mysmelly.com: could not connect to host
 mystudy.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 myvirtualserver.com: max-age too low: 2592000
 myzone.com: did not receive HSTS header
 mziulu.me: could not connect to host
 n0psled.nl: could not connect to host
+n2x.in: could not connect to host
 n4l.pw: could not connect to host
 nagoya-kyuyo.com: could not connect to host
 naiharngym.com: did not receive HSTS header
 najedlo.sk: did not receive HSTS header
 nakliyatsirketi.biz: could not connect to host
 nalifornia.com: did not receive HSTS header
 namacindia.com: did not receive HSTS header
 nametaken-cloud.duckdns.org: could not connect to host
@@ -2316,16 +2311,17 @@ newtonwarp.com: could not connect to hos
 nextcloud.org: could not connect to host
 nexth.de: could not connect to host
 nexth.net: could not connect to host
 nexth.us: could not connect to host
 nextproject.us: could not connect to host
 ng-security.com: could not connect to host
 ngine.ch: did not receive HSTS header
 nginxnudes.com: could not connect to host
+ngt-service.ru: could not connect to host
 ni.search.yahoo.com: did not receive HSTS header
 nibiisclaim.com: could not connect to host
 nicestresser.fr: could not connect to host
 nicky.io: did not receive HSTS header
 nicolasbettag.me: could not connect to host
 niconiconi.xyz: could not connect to host
 niconode.com: could not connect to host
 nien.chat: could not connect to host
@@ -2362,16 +2358,17 @@ nossasenhoradaconceicao.com.br: could no
 nottheonion.net: did not receive HSTS header
 nouvelle-vague-saint-cast.fr: did not receive HSTS header
 novacoast.com: did not receive HSTS header
 novatrucking.de: could not connect to host
 nowak.ninja: did not receive HSTS header
 noworrywp.com: could not connect to host
 np.search.yahoo.com: did not receive HSTS header
 npol.de: did not receive HSTS header
+nshost.ro: did not receive HSTS header
 ntbs.pro: could not connect to host
 nu3.at: did not receive HSTS header
 nu3.ch: did not receive HSTS header
 nu3.co.uk: did not receive HSTS header
 nu3.com: did not receive HSTS header
 nu3.de: did not receive HSTS header
 nu3.dk: did not receive HSTS header
 nu3.fi: did not receive HSTS header
@@ -2461,17 +2458,16 @@ optometriepunt.nl: did not receive HSTS 
 optumrxhealthstore.com: did not receive HSTS header
 oracaodocredo.com.br: could not connect to host
 orbiosales.com: could not connect to host
 orbitcom.de: max-age too low: 0
 orbograph-hrcm.com: did not receive HSTS header
 orionfcu.com: did not receive HSTS header
 orleika.ml: could not connect to host
 osaiyuwu.com: could not connect to host
-oshell.me: did not receive HSTS header
 oslfoundation.org: could not connect to host
 ossan-kobe-gourmet.com: did not receive HSTS header
 ossbinaries.com: could not connect to host
 osteammate.com: did not receive HSTS header
 otakuworld.de: could not connect to host
 othercode.nl: could not connect to host
 othermedia.cc: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 otherstuff.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
@@ -2533,16 +2529,17 @@ paulchen.at: did not receive HSTS header
 paulyang.cn: did not receive HSTS header
 paxwinkel.nl: did not receive HSTS header
 pay.gigahost.dk: did not receive HSTS header
 payments.google.com: did not receive HSTS header (error ignored - included regardless)
 payroll.ch: did not receive HSTS header
 pbapp.net: did not receive HSTS header
 pbprint.ru: max-age too low: 0
 pc-nf.de: could not connect to host
+pcfun.net: did not receive HSTS header
 pchax.net: did not receive HSTS header
 peissen.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 pekkapikkarainen.fi: could not connect to host
 pekkarik.ru: could not connect to host
 pentagram.me: could not connect to host
 pepperhead.com: could not connect to host
 pepperworldhotshop.de: did not receive HSTS header
 perfectionis.me: could not connect to host
@@ -2643,16 +2640,17 @@ prnt.li: did not receive HSTS header
 pro-zone.com: could not connect to host
 prodpad.com: did not receive HSTS header
 production.vn: did not receive HSTS header
 professionalboundaries.com: did not receive HSTS header
 profi-durchgangsmelder.de: did not receive HSTS header
 profundr.com: could not connect to host
 progg.no: could not connect to host
 prohostonline.fi: could not connect to host
+prok.pw: could not connect to host
 promecon-gmbh.de: did not receive HSTS header
 prontolight.com: did not receive HSTS header
 prosocialmachines.com: could not connect to host
 prosoft.sk: did not receive HSTS header
 prosperident.com: did not receive HSTS header
 prowhisky.de: did not receive HSTS header
 proximato.com: could not connect to host
 proxybay.al: could not connect to host
@@ -2667,30 +2665,30 @@ ptonet.com: did not receive HSTS header
 pubkey.is: could not connect to host
 puiterwijk.org: could not connect to host
 pumpgames.net: could not connect to host
 punchr-kamikazee.rhcloud.com: did not receive HSTS header
 purewebmasters.com: could not connect to host
 purplemoon.mobi: did not receive HSTS header
 purplestar.mobi: did not receive HSTS header
 pushapp.org: did not receive HSTS header
+pwd.ovh: could not connect to host
 pwnies.dk: could not connect to host
 py.search.yahoo.com: did not receive HSTS header
 pypi-status.org: could not connect to host
 pyplo.org: did not receive HSTS header
 pypt.lt: did not receive HSTS header
 q2.si: did not receive HSTS header
 qingxuan.info: max-age too low: 864000
 qinxi1992.com: did not receive HSTS header
 qiwi.be: did not receive HSTS header
 qorm.co.uk: did not receive HSTS header
 qrara.net: did not receive HSTS header
 qrlending.com: did not receive HSTS header
 quail.solutions: could not connect to host
-qualityology.com: could not connect to host
 quantacloud.ch: could not connect to host
 quantenteranik.eu: could not connect to host
 quantumcourse.org: did not receive HSTS header
 queercoders.com: did not receive HSTS header
 quemmeliga.com: could not connect to host
 questsandrewards.com: could not connect to host
 quranserver.net: could not connect to host
 qvi.st: did not receive HSTS header
@@ -2724,17 +2722,16 @@ readr.pw: could not connect to host
 realmic.net: could not connect to host
 realmofespionage.com: could not connect to host
 reardenporn.com: could not connect to host
 recommended.reviews: could not connect to host
 redar.xyz: did not receive HSTS header
 reddiseals.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 reddit.com: did not receive HSTS header
 redicabo.de: could not connect to host
-rediske.me: could not connect to host
 redlatam.org: did not receive HSTS header
 redmbk.com: could not connect to host
 regaloaks.com: did not receive HSTS header
 regalpalms.com: did not receive HSTS header
 regenbogenwald.de: did not receive HSTS header
 regenerescence.com: did not receive HSTS header
 reggae-cdmx.com: did not receive HSTS header
 reic.me: could not connect to host
@@ -2768,17 +2765,16 @@ rgavmf.ru: did not receive HSTS header
 rhapsodhy.hu: could not connect to host
 rhdigital.pro: could not connect to host
 riaucybersolution.net: did not receive HSTS header
 richiemail.net: did not receive HSTS header
 richmondsunlight.com: did not receive HSTS header
 rid-wan.com: could not connect to host
 rideworks.com: did not receive HSTS header
 right2.org: could not connect to host
-righttobuy.gov.uk: could not connect to host
 righttoknow.ie: did not receive HSTS header
 rijndael.xyz: could not connect to host
 rika.me: could not connect to host
 ring0.xyz: did not receive HSTS header
 ringh.am: could not connect to host
 rippleunion.com: could not connect to host
 riskmgt.com.au: could not connect to host
 rj.gg: could not connect to host
@@ -2808,26 +2804,27 @@ roundtheme.com: did not receive HSTS hea
 rout0r.org: did not receive HSTS header
 rouvray.org: could not connect to host
 rr.in.th: could not connect to host
 rrke.cc: did not receive HSTS header
 rsajeey.info: could not connect to host
 rsauget.fr: could not connect to host
 rsf.io: could not connect to host
 rsmaps.org: could not connect to host
+rsync.eu: could not connect to host
 rubbereggs.ca: could not connect to host
 rubberfurs.org: max-age too low: 86400
 rubecodeberg.com: could not connect to host
 rubenschulz.nl: did not receive HSTS header
 ruborr.se: did not receive HSTS header
+rubysecurity.org: did not receive HSTS header
 rubyshop.nl: max-age too low: 604800
 rudeotter.com: did not receive HSTS header
 rudloff.pro: did not receive HSTS header
 rugirlfriend.com: could not connect to host
-ruh-veit.de: could not connect to host
 ruiming.me: could not connect to host
 runawebinar.nl: could not connect to host
 runementors.com: could not connect to host
 runtondev.com: did not receive HSTS header
 ruqu.nl: could not connect to host
 rusadmin.biz: did not receive HSTS header
 rusl.me: could not connect to host
 russmarshall.com: could not connect to host
@@ -2867,17 +2864,16 @@ saunasandstuff.ca: did not receive HSTS 
 saunasandstuff.com: did not receive HSTS header
 save.gov: could not connect to host
 saveaward.gov: could not connect to host
 saveyour.biz: did not receive HSTS header
 sawamura-rental.com: did not receive HSTS header
 sb-group.dk: did not receive HSTS header
 sby.de: did not receive HSTS header
 sc4le.com: could not connect to host
-scaling.solutions: did not receive HSTS header
 schmitz.link: could not connect to host
 schnell-gold.com: could not connect to host
 schoop.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 schrauger.run: could not connect to host
 schreiber-netzwerk.eu: did not receive HSTS header
 schrodinger.io: could not connect to host
 scienceathome.org: did not receive HSTS header
 scooshonline.co.uk: did not receive HSTS header
@@ -2889,16 +2885,17 @@ screencaster.io: did not receive HSTS he
 screenresolution.space: could not connect to host
 scribe.systems: could not connect to host
 script.google.com: did not receive HSTS header (error ignored - included regardless)
 scriptict.nl: could not connect to host
 sdmoscow.ru: could not connect to host
 sdrobs.com: did not receive HSTS header
 sdsl-speedtest.de: could not connect to host
 search-one.de: did not receive HSTS header
+sebastian-lutsch.de: could not connect to host
 sebster.com: did not receive HSTS header
 secandtech.com: could not connect to host
 sectia22.ro: could not connect to host
 sectun.com: did not receive HSTS header
 secure-games.us: could not connect to host
 secureradio.net: could not connect to host
 securesuisse.ch: could not connect to host
 security.google.com: did not receive HSTS header (error ignored - included regardless)
@@ -2906,17 +2903,16 @@ securityinet.biz: did not receive HSTS h
 securityinet.net: did not receive HSTS header
 securityinet.org.il: did not receive HSTS header
 securitymap.wiki: did not receive HSTS header
 securitysoapbox.com: could not connect to host
 securiviera.ch: did not receive HSTS header
 seedbox.fr: did not receive HSTS header
 seele.ca: could not connect to host
 segulink.com: could not connect to host
-segurosbalboa.com.ec: could not connect to host
 sehenderson.com: did not receive HSTS header
 seiko-dojo.com: could not connect to host
 selecadm.name: could not connect to host
 selectruckscalltrackingreports.com: could not connect to host
 self-injury.net: could not connect to host
 selfcarecentral.com: did not receive HSTS header
 selfie-france.fr: could not connect to host
 selldorado.com: did not receive HSTS header
@@ -2925,17 +2921,17 @@ sellocdn.com: could not connect to host
 semen3325.xyz: could not connect to host
 semenkovich.com: did not receive HSTS header
 semps-servers.de: could not connect to host
 semps.de: did not receive HSTS header
 senedirect.com: did not receive HSTS header
 sensibus.com: did not receive HSTS header
 seo.consulting: did not receive HSTS header
 seomobo.com: could not connect to host
-seowarp.net: did not receive HSTS header
+seowarp.net: could not connect to host
 seq.tf: did not receive HSTS header
 serfdom.io: did not receive HSTS header
 serized.pw: could not connect to host
 servercode.ca: did not receive HSTS header
 serverdensity.io: did not receive HSTS header
 servergno.me: did not receive HSTS header
 seryo.moe: could not connect to host
 setphaserstostun.org: could not connect to host
@@ -2943,16 +2939,17 @@ setuid.de: could not connect to host
 setuid.io: did not receive HSTS header
 seyahatsagliksigortalari.com: could not connect to host
 shadoom.com: did not receive HSTS header
 shadowmorph.info: did not receive HSTS header
 shadowsocks.net: could not connect to host
 shakepeers.org: did not receive HSTS header
 shakespearesolutions.com.au: did not receive HSTS header
 shanesage.com: could not connect to host
+shanewadleigh.com: could not connect to host
 shaobin.wang: could not connect to host
 sharepass.pw: could not connect to host
 sharescope.co.uk: max-age too low: 14400
 shareworx.net: could not connect to host
 shauncrowley.co.uk: could not connect to host
 shaunwheelhou.se: could not connect to host
 shawnh.net: could not connect to host
 shellsec.pw: did not receive HSTS header
@@ -2988,17 +2985,16 @@ simon.butcher.name: max-age too low: 262
 simonkjellberg.se: could not connect to host
 simplefraud.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 simplelearner.com: could not connect to host
 simplepractice.com: did not receive HSTS header
 simply-premium.com: max-age too low: 0
 sincron.org: could not connect to host
 siriad.com: did not receive HSTS header
 sirius-lee.net: could not connect to host
-sitehost.io: could not connect to host
 sites.google.com: did not receive HSTS header (error ignored - included regardless)
 sitesten.com: did not receive HSTS header
 sitsy.ru: did not receive HSTS header
 skhosting.eu: did not receive HSTS header
 skile.ru: could not connect to host
 skk.io: could not connect to host
 skoda-clever-lead.de: could not connect to host
 skoda-im-dialog.de: could not connect to host
@@ -3030,29 +3026,31 @@ smusg.com: did not receive HSTS header
 snailing.org: could not connect to host
 snapappointments.com: did not receive HSTS header
 snapappts.com: could not connect to host
 snapworks.net: did not receive HSTS header
 sneberger.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 snel4u.nl: could not connect to host
 snelwerk.be: did not receive HSTS header
 sng.my: could not connect to host
+sniderman.eu.org: could not connect to host
 snoqualmiefiber.org: did not receive HSTS header
 sobabox.ru: could not connect to host
 sobie.ch: could not connect to host
 sobotkama.eu: did not receive HSTS header
 soccergif.com: could not connect to host
 soci.ml: did not receive HSTS header
 socialbillboard.com: could not connect to host
 socialdevelop.biz: did not receive HSTS header
 socialhams.net: did not receive HSTS header
 socialhead.io: could not connect to host
 socialspirit.com.br: did not receive HSTS header
 sockeye.cc: could not connect to host
 socomponents.co.uk: did not receive HSTS header
+soe-server.com: could not connect to host
 sogeek.me: did not receive HSTS header
 solidfuelappliancespares.co.uk: did not receive HSTS header
 solinter.com.br: did not receive HSTS header
 soll-i.ch: did not receive HSTS header
 solsystems.ru: could not connect to host
 someshit.xyz: could not connect to host
 somethingnew.xyz: did not receive HSTS header
 songzhuolun.com: did not receive HSTS header
@@ -3103,17 +3101,17 @@ sproutconnections.com: did not receive H
 sprybear.com: did not receive HSTS header
 square.gs: could not connect to host
 squatldf.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 sqzryang.com: max-age too low: 604800
 srevilak.net: did not receive HSTS header
 srna.sk: could not connect to host
 srrr.ca: could not connect to host
 ss.wtf: did not receive HSTS header
-ssersay.com: did not receive HSTS header
+ssersay.com: max-age too low: 0
 ssl.panoramio.com: did not receive HSTS header
 ssl.rip: could not connect to host
 sslhosting.cz: could not connect to host
 ssmato.me: could not connect to host
 ssnc.org: max-age too low: 300
 sss3s.com: could not connect to host
 stabletoken.com: could not connect to host
 stadjerspasonline.nl: could not connect to host
@@ -3156,58 +3154,58 @@ stuartbaxter.co: could not connect to ho
 student-scientist.org: did not receive HSTS header
 studentresearcher.org: did not receive HSTS header
 studentskydenik.cz: could not connect to host
 studenttravel.cz: did not receive HSTS header
 studybay.com: did not receive HSTS header
 studydrive.net: did not receive HSTS header
 stugb.de: did not receive HSTS header
 stw-group.at: could not connect to host
-styles.pm: could not connect to host
 subbing.work: could not connect to host
 subdimension.org: could not connect to host
 subrosa.io: could not connect to host
 subtitle.rip: could not connect to host
-sudo.im: could not connect to host
 sudo.li: did not receive HSTS header
+sufix.cz: could not connect to host
 suite73.org: could not connect to host
 suksit.com: could not connect to host
 sumoatm.com: did not receive HSTS header
 sumoscout.de: did not receive HSTS header
 suncountrymarine.com: did not receive HSTS header
-sunflyer.cn: did not receive HSTS header
 sunshinepress.org: could not connect to host
 superbabysitting.ch: could not connect to host
 supereight.net: did not receive HSTS header
 superiorfloridavacation.com: did not receive HSTS header
 supersalescontest.nl: did not receive HSTS header
 superwally.org: could not connect to host
 suprlink.net: could not connect to host
 supweb.ovh: did not receive HSTS header
 surfeasy.com: did not receive HSTS header
 surfone-leucate.com: did not receive HSTS header
 sushi101tempe.com: did not receive HSTS header
 suzukikenichi.com: did not receive HSTS header
 sv.search.yahoo.com: did not receive HSTS header
+svendubbeld.nl: could not connect to host
 sweetstreats.ca: could not connect to host
 swimming.ca: did not receive HSTS header
 swimturk.com.tr: did not receive HSTS header
 swmd5c.org: did not receive HSTS header
 sxbk.pw: could not connect to host
 syam.cc: could not connect to host
 sydgrabber.tk: could not connect to host
 sylvanorder.com: could not connect to host
 synackr.com: could not connect to host
 syncer.jp: did not receive HSTS header
 syncserve.net: did not receive HSTS header
 syneic.com: did not receive HSTS header
 syno.gq: could not connect to host
 sysadmin.xyz: could not connect to host
 syso.name: could not connect to host
 szaszm.tk: max-age too low: 0
+t-tz.com: did not receive HSTS header
 t.facebook.com: did not receive HSTS header
 taabe.xyz: did not receive HSTS header
 tablet.facebook.com: did not receive HSTS header
 tacomafia.net: did not receive HSTS header
 tadigitalstore.com: could not connect to host
 tafoma.com: did not receive HSTS header
 tageau.com: could not connect to host
 taglondon.org: did not receive HSTS header
@@ -3235,16 +3233,17 @@ taxbench.com: could not connect to host
 tazemama.biz: could not connect to host
 tazz.in: could not connect to host
 tcao.info: could not connect to host
 tcdw.net: could not connect to host
 tcl.ath.cx: did not receive HSTS header
 tcomms.org: max-age too low: 0
 teachforcanada.ca: did not receive HSTS header
 teamblueridge.org: could not connect to host
+teamdaylo.xyz: could not connect to host
 teamsocial.co: did not receive HSTS header
 teamzeus.cz: could not connect to host
 techhub.ml: could not connect to host
 techllage.com: could not connect to host
 techloaner.com: could not connect to host
 techmatehq.com: could not connect to host
 technosavvyport.com: did not receive HSTS header
 techpointed.com: could not connect to host
@@ -3267,21 +3266,21 @@ texter-linz.at: did not receive HSTS hea
 textoplano.xyz: could not connect to host
 textracer.dk: could not connect to host
 tezcam.tk: could not connect to host
 tfcoms-sp-tracker-client.azurewebsites.net: could not connect to host
 tffans.com: could not connect to host
 tfl.lu: did not receive HSTS header
 tgr.re: could not connect to host
 thai.land: could not connect to host
-the-delta.net.eu.org: could not connect to host
 the-sky-of-valkyries.com: could not connect to host
 theamateurs.net: did not receive HSTS header
 theater.cf: could not connect to host
 thebrotherswarde.com: could not connect to host
+thecitizens.com: could not connect to host
 theclementinebutchers.com: could not connect to host
 thecoffeehouse.xyz: could not connect to host
 thediaryofadam.com: did not receive HSTS header
 theendofzion.com: did not receive HSTS header
 thefarbeyond.com: could not connect to host
 thefootballanalyst.com: could not connect to host
 thehiddenbay.me: could not connect to host
 thehiddenbay.net: could not connect to host
@@ -3289,17 +3288,16 @@ thehistory.me: could not connect to host
 thehonorguard.org: did not receive HSTS header
 theinvisibletrailer.com: could not connect to host
 themarble.co: could not connect to host
 themerchandiser.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 themicrocapital.com: could not connect to host
 themillerslive.com: could not connect to host
 theodorejones.info: could not connect to host
 thepartywarehouse.co.uk: did not receive HSTS header
-thephonecaseplace.com: could not connect to host
 thepiratebay.al: could not connect to host
 thepiratebay.tech: could not connect to host
 therapyportal.com: did not receive HSTS header
 therewill.be: could not connect to host
 thestack.xyz: could not connect to host
 thestagchorleywood.co.uk: did not receive HSTS header
 thetomharling.com: max-age too low: 86400
 theurbanyoga.com: did not receive HSTS header
@@ -3307,21 +3305,21 @@ thevintagenews.com: [Exception... "Compo
 thezonders.com: did not receive HSTS header
 thierfreund.de: could not connect to host
 thierryhayoz.ch: could not connect to host
 thijsalders.nl: max-age too low: 300
 thinkcoding.de: could not connect to host
 thinlyveiledcontempt.com: could not connect to host
 thirdpartytrade.com: did not receive HSTS header
 thirty5.net: did not receive HSTS header
+thomasmeester.nl: could not connect to host
 thomaswoo.com: could not connect to host
 thorncreek.net: did not receive HSTS header
 thriveapproach.co.uk: did not receive HSTS header
 thumbtack.com: did not receive HSTS header
-ticfleet.com: could not connect to host
 tickopa.co.uk: could not connect to host
 tickreport.com: did not receive HSTS header
 tictactux.de: could not connect to host
 tidmore.us: could not connect to host
 tiensnet.com: did not receive HSTS header
 tightlineproductions.com: did not receive HSTS header
 tikutiku.pl: max-age too low: 0
 tillcraft.com: could not connect to host
@@ -3340,16 +3338,17 @@ tkarstens.de: did not receive HSTS heade
 tlo.hosting: could not connect to host
 tlo.network: could not connect to host
 tls.li: could not connect to host
 tm-solutions.eu: could not connect to host
 tmitchell.io: could not connect to host
 tmprod.com: did not receive HSTS header
 tncnanet.com.br: could not connect to host
 tnrsca.jp: did not receive HSTS header
+tobias-bielefeld.de: could not connect to host
 tobiasmathes.com: could not connect to host
 tobiasmathes.name: could not connect to host
 tobiasofficial.at: could not connect to host
 todo.is: did not receive HSTS header
 todobazar.es: could not connect to host
 tokyopopline.com: did not receive HSTS header
 tollmanz.com: did not receive HSTS header
 tomeara.net: could not connect to host
@@ -3428,28 +3427,28 @@ tzappa.net: could not connect to host
 u-blox.com: did not receive HSTS header
 ua.search.yahoo.com: did not receive HSTS header
 ubicloud.de: could not connect to host
 ublox.com: did not receive HSTS header
 ubuntuhot.com: did not receive HSTS header
 uega.net: did not receive HSTS header
 ufgaming.com: did not receive HSTS header
 ufotable.uk: could not connect to host
-ui8.net: did not receive HSTS header
+ui8.net: max-age too low: 86400
 ukas.com: did not receive HSTS header
 ukdropshipment.co.uk: did not receive HSTS header
 ukdropshipment.com: did not receive HSTS header
 ukrgadget.com: could not connect to host
 ulmo.dk: could not connect to host
 ultros.io: did not receive HSTS header
 umidev.com: could not connect to host
 umie.cc: did not receive HSTS header
-unapp.me: could not connect to host
 unbanthe.net: could not connect to host
 unblocked.host: could not connect to host
+unblocked.win: could not connect to host
 unccdesign.club: could not connect to host
 undernet.uy: did not receive HSTS header
 unfiltered.nyc: did not receive HSTS header
 uni-games.com: could not connect to host
 unicooo.com: could not connect to host
 unison.com: could not connect to host
 unitedcyberdevelopment.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 unitel2000.de: could not connect to host
@@ -3501,17 +3500,16 @@ vasanth.org: did not receive HSTS header
 vazue.com: could not connect to host
 vbh2o.com: did not receive HSTS header
 vbulletin-russia.com: could not connect to host
 vbulletinrussia.com: could not connect to host
 vcdove.com: did not receive HSTS header
 vcr.re: could not connect to host
 veblen.com: could not connect to host
 vechkasov.ru: did not receive HSTS header
-vehicletax.service.gov.uk: could not connect to host
 vemokin.net: did not receive HSTS header
 venixplays-stream.ml: could not connect to host
 verifikatorindonesia.com: could not connect to host
 veriny.tf: did not receive HSTS header
 vermontcareergateway.org: could not connect to host
 versia.ru: did not receive HSTS header
 veryhax.de: could not connect to host
 vfree.org: could not connect to host
@@ -3653,34 +3651,34 @@ withgoogle.com: did not receive HSTS hea
 withustrading.com: could not connect to host
 withyoutube.com: did not receive HSTS header (error ignored - included regardless)
 wittcher.com: could not connect to host
 witzemaschine.com: max-age too low: 0
 wiz.biz: could not connect to host
 wlzhiyin.cn: could not connect to host
 wm-talk.net: did not receive HSTS header
 wmcuk.net: could not connect to host
-wobble.ninja: could not connect to host
-wobblylang.org: could not connect to host
 wodice.com: could not connect to host
 wohnungsbau-ludwigsburg.de: did not receive HSTS header
 woima.fi: max-age too low: 604800
 wolfesden.com: could not connect to host
 womosale.de: could not connect to host
 wonderfall.xyz: could not connect to host
 wonderhost.info: could not connect to host
 wondershift.biz: did not receive HSTS header
 woording.com: could not connect to host
 woresite.jp: did not receive HSTS header
 workfone.io: did not receive HSTS header
 workwithgo.com: could not connect to host
 wowapi.org: could not connect to host
+wpdublin.com: did not receive HSTS header
 wphostingspot.com: did not receive HSTS header
 wpmetadatastandardsproject.org: could not connect to host
 writeapp.me: did not receive HSTS header
+wsgvet.com: could not connect to host
 wsscompany.com.ve: could not connect to host
 wufu.org: did not receive HSTS header
 wuhengmin.com: did not receive HSTS header
 wurzelzwerg.net: could not connect to host
 ww2onlineshop.com: did not receive HSTS header
 www.apollo-auto.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 www.braintreepayments.com: did not receive HSTS header
 www.calyxinstitute.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
@@ -3743,16 +3741,17 @@ xn--lgb3a8bcpn.gq: could not connect to 
 xn--lgb3a8bcpn.ml: could not connect to host
 xn--ls8hi7a.tk: could not connect to host
 xn--maraa-rta.org: could not connect to host
 xn--mgbbh2a9fub.xn--ngbc5azd: did not receive HSTS header
 xn--neb-tma3u8u.xyz: could not connect to host
 xng.io: did not receive HSTS header
 xombra.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 xplore-dna.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
+xqin.net: could not connect to host
 xsmobile.de: could not connect to host
 xtream-hosting.com: could not connect to host
 xtream-hosting.de: could not connect to host
 xtream-hosting.eu: could not connect to host
 xtreamhosting.eu: could not connect to host
 xtremegaming.it: could not connect to host
 xuri.me: max-age too low: 2592000
 xuyh0120.win: did not receive HSTS header
@@ -3775,26 +3774,26 @@ yenniferallulli.nl: could not connect to
 yetcore.io: could not connect to host
 yingyj.com: could not connect to host
 yjsoft.me: did not receive HSTS header
 ynode.co: did not receive HSTS header
 ynsn.nl: did not receive HSTS header
 yntongji.com: could not connect to host
 yobst.tk: could not connect to host
 yokeepo.com: max-age too low: 0
-yoloboatrentals.com: did not receive HSTS header
+yoloboatrentals.com: could not connect to host
 yoloprod.fr: could not connect to host
 yoloseo.com: could not connect to host
 youcontrol.ru: could not connect to host
 yourstrongbox.com: could not connect to host
 yout.com: max-age too low: 60000
+ytuquelees.net: could not connect to host
 yu.gg: did not receive HSTS header
 yuan.ga: did not receive HSTS header
 yuhen.ru: did not receive HSTS header
-yuko.moe: could not connect to host
 yukontec.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 yunzhu.li: did not receive HSTS header
 yunzhu.org: could not connect to host
 yux.io: did not receive HSTS header
 yzal.io: could not connect to host
 z33.ch: did not receive HSTS header
 z3liff.com: could not connect to host
 z3liff.net: could not connect to host
--- a/security/manager/ssl/nsSTSPreloadList.inc
+++ b/security/manager/ssl/nsSTSPreloadList.inc
@@ -3,17 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /*****************************************************************************/
 /* This is an automatically generated file. If you're not                    */
 /* nsSiteSecurityService.cpp, you shouldn't be #including it.     */
 /*****************************************************************************/
 
 #include <stdint.h>
-const PRTime gPreloadListExpirationTime = INT64_C(1490192178870000);
+const PRTime gPreloadListExpirationTime = INT64_C(1490277725538000);
 
 static const char kSTSHostTable[] = {
   /* "007sascha.de", true */ '0', '0', '7', 's', 'a', 's', 'c', 'h', 'a', '.', 'd', 'e', '\0',
   /* "00f.net", true */ '0', '0', 'f', '.', 'n', 'e', 't', '\0',
   /* "01electronica.com.ar", true */ '0', '1', 'e', 'l', 'e', 'c', 't', 'r', 'o', 'n', 'i', 'c', 'a', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0',
   /* "01seguridad.com.ar", true */ '0', '1', 's', 'e', 'g', 'u', 'r', 'i', 'd', 'a', 'd', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0',
   /* "050media.nl", true */ '0', '5', '0', 'm', 'e', 'd', 'i', 'a', '.', 'n', 'l', '\0',
   /* "0513c.com", true */ '0', '5', '1', '3', 'c', '.', 'c', 'o', 'm', '\0',
@@ -145,17 +145,16 @@ static const char kSTSHostTable[] = {
   /* "4500.co.il", true */ '4', '5', '0', '0', '.', 'c', 'o', '.', 'i', 'l', '\0',
   /* "4cclothing.com", true */ '4', 'c', 'c', 'l', 'o', 't', 'h', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "4d2.xyz", true */ '4', 'd', '2', '.', 'x', 'y', 'z', '\0',
   /* "4g-server.eu", false */ '4', 'g', '-', 's', 'e', 'r', 'v', 'e', 'r', '.', 'e', 'u', '\0',
   /* "4loc.us", true */ '4', 'l', 'o', 'c', '.', 'u', 's', '\0',
   /* "4ourty2.org", true */ '4', 'o', 'u', 'r', 't', 'y', '2', '.', 'o', 'r', 'g', '\0',
   /* "4project.co.il", true */ '4', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'c', 'o', '.', 'i', 'l', '\0',
   /* "4th-ave-studio.com", true */ '4', 't', 'h', '-', 'a', 'v', 'e', '-', 's', 't', 'u', 'd', 'i', 'o', '.', 'c', 'o', 'm', '\0',
-  /* "4vf.de", true */ '4', 'v', 'f', '.', 'd', 'e', '\0',
   /* "4w-performers.link", false */ '4', 'w', '-', 'p', 'e', 'r', 'f', 'o', 'r', 'm', 'e', 'r', 's', '.', 'l', 'i', 'n', 'k', '\0',
   /* "4winds.pt", true */ '4', 'w', 'i', 'n', 'd', 's', '.', 'p', 't', '\0',
   /* "4x.fi", true */ '4', 'x', '.', 'f', 'i', '\0',
   /* "500p.xyz", true */ '5', '0', '0', 'p', '.', 'x', 'y', 'z', '\0',
   /* "50plusnet.nl", true */ '5', '0', 'p', 'l', 'u', 's', 'n', 'e', 't', '.', 'n', 'l', '\0',
   /* "540.co", false */ '5', '4', '0', '.', 'c', 'o', '\0',
   /* "54below.com", true */ '5', '4', 'b', 'e', 'l', 'o', 'w', '.', 'c', 'o', 'm', '\0',
   /* "54bf.com", true */ '5', '4', 'b', 'f', '.', 'c', 'o', 'm', '\0',
@@ -237,16 +236,17 @@ static const char kSTSHostTable[] = {
   /* "accelight.co.jp", true */ 'a', 'c', 'c', 'e', 'l', 'i', 'g', 'h', 't', '.', 'c', 'o', '.', 'j', 'p', '\0',
   /* "access-sofia.org", true */ 'a', 'c', 'c', 'e', 's', 's', '-', 's', 'o', 'f', 'i', 'a', '.', 'o', 'r', 'g', '\0',
   /* "accessacademies.org", true */ 'a', 'c', 'c', 'e', 's', 's', 'a', 'c', 'a', 'd', 'e', 'm', 'i', 'e', 's', '.', 'o', 'r', 'g', '\0',
   /* "accounts-p.com", true */ 'a', 'c', 'c', 'o', 'u', 'n', 't', 's', '-', 'p', '.', 'c', 'o', 'm', '\0',
   /* "accounts.firefox.com", true */ 'a', 'c', 'c', 'o', 'u', 'n', 't', 's', '.', 'f', 'i', 'r', 'e', 'f', 'o', 'x', '.', 'c', 'o', 'm', '\0',
   /* "accounts.google.com", true */ 'a', 'c', 'c', 'o', 'u', 'n', 't', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "accwing.com", true */ 'a', 'c', 'c', 'w', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "acelpb.com", true */ 'a', 'c', 'e', 'l', 'p', 'b', '.', 'c', 'o', 'm', '\0',
+  /* "acg.sb", false */ 'a', 'c', 'g', '.', 's', 'b', '\0',
   /* "acgmoon.org", true */ 'a', 'c', 'g', 'm', 'o', 'o', 'n', '.', 'o', 'r', 'g', '\0',
   /* "acheconcursos.com.br", true */ 'a', 'c', 'h', 'e', 'c', 'o', 'n', 'c', 'u', 'r', 's', 'o', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "achenar.net", true */ 'a', 'c', 'h', 'e', 'n', 'a', 'r', '.', 'n', 'e', 't', '\0',
   /* "acheritage.co.uk", true */ 'a', 'c', 'h', 'e', 'r', 'i', 't', 'a', 'g', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "achow101.com", true */ 'a', 'c', 'h', 'o', 'w', '1', '0', '1', '.', 'c', 'o', 'm', '\0',
   /* "achromatisch.de", true */ 'a', 'c', 'h', 'r', 'o', 'm', 'a', 't', 'i', 's', 'c', 'h', '.', 'd', 'e', '\0',
   /* "achtzehn.eu", true */ 'a', 'c', 'h', 't', 'z', 'e', 'h', 'n', '.', 'e', 'u', '\0',
   /* "aciksite.com", true */ 'a', 'c', 'i', 'k', 's', 'i', 't', 'e', '.', 'c', 'o', 'm', '\0',
@@ -609,16 +609,17 @@ static const char kSTSHostTable[] = {
   /* "angristan.fr", true */ 'a', 'n', 'g', 'r', 'i', 's', 't', 'a', 'n', '.', 'f', 'r', '\0',
   /* "angularjs.org", true */ 'a', 'n', 'g', 'u', 'l', 'a', 'r', 'j', 's', '.', 'o', 'r', 'g', '\0',
   /* "animalnet.de", false */ 'a', 'n', 'i', 'm', 'a', 'l', 'n', 'e', 't', '.', 'd', 'e', '\0',
   /* "anime.my", false */ 'a', 'n', 'i', 'm', 'e', '.', 'm', 'y', '\0',
   /* "anitaalbersen.nl", true */ 'a', 'n', 'i', 't', 'a', 'a', 'l', 'b', 'e', 'r', 's', 'e', 'n', '.', 'n', 'l', '\0',
   /* "anitube-nocookie.ch", true */ 'a', 'n', 'i', 't', 'u', 'b', 'e', '-', 'n', 'o', 'c', 'o', 'o', 'k', 'i', 'e', '.', 'c', 'h', '\0',
   /* "anitube.ch", true */ 'a', 'n', 'i', 't', 'u', 'b', 'e', '.', 'c', 'h', '\0',
   /* "ankarakart.com.tr", true */ 'a', 'n', 'k', 'a', 'r', 'a', 'k', 'a', 'r', 't', '.', 'c', 'o', 'm', '.', 't', 'r', '\0',
+  /* "ankaraprofesyonelnakliyat.com.tr", false */ 'a', 'n', 'k', 'a', 'r', 'a', 'p', 'r', 'o', 'f', 'e', 's', 'y', 'o', 'n', 'e', 'l', 'n', 'a', 'k', 'l', 'i', 'y', 'a', 't', '.', 'c', 'o', 'm', '.', 't', 'r', '\0',
   /* "ankaraprofesyonelwebtasarim.com", true */ 'a', 'n', 'k', 'a', 'r', 'a', 'p', 'r', 'o', 'f', 'e', 's', 'y', 'o', 'n', 'e', 'l', 'w', 'e', 'b', 't', 'a', 's', 'a', 'r', 'i', 'm', '.', 'c', 'o', 'm', '\0',
   /* "ankarauzmanlarnakliyat.com", true */ 'a', 'n', 'k', 'a', 'r', 'a', 'u', 'z', 'm', 'a', 'n', 'l', 'a', 'r', 'n', 'a', 'k', 'l', 'i', 'y', 'a', 't', '.', 'c', 'o', 'm', '\0',
   /* "anna.info", true */ 'a', 'n', 'n', 'a', '.', 'i', 'n', 'f', 'o', '\0',
   /* "annahmeschluss.de", true */ 'a', 'n', 'n', 'a', 'h', 'm', 'e', 's', 'c', 'h', 'l', 'u', 's', 's', '.', 'd', 'e', '\0',
   /* "annarokina.com", true */ 'a', 'n', 'n', 'a', 'r', 'o', 'k', 'i', 'n', 'a', '.', 'c', 'o', 'm', '\0',
   /* "annejan.com", true */ 'a', 'n', 'n', 'e', 'j', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "annetta.com", true */ 'a', 'n', 'n', 'e', 't', 't', 'a', '.', 'c', 'o', 'm', '\0',
   /* "annevankesteren.com", true */ 'a', 'n', 'n', 'e', 'v', 'a', 'n', 'k', 'e', 's', 't', 'e', 'r', 'e', 'n', '.', 'c', 'o', 'm', '\0',
@@ -809,16 +810,17 @@ static const char kSTSHostTable[] = {
   /* "asandu.eu", true */ 'a', 's', 'a', 'n', 'd', 'u', '.', 'e', 'u', '\0',
   /* "asato-jewelry.com", true */ 'a', 's', 'a', 't', 'o', '-', 'j', 'e', 'w', 'e', 'l', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "asbito.de", true */ 'a', 's', 'b', 'i', 't', 'o', '.', 'd', 'e', '\0',
   /* "ascamso.com", true */ 'a', 's', 'c', 'a', 'm', 's', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ascension.run", true */ 'a', 's', 'c', 'e', 'n', 's', 'i', 'o', 'n', '.', 'r', 'u', 'n', '\0',
   /* "ascii.moe", true */ 'a', 's', 'c', 'i', 'i', '.', 'm', 'o', 'e', '\0',
   /* "asciitable.tips", true */ 'a', 's', 'c', 'i', 'i', 't', 'a', 'b', 'l', 'e', '.', 't', 'i', 'p', 's', '\0',
   /* "aserver.co", true */ 'a', 's', 'e', 'r', 'v', 'e', 'r', '.', 'c', 'o', '\0',
+  /* "ashleymedway.com", true */ 'a', 's', 'h', 'l', 'e', 'y', 'm', 'e', 'd', 'w', 'a', 'y', '.', 'c', 'o', 'm', '\0',
   /* "ashutoshmishra.org", true */ 'a', 's', 'h', 'u', 't', 'o', 's', 'h', 'm', 'i', 's', 'h', 'r', 'a', '.', 'o', 'r', 'g', '\0',
   /* "asianodor.com", true */ 'a', 's', 'i', 'a', 'n', 'o', 'd', 'o', 'r', '.', 'c', 'o', 'm', '\0',
   /* "ask.fedoraproject.org", true */ 'a', 's', 'k', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "ask.stg.fedoraproject.org", true */ 'a', 's', 'k', '.', 's', 't', 'g', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "askfit.cz", true */ 'a', 's', 'k', 'f', 'i', 't', '.', 'c', 'z', '\0',
   /* "askmagicconch.com", true */ 'a', 's', 'k', 'm', 'a', 'g', 'i', 'c', 'c', 'o', 'n', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "askme24.de", true */ 'a', 's', 'k', 'm', 'e', '2', '4', '.', 'd', 'e', '\0',
   /* "askwhy.cz", true */ 'a', 's', 'k', 'w', 'h', 'y', '.', 'c', 'z', '\0',
@@ -933,16 +935,17 @@ static const char kSTSHostTable[] = {
   /* "avso.pw", true */ 'a', 'v', 's', 'o', '.', 'p', 'w', '\0',
   /* "avsox.com", true */ 'a', 'v', 's', 'o', 'x', '.', 'c', 'o', 'm', '\0',
   /* "avtovokzaly.ru", true */ 'a', 'v', 't', 'o', 'v', 'o', 'k', 'z', 'a', 'l', 'y', '.', 'r', 'u', '\0',
   /* "avxo.pw", true */ 'a', 'v', 'x', 'o', '.', 'p', 'w', '\0',
   /* "awanderlustadventure.com", true */ 'a', 'w', 'a', 'n', 'd', 'e', 'r', 'l', 'u', 's', 't', 'a', 'd', 'v', 'e', 'n', 't', 'u', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "awaremi-tai.com", true */ 'a', 'w', 'a', 'r', 'e', 'm', 'i', '-', 't', 'a', 'i', '.', 'c', 'o', 'm', '\0',
   /* "awk.tw", true */ 'a', 'w', 'k', '.', 't', 'w', '\0',
   /* "aww.moe", true */ 'a', 'w', 'w', '.', 'm', 'o', 'e', '\0',
+  /* "awxg.com", true */ 'a', 'w', 'x', 'g', '.', 'c', 'o', 'm', '\0',
   /* "axka.com", false */ 'a', 'x', 'k', 'a', '.', 'c', 'o', 'm', '\0',
   /* "axolotlfarm.org", true */ 'a', 'x', 'o', 'l', 'o', 't', 'l', 'f', 'a', 'r', 'm', '.', 'o', 'r', 'g', '\0',
   /* "axolsoft.com", true */ 'a', 'x', 'o', 'l', 's', 'o', 'f', 't', '.', 'c', 'o', 'm', '\0',
   /* "axrec.de", true */ 'a', 'x', 'r', 'e', 'c', '.', 'd', 'e', '\0',
   /* "ayesh.me", true */ 'a', 'y', 'e', 's', 'h', '.', 'm', 'e', '\0',
   /* "aylak.com", true */ 'a', 'y', 'l', 'a', 'k', '.', 'c', 'o', 'm', '\0',
   /* "aymerick.fr", true */ 'a', 'y', 'm', 'e', 'r', 'i', 'c', 'k', '.', 'f', 'r', '\0',
   /* "aymericlagier.com", true */ 'a', 'y', 'm', 'e', 'r', 'i', 'c', 'l', 'a', 'g', 'i', 'e', 'r', '.', 'c', 'o', 'm', '\0',
@@ -1023,17 +1026,16 @@ static const char kSTSHostTable[] = {
   /* "bangzafran.com", true */ 'b', 'a', 'n', 'g', 'z', 'a', 'f', 'r', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "bank.simple.com", false */ 'b', 'a', 'n', 'k', '.', 's', 'i', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "bankcardoffer.com", true */ 'b', 'a', 'n', 'k', 'c', 'a', 'r', 'd', 'o', 'f', 'f', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "bankcircle.co.in", true */ 'b', 'a', 'n', 'k', 'c', 'i', 'r', 'c', 'l', 'e', '.', 'c', 'o', '.', 'i', 'n', '\0',
   /* "bankersonline.com", true */ 'b', 'a', 'n', 'k', 'e', 'r', 's', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "bankin.com", true */ 'b', 'a', 'n', 'k', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "bankinter.pt", true */ 'b', 'a', 'n', 'k', 'i', 'n', 't', 'e', 'r', '.', 'p', 't', '\0',
   /* "bankofdenton.com", true */ 'b', 'a', 'n', 'k', 'o', 'f', 'd', 'e', 'n', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0',
-  /* "banqingdiao.com", false */ 'b', 'a', 'n', 'q', 'i', 'n', 'g', 'd', 'i', 'a', 'o', '.', 'c', 'o', 'm', '\0',
   /* "baofengtech.com", true */ 'b', 'a', 'o', 'f', 'e', 'n', 'g', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "baptiste-peugnez.fr", true */ 'b', 'a', 'p', 't', 'i', 's', 't', 'e', '-', 'p', 'e', 'u', 'g', 'n', 'e', 'z', '.', 'f', 'r', '\0',
   /* "barbarians.com", true */ 'b', 'a', 'r', 'b', 'a', 'r', 'i', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "barbaros.info", true */ 'b', 'a', 'r', 'b', 'a', 'r', 'o', 's', '.', 'i', 'n', 'f', 'o', '\0',
   /* "barbate.fr", true */ 'b', 'a', 'r', 'b', 'a', 't', 'e', '.', 'f', 'r', '\0',
   /* "barbosha.ru", true */ 'b', 'a', 'r', 'b', 'o', 's', 'h', 'a', '.', 'r', 'u', '\0',
   /* "barbu.family", true */ 'b', 'a', 'r', 'b', 'u', '.', 'f', 'a', 'm', 'i', 'l', 'y', '\0',
   /* "barclays.net", true */ 'b', 'a', 'r', 'c', 'l', 'a', 'y', 's', '.', 'n', 'e', 't', '\0',
@@ -1088,16 +1090,17 @@ static const char kSTSHostTable[] = {
   /* "bcheng.cf", true */ 'b', 'c', 'h', 'e', 'n', 'g', '.', 'c', 'f', '\0',
   /* "bchep.com", true */ 'b', 'c', 'h', 'e', 'p', '.', 'c', 'o', 'm', '\0',
   /* "bcmlu.org", true */ 'b', 'c', 'm', 'l', 'u', '.', 'o', 'r', 'g', '\0',
   /* "bcrook.com", false */ 'b', 'c', 'r', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0',
   /* "bcswampcabins.com", true */ 'b', 'c', 's', 'w', 'a', 'm', 'p', 'c', 'a', 'b', 'i', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "bcvps.com", true */ 'b', 'c', 'v', 'p', 's', '.', 'c', 'o', 'm', '\0',
   /* "bcweightlifting.ca", true */ 'b', 'c', 'w', 'e', 'i', 'g', 'h', 't', 'l', 'i', 'f', 't', 'i', 'n', 'g', '.', 'c', 'a', '\0',
   /* "bddemir.com", true */ 'b', 'd', 'd', 'e', 'm', 'i', 'r', '.', 'c', 'o', 'm', '\0',
+  /* "bdikaros-network.net", true */ 'b', 'd', 'i', 'k', 'a', 'r', 'o', 's', '-', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'n', 'e', 't', '\0',
   /* "be-real.life", true */ 'b', 'e', '-', 'r', 'e', 'a', 'l', '.', 'l', 'i', 'f', 'e', '\0',
   /* "beamitapp.com", true */ 'b', 'e', 'a', 'm', 'i', 't', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
   /* "beanjuice.me", true */ 'b', 'e', 'a', 'n', 'j', 'u', 'i', 'c', 'e', '.', 'm', 'e', '\0',
   /* "beans-one.com", false */ 'b', 'e', 'a', 'n', 's', '-', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "beastlog.tk", true */ 'b', 'e', 'a', 's', 't', 'l', 'o', 'g', '.', 't', 'k', '\0',
   /* "beastowner.li", true */ 'b', 'e', 'a', 's', 't', 'o', 'w', 'n', 'e', 'r', '.', 'l', 'i', '\0',
   /* "beatnikbreaks.com", true */ 'b', 'e', 'a', 't', 'n', 'i', 'k', 'b', 'r', 'e', 'a', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "beautykat.ru", true */ 'b', 'e', 'a', 'u', 't', 'y', 'k', 'a', 't', '.', 'r', 'u', '\0',
@@ -1405,16 +1408,17 @@ static const char kSTSHostTable[] = {
   /* "blichmann.eu", true */ 'b', 'l', 'i', 'c', 'h', 'm', 'a', 'n', 'n', '.', 'e', 'u', '\0',
   /* "blieque.co.uk", true */ 'b', 'l', 'i', 'e', 'q', 'u', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "blingsparkleshine.com", true */ 'b', 'l', 'i', 'n', 'g', 's', 'p', 'a', 'r', 'k', 'l', 'e', 's', 'h', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "blinkenlight.co.uk", true */ 'b', 'l', 'i', 'n', 'k', 'e', 'n', 'l', 'i', 'g', 'h', 't', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "blinkenlight.com.au", true */ 'b', 'l', 'i', 'n', 'k', 'e', 'n', 'l', 'i', 'g', 'h', 't', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "blio.tk", true */ 'b', 'l', 'i', 'o', '.', 't', 'k', '\0',
   /* "blissjoe.com", true */ 'b', 'l', 'i', 's', 's', 'j', 'o', 'e', '.', 'c', 'o', 'm', '\0',
   /* "blissplan.com", true */ 'b', 'l', 'i', 's', 's', 'p', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0',
+  /* "blitzprog.org", true */ 'b', 'l', 'i', 't', 'z', 'p', 'r', 'o', 'g', '.', 'o', 'r', 'g', '\0',
   /* "blizz.news", true */ 'b', 'l', 'i', 'z', 'z', '.', 'n', 'e', 'w', 's', '\0',
   /* "blmiller.com", true */ 'b', 'l', 'm', 'i', 'l', 'l', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "blockchain.info", true */ 'b', 'l', 'o', 'c', 'k', 'c', 'h', 'a', 'i', 'n', '.', 'i', 'n', 'f', 'o', '\0',
   /* "blocksatz-medien.de", true */ 'b', 'l', 'o', 'c', 'k', 's', 'a', 't', 'z', '-', 'm', 'e', 'd', 'i', 'e', 'n', '.', 'd', 'e', '\0',
   /* "bloemendal.me", true */ 'b', 'l', 'o', 'e', 'm', 'e', 'n', 'd', 'a', 'l', '.', 'm', 'e', '\0',
   /* "blog.gov.uk", true */ 'b', 'l', 'o', 'g', '.', 'g', 'o', 'v', '.', 'u', 'k', '\0',
   /* "blog.gparent.org", true */ 'b', 'l', 'o', 'g', '.', 'g', 'p', 'a', 'r', 'e', 'n', 't', '.', 'o', 'r', 'g', '\0',
   /* "blog.linode.com", false */ 'b', 'l', 'o', 'g', '.', 'l', 'i', 'n', 'o', 'd', 'e', '.', 'c', 'o', 'm', '\0',
@@ -1435,17 +1439,16 @@ static const char kSTSHostTable[] = {
   /* "bluefuzz.nl", true */ 'b', 'l', 'u', 'e', 'f', 'u', 'z', 'z', '.', 'n', 'l', '\0',
   /* "blueglobalmedia.com", true */ 'b', 'l', 'u', 'e', 'g', 'l', 'o', 'b', 'a', 'l', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0',
   /* "blueimp.net", true */ 'b', 'l', 'u', 'e', 'i', 'm', 'p', '.', 'n', 'e', 't', '\0',
   /* "bluemosh.com", true */ 'b', 'l', 'u', 'e', 'm', 'o', 's', 'h', '.', 'c', 'o', 'm', '\0',
   /* "blueperil.de", true */ 'b', 'l', 'u', 'e', 'p', 'e', 'r', 'i', 'l', '.', 'd', 'e', '\0',
   /* "bluepoint.foundation", true */ 'b', 'l', 'u', 'e', 'p', 'o', 'i', 'n', 't', '.', 'f', 'o', 'u', 'n', 'd', 'a', 't', 'i', 'o', 'n', '\0',
   /* "bluepoint.institute", true */ 'b', 'l', 'u', 'e', 'p', 'o', 'i', 'n', 't', '.', 'i', 'n', 's', 't', 'i', 't', 'u', 't', 'e', '\0',
   /* "bluepoint.one", true */ 'b', 'l', 'u', 'e', 'p', 'o', 'i', 'n', 't', '.', 'o', 'n', 'e', '\0',
-  /* "bluescloud.xyz", true */ 'b', 'l', 'u', 'e', 's', 'c', 'l', 'o', 'u', 'd', '.', 'x', 'y', 'z', '\0',
   /* "bluex.im", true */ 'b', 'l', 'u', 'e', 'x', '.', 'i', 'm', '\0',
   /* "bluex.info", true */ 'b', 'l', 'u', 'e', 'x', '.', 'i', 'n', 'f', 'o', '\0',
   /* "bluex.net", true */ 'b', 'l', 'u', 'e', 'x', '.', 'n', 'e', 't', '\0',
   /* "bluex.org", true */ 'b', 'l', 'u', 'e', 'x', '.', 'o', 'r', 'g', '\0',
   /* "blumenfeldart.com", true */ 'b', 'l', 'u', 'm', 'e', 'n', 'f', 'e', 'l', 'd', 'a', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "blumiges-fischbachtal.de", true */ 'b', 'l', 'u', 'm', 'i', 'g', 'e', 's', '-', 'f', 'i', 's', 'c', 'h', 'b', 'a', 'c', 'h', 't', 'a', 'l', '.', 'd', 'e', '\0',
   /* "blupig.net", true */ 'b', 'l', 'u', 'p', 'i', 'g', '.', 'n', 'e', 't', '\0',
   /* "blurringexistence.net", true */ 'b', 'l', 'u', 'r', 'r', 'i', 'n', 'g', 'e', 'x', 'i', 's', 't', 'e', 'n', 'c', 'e', '.', 'n', 'e', 't', '\0',
@@ -1459,17 +1462,16 @@ static const char kSTSHostTable[] = {
   /* "bobancoamigo.com", true */ 'b', 'o', 'b', 'a', 'n', 'c', 'o', 'a', 'm', 'i', 'g', 'o', '.', 'c', 'o', 'm', '\0',
   /* "bobcopeland.com", true */ 'b', 'o', 'b', 'c', 'o', 'p', 'e', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0',
   /* "boboolo.com", true */ 'b', 'o', 'b', 'o', 'o', 'l', 'o', '.', 'c', 'o', 'm', '\0',
   /* "bochs.info", true */ 'b', 'o', 'c', 'h', 's', '.', 'i', 'n', 'f', 'o', '\0',
   /* "bockenauer.at", true */ 'b', 'o', 'c', 'k', 'e', 'n', 'a', 'u', 'e', 'r', '.', 'a', 't', '\0',
   /* "bodhi.fedoraproject.org", true */ 'b', 'o', 'd', 'h', 'i', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "bodo-wolff.de", false */ 'b', 'o', 'd', 'o', '-', 'w', 'o', 'l', 'f', 'f', '.', 'd', 'e', '\0',
   /* "bodrumfarm.com", true */ 'b', 'o', 'd', 'r', 'u', 'm', 'f', 'a', 'r', 'm', '.', 'c', 'o', 'm', '\0',
-  /* "bodyweightsolution.com", true */ 'b', 'o', 'd', 'y', 'w', 'e', 'i', 'g', 'h', 't', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "boeddhashop.nl", true */ 'b', 'o', 'e', 'd', 'd', 'h', 'a', 's', 'h', 'o', 'p', '.', 'n', 'l', '\0',
   /* "boernecancerfonden.dk", true */ 'b', 'o', 'e', 'r', 'n', 'e', 'c', 'a', 'n', 'c', 'e', 'r', 'f', 'o', 'n', 'd', 'e', 'n', '.', 'd', 'k', '\0',
   /* "bohramt.de", true */ 'b', 'o', 'h', 'r', 'a', 'm', 't', '.', 'd', 'e', '\0',
   /* "boilesen.com", true */ 'b', 'o', 'i', 'l', 'e', 's', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "boiseonlinemall.com", true */ 'b', 'o', 'i', 's', 'e', 'o', 'n', 'l', 'i', 'n', 'e', 'm', 'a', 'l', 'l', '.', 'c', 'o', 'm', '\0',
   /* "bokeyy.com", true */ 'b', 'o', 'k', 'e', 'y', 'y', '.', 'c', 'o', 'm', '\0',
   /* "bolt.cm", true */ 'b', 'o', 'l', 't', '.', 'c', 'm', '\0',
   /* "bombsquad.studio", true */ 'b', 'o', 'm', 'b', 's', 'q', 'u', 'a', 'd', '.', 's', 't', 'u', 'd', 'i', 'o', '\0',
@@ -1492,17 +1494,17 @@ static const char kSTSHostTable[] = {
   /* "boris64.net", true */ 'b', 'o', 'r', 'i', 's', '6', '4', '.', 'n', 'e', 't', '\0',
   /* "borisbesemer.com", true */ 'b', 'o', 'r', 'i', 's', 'b', 'e', 's', 'e', 'm', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "borrelioz.com", true */ 'b', 'o', 'r', 'r', 'e', 'l', 'i', 'o', 'z', '.', 'c', 'o', 'm', '\0',
   /* "borysek.net", true */ 'b', 'o', 'r', 'y', 's', 'e', 'k', '.', 'n', 'e', 't', '\0',
   /* "bostadsportal.se", true */ 'b', 'o', 's', 't', 'a', 'd', 's', 'p', 'o', 'r', 't', 'a', 'l', '.', 's', 'e', '\0',
   /* "bosun.io", true */ 'b', 'o', 's', 'u', 'n', '.', 'i', 'o', '\0',
   /* "bougeret.fr", true */ 'b', 'o', 'u', 'g', 'e', 'r', 'e', 't', '.', 'f', 'r', '\0',
   /* "bouncourseplanner.net", true */ 'b', 'o', 'u', 'n', 'c', 'o', 'u', 'r', 's', 'e', 'p', 'l', 'a', 'n', 'n', 'e', 'r', '.', 'n', 'e', 't', '\0',
-  /* "bouncyball.eu", true */ 'b', 'o', 'u', 'n', 'c', 'y', 'b', 'a', 'l', 'l', '.', 'e', 'u', '\0',
+  /* "bouncyball.eu", false */ 'b', 'o', 'u', 'n', 'c', 'y', 'b', 'a', 'l', 'l', '.', 'e', 'u', '\0',
   /* "bouncyballs.org", true */ 'b', 'o', 'u', 'n', 'c', 'y', 'b', 'a', 'l', 'l', 's', '.', 'o', 'r', 'g', '\0',
   /* "bountyfactory.io", true */ 'b', 'o', 'u', 'n', 't', 'y', 'f', 'a', 'c', 't', 'o', 'r', 'y', '.', 'i', 'o', '\0',
   /* "bourasse.fr", true */ 'b', 'o', 'u', 'r', 'a', 's', 's', 'e', '.', 'f', 'r', '\0',
   /* "bourse-aux-jouets.org", false */ 'b', 'o', 'u', 'r', 's', 'e', '-', 'a', 'u', 'x', '-', 'j', 'o', 'u', 'e', 't', 's', '.', 'o', 'r', 'g', '\0',
   /* "bourse-aux-vetements.org", false */ 'b', 'o', 'u', 'r', 's', 'e', '-', 'a', 'u', 'x', '-', 'v', 'e', 't', 'e', 'm', 'e', 'n', 't', 's', '.', 'o', 'r', 'g', '\0',
   /* "bourse-puericulture.org", false */ 'b', 'o', 'u', 'r', 's', 'e', '-', 'p', 'u', 'e', 'r', 'i', 'c', 'u', 'l', 't', 'u', 'r', 'e', '.', 'o', 'r', 'g', '\0',
   /* "bowling.com", true */ 'b', 'o', 'w', 'l', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "bownty.be", true */ 'b', 'o', 'w', 'n', 't', 'y', '.', 'b', 'e', '\0',
@@ -1593,16 +1595,17 @@ static const char kSTSHostTable[] = {
   /* "brrr.fr", true */ 'b', 'r', 'r', 'r', '.', 'f', 'r', '\0',
   /* "bru6.de", true */ 'b', 'r', 'u', '6', '.', 'd', 'e', '\0',
   /* "brunn.email", true */ 'b', 'r', 'u', 'n', 'n', '.', 'e', 'm', 'a', 'i', 'l', '\0',
   /* "brunoonline.co.uk", true */ 'b', 'r', 'u', 'n', 'o', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "brunoramos.com", true */ 'b', 'r', 'u', 'n', 'o', 'r', 'a', 'm', 'o', 's', '.', 'c', 'o', 'm', '\0',
   /* "brunoramos.org", true */ 'b', 'r', 'u', 'n', 'o', 'r', 'a', 'm', 'o', 's', '.', 'o', 'r', 'g', '\0',
   /* "brunosouza.org", true */ 'b', 'r', 'u', 'n', 'o', 's', 'o', 'u', 'z', 'a', '.', 'o', 'r', 'g', '\0',
   /* "bryanquigley.com", true */ 'b', 'r', 'y', 'a', 'n', 'q', 'u', 'i', 'g', 'l', 'e', 'y', '.', 'c', 'o', 'm', '\0',
+  /* "bryn.xyz", true */ 'b', 'r', 'y', 'n', '.', 'x', 'y', 'z', '\0',
   /* "bsalyzer.com", true */ 'b', 's', 'a', 'l', 'y', 'z', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "bsdug.org", true */ 'b', 's', 'd', 'u', 'g', '.', 'o', 'r', 'g', '\0',
   /* "bsidessf.com", true */ 'b', 's', 'i', 'd', 'e', 's', 's', 'f', '.', 'c', 'o', 'm', '\0',
   /* "bsklabels.com", false */ 'b', 's', 'k', 'l', 'a', 'b', 'e', 'l', 's', '.', 'c', 'o', 'm', '\0',
   /* "bsquared.org", true */ 'b', 's', 'q', 'u', 'a', 'r', 'e', 'd', '.', 'o', 'r', 'g', '\0',
   /* "bsw-solution.de", true */ 'b', 's', 'w', '-', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', '.', 'd', 'e', '\0',
   /* "bta.lv", false */ 'b', 't', 'a', '.', 'l', 'v', '\0',
   /* "btc-e.com", true */ 'b', 't', 'c', '-', 'e', '.', 'c', 'o', 'm', '\0',
@@ -1641,16 +1644,17 @@ static const char kSTSHostTable[] = {
   /* "buka.jp", true */ 'b', 'u', 'k', 'a', '.', 'j', 'p', '\0',
   /* "bukkenfan.jp", true */ 'b', 'u', 'k', 'k', 'e', 'n', 'f', 'a', 'n', '.', 'j', 'p', '\0',
   /* "bulario.com", true */ 'b', 'u', 'l', 'a', 'r', 'i', 'o', '.', 'c', 'o', 'm', '\0',
   /* "bulbcompare.com", true */ 'b', 'u', 'l', 'b', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "bulkcandystore.com", true */ 'b', 'u', 'l', 'k', 'c', 'a', 'n', 'd', 'y', 's', 't', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "bulktrade.de", true */ 'b', 'u', 'l', 'k', 't', 'r', 'a', 'd', 'e', '.', 'd', 'e', '\0',
   /* "bullbits.com", true */ 'b', 'u', 'l', 'l', 'b', 'i', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "bulldog-hosting.de", true */ 'b', 'u', 'l', 'l', 'd', 'o', 'g', '-', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'd', 'e', '\0',
+  /* "bulmafox.com", true */ 'b', 'u', 'l', 'm', 'a', 'f', 'o', 'x', '.', 'c', 'o', 'm', '\0',
   /* "bunbun.be", false */ 'b', 'u', 'n', 'b', 'u', 'n', '.', 'b', 'e', '\0',
   /* "bund-von-theramore.de", true */ 'b', 'u', 'n', 'd', '-', 'v', 'o', 'n', '-', 't', 'h', 'e', 'r', 'a', 'm', 'o', 'r', 'e', '.', 'd', 'e', '\0',
   /* "bundaberg.com", true */ 'b', 'u', 'n', 'd', 'a', 'b', 'e', 'r', 'g', '.', 'c', 'o', 'm', '\0',
   /* "bunkyo-life.com", true */ 'b', 'u', 'n', 'k', 'y', 'o', '-', 'l', 'i', 'f', 'e', '.', 'c', 'o', 'm', '\0',
   /* "bunsenlabs.org", true */ 'b', 'u', 'n', 's', 'e', 'n', 'l', 'a', 'b', 's', '.', 'o', 'r', 'g', '\0',
   /* "bureaubolster.nl", true */ 'b', 'u', 'r', 'e', 'a', 'u', 'b', 'o', 'l', 's', 't', 'e', 'r', '.', 'n', 'l', '\0',
   /* "buri.be", false */ 'b', 'u', 'r', 'i', '.', 'b', 'e', '\0',
   /* "burningcrash.de", true */ 'b', 'u', 'r', 'n', 'i', 'n', 'g', 'c', 'r', 'a', 's', 'h', '.', 'd', 'e', '\0',
@@ -1750,17 +1754,16 @@ static const char kSTSHostTable[] = {
   /* "calaborlawnews.com", true */ 'c', 'a', 'l', 'a', 'b', 'o', 'r', 'l', 'a', 'w', 'n', 'e', 'w', 's', '.', 'c', 'o', 'm', '\0',
   /* "calc.pw", true */ 'c', 'a', 'l', 'c', '.', 'p', 'w', '\0',
   /* "calculator-imt.com", true */ 'c', 'a', 'l', 'c', 'u', 'l', 'a', 't', 'o', 'r', '-', 'i', 'm', 't', '.', 'c', 'o', 'm', '\0',
   /* "calculator.tf", true */ 'c', 'a', 'l', 'c', 'u', 'l', 'a', 't', 'o', 'r', '.', 't', 'f', '\0',
   /* "calebmorris.com", false */ 'c', 'a', 'l', 'e', 'b', 'm', 'o', 'r', 'r', 'i', 's', '.', 'c', 'o', 'm', '\0',
   /* "calgoty.com", true */ 'c', 'a', 'l', 'g', 'o', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "calibreapp.com", false */ 'c', 'a', 'l', 'i', 'b', 'r', 'e', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
   /* "calibso.net", true */ 'c', 'a', 'l', 'i', 'b', 's', 'o', '.', 'n', 'e', 't', '\0',
-  /* "call.me", false */ 'c', 'a', 'l', 'l', '.', 'm', 'e', '\0',
   /* "callcap.com", false */ 'c', 'a', 'l', 'l', 'c', 'a', 'p', '.', 'c', 'o', 'm', '\0',
   /* "callear.org", true */ 'c', 'a', 'l', 'l', 'e', 'a', 'r', '.', 'o', 'r', 'g', '\0',
   /* "callhub.io", true */ 'c', 'a', 'l', 'l', 'h', 'u', 'b', '.', 'i', 'o', '\0',
   /* "callision.com", true */ 'c', 'a', 'l', 'l', 'i', 's', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "callsigns.ca", true */ 'c', 'a', 'l', 'l', 's', 'i', 'g', 'n', 's', '.', 'c', 'a', '\0',
   /* "calomel.org", true */ 'c', 'a', 'l', 'o', 'm', 'e', 'l', '.', 'o', 'r', 'g', '\0',
   /* "calories.org", true */ 'c', 'a', 'l', 'o', 'r', 'i', 'e', 's', '.', 'o', 'r', 'g', '\0',
   /* "caltonnutrition.com", true */ 'c', 'a', 'l', 't', 'o', 'n', 'n', 'u', 't', 'r', 'i', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
@@ -1787,17 +1790,16 @@ static const char kSTSHostTable[] = {
   /* "canadalife.de", true */ 'c', 'a', 'n', 'a', 'd', 'a', 'l', 'i', 'f', 'e', '.', 'd', 'e', '\0',
   /* "canadasmotorcycle.ca", true */ 'c', 'a', 'n', 'a', 'd', 'a', 's', 'm', 'o', 't', 'o', 'r', 'c', 'y', 'c', 'l', 'e', '.', 'c', 'a', '\0',
   /* "canadian.dating", true */ 'c', 'a', 'n', 'a', 'd', 'i', 'a', 'n', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0',
   /* "canadianchristianity.com", true */ 'c', 'a', 'n', 'a', 'd', 'i', 'a', 'n', 'c', 'h', 'r', 'i', 's', 't', 'i', 'a', 'n', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "canarymod.net", true */ 'c', 'a', 'n', 'a', 'r', 'y', 'm', 'o', 'd', '.', 'n', 'e', 't', '\0',
   /* "cando.eu", true */ 'c', 'a', 'n', 'd', 'o', '.', 'e', 'u', '\0',
   /* "candy-it.de", true */ 'c', 'a', 'n', 'd', 'y', '-', 'i', 't', '.', 'd', 'e', '\0',
   /* "canhazip.com", true */ 'c', 'a', 'n', 'h', 'a', 'z', 'i', 'p', '.', 'c', 'o', 'm', '\0',
-  /* "cannyfoxx.me", true */ 'c', 'a', 'n', 'n', 'y', 'f', 'o', 'x', 'x', '.', 'm', 'e', '\0',
   /* "canoonic.se", true */ 'c', 'a', 'n', 'o', 'o', 'n', 'i', 'c', '.', 's', 'e', '\0',
   /* "cantrack.com", true */ 'c', 'a', 'n', 't', 'r', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0',
   /* "canva-dev.com", true */ 'c', 'a', 'n', 'v', 'a', '-', 'd', 'e', 'v', '.', 'c', 'o', 'm', '\0',
   /* "canva.com", true */ 'c', 'a', 'n', 'v', 'a', '.', 'c', 'o', 'm', '\0',
   /* "canyoupwn.me", true */ 'c', 'a', 'n', 'y', 'o', 'u', 'p', 'w', 'n', '.', 'm', 'e', '\0',
   /* "cao.gov", true */ 'c', 'a', 'o', '.', 'g', 'o', 'v', '\0',
   /* "cao.la", true */ 'c', 'a', 'o', '.', 'l', 'a', '\0',
   /* "capacent.is", true */ 'c', 'a', 'p', 'a', 'c', 'e', 'n', 't', '.', 'i', 's', '\0',
@@ -2233,17 +2235,16 @@ static const char kSTSHostTable[] = {
   /* "codingrobots.com", true */ 'c', 'o', 'd', 'i', 'n', 'g', 'r', 'o', 'b', 'o', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "codyevanscomputer.com", true */ 'c', 'o', 'd', 'y', 'e', 'v', 'a', 'n', 's', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "codymoniz.com", true */ 'c', 'o', 'd', 'y', 'm', 'o', 'n', 'i', 'z', '.', 'c', 'o', 'm', '\0',
   /* "coffee-mamenoki.jp", true */ 'c', 'o', 'f', 'f', 'e', 'e', '-', 'm', 'a', 'm', 'e', 'n', 'o', 'k', 'i', '.', 'j', 'p', '\0',
   /* "cogent.cc", true */ 'c', 'o', 'g', 'e', 'n', 't', '.', 'c', 'c', '\0',
   /* "cogitoltd.com", true */ 'c', 'o', 'g', 'i', 't', 'o', 'l', 't', 'd', '.', 'c', 'o', 'm', '\0',
   /* "cogumelosmagicos.org", true */ 'c', 'o', 'g', 'u', 'm', 'e', 'l', 'o', 's', 'm', 'a', 'g', 'i', 'c', 'o', 's', '.', 'o', 'r', 'g', '\0',
   /* "coi-verify.com", true */ 'c', 'o', 'i', '-', 'v', 'e', 'r', 'i', 'f', 'y', '.', 'c', 'o', 'm', '\0',
-  /* "coimmvest.com", true */ 'c', 'o', 'i', 'm', 'm', 'v', 'e', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "coin.dance", true */ 'c', 'o', 'i', 'n', '.', 'd', 'a', 'n', 'c', 'e', '\0',
   /* "coinapult.com", true */ 'c', 'o', 'i', 'n', 'a', 'p', 'u', 'l', 't', '.', 'c', 'o', 'm', '\0',
   /* "coinbase.com", true */ 'c', 'o', 'i', 'n', 'b', 'a', 's', 'e', '.', 'c', 'o', 'm', '\0',
   /* "coinessa.com", true */ 'c', 'o', 'i', 'n', 'e', 's', 's', 'a', '.', 'c', 'o', 'm', '\0',
   /* "coinjar-sandbox.com", true */ 'c', 'o', 'i', 'n', 'j', 'a', 'r', '-', 's', 'a', 'n', 'd', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0',
   /* "cojo.eu", true */ 'c', 'o', 'j', 'o', '.', 'e', 'u', '\0',
   /* "coldawn.com", true */ 'c', 'o', 'l', 'd', 'a', 'w', 'n', '.', 'c', 'o', 'm', '\0',
   /* "coldfff.com", false */ 'c', 'o', 'l', 'd', 'f', 'f', 'f', '.', 'c', 'o', 'm', '\0',
@@ -2434,28 +2435,30 @@ static const char kSTSHostTable[] = {
   /* "creative-wave.fr", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', '-', 'w', 'a', 'v', 'e', '.', 'f', 'r', '\0',
   /* "creativeartifice.com", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', 'a', 'r', 't', 'i', 'f', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "creativecaptiv.es", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', 'c', 'a', 'p', 't', 'i', 'v', '.', 'e', 's', '\0',
   /* "creditkarma.com", true */ 'c', 'r', 'e', 'd', 'i', 't', 'k', 'a', 'r', 'm', 'a', '.', 'c', 'o', 'm', '\0',
   /* "creditproautos.com", false */ 'c', 'r', 'e', 'd', 'i', 't', 'p', 'r', 'o', 'a', 'u', 't', 'o', 's', '.', 'c', 'o', 'm', '\0',
   /* "creep.im", true */ 'c', 'r', 'e', 'e', 'p', '.', 'i', 'm', '\0',
   /* "crefelder.com", true */ 'c', 'r', 'e', 'f', 'e', 'l', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "crepererum.net", true */ 'c', 'r', 'e', 'p', 'e', 'r', 'e', 'r', 'u', 'm', '.', 'n', 'e', 't', '\0',
+  /* "crestasantos.com", true */ 'c', 'r', 'e', 's', 't', 'a', 's', 'a', 'n', 't', 'o', 's', '.', 'c', 'o', 'm', '\0',
   /* "crimson.no", true */ 'c', 'r', 'i', 'm', 's', 'o', 'n', '.', 'n', 'o', '\0',
   /* "cristiandeluxe.com", true */ 'c', 'r', 'i', 's', 't', 'i', 'a', 'n', 'd', 'e', 'l', 'u', 'x', 'e', '.', 'c', 'o', 'm', '\0',
   /* "critcola.com", true */ 'c', 'r', 'i', 't', 'c', 'o', 'l', 'a', '.', 'c', 'o', 'm', '\0',
   /* "criticalaim.com", true */ 'c', 'r', 'i', 't', 'i', 'c', 'a', 'l', 'a', 'i', 'm', '.', 'c', 'o', 'm', '\0',
   /* "criticalsurveys.co.uk", true */ 'c', 'r', 'i', 't', 'i', 'c', 'a', 'l', 's', 'u', 'r', 'v', 'e', 'y', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "crl-autos.com", true */ 'c', 'r', 'l', '-', 'a', 'u', 't', 'o', 's', '.', 'c', 'o', 'm', '\0',
   /* "crm.onlime.ch", false */ 'c', 'r', 'm', '.', 'o', 'n', 'l', 'i', 'm', 'e', '.', 'c', 'h', '\0',
   /* "cross-view.com", true */ 'c', 'r', 'o', 's', 's', '-', 'v', 'i', 'e', 'w', '.', 'c', 'o', 'm', '\0',
   /* "cross-x.com", true */ 'c', 'r', 'o', 's', 's', '-', 'x', '.', 'c', 'o', 'm', '\0',
   /* "crosscom.ch", true */ 'c', 'r', 'o', 's', 's', 'c', 'o', 'm', '.', 'c', 'h', '\0',
   /* "crossfitblackwater.com", true */ 'c', 'r', 'o', 's', 's', 'f', 'i', 't', 'b', 'l', 'a', 'c', 'k', 'w', 'a', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "crosssellguide.com", true */ 'c', 'r', 'o', 's', 's', 's', 'e', 'l', 'l', 'g', 'u', 'i', 'd', 'e', '.', 'c', 'o', 'm', '\0',
+  /* "crow.tw", true */ 'c', 'r', 'o', 'w', '.', 't', 'w', '\0',
   /* "crowdsupply.com", true */ 'c', 'r', 'o', 'w', 'd', 's', 'u', 'p', 'p', 'l', 'y', '.', 'c', 'o', 'm', '\0',
   /* "crownruler.com", true */ 'c', 'r', 'o', 'w', 'n', 'r', 'u', 'l', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "crstat.ru", true */ 'c', 'r', 's', 't', 'a', 't', '.', 'r', 'u', '\0',
   /* "crt.sh", true */ 'c', 'r', 't', '.', 's', 'h', '\0',
   /* "crufad.org", true */ 'c', 'r', 'u', 'f', 'a', 'd', '.', 'o', 'r', 'g', '\0',
   /* "crumbcontrol.com", true */ 'c', 'r', 'u', 'm', 'b', 'c', 'o', 'n', 't', 'r', 'o', 'l', '.', 'c', 'o', 'm', '\0',
   /* "crushroom.com", true */ 'c', 'r', 'u', 's', 'h', 'r', 'o', 'o', 'm', '.', 'c', 'o', 'm', '\0',
   /* "crute.me", true */ 'c', 'r', 'u', 't', 'e', '.', 'm', 'e', '\0',
@@ -2650,16 +2653,17 @@ static const char kSTSHostTable[] = {
   /* "danielvoogsgerd.nl", true */ 'd', 'a', 'n', 'i', 'e', 'l', 'v', 'o', 'o', 'g', 's', 'g', 'e', 'r', 'd', '.', 'n', 'l', '\0',
   /* "danilapisarev.com", true */ 'd', 'a', 'n', 'i', 'l', 'a', 'p', 'i', 's', 'a', 'r', 'e', 'v', '.', 'c', 'o', 'm', '\0',
   /* "danishenanigans.com", true */ 'd', 'a', 'n', 'i', 's', 'h', 'e', 'n', 'a', 'n', 'i', 'g', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "danjesensky.com", true */ 'd', 'a', 'n', 'j', 'e', 's', 'e', 'n', 's', 'k', 'y', '.', 'c', 'o', 'm', '\0',
   /* "dank.ninja", true */ 'd', 'a', 'n', 'k', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "dankim.de", false */ 'd', 'a', 'n', 'k', 'i', 'm', '.', 'd', 'e', '\0',
   /* "danny.fm", true */ 'd', 'a', 'n', 'n', 'y', '.', 'f', 'm', '\0',
   /* "dannycrichton.com", true */ 'd', 'a', 'n', 'n', 'y', 'c', 'r', 'i', 'c', 'h', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0',
+  /* "dannyrohde.de", true */ 'd', 'a', 'n', 'n', 'y', 'r', 'o', 'h', 'd', 'e', '.', 'd', 'e', '\0',
   /* "danonsecurity.com", true */ 'd', 'a', 'n', 'o', 'n', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "danscomp.com", true */ 'd', 'a', 'n', 's', 'c', 'o', 'm', 'p', '.', 'c', 'o', 'm', '\0',
   /* "danseressen.nl", true */ 'd', 'a', 'n', 's', 'e', 'r', 'e', 's', 's', 'e', 'n', '.', 'n', 'l', '\0',
   /* "danskoferie.dk", true */ 'd', 'a', 'n', 's', 'k', 'o', 'f', 'e', 'r', 'i', 'e', '.', 'd', 'k', '\0',
   /* "danw.io", true */ 'd', 'a', 'n', 'w', '.', 'i', 'o', '\0',
   /* "daphne.informatik.uni-freiburg.de", true */ 'd', 'a', 'p', 'h', 'n', 'e', '.', 'i', 'n', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'k', '.', 'u', 'n', 'i', '-', 'f', 'r', 'e', 'i', 'b', 'u', 'r', 'g', '.', 'd', 'e', '\0',
   /* "daplie.com", true */ 'd', 'a', 'p', 'l', 'i', 'e', '.', 'c', 'o', 'm', '\0',
   /* "darchoods.net", false */ 'd', 'a', 'r', 'c', 'h', 'o', 'o', 'd', 's', '.', 'n', 'e', 't', '\0',
@@ -2696,17 +2700,17 @@ static const char kSTSHostTable[] = {
   /* "datacalle.com", true */ 'd', 'a', 't', 'a', 'c', 'a', 'l', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "datacandy.com", true */ 'd', 'a', 't', 'a', 'c', 'a', 'n', 'd', 'y', '.', 'c', 'o', 'm', '\0',
   /* "datadit.hu", true */ 'd', 'a', 't', 'a', 'd', 'i', 't', '.', 'h', 'u', '\0',
   /* "datajapan.co.jp", true */ 'd', 'a', 't', 'a', 'j', 'a', 'p', 'a', 'n', '.', 'c', 'o', '.', 'j', 'p', '\0',
   /* "datapun.ch", true */ 'd', 'a', 't', 'a', 'p', 'u', 'n', '.', 'c', 'h', '\0',
   /* "datascience.cafe", true */ 'd', 'a', 't', 'a', 's', 'c', 'i', 'e', 'n', 'c', 'e', '.', 'c', 'a', 'f', 'e', '\0',
   /* "datascomemorativas.com.br", true */ 'd', 'a', 't', 'a', 's', 'c', 'o', 'm', 'e', 'm', 'o', 'r', 'a', 't', 'i', 'v', 'a', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "datasharesystem.com", true */ 'd', 'a', 't', 'a', 's', 'h', 'a', 'r', 'e', 's', 'y', 's', 't', 'e', 'm', '.', 'c', 'o', 'm', '\0',
-  /* "dataskydd.net", true */ 'd', 'a', 't', 'a', 's', 'k', 'y', 'd', 'd', '.', 'n', 'e', 't', '\0',
+  /* "dataskydd.net", false */ 'd', 'a', 't', 'a', 's', 'k', 'y', 'd', 'd', '.', 'n', 'e', 't', '\0',
   /* "datasnitch.co.uk", true */ 'd', 'a', 't', 'a', 's', 'n', 'i', 't', 'c', 'h', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "datastream.re", true */ 'd', 'a', 't', 'a', 's', 't', 'r', 'e', 'a', 'm', '.', 'r', 'e', '\0',
   /* "dataswamp.org", true */ 'd', 'a', 't', 'a', 's', 'w', 'a', 'm', 'p', '.', 'o', 'r', 'g', '\0',
   /* "datatekniikka.com", false */ 'd', 'a', 't', 'a', 't', 'e', 'k', 'n', 'i', 'i', 'k', 'k', 'a', '.', 'c', 'o', 'm', '\0',
   /* "datatekniikka.fi", false */ 'd', 'a', 't', 'a', 't', 'e', 'k', 'n', 'i', 'i', 'k', 'k', 'a', '.', 'f', 'i', '\0',
   /* "datorb.com", true */ 'd', 'a', 't', 'o', 'r', 'b', '.', 'c', 'o', 'm', '\0',
   /* "datortipsen.se", true */ 'd', 'a', 't', 'o', 'r', 't', 'i', 'p', 's', 'e', 'n', '.', 's', 'e', '\0',
   /* "datsound.ru", true */ 'd', 'a', 't', 's', 'o', 'u', 'n', 'd', '.', 'r', 'u', '\0',
@@ -2913,17 +2917,16 @@ static const char kSTSHostTable[] = {
   /* "dhauwer.nl", true */ 'd', 'h', 'a', 'u', 'w', 'e', 'r', '.', 'n', 'l', '\0',
   /* "dhedegaard.dk", true */ 'd', 'h', 'e', 'd', 'e', 'g', 'a', 'a', 'r', 'd', '.', 'd', 'k', '\0',
   /* "dhome.at", true */ 'd', 'h', 'o', 'm', 'e', '.', 'a', 't', '\0',
   /* "dhuy.net", true */ 'd', 'h', 'u', 'y', '.', 'n', 'e', 't', '\0',
   /* "diagnostix.org", true */ 'd', 'i', 'a', 'g', 'n', 'o', 's', 't', 'i', 'x', '.', 'o', 'r', 'g', '\0',
   /* "diamante.ro", true */ 'd', 'i', 'a', 'm', 'a', 'n', 't', 'e', '.', 'r', 'o', '\0',
   /* "dianlujitao.com", true */ 'd', 'i', 'a', 'n', 'l', 'u', 'j', 'i', 't', 'a', 'o', '.', 'c', 'o', 'm', '\0',
   /* "diasdasemana.com", true */ 'd', 'i', 'a', 's', 'd', 'a', 's', 'e', 'm', 'a', 'n', 'a', '.', 'c', 'o', 'm', '\0',
-  /* "diasporadialogues.com", true */ 'd', 'i', 'a', 's', 'p', 'o', 'r', 'a', 'd', 'i', 'a', 'l', 'o', 'g', 'u', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "diavo.de", true */ 'd', 'i', 'a', 'v', 'o', '.', 'd', 'e', '\0',
   /* "dibiphp.com", true */ 'd', 'i', 'b', 'i', 'p', 'h', 'p', '.', 'c', 'o', 'm', '\0',
   /* "dicgaming.net", true */ 'd', 'i', 'c', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "dicionariodenomesproprios.com.br", true */ 'd', 'i', 'c', 'i', 'o', 'n', 'a', 'r', 'i', 'o', 'd', 'e', 'n', 'o', 'm', 'e', 's', 'p', 'r', 'o', 'p', 'r', 'i', 'o', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "dicionariofinanceiro.com", true */ 'd', 'i', 'c', 'i', 'o', 'n', 'a', 'r', 'i', 'o', 'f', 'i', 'n', 'a', 'n', 'c', 'e', 'i', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "dick.red", true */ 'd', 'i', 'c', 'k', '.', 'r', 'e', 'd', '\0',
   /* "dickieslife.com", true */ 'd', 'i', 'c', 'k', 'i', 'e', 's', 'l', 'i', 'f', 'e', '.', 'c', 'o', 'm', '\0',
   /* "didacte.com", true */ 'd', 'i', 'd', 'a', 'c', 't', 'e', '.', 'c', 'o', 'm', '\0',
@@ -3206,18 +3209,17 @@ static const char kSTSHostTable[] = {
   /* "drweissbrot.net", true */ 'd', 'r', 'w', 'e', 'i', 's', 's', 'b', 'r', 'o', 't', '.', 'n', 'e', 't', '\0',
   /* "drycreekphoto.com", true */ 'd', 'r', 'y', 'c', 'r', 'e', 'e', 'k', 'p', 'h', 'o', 't', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ds-christiansen.de", true */ 'd', 's', '-', 'c', 'h', 'r', 'i', 's', 't', 'i', 'a', 'n', 's', 'e', 'n', '.', 'd', 'e', '\0',
   /* "dsbrowser.com", true */ 'd', 's', 'b', 'r', 'o', 'w', 's', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "dsebastien.net", true */ 'd', 's', 'e', 'b', 'a', 's', 't', 'i', 'e', 'n', '.', 'n', 'e', 't', '\0',
   /* "dsol.hu", true */ 'd', 's', 'o', 'l', '.', 'h', 'u', '\0',
   /* "dt27.org", true */ 'd', 't', '2', '7', '.', 'o', 'r', 'g', '\0',
   /* "dubaieveningsafari.com", true */ 'd', 'u', 'b', 'a', 'i', 'e', 'v', 'e', 'n', 'i', 'n', 'g', 's', 'a', 'f', 'a', 'r', 'i', '.', 'c', 'o', 'm', '\0',
-  /* "dubrovskiy.net", true */ 'd', 'u', 'b', 'r', 'o', 'v', 's', 'k', 'i', 'y', '.', 'n', 'e', 't', '\0',
-  /* "dubrovskiy.pro", true */ 'd', 'u', 'b', 'r', 'o', 'v', 's', 'k', 'i', 'y', '.', 'p', 'r', 'o', '\0',
+  /* "duckasylum.com", true */ 'd', 'u', 'c', 'k', 'a', 's', 'y', 'l', 'u', 'm', '.', 'c', 'o', 'm', '\0',
   /* "duckduckstart.com", true */ 'd', 'u', 'c', 'k', 'd', 'u', 'c', 'k', 's', 't', 'a', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "duckinc.net", true */ 'd', 'u', 'c', 'k', 'i', 'n', 'c', '.', 'n', 'e', 't', '\0',
   /* "ducohosting.com", true */ 'd', 'u', 'c', 'o', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "duelysthub.com", true */ 'd', 'u', 'e', 'l', 'y', 's', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '\0',
   /* "duernberg.at", true */ 'd', 'u', 'e', 'r', 'n', 'b', 'e', 'r', 'g', '.', 'a', 't', '\0',
   /* "duijf.info", true */ 'd', 'u', 'i', 'j', 'f', '.', 'i', 'n', 'f', 'o', '\0',
   /* "duijfathome.nl", true */ 'd', 'u', 'i', 'j', 'f', 'a', 't', 'h', 'o', 'm', 'e', '.', 'n', 'l', '\0',
   /* "dukan-recepty.ru", true */ 'd', 'u', 'k', 'a', 'n', '-', 'r', 'e', 'c', 'e', 'p', 't', 'y', '.', 'r', 'u', '\0',
@@ -3242,17 +3244,17 @@ static const char kSTSHostTable[] = {
   /* "dutchweballiance.nl", true */ 'd', 'u', 't', 'c', 'h', 'w', 'e', 'b', 'a', 'l', 'l', 'i', 'a', 'n', 'c', 'e', '.', 'n', 'l', '\0',
   /* "dutyfreeonboard.com", true */ 'd', 'u', 't', 'y', 'f', 'r', 'e', 'e', 'o', 'n', 'b', 'o', 'a', 'r', 'd', '.', 'c', 'o', 'm', '\0',
   /* "duuu.ch", true */ 'd', 'u', 'u', 'u', '.', 'c', 'h', '\0',
   /* "dvbris.co.uk", true */ 'd', 'v', 'b', 'r', 'i', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "dvbris.com", true */ 'd', 'v', 'b', 'r', 'i', 's', '.', 'c', 'o', 'm', '\0',
   /* "dvorupotocnych.sk", true */ 'd', 'v', 'o', 'r', 'u', 'p', 'o', 't', 'o', 'c', 'n', 'y', 'c', 'h', '.', 's', 'k', '\0',
   /* "dvotx.org", true */ 'd', 'v', 'o', 't', 'x', '.', 'o', 'r', 'g', '\0',
   /* "dvwc.org", true */ 'd', 'v', 'w', 'c', '.', 'o', 'r', 'g', '\0',
-  /* "dworzak.ch", true */ 'd', 'w', 'o', 'r', 'z', 'a', 'k', '.', 'c', 'h', '\0',
+  /* "dwnld.me", true */ 'd', 'w', 'n', 'l', 'd', '.', 'm', 'e', '\0',
   /* "dxa.io", true */ 'd', 'x', 'a', '.', 'i', 'o', '\0',
   /* "dxgl.info", true */ 'd', 'x', 'g', 'l', '.', 'i', 'n', 'f', 'o', '\0',
   /* "dyeager.org", true */ 'd', 'y', 'e', 'a', 'g', 'e', 'r', '.', 'o', 'r', 'g', '\0',
   /* "dyktig.as", true */ 'd', 'y', 'k', 't', 'i', 'g', '.', 'a', 's', '\0',
   /* "dyn-nserve.net", true */ 'd', 'y', 'n', '-', 'n', 's', 'e', 'r', 'v', 'e', '.', 'n', 'e', 't', '\0',
   /* "dyn.im", true */ 'd', 'y', 'n', '.', 'i', 'm', '\0',
   /* "dynaloop.net", true */ 'd', 'y', 'n', 'a', 'l', 'o', 'o', 'p', '.', 'n', 'e', 't', '\0',
   /* "dynamicnet.net", false */ 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'n', 'e', 't', '.', 'n', 'e', 't', '\0',
@@ -3517,17 +3519,16 @@ static const char kSTSHostTable[] = {
   /* "energyatlas.com", true */ 'e', 'n', 'e', 'r', 'g', 'y', 'a', 't', 'l', 'a', 's', '.', 'c', 'o', 'm', '\0',
   /* "energydrinkblog.de", true */ 'e', 'n', 'e', 'r', 'g', 'y', 'd', 'r', 'i', 'n', 'k', 'b', 'l', 'o', 'g', '.', 'd', 'e', '\0',
   /* "enfoqueseguro.com", true */ 'e', 'n', 'f', 'o', 'q', 'u', 'e', 's', 'e', 'g', 'u', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "engelundlicht.ch", true */ 'e', 'n', 'g', 'e', 'l', 'u', 'n', 'd', 'l', 'i', 'c', 'h', 't', '.', 'c', 'h', '\0',
   /* "engineeryourmarketing.com", true */ 'e', 'n', 'g', 'i', 'n', 'e', 'e', 'r', 'y', 'o', 'u', 'r', 'm', 'a', 'r', 'k', 'e', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "englerts.de", true */ 'e', 'n', 'g', 'l', 'e', 'r', 't', 's', '.', 'd', 'e', '\0',
   /* "englishbulgaria.net", true */ 'e', 'n', 'g', 'l', 'i', 's', 'h', 'b', 'u', 'l', 'g', 'a', 'r', 'i', 'a', '.', 'n', 'e', 't', '\0',
   /* "englishclub.com", true */ 'e', 'n', 'g', 'l', 'i', 's', 'h', 'c', 'l', 'u', 'b', '.', 'c', 'o', 'm', '\0',
-  /* "enigmacpt.com", true */ 'e', 'n', 'i', 'g', 'm', 'a', 'c', 'p', 't', '.', 'c', 'o', 'm', '\0',
   /* "enjen.net", true */ 'e', 'n', 'j', 'e', 'n', '.', 'n', 'e', 't', '\0',
   /* "enjoy-nepal.de", true */ 'e', 'n', 'j', 'o', 'y', '-', 'n', 'e', 'p', 'a', 'l', '.', 'd', 'e', '\0',
   /* "enlatte.com", true */ 'e', 'n', 'l', 'a', 't', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "enlightened.si", true */ 'e', 'n', 'l', 'i', 'g', 'h', 't', 'e', 'n', 'e', 'd', '.', 's', 'i', '\0',
   /* "enlightenedhr.com", true */ 'e', 'n', 'l', 'i', 'g', 'h', 't', 'e', 'n', 'e', 'd', 'h', 'r', '.', 'c', 'o', 'm', '\0',
   /* "enloestatebank.com", true */ 'e', 'n', 'l', 'o', 'e', 's', 't', 'a', 't', 'e', 'b', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0',
   /* "enorekcah.com", true */ 'e', 'n', 'o', 'r', 'e', 'k', 'c', 'a', 'h', '.', 'c', 'o', 'm', '\0',
   /* "enot32.ru", true */ 'e', 'n', 'o', 't', '3', '2', '.', 'r', 'u', '\0',
@@ -3580,16 +3581,17 @@ static const char kSTSHostTable[] = {
   /* "erichalv.com", true */ 'e', 'r', 'i', 'c', 'h', 'a', 'l', 'v', '.', 'c', 'o', 'm', '\0',
   /* "erichorstmanshof.nl", true */ 'e', 'r', 'i', 'c', 'h', 'o', 'r', 's', 't', 'm', 'a', 'n', 's', 'h', 'o', 'f', '.', 'n', 'l', '\0',
   /* "ericisaweso.me", true */ 'e', 'r', 'i', 'c', 'i', 's', 'a', 'w', 'e', 's', 'o', '.', 'm', 'e', '\0',
   /* "ericleuthardt.com", true */ 'e', 'r', 'i', 'c', 'l', 'e', 'u', 't', 'h', 'a', 'r', 'd', 't', '.', 'c', 'o', 'm', '\0',
   /* "erico.jp", true */ 'e', 'r', 'i', 'c', 'o', '.', 'j', 'p', '\0',
   /* "ericwie.se", true */ 'e', 'r', 'i', 'c', 'w', 'i', 'e', '.', 's', 'e', '\0',
   /* "erigrid.eu", true */ 'e', 'r', 'i', 'g', 'r', 'i', 'd', '.', 'e', 'u', '\0',
   /* "eriix.org", true */ 'e', 'r', 'i', 'i', 'x', '.', 'o', 'r', 'g', '\0',
+  /* "erikhubers.nl", true */ 'e', 'r', 'i', 'k', 'h', 'u', 'b', 'e', 'r', 's', '.', 'n', 'l', '\0',
   /* "erikseth.de", true */ 'e', 'r', 'i', 'k', 's', 'e', 't', 'h', '.', 'd', 'e', '\0',
   /* "eriner.me", true */ 'e', 'r', 'i', 'n', 'e', 'r', '.', 'm', 'e', '\0',
   /* "erisrenee.com", true */ 'e', 'r', 'i', 's', 'r', 'e', 'n', 'e', 'e', '.', 'c', 'o', 'm', '\0',
   /* "ernest.ly", true */ 'e', 'r', 'n', 'e', 's', 't', '.', 'l', 'y', '\0',
   /* "ernesto.at", true */ 'e', 'r', 'n', 'e', 's', 't', 'o', '.', 'a', 't', '\0',
   /* "erp-band.ru", true */ 'e', 'r', 'p', '-', 'b', 'a', 'n', 'd', '.', 'r', 'u', '\0',
   /* "erp.band", true */ 'e', 'r', 'p', '.', 'b', 'a', 'n', 'd', '\0',
   /* "erpband.ru", true */ 'e', 'r', 'p', 'b', 'a', 'n', 'd', '.', 'r', 'u', '\0',
@@ -3936,16 +3938,17 @@ static const char kSTSHostTable[] = {
   /* "finiteheap.com", false */ 'f', 'i', 'n', 'i', 't', 'e', 'h', 'e', 'a', 'p', '.', 'c', 'o', 'm', '\0',
   /* "finkelstein.fr", true */ 'f', 'i', 'n', 'k', 'e', 'l', 's', 't', 'e', 'i', 'n', '.', 'f', 'r', '\0',
   /* "finn.io", true */ 'f', 'i', 'n', 'n', '.', 'i', 'o', '\0',
   /* "finneas.net", true */ 'f', 'i', 'n', 'n', 'e', 'a', 's', '.', 'n', 'e', 't', '\0',
   /* "finstererlebnis.de", true */ 'f', 'i', 'n', 's', 't', 'e', 'r', 'e', 'r', 'l', 'e', 'b', 'n', 'i', 's', '.', 'd', 'e', '\0',
   /* "finsterlebnis.de", true */ 'f', 'i', 'n', 's', 't', 'e', 'r', 'l', 'e', 'b', 'n', 'i', 's', '.', 'd', 'e', '\0',
   /* "fionamcbride.com", true */ 'f', 'i', 'o', 'n', 'a', 'm', 'c', 'b', 'r', 'i', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "firebaseio.com", true */ 'f', 'i', 'r', 'e', 'b', 'a', 's', 'e', 'i', 'o', '.', 'c', 'o', 'm', '\0',
+  /* "firebird.io", true */ 'f', 'i', 'r', 'e', 'b', 'i', 'r', 'd', '.', 'i', 'o', '\0',
   /* "firebirdrangecookers.com", true */ 'f', 'i', 'r', 'e', 'b', 'i', 'r', 'd', 'r', 'a', 'n', 'g', 'e', 'c', 'o', 'o', 'k', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "firecore.com", false */ 'f', 'i', 'r', 'e', 'c', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "firefart.at", false */ 'f', 'i', 'r', 'e', 'f', 'a', 'r', 't', '.', 'a', 't', '\0',
   /* "firefighters.dating", true */ 'f', 'i', 'r', 'e', 'f', 'i', 'g', 'h', 't', 'e', 'r', 's', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0',
   /* "firehost.com", true */ 'f', 'i', 'r', 'e', 'h', 'o', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "fireorbit.de", true */ 'f', 'i', 'r', 'e', 'o', 'r', 'b', 'i', 't', '.', 'd', 'e', '\0',
   /* "firevap.org", true */ 'f', 'i', 'r', 'e', 'v', 'a', 'p', '.', 'o', 'r', 'g', '\0',
   /* "firewallconsultants.com", true */ 'f', 'i', 'r', 'e', 'w', 'a', 'l', 'l', 'c', 'o', 'n', 's', 'u', 'l', 't', 'a', 'n', 't', 's', '.', 'c', 'o', 'm', '\0',
@@ -4055,16 +4058,17 @@ static const char kSTSHostTable[] = {
   /* "foodblogger.club", true */ 'f', 'o', 'o', 'd', 'b', 'l', 'o', 'g', 'g', 'e', 'r', '.', 'c', 'l', 'u', 'b', '\0',
   /* "foodiebox.no", true */ 'f', 'o', 'o', 'd', 'i', 'e', 'b', 'o', 'x', '.', 'n', 'o', '\0',
   /* "foodies.my", true */ 'f', 'o', 'o', 'd', 'i', 'e', 's', '.', 'm', 'y', '\0',
   /* "foodievenues.com", true */ 'f', 'o', 'o', 'd', 'i', 'e', 'v', 'e', 'n', 'u', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "foodplantengineering.com", true */ 'f', 'o', 'o', 'd', 'p', 'l', 'a', 'n', 't', 'e', 'n', 'g', 'i', 'n', 'e', 'e', 'r', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "foodwise.marketing", true */ 'f', 'o', 'o', 'd', 'w', 'i', 's', 'e', '.', 'm', 'a', 'r', 'k', 'e', 't', 'i', 'n', 'g', '\0',
   /* "foolwealth.com", true */ 'f', 'o', 'o', 'l', 'w', 'e', 'a', 'l', 't', 'h', '.', 'c', 'o', 'm', '\0',
   /* "foorack.com", true */ 'f', 'o', 'o', 'r', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0',
+  /* "fooster.io", true */ 'f', 'o', 'o', 's', 't', 'e', 'r', '.', 'i', 'o', '\0',
   /* "foray-jero.me", true */ 'f', 'o', 'r', 'a', 'y', '-', 'j', 'e', 'r', 'o', '.', 'm', 'e', '\0',
   /* "fordbydesign.com", true */ 'f', 'o', 'r', 'd', 'b', 'y', 'd', 'e', 's', 'i', 'g', 'n', '.', 'c', 'o', 'm', '\0',
   /* "forewordreviews.com", true */ 'f', 'o', 'r', 'e', 'w', 'o', 'r', 'd', 'r', 'e', 'v', 'i', 'e', 'w', 's', '.', 'c', 'o', 'm', '\0',
   /* "forex.ee", true */ 'f', 'o', 'r', 'e', 'x', '.', 'e', 'e', '\0',
   /* "forextimes.ru", true */ 'f', 'o', 'r', 'e', 'x', 't', 'i', 'm', 'e', 's', '.', 'r', 'u', '\0',
   /* "forgix.com", true */ 'f', 'o', 'r', 'g', 'i', 'x', '.', 'c', 'o', 'm', '\0',
   /* "formationseeker.com", true */ 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', 's', 'e', 'e', 'k', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "formationsfactory.co.uk", false */ 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', 's', 'f', 'a', 'c', 't', 'o', 'r', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0',
@@ -4359,17 +4363,16 @@ static const char kSTSHostTable[] = {
   /* "gemini.com", true */ 'g', 'e', 'm', 'i', 'n', 'i', '.', 'c', 'o', 'm', '\0',
   /* "gendrin.com", true */ 'g', 'e', 'n', 'd', 'r', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "geneau.net", true */ 'g', 'e', 'n', 'e', 'a', 'u', '.', 'n', 'e', 't', '\0',
   /* "genehome.com.au", true */ 'g', 'e', 'n', 'e', 'h', 'o', 'm', 'e', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "generali-worldwide.com", true */ 'g', 'e', 'n', 'e', 'r', 'a', 'l', 'i', '-', 'w', 'o', 'r', 'l', 'd', 'w', 'i', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "generationnext.pl", true */ 'g', 'e', 'n', 'e', 'r', 'a', 't', 'i', 'o', 'n', 'n', 'e', 'x', 't', '.', 'p', 'l', '\0',
   /* "generic.cx", true */ 'g', 'e', 'n', 'e', 'r', 'i', 'c', '.', 'c', 'x', '\0',
   /* "genesiseureka.com", true */ 'g', 'e', 'n', 'e', 's', 'i', 's', 'e', 'u', 'r', 'e', 'k', 'a', '.', 'c', 'o', 'm', '\0',
-  /* "genie-seiner-generation.de", true */ 'g', 'e', 'n', 'i', 'e', '-', 's', 'e', 'i', 'n', 'e', 'r', '-', 'g', 'e', 'n', 'e', 'r', 'a', 't', 'i', 'o', 'n', '.', 'd', 'e', '\0',
   /* "genossen.ru", true */ 'g', 'e', 'n', 'o', 's', 's', 'e', 'n', '.', 'r', 'u', '\0',
   /* "genshiken-itb.org", true */ 'g', 'e', 'n', 's', 'h', 'i', 'k', 'e', 'n', '-', 'i', 't', 'b', '.', 'o', 'r', 'g', '\0',
   /* "genshiken.org", true */ 'g', 'e', 'n', 's', 'h', 'i', 'k', 'e', 'n', '.', 'o', 'r', 'g', '\0',
   /* "genslerapps.com", true */ 'g', 'e', 'n', 's', 'l', 'e', 'r', 'a', 'p', 'p', 's', '.', 'c', 'o', 'm', '\0',
   /* "genslerwisp.com", true */ 'g', 'e', 'n', 's', 'l', 'e', 'r', 'w', 'i', 's', 'p', '.', 'c', 'o', 'm', '\0',
   /* "genuxtsg.com", true */ 'g', 'e', 'n', 'u', 'x', 't', 's', 'g', '.', 'c', 'o', 'm', '\0',
   /* "genxbeats.com", true */ 'g', 'e', 'n', 'x', 'b', 'e', 'a', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "genxnotes.com", true */ 'g', 'e', 'n', 'x', 'n', 'o', 't', 'e', 's', '.', 'c', 'o', 'm', '\0',
@@ -4593,17 +4596,16 @@ static const char kSTSHostTable[] = {
   /* "gra2.com", true */ 'g', 'r', 'a', '2', '.', 'c', 'o', 'm', '\0',
   /* "graasp.net", true */ 'g', 'r', 'a', 'a', 's', 'p', '.', 'n', 'e', 't', '\0',
   /* "graavaapi.elasticbeanstalk.com", true */ 'g', 'r', 'a', 'a', 'v', 'a', 'a', 'p', 'i', '.', 'e', 'l', 'a', 's', 't', 'i', 'c', 'b', 'e', 'a', 'n', 's', 't', 'a', 'l', 'k', '.', 'c', 'o', 'm', '\0',
   /* "grace-wan.com", true */ 'g', 'r', 'a', 'c', 'e', '-', 'w', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "gracedays.org", true */ 'g', 'r', 'a', 'c', 'e', 'd', 'a', 'y', 's', '.', 'o', 'r', 'g', '\0',
   /* "graceful-project.eu", true */ 'g', 'r', 'a', 'c', 'e', 'f', 'u', 'l', '-', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'e', 'u', '\0',
   /* "gracethrufaith.com", true */ 'g', 'r', 'a', 'c', 'e', 't', 'h', 'r', 'u', 'f', 'a', 'i', 't', 'h', '.', 'c', 'o', 'm', '\0',
   /* "graciousmay.com", true */ 'g', 'r', 'a', 'c', 'i', 'o', 'u', 's', 'm', 'a', 'y', '.', 'c', 'o', 'm', '\0',
-  /* "grademymac.com", true */ 'g', 'r', 'a', 'd', 'e', 'm', 'y', 'm', 'a', 'c', '.', 'c', 'o', 'm', '\0',
   /* "grademypc.com", true */ 'g', 'r', 'a', 'd', 'e', 'm', 'y', 'p', 'c', '.', 'c', 'o', 'm', '\0',
   /* "gradienthosting.co.uk", true */ 'g', 'r', 'a', 'd', 'i', 'e', 'n', 't', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "grafitec.ru", true */ 'g', 'r', 'a', 'f', 'i', 't', 'e', 'c', '.', 'r', 'u', '\0',
   /* "grafmurr.de", true */ 'g', 'r', 'a', 'f', 'm', 'u', 'r', 'r', '.', 'd', 'e', '\0',
   /* "graingert.co.uk", true */ 'g', 'r', 'a', 'i', 'n', 'g', 'e', 'r', 't', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "graliv.net", true */ 'g', 'r', 'a', 'l', 'i', 'v', '.', 'n', 'e', 't', '\0',
   /* "granary-demo.appspot.com", true */ 'g', 'r', 'a', 'n', 'a', 'r', 'y', '-', 'd', 'e', 'm', 'o', '.', 'a', 'p', 'p', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "grandcapital.id", true */ 'g', 'r', 'a', 'n', 'd', 'c', 'a', 'p', 'i', 't', 'a', 'l', '.', 'i', 'd', '\0',
@@ -4639,16 +4641,18 @@ static const char kSTSHostTable[] = {
   /* "greencircleplantnursery.net.au", true */ 'g', 'r', 'e', 'e', 'n', 'c', 'i', 'r', 'c', 'l', 'e', 'p', 'l', 'a', 'n', 't', 'n', 'u', 'r', 's', 'e', 'r', 'y', '.', 'n', 'e', 't', '.', 'a', 'u', '\0',
   /* "greenpeace-magazin.de", true */ 'g', 'r', 'e', 'e', 'n', 'p', 'e', 'a', 'c', 'e', '-', 'm', 'a', 'g', 'a', 'z', 'i', 'n', '.', 'd', 'e', '\0',
   /* "greenpeace.berlin", true */ 'g', 'r', 'e', 'e', 'n', 'p', 'e', 'a', 'c', 'e', '.', 'b', 'e', 'r', 'l', 'i', 'n', '\0',
   /* "greenroach.ru", true */ 'g', 'r', 'e', 'e', 'n', 'r', 'o', 'a', 'c', 'h', '.', 'r', 'u', '\0',
   /* "greensdictofslang.com", true */ 'g', 'r', 'e', 'e', 'n', 's', 'd', 'i', 'c', 't', 'o', 'f', 's', 'l', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "greensolid.biz", true */ 'g', 'r', 'e', 'e', 'n', 's', 'o', 'l', 'i', 'd', '.', 'b', 'i', 'z', '\0',
   /* "greenteamtwente.nl", true */ 'g', 'r', 'e', 'e', 'n', 't', 'e', 'a', 'm', 't', 'w', 'e', 'n', 't', 'e', '.', 'n', 'l', '\0',
   /* "greg.red", true */ 'g', 'r', 'e', 'g', '.', 'r', 'e', 'd', '\0',
+  /* "gregmilton.com", true */ 'g', 'r', 'e', 'g', 'm', 'i', 'l', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0',
+  /* "gregmilton.org", true */ 'g', 'r', 'e', 'g', 'm', 'i', 'l', 't', 'o', 'n', '.', 'o', 'r', 'g', '\0',
   /* "gregorians.org", true */ 'g', 'r', 'e', 'g', 'o', 'r', 'i', 'a', 'n', 's', '.', 'o', 'r', 'g', '\0',
   /* "gregorywiest.com", true */ 'g', 'r', 'e', 'g', 'o', 'r', 'y', 'w', 'i', 'e', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "greiners.net", true */ 'g', 'r', 'e', 'i', 'n', 'e', 'r', 's', '.', 'n', 'e', 't', '\0',
   /* "grepular.com", true */ 'g', 'r', 'e', 'p', 'u', 'l', 'a', 'r', '.', 'c', 'o', 'm', '\0',
   /* "gresak.io", true */ 'g', 'r', 'e', 's', 'a', 'k', '.', 'i', 'o', '\0',
   /* "gresb.com", true */ 'g', 'r', 'e', 's', 'b', '.', 'c', 'o', 'm', '\0',
   /* "gretchelizartistry.com", true */ 'g', 'r', 'e', 't', 'c', 'h', 'e', 'l', 'i', 'z', 'a', 'r', 't', 'i', 's', 't', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "grey.house", true */ 'g', 'r', 'e', 'y', '.', 'h', 'o', 'u', 's', 'e', '\0',
@@ -4771,16 +4775,17 @@ static const char kSTSHostTable[] = {
   /* "hackernet.se", true */ 'h', 'a', 'c', 'k', 'e', 'r', 'n', 'e', 't', '.', 's', 'e', '\0',
   /* "hackerone-user-content.com", true */ 'h', 'a', 'c', 'k', 'e', 'r', 'o', 'n', 'e', '-', 'u', 's', 'e', 'r', '-', 'c', 'o', 'n', 't', 'e', 'n', 't', '.', 'c', 'o', 'm', '\0',
   /* "hackerone.com", true */ 'h', 'a', 'c', 'k', 'e', 'r', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "hackerpoints.com", true */ 'h', 'a', 'c', 'k', 'e', 'r', 'p', 'o', 'i', 'n', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "hackerstxt.org", true */ 'h', 'a', 'c', 'k', 'e', 'r', 's', 't', 'x', 't', '.', 'o', 'r', 'g', '\0',
   /* "hackmd.io", true */ 'h', 'a', 'c', 'k', 'm', 'd', '.', 'i', 'o', '\0',
   /* "hacksnack.io", true */ 'h', 'a', 'c', 'k', 's', 'n', 'a', 'c', 'k', '.', 'i', 'o', '\0',
   /* "hackthissite.org", true */ 'h', 'a', 'c', 'k', 't', 'h', 'i', 's', 's', 'i', 't', 'e', '.', 'o', 'r', 'g', '\0',
+  /* "hacktivis.me", true */ 'h', 'a', 'c', 'k', 't', 'i', 'v', 'i', 's', '.', 'm', 'e', '\0',
   /* "hadaf.pro", true */ 'h', 'a', 'd', 'a', 'f', '.', 'p', 'r', 'o', '\0',
   /* "hadleighswimmingclub.co.uk", true */ 'h', 'a', 'd', 'l', 'e', 'i', 'g', 'h', 's', 'w', 'i', 'm', 'm', 'i', 'n', 'g', 'c', 'l', 'u', 'b', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "haeckdesign.com", true */ 'h', 'a', 'e', 'c', 'k', 'd', 'e', 's', 'i', 'g', 'n', '.', 'c', 'o', 'm', '\0',
   /* "haeckl.eu", true */ 'h', 'a', 'e', 'c', 'k', 'l', '.', 'e', 'u', '\0',
   /* "hafniatimes.com", true */ 'h', 'a', 'f', 'n', 'i', 'a', 't', 'i', 'm', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "hail2u.net", true */ 'h', 'a', 'i', 'l', '2', 'u', '.', 'n', 'e', 't', '\0',
   /* "hailer.com", true */ 'h', 'a', 'i', 'l', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "haircrazy.com", true */ 'h', 'a', 'i', 'r', 'c', 'r', 'a', 'z', 'y', '.', 'c', 'o', 'm', '\0',
@@ -5139,23 +5144,23 @@ static const char kSTSHostTable[] = {
   /* "huagati.com", true */ 'h', 'u', 'a', 'g', 'a', 't', 'i', '.', 'c', 'o', 'm', '\0',
   /* "huang.nu", true */ 'h', 'u', 'a', 'n', 'g', '.', 'n', 'u', '\0',
   /* "huaxueba.com", true */ 'h', 'u', 'a', 'x', 'u', 'e', 'b', 'a', '.', 'c', 'o', 'm', '\0',
   /* "hubert.systems", true */ 'h', 'u', 'b', 'e', 'r', 't', '.', 's', 'y', 's', 't', 'e', 'm', 's', '\0',
   /* "hudingyuan.cn", true */ 'h', 'u', 'd', 'i', 'n', 'g', 'y', 'u', 'a', 'n', '.', 'c', 'n', '\0',
   /* "huersch.com", true */ 'h', 'u', 'e', 'r', 's', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "huffduffer.com", true */ 'h', 'u', 'f', 'f', 'd', 'u', 'f', 'f', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "hugocollignon.fr", false */ 'h', 'u', 'g', 'o', 'c', 'o', 'l', 'l', 'i', 'g', 'n', 'o', 'n', '.', 'f', 'r', '\0',
-  /* "hugofs.com", true */ 'h', 'u', 'g', 'o', 'f', 's', '.', 'c', 'o', 'm', '\0',
   /* "huihui.moe", true */ 'h', 'u', 'i', 'h', 'u', 'i', '.', 'm', 'o', 'e', '\0',
   /* "huiser.nl", true */ 'h', 'u', 'i', 's', 'e', 'r', '.', 'n', 'l', '\0',
   /* "humankode.com", true */ 'h', 'u', 'm', 'a', 'n', 'k', 'o', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "humpi.at", true */ 'h', 'u', 'm', 'p', 'i', '.', 'a', 't', '\0',
   /* "hund.io", true */ 'h', 'u', 'n', 'd', '.', 'i', 'o', '\0',
   /* "huntshomeinspections.com", true */ 'h', 'u', 'n', 't', 's', 'h', 'o', 'm', 'e', 'i', 'n', 's', 'p', 'e', 'c', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0',
+  /* "hup.blue", true */ 'h', 'u', 'p', '.', 'b', 'l', 'u', 'e', '\0',
   /* "hupp.se", true */ 'h', 'u', 'p', 'p', '.', 's', 'e', '\0',
   /* "hurd.is", true */ 'h', 'u', 'r', 'd', '.', 'i', 's', '\0',
   /* "huren.nl", true */ 'h', 'u', 'r', 'e', 'n', '.', 'n', 'l', '\0',
   /* "husakbau.at", true */ 'h', 'u', 's', 'a', 'k', 'b', 'a', 'u', '.', 'a', 't', '\0',
   /* "hushfile.it", true */ 'h', 'u', 's', 'h', 'f', 'i', 'l', 'e', '.', 'i', 't', '\0',
   /* "husic.net", true */ 'h', 'u', 's', 'i', 'c', '.', 'n', 'e', 't', '\0',
   /* "husky.xyz", true */ 'h', 'u', 's', 'k', 'y', '.', 'x', 'y', 'z', '\0',
   /* "huskybutt.dog", true */ 'h', 'u', 's', 'k', 'y', 'b', 'u', 't', 't', '.', 'd', 'o', 'g', '\0',
@@ -5169,16 +5174,17 @@ static const char kSTSHostTable[] = {
   /* "hydrozone.fr", true */ 'h', 'y', 'd', 'r', 'o', 'z', 'o', 'n', 'e', '.', 'f', 'r', '\0',
   /* "hyk.me", true */ 'h', 'y', 'k', '.', 'm', 'e', '\0',
   /* "hymerscollege.co.uk", true */ 'h', 'y', 'm', 'e', 'r', 's', 'c', 'o', 'l', 'l', 'e', 'g', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "hynek.me", true */ 'h', 'y', 'n', 'e', 'k', '.', 'm', 'e', '\0',
   /* "hypemgmt.com", true */ 'h', 'y', 'p', 'e', 'm', 'g', 'm', 't', '.', 'c', 'o', 'm', '\0',
   /* "hyper-matrix.org", true */ 'h', 'y', 'p', 'e', 'r', '-', 'm', 'a', 't', 'r', 'i', 'x', '.', 'o', 'r', 'g', '\0',
   /* "hyper-text.org", true */ 'h', 'y', 'p', 'e', 'r', '-', 't', 'e', 'x', 't', '.', 'o', 'r', 'g', '\0',
   /* "hypotecnicentrum.cz", true */ 'h', 'y', 'p', 'o', 't', 'e', 'c', 'n', 'i', 'c', 'e', 'n', 't', 'r', 'u', 'm', '.', 'c', 'z', '\0',
+  /* "hzsh.xyz", true */ 'h', 'z', 's', 'h', '.', 'x', 'y', 'z', '\0',
   /* "i--b.com", true */ 'i', '-', '-', 'b', '.', 'c', 'o', 'm', '\0',
   /* "i-stats.net", true */ 'i', '-', 's', 't', 'a', 't', 's', '.', 'n', 'e', 't', '\0',
   /* "i10z.com", false */ 'i', '1', '0', 'z', '.', 'c', 'o', 'm', '\0',
   /* "i1314.gdn", true */ 'i', '1', '3', '1', '4', '.', 'g', 'd', 'n', '\0',
   /* "i5y.co.uk", true */ 'i', '5', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "i95.me", false */ 'i', '9', '5', '.', 'm', 'e', '\0',
   /* "iactu.info", true */ 'i', 'a', 'c', 't', 'u', '.', 'i', 'n', 'f', 'o', '\0',
   /* "iainsimms.me", true */ 'i', 'a', 'i', 'n', 's', 'i', 'm', 'm', 's', '.', 'm', 'e', '\0',
@@ -5242,21 +5248,21 @@ static const char kSTSHostTable[] = {
   /* "ieeespmb.org", true */ 'i', 'e', 'e', 'e', 's', 'p', 'm', 'b', '.', 'o', 'r', 'g', '\0',
   /* "ierna.com", true */ 'i', 'e', 'r', 'n', 'a', '.', 'c', 'o', 'm', '\0',
   /* "ieval.ro", true */ 'i', 'e', 'v', 'a', 'l', '.', 'r', 'o', '\0',
   /* "ifasec.de", false */ 'i', 'f', 'a', 's', 'e', 'c', '.', 'd', 'e', '\0',
   /* "ifcfg.me", true */ 'i', 'f', 'c', 'f', 'g', '.', 'm', 'e', '\0',
   /* "ifconfig.co", true */ 'i', 'f', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', '\0',
   /* "iflare.de", true */ 'i', 'f', 'l', 'a', 'r', 'e', '.', 'd', 'e', '\0',
   /* "iformbuilder.com", false */ 'i', 'f', 'o', 'r', 'm', 'b', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0',
-  /* "ifoss.me", true */ 'i', 'f', 'o', 's', 's', '.', 'm', 'e', '\0',
   /* "ifsac.org", true */ 'i', 'f', 's', 'a', 'c', '.', 'o', 'r', 'g', '\0',
   /* "ifsr.de", true */ 'i', 'f', 's', 'r', '.', 'd', 'e', '\0',
   /* "iftrue.de", true */ 'i', 'f', 't', 'r', 'u', 'e', '.', 'd', 'e', '\0',
   /* "ifxor.com", true */ 'i', 'f', 'x', 'o', 'r', '.', 'c', 'o', 'm', '\0',
+  /* "igforums.com", true */ 'i', 'g', 'f', 'o', 'r', 'u', 'm', 's', '.', 'c', 'o', 'm', '\0',
   /* "iggprivate.com", true */ 'i', 'g', 'g', 'p', 'r', 'i', 'v', 'a', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "iggsoft.com", true */ 'i', 'g', 'g', 's', 'o', 'f', 't', '.', 'c', 'o', 'm', '\0',
   /* "iggsoftware.com", true */ 'i', 'g', 'g', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "igiftcards.nl", true */ 'i', 'g', 'i', 'f', 't', 'c', 'a', 'r', 'd', 's', '.', 'n', 'l', '\0',
   /* "igk.de", true */ 'i', 'g', 'k', '.', 'd', 'e', '\0',
   /* "ignace72.eu", true */ 'i', 'g', 'n', 'a', 'c', 'e', '7', '2', '.', 'e', 'u', '\0',
   /* "ignitedmindz.in", true */ 'i', 'g', 'n', 'i', 't', 'e', 'd', 'm', 'i', 'n', 'd', 'z', '.', 'i', 'n', '\0',
   /* "igotoffer.com", true */ 'i', 'g', 'o', 't', 'o', 'f', 'f', 'e', 'r', '.', 'c', 'o', 'm', '\0',
@@ -5542,16 +5548,17 @@ static const char kSTSHostTable[] = {
   /* "isogen5.com", true */ 'i', 's', 'o', 'g', 'e', 'n', '5', '.', 'c', 'o', 'm', '\0',
   /* "isondo.com", true */ 'i', 's', 'o', 'n', 'd', 'o', '.', 'c', 'o', 'm', '\0',
   /* "isopres.de", true */ 'i', 's', 'o', 'p', 'r', 'e', 's', '.', 'd', 'e', '\0',
   /* "ispweb.es", true */ 'i', 's', 'p', 'w', 'e', 'b', '.', 'e', 's', '\0',
   /* "isqrl.de", true */ 'i', 's', 'q', 'r', 'l', '.', 'd', 'e', '\0',
   /* "isreedyintheuk.com", true */ 'i', 's', 'r', 'e', 'e', 'd', 'y', 'i', 'n', 't', 'h', 'e', 'u', 'k', '.', 'c', 'o', 'm', '\0',
   /* "issforum.org", true */ 'i', 's', 's', 'f', 'o', 'r', 'u', 'm', '.', 'o', 'r', 'g', '\0',
   /* "isslshop.com", true */ 'i', 's', 's', 'l', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '\0',
+  /* "issuesofconcern.in", true */ 'i', 's', 's', 'u', 'e', 's', 'o', 'f', 'c', 'o', 'n', 'c', 'e', 'r', 'n', '.', 'i', 'n', '\0',
   /* "istanbul.systems", true */ 'i', 's', 't', 'a', 'n', 'b', 'u', 'l', '.', 's', 'y', 's', 't', 'e', 'm', 's', '\0',
   /* "istanbultravelguide.info", true */ 'i', 's', 't', 'a', 'n', 'b', 'u', 'l', 't', 'r', 'a', 'v', 'e', 'l', 'g', 'u', 'i', 'd', 'e', '.', 'i', 'n', 'f', 'o', '\0',
   /* "istdieweltschonuntergegangen.de", true */ 'i', 's', 't', 'd', 'i', 'e', 'w', 'e', 'l', 't', 's', 'c', 'h', 'o', 'n', 'u', 'n', 't', 'e', 'r', 'g', 'e', 'g', 'a', 'n', 'g', 'e', 'n', '.', 'd', 'e', '\0',
   /* "isteinbaby.de", true */ 'i', 's', 't', 'e', 'i', 'n', 'b', 'a', 'b', 'y', '.', 'd', 'e', '\0',
   /* "istgame.com", true */ 'i', 's', 't', 'g', 'a', 'm', 'e', '.', 'c', 'o', 'm', '\0',
   /* "istheapplestoredown.com", true */ 'i', 's', 't', 'h', 'e', 'a', 'p', 'p', 'l', 'e', 's', 't', 'o', 'r', 'e', 'd', 'o', 'w', 'n', '.', 'c', 'o', 'm', '\0',
   /* "istheapplestoredown.de", true */ 'i', 's', 't', 'h', 'e', 'a', 'p', 'p', 'l', 'e', 's', 't', 'o', 'r', 'e', 'd', 'o', 'w', 'n', '.', 'd', 'e', '\0',
   /* "istherrienstillcoach.com", true */ 'i', 's', 't', 'h', 'e', 'r', 'r', 'i', 'e', 'n', 's', 't', 'i', 'l', 'l', 'c', 'o', 'a', 'c', 'h', '.', 'c', 'o', 'm', '\0',
@@ -5710,17 +5717,16 @@ static const char kSTSHostTable[] = {
   /* "jayxon.com", true */ 'j', 'a', 'y', 'x', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "jayxu.com", true */ 'j', 'a', 'y', 'x', 'u', '.', 'c', 'o', 'm', '\0',
   /* "jazz-alliance.com", true */ 'j', 'a', 'z', 'z', '-', 'a', 'l', 'l', 'i', 'a', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "jazz-alliance.org", true */ 'j', 'a', 'z', 'z', '-', 'a', 'l', 'l', 'i', 'a', 'n', 'c', 'e', '.', 'o', 'r', 'g', '\0',
   /* "jazzanet.com", true */ 'j', 'a', 'z', 'z', 'a', 'n', 'e', 't', '.', 'c', 'o', 'm', '\0',
   /* "jazzncheese.com", true */ 'j', 'a', 'z', 'z', 'n', 'c', 'h', 'e', 'e', 's', 'e', '.', 'c', 'o', 'm', '\0',
   /* "jcaicedo.tk", true */ 'j', 'c', 'a', 'i', 'c', 'e', 'd', 'o', '.', 't', 'k', '\0',
   /* "jccrew.org", true */ 'j', 'c', 'c', 'r', 'e', 'w', '.', 'o', 'r', 'g', '\0',
-  /* "jcor.me", true */ 'j', 'c', 'o', 'r', '.', 'm', 'e', '\0',
   /* "jcoscia.com", true */ 'j', 'c', 'o', 's', 'c', 'i', 'a', '.', 'c', 'o', 'm', '\0',
   /* "jcraft.us", true */ 'j', 'c', 'r', 'a', 'f', 't', '.', 'u', 's', '\0',
   /* "jcyz.cf", true */ 'j', 'c', 'y', 'z', '.', 'c', 'f', '\0',
   /* "jdav-leipzig.de", true */ 'j', 'd', 'a', 'v', '-', 'l', 'e', 'i', 'p', 'z', 'i', 'g', '.', 'd', 'e', '\0',
   /* "jdcgroup.com.ph", true */ 'j', 'd', 'c', 'g', 'r', 'o', 'u', 'p', '.', 'c', 'o', 'm', '.', 'p', 'h', '\0',
   /* "jdh8.org", true */ 'j', 'd', 'h', '8', '.', 'o', 'r', 'g', '\0',
   /* "jdubya.info", true */ 'j', 'd', 'u', 'b', 'y', 'a', '.', 'i', 'n', 'f', 'o', '\0',
   /* "jean-remy.ch", true */ 'j', 'e', 'a', 'n', '-', 'r', 'e', 'm', 'y', '.', 'c', 'h', '\0',
@@ -5781,19 +5787,16 @@ static const char kSTSHostTable[] = {
   /* "jka.io", true */ 'j', 'k', 'a', '.', 'i', 'o', '\0',
   /* "jkirsche.com", true */ 'j', 'k', 'i', 'r', 's', 'c', 'h', 'e', '.', 'c', 'o', 'm', '\0',
   /* "jkrippen.com", true */ 'j', 'k', 'r', 'i', 'p', 'p', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "jlhmedia.com", true */ 'j', 'l', 'h', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0',
   /* "jlkhosting.com", true */ 'j', 'l', 'k', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "jmedved.com", true */ 'j', 'm', 'e', 'd', 'v', 'e', 'd', '.', 'c', 'o', 'm', '\0',
   /* "jmk.hu", true */ 'j', 'm', 'k', '.', 'h', 'u', '\0',
   /* "jn1.me", true */ 'j', 'n', '1', '.', 'm', 'e', '\0',
-  /* "jncde.de", true */ 'j', 'n', 'c', 'd', 'e', '.', 'd', 'e', '\0',
-  /* "jncie.eu", true */ 'j', 'n', 'c', 'i', 'e', '.', 'e', 'u', '\0',
-  /* "jncip.de", true */ 'j', 'n', 'c', 'i', 'p', '.', 'd', 'e', '\0',
   /* "jobbkk.com", true */ 'j', 'o', 'b', 'b', 'k', 'k', '.', 'c', 'o', 'm', '\0',
   /* "jobflyapp.com", true */ 'j', 'o', 'b', 'f', 'l', 'y', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
   /* "jobmob.co.il", true */ 'j', 'o', 'b', 'm', 'o', 'b', '.', 'c', 'o', '.', 'i', 'l', '\0',
   /* "jobs.at", true */ 'j', 'o', 'b', 's', '.', 'a', 't', '\0',
   /* "jobss.co.uk", true */ 'j', 'o', 'b', 's', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "jodlajodla.si", true */ 'j', 'o', 'd', 'l', 'a', 'j', 'o', 'd', 'l', 'a', '.', 's', 'i', '\0',
   /* "joduska.me", true */ 'j', 'o', 'd', 'u', 's', 'k', 'a', '.', 'm', 'e', '\0',
   /* "jodyboucher.com", true */ 'j', 'o', 'd', 'y', 'b', 'o', 'u', 'c', 'h', 'e', 'r', '.', 'c', 'o', 'm', '\0',
@@ -6104,18 +6107,18 @@ static const char kSTSHostTable[] = {
   /* "kiedys.net", true */ 'k', 'i', 'e', 'd', 'y', 's', '.', 'n', 'e', 't', '\0',
   /* "kiekin.org", true */ 'k', 'i', 'e', 'k', 'i', 'n', '.', 'o', 'r', 'g', '\0',
   /* "kielderweather.org.uk", true */ 'k', 'i', 'e', 'l', 'd', 'e', 'r', 'w', 'e', 'a', 't', 'h', 'e', 'r', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "kienlen.org", true */ 'k', 'i', 'e', 'n', 'l', 'e', 'n', '.', 'o', 'r', 'g', '\0',
   /* "kiffmarks.com", true */ 'k', 'i', 'f', 'f', 'm', 'a', 'r', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "kigmbh.com", true */ 'k', 'i', 'g', 'm', 'b', 'h', '.', 'c', 'o', 'm', '\0',
   /* "kikuzuki.org", false */ 'k', 'i', 'k', 'u', 'z', 'u', 'k', 'i', '.', 'o', 'r', 'g', '\0',
   /* "kilerd.me", true */ 'k', 'i', 'l', 'e', 'r', 'd', '.', 'm', 'e', '\0',
+  /* "kilianvalkhof.com", true */ 'k', 'i', 'l', 'i', 'a', 'n', 'v', 'a', 'l', 'k', 'h', 'o', 'f', '.', 'c', 'o', 'm', '\0',
   /* "killerrobots.com", true */ 'k', 'i', 'l', 'l', 'e', 'r', 'r', 'o', 'b', 'o', 't', 's', '.', 'c', 'o', 'm', '\0',
-  /* "kilobyte22.de", true */ 'k', 'i', 'l', 'o', 'b', 'y', 't', 'e', '2', '2', '.', 'd', 'e', '\0',
   /* "kilogram.nl", true */ 'k', 'i', 'l', 'o', 'g', 'r', 'a', 'm', '.', 'n', 'l', '\0',
   /* "kilometertje.nl", true */ 'k', 'i', 'l', 'o', 'm', 'e', 't', 'e', 'r', 't', 'j', 'e', '.', 'n', 'l', '\0',
   /* "kimberg.co.uk", true */ 'k', 'i', 'm', 'b', 'e', 'r', 'g', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "kimmel.com", true */ 'k', 'i', 'm', 'm', 'e', 'l', '.', 'c', 'o', 'm', '\0',
   /* "kimmel.in", true */ 'k', 'i', 'm', 'm', 'e', 'l', '.', 'i', 'n', '\0',
   /* "kinderbasar-luhe.de", true */ 'k', 'i', 'n', 'd', 'e', 'r', 'b', 'a', 's', 'a', 'r', '-', 'l', 'u', 'h', 'e', '.', 'd', 'e', '\0',
   /* "kinderbuecher-kostenlos.de", true */ 'k', 'i', 'n', 'd', 'e', 'r', 'b', 'u', 'e', 'c', 'h', 'e', 'r', '-', 'k', 'o', 's', 't', 'e', 'n', 'l', 'o', 's', '.', 'd', 'e', '\0',
   /* "kinderly.co.uk", true */ 'k', 'i', 'n', 'd', 'e', 'r', 'l', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0',
@@ -6431,16 +6434,17 @@ static const char kSTSHostTable[] = {
   /* "lapidge.net", true */ 'l', 'a', 'p', 'i', 'd', 'g', 'e', '.', 'n', 'e', 't', '\0',
   /* "laposte.net", true */ 'l', 'a', 'p', 'o', 's', 't', 'e', '.', 'n', 'e', 't', '\0',
   /* "largescaleforums.com", true */ 'l', 'a', 'r', 'g', 'e', 's', 'c', 'a', 'l', 'e', 'f', 'o', 'r', 'u', 'm', 's', '.', 'c', 'o', 'm', '\0',
   /* "largeviewer.com", true */ 'l', 'a', 'r', 'g', 'e', 'v', 'i', 'e', 'w', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "larptreff.de", true */ 'l', 'a', 'r', 'p', 't', 'r', 'e', 'f', 'f', '.', 'd', 'e', '\0',
   /* "larrysalibra.com", true */ 'l', 'a', 'r', 'r', 'y', 's', 'a', 'l', 'i', 'b', 'r', 'a', '.', 'c', 'o', 'm', '\0',
   /* "lars-ewald.com", true */ 'l', 'a', 'r', 's', '-', 'e', 'w', 'a', 'l', 'd', '.', 'c', 'o', 'm', '\0',
   /* "larsklene.nl", true */ 'l', 'a', 'r', 's', 'k', 'l', 'e', 'n', 'e', '.', 'n', 'l', '\0',
+  /* "lasercloud.ml", true */ 'l', 'a', 's', 'e', 'r', 'c', 'l', 'o', 'u', 'd', '.', 'm', 'l', '\0',
   /* "lasnaves.com", true */ 'l', 'a', 's', 'n', 'a', 'v', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "lasst-uns-beten.de", true */ 'l', 'a', 's', 's', 't', '-', 'u', 'n', 's', '-', 'b', 'e', 't', 'e', 'n', '.', 'd', 'e', '\0',
   /* "lastchancetraveler.com", true */ 'l', 'a', 's', 't', 'c', 'h', 'a', 'n', 'c', 'e', 't', 'r', 'a', 'v', 'e', 'l', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "lastpass.com", false */ 'l', 'a', 's', 't', 'p', 'a', 's', 's', '.', 'c', 'o', 'm', '\0',
   /* "latenitefilms.com", false */ 'l', 'a', 't', 'e', 'n', 'i', 't', 'e', 'f', 'i', 'l', 'm', 's', '.', 'c', 'o', 'm', '\0',
   /* "lateralsecurity.com", true */ 'l', 'a', 't', 'e', 'r', 'a', 'l', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "latetrain.cn", true */ 'l', 'a', 't', 'e', 't', 'r', 'a', 'i', 'n', '.', 'c', 'n', '\0',
   /* "lathamlabs.com", true */ 'l', 'a', 't', 'h', 'a', 'm', 'l', 'a', 'b', 's', '.', 'c', 'o', 'm', '\0',
@@ -6456,16 +6460,17 @@ static const char kSTSHostTable[] = {
   /* "laukstein.com", true */ 'l', 'a', 'u', 'k', 's', 't', 'e', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "launchkey.com", true */ 'l', 'a', 'u', 'n', 'c', 'h', 'k', 'e', 'y', '.', 'c', 'o', 'm', '\0',
   /* "laurel4th.org", true */ 'l', 'a', 'u', 'r', 'e', 'l', '4', 't', 'h', '.', 'o', 'r', 'g', '\0',
   /* "lausitzer-widerstand.de", true */ 'l', 'a', 'u', 's', 'i', 't', 'z', 'e', 'r', '-', 'w', 'i', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', '.', 'd', 'e', '\0',
   /* "laussat.de", true */ 'l', 'a', 'u', 's', 's', 'a', 't', '.', 'd', 'e', '\0',
   /* "lavalite.de", true */ 'l', 'a', 'v', 'a', 'l', 'i', 't', 'e', '.', 'd', 'e', '\0',
   /* "laventainnhotel-mailing.com", true */ 'l', 'a', 'v', 'e', 'n', 't', 'a', 'i', 'n', 'n', 'h', 'o', 't', 'e', 'l', '-', 'm', 'a', 'i', 'l', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "lavine.ch", true */ 'l', 'a', 'v', 'i', 'n', 'e', '.', 'c', 'h', '\0',
+  /* "lavinya.net", false */ 'l', 'a', 'v', 'i', 'n', 'y', 'a', '.', 'n', 'e', 't', '\0',
   /* "lavita.de", true */ 'l', 'a', 'v', 'i', 't', 'a', '.', 'd', 'e', '\0',
   /* "lavito.cz", true */ 'l', 'a', 'v', 'i', 't', 'o', '.', 'c', 'z', '\0',
   /* "lavoieducoeur.be", true */ 'l', 'a', 'v', 'o', 'i', 'e', 'd', 'u', 'c', 'o', 'e', 'u', 'r', '.', 'b', 'e', '\0',
   /* "lavoiepharmd.com", true */ 'l', 'a', 'v', 'o', 'i', 'e', 'p', 'h', 'a', 'r', 'm', 'd', '.', 'c', 'o', 'm', '\0',
   /* "lawformt.com", true */ 'l', 'a', 'w', 'f', 'o', 'r', 'm', 't', '.', 'c', 'o', 'm', '\0',
   /* "lawly.org", true */ 'l', 'a', 'w', 'l', 'y', '.', 'o', 'r', 'g', '\0',
   /* "lawrencemurgatroyd.com", true */ 'l', 'a', 'w', 'r', 'e', 'n', 'c', 'e', 'm', 'u', 'r', 'g', 'a', 't', 'r', 'o', 'y', 'd', '.', 'c', 'o', 'm', '\0',
   /* "layer8.tk", true */ 'l', 'a', 'y', 'e', 'r', '8', '.', 't', 'k', '\0',
@@ -6630,17 +6635,16 @@ static const char kSTSHostTable[] = {
   /* "linux.cn", true */ 'l', 'i', 'n', 'u', 'x', '.', 'c', 'n', '\0',
   /* "linux.fi", true */ 'l', 'i', 'n', 'u', 'x', '.', 'f', 'i', '\0',
   /* "linuxandstuff.de", true */ 'l', 'i', 'n', 'u', 'x', 'a', 'n', 'd', 's', 't', 'u', 'f', 'f', '.', 'd', 'e', '\0',
   /* "linuxbabe.com", true */ 'l', 'i', 'n', 'u', 'x', 'b', 'a', 'b', 'e', '.', 'c', 'o', 'm', '\0',
   /* "linuxbierwanderung.com", true */ 'l', 'i', 'n', 'u', 'x', 'b', 'i', 'e', 'r', 'w', 'a', 'n', 'd', 'e', 'r', 'u', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "linuxcommand.ru", true */ 'l', 'i', 'n', 'u', 'x', 'c', 'o', 'm', 'm', 'a', 'n', 'd', '.', 'r', 'u', '\0',
   /* "linuxhostsupport.com", true */ 'l', 'i', 'n', 'u', 'x', 'h', 'o', 's', 't', 's', 'u', 'p', 'p', 'o', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "linuxlounge.net", true */ 'l', 'i', 'n', 'u', 'x', 'l', 'o', 'u', 'n', 'g', 'e', '.', 'n', 'e', 't', '\0',
-  /* "linuxmonitoring.net", true */ 'l', 'i', 'n', 'u', 'x', 'm', 'o', 'n', 'i', 't', 'o', 'r', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "linvx.org", true */ 'l', 'i', 'n', 'v', 'x', '.', 'o', 'r', 'g', '\0',
   /* "linx.li", true */ 'l', 'i', 'n', 'x', '.', 'l', 'i', '\0',
   /* "linx.net", true */ 'l', 'i', 'n', 'x', '.', 'n', 'e', 't', '\0',
   /* "linzgau.de", true */ 'l', 'i', 'n', 'z', 'g', 'a', 'u', '.', 'd', 'e', '\0',
   /* "liornavok.com", true */ 'l', 'i', 'o', 'r', 'n', 'a', 'v', 'o', 'k', '.', 'c', 'o', 'm', '\0',
   /* "liquid.cz", true */ 'l', 'i', 'q', 'u', 'i', 'd', '.', 'c', 'z', '\0',
   /* "liquidcomm.net", true */ 'l', 'i', 'q', 'u', 'i', 'd', 'c', 'o', 'm', 'm', '.', 'n', 'e', 't', '\0',
   /* "lirion.de", true */ 'l', 'i', 'r', 'i', 'o', 'n', '.', 'd', 'e', '\0',
@@ -6652,17 +6656,17 @@ static const char kSTSHostTable[] = {
   /* "lister-kirchweg.de", true */ 'l', 'i', 's', 't', 'e', 'r', '-', 'k', 'i', 'r', 'c', 'h', 'w', 'e', 'g', '.', 'd', 'e', '\0',
   /* "listminut.be", true */ 'l', 'i', 's', 't', 'm', 'i', 'n', 'u', 't', '.', 'b', 'e', '\0',
   /* "lists.fedoraproject.org", true */ 'l', 'i', 's', 't', 's', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "lists.mayfirst.org", false */ 'l', 'i', 's', 't', 's', '.', 'm', 'a', 'y', 'f', 'i', 'r', 's', 't', '.', 'o', 'r', 'g', '\0',
   /* "lists.stg.fedoraproject.org", true */ 'l', 'i', 's', 't', 's', '.', 's', 't', 'g', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "litchidova.nl", true */ 'l', 'i', 't', 'c', 'h', 'i', 'd', 'o', 'v', 'a', '.', 'n', 'l', '\0',
   /* "litevault.net", true */ 'l', 'i', 't', 'e', 'v', 'a', 'u', 'l', 't', '.', 'n', 'e', 't', '\0',
   /* "litfin.name", true */ 'l', 'i', 't', 'f', 'i', 'n', '.', 'n', 'a', 'm', 'e', '\0',
-  /* "lithesalar.se", false */ 'l', 'i', 't', 'h', 'e', 's', 'a', 'l', 'a', 'r', '.', 's', 'e', '\0',
+  /* "lithesalar.se", true */ 'l', 'i', 't', 'h', 'e', 's', 'a', 'l', 'a', 'r', '.', 's', 'e', '\0',
   /* "little.pw", true */ 'l', 'i', 't', 't', 'l', 'e', '.', 'p', 'w', '\0',
   /* "littlefreelibrary.org", true */ 'l', 'i', 't', 't', 'l', 'e', 'f', 'r', 'e', 'e', 'l', 'i', 'b', 'r', 'a', 'r', 'y', '.', 'o', 'r', 'g', '\0',
   /* "litvideoserver.de", true */ 'l', 'i', 't', 'v', 'i', 'd', 'e', 'o', 's', 'e', 'r', 'v', 'e', 'r', '.', 'd', 'e', '\0',
   /* "liud.im", true */ 'l', 'i', 'u', 'd', '.', 'i', 'm', '\0',
   /* "liudon.org", true */ 'l', 'i', 'u', 'd', 'o', 'n', '.', 'o', 'r', 'g', '\0',
   /* "livecards.co.uk", true */ 'l', 'i', 'v', 'e', 'c', 'a', 'r', 'd', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "livedesign.at", true */ 'l', 'i', 'v', 'e', 'd', 'e', 's', 'i', 'g', 'n', '.', 'a', 't', '\0',
   /* "liveforspeed.se", true */ 'l', 'i', 'v', 'e', 'f', 'o', 'r', 's', 'p', 'e', 'e', 'd', '.', 's', 'e', '\0',
@@ -6882,16 +6886,17 @@ static const char kSTSHostTable[] = {
   /* "machon.biz", false */ 'm', 'a', 'c', 'h', 'o', 'n', '.', 'b', 'i', 'z', '\0',
   /* "machtweb.de", true */ 'm', 'a', 'c', 'h', 't', 'w', 'e', 'b', '.', 'd', 'e', '\0',
   /* "macinyasha.net", true */ 'm', 'a', 'c', 'i', 'n', 'y', 'a', 's', 'h', 'a', '.', 'n', 'e', 't', '\0',
   /* "macker.io", true */ 'm', 'a', 'c', 'k', 'e', 'r', '.', 'i', 'o', '\0',
   /* "maclemon.at", true */ 'm', 'a', 'c', 'l', 'e', 'm', 'o', 'n', '.', 'a', 't', '\0',
   /* "macleod.io", true */ 'm', 'a', 'c', 'l', 'e', 'o', 'd', '.', 'i', 'o', '\0',
   /* "macnemo.de", true */ 'm', 'a', 'c', 'n', 'e', 'm', 'o', '.', 'd', 'e', '\0',
   /* "maco.org.uk", true */ 'm', 'a', 'c', 'o', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
+  /* "macosxfilerecovery.com", true */ 'm', 'a', 'c', 'o', 's', 'x', 'f', 'i', 'l', 'e', 'r', 'e', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "maddi.biz", true */ 'm', 'a', 'd', 'd', 'i', '.', 'b', 'i', 'z', '\0',
   /* "madebyshore.com", true */ 'm', 'a', 'd', 'e', 'b', 'y', 's', 'h', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "madeglobal.com", true */ 'm', 'a', 'd', 'e', 'g', 'l', 'o', 'b', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "madeitwor.se", true */ 'm', 'a', 'd', 'e', 'i', 't', 'w', 'o', 'r', '.', 's', 'e', '\0',
   /* "madin.ru", true */ 'm', 'a', 'd', 'i', 'n', '.', 'r', 'u', '\0',
   /* "madnetwork.org", true */ 'm', 'a', 'd', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'o', 'r', 'g', '\0',
   /* "madokami.net", true */ 'm', 'a', 'd', 'o', 'k', 'a', 'm', 'i', '.', 'n', 'e', 't', '\0',
   /* "madrants.net", true */ 'm', 'a', 'd', 'r', 'a', 'n', 't', 's', '.', 'n', 'e', 't', '\0',
@@ -7165,16 +7170,17 @@ static const char kSTSHostTable[] = {
   /* "mdpraha.cz", true */ 'm', 'd', 'p', 'r', 'a', 'h', 'a', '.', 'c', 'z', '\0',
   /* "mdwftw.com", true */ 'm', 'd', 'w', 'f', 't', 'w', '.', 'c', 'o', 'm', '\0',
   /* "mdx.no", true */ 'm', 'd', 'x', '.', 'n', 'o', '\0',
   /* "mdxn.org", true */ 'm', 'd', 'x', 'n', '.', 'o', 'r', 'g', '\0',
   /* "me.net.nz", true */ 'm', 'e', '.', 'n', 'e', 't', '.', 'n', 'z', '\0',
   /* "meadowviewfarms.org", true */ 'm', 'e', 'a', 'd', 'o', 'w', 'v', 'i', 'e', 'w', 'f', 'a', 'r', 'm', 's', '.', 'o', 'r', 'g', '\0',
   /* "mealgoo.com", true */ 'm', 'e', 'a', 'l', 'g', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "meamod.com", true */ 'm', 'e', 'a', 'm', 'o', 'd', '.', 'c', 'o', 'm', '\0',
+  /* "mebio.us", false */ 'm', 'e', 'b', 'i', 'o', '.', 'u', 's', '\0',
   /* "mechanixdirect.co.uk", false */ 'm', 'e', 'c', 'h', 'a', 'n', 'i', 'x', 'd', 'i', 'r', 'e', 'c', 't', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "mechmk1.me", true */ 'm', 'e', 'c', 'h', 'm', 'k', '1', '.', 'm', 'e', '\0',
   /* "medba.se", true */ 'm', 'e', 'd', 'b', 'a', '.', 's', 'e', '\0',
   /* "meddelare.com", true */ 'm', 'e', 'd', 'd', 'e', 'l', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "medexpress.co.uk", true */ 'm', 'e', 'd', 'e', 'x', 'p', 'r', 'e', 's', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "medi-link.co.il", true */ 'm', 'e', 'd', 'i', '-', 'l', 'i', 'n', 'k', '.', 'c', 'o', '.', 'i', 'l', '\0',
   /* "mediaburst.co.uk", true */ 'm', 'e', 'd', 'i', 'a', 'b', 'u', 'r', 's', 't', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "mediamag.am", true */ 'm', 'e', 'd', 'i', 'a', 'm', 'a', 'g', '.', 'a', 'm', '\0',
@@ -7208,16 +7214,17 @@ static const char kSTSHostTable[] = {
   /* "mega.online", true */ 'm', 'e', 'g', 'a', '.', 'o', 'n', 'l', 'i', 'n', 'e', '\0',
   /* "megadrol.com", true */ 'm', 'e', 'g', 'a', 'd', 'r', 'o', 'l', '.', 'c', 'o', 'm', '\0',
   /* "megaflowers.ru", true */ 'm', 'e', 'g', 'a', 'f', 'l', 'o', 'w', 'e', 'r', 's', '.', 'r', 'u', '\0',
   /* "megakiste.de", true */ 'm', 'e', 'g', 'a', 'k', 'i', 's', 't', 'e', '.', 'd', 'e', '\0',
   /* "megamisja.pl", true */ 'm', 'e', 'g', 'a', 'm', 'i', 's', 'j', 'a', '.', 'p', 'l', '\0',
   /* "meganreel.com", true */ 'm', 'e', 'g', 'a', 'n', 'r', 'e', 'e', 'l', '.', 'c', 'o', 'm', '\0',
   /* "megaplan.cz", true */ 'm', 'e', 'g', 'a', 'p', 'l', 'a', 'n', '.', 'c', 'z', '\0',
   /* "megaplan.ru", true */ 'm', 'e', 'g', 'a', 'p', 'l', 'a', 'n', '.', 'r', 'u', '\0',
+  /* "megumico.net", true */ 'm', 'e', 'g', 'u', 'm', 'i', 'c', 'o', '.', 'n', 'e', 't', '\0',
   /* "mehmetince.net", true */ 'm', 'e', 'h', 'm', 'e', 't', 'i', 'n', 'c', 'e', '.', 'n', 'e', 't', '\0',
   /* "mehostdd.com", true */ 'm', 'e', 'h', 'o', 's', 't', 'd', 'd', '.', 'c', 'o', 'm', '\0',
   /* "mehrwert.de", true */ 'm', 'e', 'h', 'r', 'w', 'e', 'r', 't', '.', 'd', 'e', '\0',
   /* "meifrench.com", true */ 'm', 'e', 'i', 'f', 'r', 'e', 'n', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "meikan.moe", true */ 'm', 'e', 'i', 'k', 'a', 'n', '.', 'm', 'o', 'e', '\0',
   /* "meillard-auto-ecole.ch", true */ 'm', 'e', 'i', 'l', 'l', 'a', 'r', 'd', '-', 'a', 'u', 't', 'o', '-', 'e', 'c', 'o', 'l', 'e', '.', 'c', 'h', '\0',
   /* "mein-webportal.de", true */ 'm', 'e', 'i', 'n', '-', 'w', 'e', 'b', 'p', 'o', 'r', 't', 'a', 'l', '.', 'd', 'e', '\0',
   /* "meine-email-im.net", true */ 'm', 'e', 'i', 'n', 'e', '-', 'e', 'm', 'a', 'i', 'l', '-', 'i', 'm', '.', 'n', 'e', 't', '\0',
@@ -7232,17 +7239,16 @@ static const char kSTSHostTable[] = {
   /* "melvinlow.com", true */ 'm', 'e', 'l', 'v', 'i', 'n', 'l', 'o', 'w', '.', 'c', 'o', 'm', '\0',
   /* "memberpress.com", true */ 'm', 'e', 'm', 'b', 'e', 'r', 'p', 'r', 'e', 's', 's', '.', 'c', 'o', 'm', '\0',
   /* "members-only-shopping.com", true */ 'm', 'e', 'm', 'b', 'e', 'r', 's', '-', 'o', 'n', 'l', 'y', '-', 's', 'h', 'o', 'p', 'p', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "members.nearlyfreespeech.net", false */ 'm', 'e', 'm', 'b', 'e', 'r', 's', '.', 'n', 'e', 'a', 'r', 'l', 'y', 'f', 'r', 'e', 'e', 's', 'p', 'e', 'e', 'c', 'h', '.', 'n', 'e', 't', '\0',
   /* "memdoc.org", true */ 'm', 'e', 'm', 'd', 'o', 'c', '.', 'o', 'r', 'g', '\0',
   /* "meme.institute", true */ 'm', 'e', 'm', 'e', '.', 'i', 'n', 's', 't', 'i', 't', 'u', 't', 'e', '\0',
   /* "memeblast.ninja", true */ 'm', 'e', 'm', 'e', 'b', 'l', 'a', 's', 't', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "memo-linux.com", true */ 'm', 'e', 'm', 'o', '-', 'l', 'i', 'n', 'u', 'x', '.', 'c', 'o', 'm', '\0',
-  /* "mencap.org.uk", true */ 'm', 'e', 'n', 'c', 'a', 'p', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "mensagemaniversario.com.br", true */ 'm', 'e', 'n', 's', 'a', 'g', 'e', 'm', 'a', 'n', 'i', 'v', 'e', 'r', 's', 'a', 'r', 'i', 'o', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "mensagemdaluz.com", true */ 'm', 'e', 'n', 's', 'a', 'g', 'e', 'm', 'd', 'a', 'l', 'u', 'z', '.', 'c', 'o', 'm', '\0',
   /* "mentax.net", false */ 'm', 'e', 'n', 't', 'a', 'x', '.', 'n', 'e', 't', '\0',
   /* "mentiq.az", true */ 'm', 'e', 'n', 't', 'i', 'q', '.', 'a', 'z', '\0',
   /* "mentorithm.com", true */ 'm', 'e', 'n', 't', 'o', 'r', 'i', 't', 'h', 'm', '.', 'c', 'o', 'm', '\0',
   /* "mentz.info", true */ 'm', 'e', 'n', 't', 'z', '.', 'i', 'n', 'f', 'o', '\0',
   /* "menudrivetest.com", true */ 'm', 'e', 'n', 'u', 'd', 'r', 'i', 'v', 'e', 't', 'e', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "menuonlineordering.com", true */ 'm', 'e', 'n', 'u', 'o', 'n', 'l', 'i', 'n', 'e', 'o', 'r', 'd', 'e', 'r', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
@@ -7738,17 +7744,16 @@ static const char kSTSHostTable[] = {
   /* "mytweeps.com", true */ 'm', 'y', 't', 'w', 'e', 'e', 'p', 's', '.', 'c', 'o', 'm', '\0',
   /* "myvpl.com", true */ 'm', 'y', 'v', 'p', 'l', '.', 'c', 'o', 'm', '\0',
   /* "myworkinfo.com", true */ 'm', 'y', 'w', 'o', 'r', 'k', 'i', 'n', 'f', 'o', '.', 'c', 'o', 'm', '\0',
   /* "myworth.com.au", true */ 'm', 'y', 'w', 'o', 'r', 't', 'h', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "myzina.cz", false */ 'm', 'y', 'z', 'i', 'n', 'a', '.', 'c', 'z', '\0',
   /* "n-pix.com", false */ 'n', '-', 'p', 'i', 'x', '.', 'c', 'o', 'm', '\0',
   /* "n-soft.info", true */ 'n', '-', 's', 'o', 'f', 't', '.', 'i', 'n', 'f', 'o', '\0',
   /* "n0paste.tk", true */ 'n', '0', 'p', 'a', 's', 't', 'e', '.', 't', 'k', '\0',
-  /* "n2x.in", false */ 'n', '2', 'x', '.', 'i', 'n', '\0',
   /* "nabankco.com", true */ 'n', 'a', 'b', 'a', 'n', 'k', 'c', 'o', '.', 'c', 'o', 'm', '\0',
   /* "nabru.co.uk", true */ 'n', 'a', 'b', 'r', 'u', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "nabu-bad-nauheim.de", true */ 'n', 'a', 'b', 'u', '-', 'b', 'a', 'd', '-', 'n', 'a', 'u', 'h', 'e', 'i', 'm', '.', 'd', 'e', '\0',
   /* "nabytko.cz", true */ 'n', 'a', 'b', 'y', 't', 'k', 'o', '.', 'c', 'z', '\0',
   /* "nachsendeauftrag.net", true */ 'n', 'a', 'c', 'h', 's', 'e', 'n', 'd', 'e', 'a', 'u', 'f', 't', 'r', 'a', 'g', '.', 'n', 'e', 't', '\0',
   /* "nachsenden.info", true */ 'n', 'a', 'c', 'h', 's', 'e', 'n', 'd', 'e', 'n', '.', 'i', 'n', 'f', 'o', '\0',
   /* "nacktetatsachen.at", true */ 'n', 'a', 'c', 'k', 't', 'e', 't', 'a', 't', 's', 'a', 'c', 'h', 'e', 'n', '.', 'a', 't', '\0',
   /* "nafod.net", true */ 'n', 'a', 'f', 'o', 'd', '.', 'n', 'e', 't', '\0',
@@ -7959,17 +7964,16 @@ static const char kSTSHostTable[] = {
   /* "nfe-elektro.de", true */ 'n', 'f', 'e', '-', 'e', 'l', 'e', 'k', 't', 'r', 'o', '.', 'd', 'e', '\0',
   /* "nfo.so", true */ 'n', 'f', 'o', '.', 's', 'o', '\0',
   /* "nframe.io", true */ 'n', 'f', 'r', 'a', 'm', 'e', '.', 'i', 'o', '\0',
   /* "nfrost.me", true */ 'n', 'f', 'r', 'o', 's', 't', '.', 'm', 'e', '\0',
   /* "nfsec.pl", true */ 'n', 'f', 's', 'e', 'c', '.', 'p', 'l', '\0',
   /* "ng-firewall.com", true */ 'n', 'g', '-', 'f', 'i', 'r', 'e', 'w', 'a', 'l', 'l', '.', 'c', 'o', 'm', '\0',
   /* "nghe.net", true */ 'n', 'g', 'h', 'e', '.', 'n', 'e', 't', '\0',
   /* "nglr.org", true */ 'n', 'g', 'l', 'r', '.', 'o', 'r', 'g', '\0',
-  /* "ngt-service.ru", true */ 'n', 'g', 't', '-', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'r', 'u', '\0',
   /* "nhome.ba", true */ 'n', 'h', 'o', 'm', 'e', '.', 'b', 'a', '\0',
   /* "ni-mate.com", true */ 'n', 'i', '-', 'm', 'a', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "niagarafalls.ca", true */ 'n', 'i', 'a', 'g', 'a', 'r', 'a', 'f', 'a', 'l', 'l', 's', '.', 'c', 'a', '\0',
   /* "niagaraschoice.org", true */ 'n', 'i', 'a', 'g', 'a', 'r', 'a', 's', 'c', 'h', 'o', 'i', 'c', 'e', '.', 'o', 'r', 'g', '\0',
   /* "nibb13.tech", true */ 'n', 'i', 'b', 'b', '1', '3', '.', 't', 'e', 'c', 'h', '\0',
   /* "nicestudio.co.il", false */ 'n', 'i', 'c', 'e', 's', 't', 'u', 'd', 'i', 'o', '.', 'c', 'o', '.', 'i', 'l', '\0',
   /* "nichteinschalten.de", true */ 'n', 'i', 'c', 'h', 't', 'e', 'i', 'n', 's', 'c', 'h', 'a', 'l', 't', 'e', 'n', '.', 'd', 'e', '\0',
   /* "nichthelfer.de", true */ 'n', 'i', 'c', 'h', 't', 'h', 'e', 'l', 'f', 'e', 'r', '.', 'd', 'e', '\0',
@@ -8121,17 +8125,16 @@ static const char kSTSHostTable[] = {
   /* "npw.net", true */ 'n', 'p', 'w', '.', 'n', 'e', 't', '\0',
   /* "nq7.pl", true */ 'n', 'q', '7', '.', 'p', 'l', '\0',
   /* "nrechn.de", true */ 'n', 'r', 'e', 'c', 'h', 'n', '.', 'd', 'e', '\0',
   /* "nrkn.fr", true */ 'n', 'r', 'k', 'n', '.', 'f', 'r', '\0',
   /* "nsa.lol", true */ 'n', 's', 'a', '.', 'l', 'o', 'l', '\0',
   /* "nsa.wtf", true */ 'n', 's', 'a', '.', 'w', 't', 'f', '\0',
   /* "nsboston.org", true */ 'n', 's', 'b', 'o', 's', 't', 'o', 'n', '.', 'o', 'r', 'g', '\0',
   /* "nsboutique.com", true */ 'n', 's', 'b', 'o', 'u', 't', 'i', 'q', 'u', 'e', '.', 'c', 'o', 'm', '\0',
-  /* "nshost.ro", true */ 'n', 's', 'h', 'o', 's', 't', '.', 'r', 'o', '\0',
   /* "nsm.ee", true */ 'n', 's', 'm', '.', 'e', 'e', '\0',
   /* "nspeaks.com", true */ 'n', 's', 'p', 'e', 'a', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "nsweb.solutions", true */ 'n', 's', 'w', 'e', 'b', '.', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '\0',
   /* "nsworks.com", true */ 'n', 's', 'w', 'o', 'r', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "ntotten.com", true */ 'n', 't', 'o', 't', 't', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "ntppool.org", true */ 'n', 't', 'p', 'p', 'o', 'o', 'l', '.', 'o', 'r', 'g', '\0',
   /* "nube.ninja", true */ 'n', 'u', 'b', 'e', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "nubu.at", true */ 'n', 'u', 'b', 'u', '.', 'a', 't', '\0',
@@ -8364,16 +8367,17 @@ static const char kSTSHostTable[] = {
   /* "oroweatorganic.com", true */ 'o', 'r', 'o', 'w', 'e', 'a', 't', 'o', 'r', 'g', 'a', 'n', 'i', 'c', '.', 'c', 'o', 'm', '\0',
   /* "orrs.de", true */ 'o', 'r', 'r', 's', '.', 'd', 'e', '\0',
   /* "osacrypt.studio", true */ 'o', 's', 'a', 'c', 'r', 'y', 'p', 't', '.', 's', 't', 'u', 'd', 'i', 'o', '\0',
   /* "osao.org", true */ 'o', 's', 'a', 'o', '.', 'o', 'r', 'g', '\0',
   /* "oscarvk.ch", true */ 'o', 's', 'c', 'a', 'r', 'v', 'k', '.', 'c', 'h', '\0',
   /* "oscsdp.cz", true */ 'o', 's', 'c', 's', 'd', 'p', '.', 'c', 'z', '\0',
   /* "oses.mobi", true */ 'o', 's', 'e', 's', '.', 'm', 'o', 'b', 'i', '\0',
   /* "oshayr.com", true */ 'o', 's', 'h', 'a', 'y', 'r', '.', 'c', 'o', 'm', '\0',
+  /* "oshell.me", true */ 'o', 's', 'h', 'e', 'l', 'l', '.', 'm', 'e', '\0',
   /* "osm.is", true */ 'o', 's', 'm', '.', 'i', 's', '\0',
   /* "osmanlitorunu.com", true */ 'o', 's', 'm', 'a', 'n', 'l', 'i', 't', 'o', 'r', 'u', 'n', 'u', '.', 'c', 'o', 'm', '\0',
   /* "osmosis.org", true */ 'o', 's', 'm', 'o', 's', 'i', 's', '.', 'o', 'r', 'g', '\0',
   /* "osp.cx", true */ 'o', 's', 'p', '.', 'c', 'x', '\0',
   /* "osquery.io", true */ 'o', 's', 'q', 'u', 'e', 'r', 'y', '.', 'i', 'o', '\0',
   /* "ostan-collections.net", true */ 'o', 's', 't', 'a', 'n', '-', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 's', '.', 'n', 'e', 't', '\0',
   /* "ostendorf.com", true */ 'o', 's', 't', 'e', 'n', 'd', 'o', 'r', 'f', '.', 'c', 'o', 'm', '\0',
   /* "osterkraenzchen.de", true */ 'o', 's', 't', 'e', 'r', 'k', 'r', 'a', 'e', 'n', 'z', 'c', 'h', 'e', 'n', '.', 'd', 'e', '\0',
@@ -8568,17 +8572,16 @@ static const char kSTSHostTable[] = {
   /* "paytwopay.com", true */ 'p', 'a', 'y', 't', 'w', 'o', 'p', 'a', 'y', '.', 'c', 'o', 'm', '\0',
   /* "payupay.ru", true */ 'p', 'a', 'y', 'u', 'p', 'a', 'y', '.', 'r', 'u', '\0',
   /* "pbraunschdash.com", true */ 'p', 'b', 'r', 'a', 'u', 'n', 's', 'c', 'h', 'd', 'a', 's', 'h', '.', 'c', 'o', 'm', '\0',
   /* "pbscreens.com", true */ 'p', 'b', 's', 'c', 'r', 'e', 'e', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "pccentral.nl", true */ 'p', 'c', 'c', 'e', 'n', 't', 'r', 'a', 'l', '.', 'n', 'l', '\0',
   /* "pcel.com", true */ 'p', 'c', 'e', 'l', '.', 'c', 'o', 'm', '\0',
   /* "pcfeuerwehr.de", true */ 'p', 'c', 'f', 'e', 'u', 'e', 'r', 'w', 'e', 'h', 'r', '.', 'd', 'e', '\0',
   /* "pcforum.sk", true */ 'p', 'c', 'f', 'o', 'r', 'u', 'm', '.', 's', 'k', '\0',
-  /* "pcfun.net", true */ 'p', 'c', 'f', 'u', 'n', '.', 'n', 'e', 't', '\0',
   /* "pciconcursos.com.br", true */ 'p', 'c', 'i', 'c', 'o', 'n', 'c', 'u', 'r', 's', 'o', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "pclob.gov", true */ 'p', 'c', 'l', 'o', 'b', '.', 'g', 'o', 'v', '\0',
   /* "pcloud.com", true */ 'p', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0',
   /* "pcnotdienst-oldenburg-rastede.de", true */ 'p', 'c', 'n', 'o', 't', 'd', 'i', 'e', 'n', 's', 't', '-', 'o', 'l', 'd', 'e', 'n', 'b', 'u', 'r', 'g', '-', 'r', 'a', 's', 't', 'e', 'd', 'e', '.', 'd', 'e', '\0',
   /* "pctonic.net", true */ 'p', 'c', 't', 'o', 'n', 'i', 'c', '.', 'n', 'e', 't', '\0',
   /* "pdamsidoarjo.co.id", true */ 'p', 'd', 'a', 'm', 's', 'i', 'd', 'o', 'a', 'r', 'j', 'o', '.', 'c', 'o', '.', 'i', 'd', '\0',
   /* "pdevio.com", true */ 'p', 'd', 'e', 'v', 'i', 'o', '.', 'c', 'o', 'm', '\0',
   /* "pdf.yt", true */ 'p', 'd', 'f', '.', 'y', 't', '\0',
@@ -9032,17 +9035,16 @@ static const char kSTSHostTable[] = {
   /* "proj.org.cn", true */ 'p', 'r', 'o', 'j', '.', 'o', 'r', 'g', '.', 'c', 'n', '\0',
   /* "projectarmy.net", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 'a', 'r', 'm', 'y', '.', 'n', 'e', 't', '\0',
   /* "projectascension.io", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 'a', 's', 'c', 'e', 'n', 's', 'i', 'o', 'n', '.', 'i', 'o', '\0',
   /* "projectbenson.com", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 'b', 'e', 'n', 's', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "projectblackbook.us", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 'b', 'l', 'a', 'c', 'k', 'b', 'o', 'o', 'k', '.', 'u', 's', '\0',
   /* "projectdp.net", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 'd', 'p', '.', 'n', 'e', 't', '\0',
   /* "projektik.cz", true */ 'p', 'r', 'o', 'j', 'e', 'k', 't', 'i', 'k', '.', 'c', 'z', '\0',
   /* "projektzentrisch.de", true */ 'p', 'r', 'o', 'j', 'e', 'k', 't', 'z', 'e', 'n', 't', 'r', 'i', 's', 'c', 'h', '.', 'd', 'e', '\0',
-  /* "prok.pw", true */ 'p', 'r', 'o', 'k', '.', 'p', 'w', '\0',
   /* "prometheanfire.net", true */ 'p', 'r', 'o', 'm', 'e', 't', 'h', 'e', 'a', 'n', 'f', 'i', 'r', 'e', '.', 'n', 'e', 't', '\0',
   /* "prometheanfire.org", true */ 'p', 'r', 'o', 'm', 'e', 't', 'h', 'e', 'a', 'n', 'f', 'i', 'r', 'e', '.', 'o', 'r', 'g', '\0',
   /* "promhadan.com", true */ 'p', 'r', 'o', 'm', 'h', 'a', 'd', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "promisesaplus.com", true */ 'p', 'r', 'o', 'm', 'i', 's', 'e', 's', 'a', 'p', 'l', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "promoscuola.net", true */ 'p', 'r', 'o', 'm', 'o', 's', 'c', 'u', 'o', 'l', 'a', '.', 'n', 'e', 't', '\0',
   /* "promotiongeeks.com", false */ 'p', 'r', 'o', 'm', 'o', 't', 'i', 'o', 'n', 'g', 'e', 'e', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "prontocleaners.co.uk", true */ 'p', 'r', 'o', 'n', 't', 'o', 'c', 'l', 'e', 'a', 'n', 'e', 'r', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "prontomovers.co.uk", true */ 'p', 'r', 'o', 'n', 't', 'o', 'm', 'o', 'v', 'e', 'r', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
@@ -9135,17 +9137,16 @@ static const char kSTSHostTable[] = {
   /* "push.world", true */ 'p', 'u', 's', 'h', '.', 'w', 'o', 'r', 'l', 'd', '\0',
   /* "put.re", true */ 'p', 'u', 't', '.', 'r', 'e', '\0',
   /* "puyblanc.info", true */ 'p', 'u', 'y', 'b', 'l', 'a', 'n', 'c', '.', 'i', 'n', 'f', 'o', '\0',
   /* "puzz.gg", true */ 'p', 'u', 'z', 'z', '.', 'g', 'g', '\0',
   /* "puzz.me", true */ 'p', 'u', 'z', 'z', '.', 'm', 'e', '\0',
   /* "pvcvoordeel.nl", false */ 'p', 'v', 'c', 'v', 'o', 'o', 'r', 'd', 'e', 'e', 'l', '.', 'n', 'l', '\0',
   /* "pvpcraft.ca", true */ 'p', 'v', 'p', 'c', 'r', 'a', 'f', 't', '.', 'c', 'a', '\0',
   /* "pvtschlag.com", true */ 'p', 'v', 't', 's', 'c', 'h', 'l', 'a', 'g', '.', 'c', 'o', 'm', '\0',
-  /* "pwd.ovh", true */ 'p', 'w', 'd', '.', 'o', 'v', 'h', '\0',
   /* "pwdgen.net", true */ 'p', 'w', 'd', 'g', 'e', 'n', '.', 'n', 'e', 't', '\0',
   /* "pwntr.com", true */ 'p', 'w', 'n', 't', 'r', '.', 'c', 'o', 'm', '\0',
   /* "pwolk.com", true */ 'p', 'w', 'o', 'l', 'k', '.', 'c', 'o', 'm', '\0',
   /* "pxx.io", true */ 'p', 'x', 'x', '.', 'i', 'o', '\0',
   /* "pygarage.com", true */ 'p', 'y', 'g', 'a', 'r', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "pyol.org", true */ 'p', 'y', 'o', 'l', '.', 'o', 'r', 'g', '\0',
   /* "pypa.io", true */ 'p', 'y', 'p', 'a', '.', 'i', 'o', '\0',
   /* "pypi-mirrors.org", true */ 'p', 'y', 'p', 'i', '-', 'm', 'i', 'r', 'r', 'o', 'r', 's', '.', 'o', 'r', 'g', '\0',
@@ -9203,16 +9204,17 @@ static const char kSTSHostTable[] = {
   /* "qtvr.com", true */ 'q', 't', 'v', 'r', '.', 'c', 'o', 'm', '\0',
   /* "qtxh.net", true */ 'q', 't', 'x', 'h', '.', 'n', 'e', 't', '\0',
   /* "quaedam.org", true */ 'q', 'u', 'a', 'e', 'd', 'a', 'm', '.', 'o', 'r', 'g', '\0',
   /* "quai10.org", false */ 'q', 'u', 'a', 'i', '1', '0', '.', 'o', 'r', 'g', '\0',
   /* "quakelive.dk", true */ 'q', 'u', 'a', 'k', 'e', 'l', 'i', 'v', 'e', '.', 'd', 'k', '\0',
   /* "qualityedgarsolutions.com", true */ 'q', 'u', 'a', 'l', 'i', 't', 'y', 'e', 'd', 'g', 'a', 'r', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "qualityhomesystems.com", true */ 'q', 'u', 'a', 'l', 'i', 't', 'y', 'h', 'o', 'm', 'e', 's', 'y', 's', 't', 'e', 'm', 's', '.', 'c', 'o', 'm', '\0',
   /* "qualityofcourse.com", false */ 'q', 'u', 'a', 'l', 'i', 't', 'y', 'o', 'f', 'c', 'o', 'u', 'r', 's', 'e', '.', 'c', 'o', 'm', '\0',
+  /* "qualityology.com", true */ 'q', 'u', 'a', 'l', 'i', 't', 'y', 'o', 'l', 'o', 'g', 'y', '.', 'c', 'o', 'm', '\0',
   /* "quanglepro.com", true */ 'q', 'u', 'a', 'n', 'g', 'l', 'e', 'p', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "quantoras.com", true */ 'q', 'u', 'a', 'n', 't', 'o', 'r', 'a', 's', '.', 'c', 'o', 'm', '\0',
   /* "quantum-cloud.xyz", true */ 'q', 'u', 'a', 'n', 't', 'u', 'm', '-', 'c', 'l', 'o', 'u', 'd', '.', 'x', 'y', 'z', '\0',
   /* "quantumfurball.net", true */ 'q', 'u', 'a', 'n', 't', 'u', 'm', 'f', 'u', 'r', 'b', 'a', 'l', 'l', '.', 'n', 'e', 't', '\0',
   /* "quchao.com", true */ 'q', 'u', 'c', 'h', 'a', 'o', '.', 'c', 'o', 'm', '\0',
   /* "quebecmailbox.com", true */ 'q', 'u', 'e', 'b', 'e', 'c', 'm', 'a', 'i', 'l', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0',
   /* "queercinema.ch", true */ 'q', 'u', 'e', 'e', 'r', 'c', 'i', 'n', 'e', 'm', 'a', '.', 'c', 'h', '\0',
   /* "queminventou.com.br", true */ 'q', 'u', 'e', 'm', 'i', 'n', 'v', 'e', 'n', 't', 'o', 'u', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
@@ -9372,16 +9374,17 @@ static const char kSTSHostTable[] = {
   /* "reddingsbrigade-zwolle.nl", true */ 'r', 'e', 'd', 'd', 'i', 'n', 'g', 's', 'b', 'r', 'i', 'g', 'a', 'd', 'e', '-', 'z', 'w', 'o', 'l', 'l', 'e', '.', 'n', 'l', '\0',
   /* "reddit2kindle.com", true */ 'r', 'e', 'd', 'd', 'i', 't', '2', 'k', 'i', 'n', 'd', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "rede-reim.de", true */ 'r', 'e', 'd', 'e', '-', 'r', 'e', 'i', 'm', '.', 'd', 'e', '\0',
   /* "rede.ca", true */ 'r', 'e', 'd', 'e', '.', 'c', 'a', '\0',
   /* "redigest.it", true */ 'r', 'e', 'd', 'i', 'g', 'e', 's', 't', '.', 'i', 't', '\0',
   /* "redirect.fedoraproject.org", true */ 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "redirect.stg.fedoraproject.org", true */ 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '.', 's', 't', 'g', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "redirectman.com", true */ 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'm', 'a', 'n', '.', 'c', 'o', 'm', '\0',
+  /* "rediske.me", true */ 'r', 'e', 'd', 'i', 's', 'k', 'e', '.', 'm', 'e', '\0',
   /* "redit.com", true */ 'r', 'e', 'd', 'i', 't', '.', 'c', 'o', 'm', '\0',
   /* "redletter.link", true */ 'r', 'e', 'd', 'l', 'e', 't', 't', 'e', 'r', '.', 'l', 'i', 'n', 'k', '\0',
   /* "redlink.de", true */ 'r', 'e', 'd', 'l', 'i', 'n', 'k', '.', 'd', 'e', '\0',
   /* "rednsx.org", true */ 'r', 'e', 'd', 'n', 's', 'x', '.', 'o', 'r', 'g', '\0',
   /* "redports.org", false */ 'r', 'e', 'd', 'p', 'o', 'r', 't', 's', '.', 'o', 'r', 'g', '\0',
   /* "redra.ws", true */ 'r', 'e', 'd', 'r', 'a', '.', 'w', 's', '\0',
   /* "redshield.co", true */ 'r', 'e', 'd', 's', 'h', 'i', 'e', 'l', 'd', '.', 'c', 'o', '\0',
   /* "redshiftcybersecurity.co.za", true */ 'r', 'e', 'd', 's', 'h', 'i', 'f', 't', 'c', 'y', 'b', 'e', 'r', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', '.', 'z', 'a', '\0',
@@ -9536,16 +9539,17 @@ static const char kSTSHostTable[] = {
   /* "riesenweber.id.au", true */ 'r', 'i', 'e', 's', 'e', 'n', 'w', 'e', 'b', 'e', 'r', '.', 'i', 'd', '.', 'a', 'u', '\0',
   /* "rift.pictures", true */ 'r', 'i', 'f', 't', '.', 'p', 'i', 'c', 't', 'u', 'r', 'e', 's', '\0',
   /* "rigart-michael.be", true */ 'r', 'i', 'g', 'a', 'r', 't', '-', 'm', 'i', 'c', 'h', 'a', 'e', 'l', '.', 'b', 'e', '\0',
   /* "rigartmichael.be", true */ 'r', 'i', 'g', 'a', 'r', 't', 'm', 'i', 'c', 'h', 'a', 'e', 'l', '.', 'b', 'e', '\0',
   /* "right-to-love.name", true */ 'r', 'i', 'g', 'h', 't', '-', 't', 'o', '-', 'l', 'o', 'v', 'e', '.', 'n', 'a', 'm', 'e', '\0',
   /* "rightbrain.training", true */ 'r', 'i', 'g', 'h', 't', 'b', 'r', 'a', 'i', 'n', '.', 't', 'r', 'a', 'i', 'n', 'i', 'n', 'g', '\0',
   /* "rightcapital.com", true */ 'r', 'i', 'g', 'h', 't', 'c', 'a', 'p', 'i', 't', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "rightstuff.link", true */ 'r', 'i', 'g', 'h', 't', 's', 't', 'u', 'f', 'f', '.', 'l', 'i', 'n', 'k', '\0',
+  /* "righttobuy.gov.uk", true */ 'r', 'i', 'g', 'h', 't', 't', 'o', 'b', 'u', 'y', '.', 'g', 'o', 'v', '.', 'u', 'k', '\0',
   /* "rigolitch.fr", false */ 'r', 'i', 'g', 'o', 'l', 'i', 't', 'c', 'h', '.', 'f', 'r', '\0',
   /* "riiconnect24.net", true */ 'r', 'i', 'i', 'c', 'o', 'n', 'n', 'e', 'c', 't', '2', '4', '.', 'n', 'e', 't', '\0',
   /* "rijschoolgevonden.nl", false */ 'r', 'i', 'j', 's', 'c', 'h', 'o', 'o', 'l', 'g', 'e', 'v', 'o', 'n', 'd', 'e', 'n', '.', 'n', 'l', '\0',
   /* "rileyevans.co.uk", true */ 'r', 'i', 'l', 'e', 'y', 'e', 'v', 'a', 'n', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "ringingliberty.com", true */ 'r', 'i', 'n', 'g', 'i', 'n', 'g', 'l', 'i', 'b', 'e', 'r', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "riscascape.net", true */ 'r', 'i', 's', 'c', 'a', 's', 'c', 'a', 'p', 'e', '.', 'n', 'e', 't', '\0',
   /* "rischard.org", true */ 'r', 'i', 's', 'c', 'h', 'a', 'r', 'd', '.', 'o', 'r', 'g', '\0',
   /* "riseup.net", true */ 'r', 'i', 's', 'e', 'u', 'p', '.', 'n', 'e', 't', '\0',
@@ -9670,33 +9674,32 @@ static const char kSTSHostTable[] = {
   /* "rpy.xyz", true */ 'r', 'p', 'y', '.', 'x', 'y', 'z', '\0',
   /* "rq-labo.jp", true */ 'r', 'q', '-', 'l', 'a', 'b', 'o', '.', 'j', 'p', '\0',
   /* "rr105.de", true */ 'r', 'r', '1', '0', '5', '.', 'd', 'e', '\0',
   /* "rring.me", true */ 'r', 'r', 'i', 'n', 'g', '.', 'm', 'e', '\0',
   /* "rsampaio.info", true */ 'r', 's', 'a', 'm', 'p', 'a', 'i', 'o', '.', 'i', 'n', 'f', 'o', '\0',
   /* "rsblake.net", true */ 'r', 's', 'b', 'l', 'a', 'k', 'e', '.', 'n', 'e', 't', '\0',
   /* "rsi.im", false */ 'r', 's', 'i', '.', 'i', 'm', '\0',
   /* "rssr.se", true */ 'r', 's', 's', 'r', '.', 's', 'e', '\0',
-  /* "rsync.eu", true */ 'r', 's', 'y', 'n', 'c', '.', 'e', 'u', '\0',
   /* "rtcx.net", true */ 'r', 't', 'c', 'x', '.', 'n', 'e', 't', '\0',
   /* "rtd.uk.com", true */ 'r', 't', 'd', '.', 'u', 'k', '.', 'c', 'o', 'm', '\0',
   /* "rtek.se", true */ 'r', 't', 'e', 'k', '.', 's', 'e', '\0',
   /* "rtfpessoa.xyz", true */ 'r', 't', 'f', 'p', 'e', 's', 's', 'o', 'a', '.', 'x', 'y', 'z', '\0',
   /* "ru-sprachstudio.ch", true */ 'r', 'u', '-', 's', 'p', 'r', 'a', 'c', 'h', 's', 't', 'u', 'd', 'i', 'o', '.', 'c', 'h', '\0',
   /* "ru.search.yahoo.com", false */ 'r', 'u', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ruanmi.de", true */ 'r', 'u', 'a', 'n', 'm', 'i', '.', 'd', 'e', '\0',
   /* "rubbermaidoutlet.com", true */ 'r', 'u', 'b', 'b', 'e', 'r', 'm', 'a', 'i', 'd', 'o', 'u', 't', 'l', 'e', 't', '.', 'c', 'o', 'm', '\0',
   /* "rubendv.be", true */ 'r', 'u', 'b', 'e', 'n', 'd', 'v', '.', 'b', 'e', '\0',
   /* "rubi-ka.net", false */ 'r', 'u', 'b', 'i', '-', 'k', 'a', '.', 'n', 'e', 't', '\0',
-  /* "rubysecurity.org", true */ 'r', 'u', 'b', 'y', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'o', 'r', 'g', '\0',
   /* "rudd-o.com", true */ 'r', 'u', 'd', 'd', '-', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ruderverein-gelsenkirchen.de", true */ 'r', 'u', 'd', 'e', 'r', 'v', 'e', 'r', 'e', 'i', 'n', '-', 'g', 'e', 'l', 's', 'e', 'n', 'k', 'i', 'r', 'c', 'h', 'e', 'n', '.', 'd', 'e', '\0',
   /* "ruffbeatz.com", true */ 'r', 'u', 'f', 'f', 'b', 'e', 'a', 't', 'z', '.', 'c', 'o', 'm', '\0',
   /* "rugk.dedyn.io", true */ 'r', 'u', 'g', 'k', '.', 'd', 'e', 'd', 'y', 'n', '.', 'i', 'o', '\0',
   /* "rugstorene.co.uk", true */ 'r', 'u', 'g', 's', 't', 'o', 'r', 'e', 'n', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
+  /* "ruh-veit.de", true */ 'r', 'u', 'h', '-', 'v', 'e', 'i', 't', '.', 'd', 'e', '\0',
   /* "ruhrmobil-e.de", true */ 'r', 'u', 'h', 'r', 'm', 'o', 'b', 'i', 'l', '-', 'e', '.', 'd', 'e', '\0',
   /* "ruja.dk", true */ 'r', 'u', 'j', 'a', '.', 'd', 'k', '\0',
   /* "runcarina.com", true */ 'r', 'u', 'n', 'c', 'a', 'r', 'i', 'n', 'a', '.', 'c', 'o', 'm', '\0',
   /* "rundumcolumn.xyz", true */ 'r', 'u', 'n', 'd', 'u', 'm', 'c', 'o', 'l', 'u', 'm', 'n', '.', 'x', 'y', 'z', '\0',
   /* "runnergrapher.com", true */ 'r', 'u', 'n', 'n', 'e', 'r', 'g', 'r', 'a', 'p', 'h', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "runreport.fr", true */ 'r', 'u', 'n', 'r', 'e', 'p', 'o', 'r', 't', '.', 'f', 'r', '\0',
   /* "runvs.io", true */ 'r', 'u', 'n', 'v', 's', '.', 'i', 'o', '\0',
   /* "runway2street.com", false */ 'r', 'u', 'n', 'w', 'a', 'y', '2', 's', 't', 'r', 'e', 'e', 't', '.', 'c', 'o', 'm', '\0',
@@ -9864,16 +9867,17 @@ static const char kSTSHostTable[] = {
   /* "sazuz.cz", true */ 's', 'a', 'z', 'u', 'z', '.', 'c', 'z', '\0',
   /* "sb.im", true */ 's', 'b', '.', 'i', 'm', '\0',
   /* "sber.us", true */ 's', 'b', 'e', 'r', '.', 'u', 's', '\0',
   /* "sbiewald.de", true */ 's', 'b', 'i', 'e', 'w', 'a', 'l', 'd', '.', 'd', 'e', '\0',
   /* "sbirecruitment.co.in", true */ 's', 'b', 'i', 'r', 'e', 'c', 'r', 'u', 'i', 't', 'm', 'e', 'n', 't', '.', 'c', 'o', '.', 'i', 'n', '\0',
   /* "sbm.cloud", true */ 's', 'b', 'm', '.', 'c', 'l', 'o', 'u', 'd', '\0',
   /* "sbox-archives.com", true */ 's', 'b', 'o', 'x', '-', 'a', 'r', 'c', 'h', 'i', 'v', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "sbssoft.ru", true */ 's', 'b', 's', 's', 'o', 'f', 't', '.', 'r', 'u', '\0',
+  /* "scaling.solutions", true */ 's', 'c', 'a', 'l', 'i', 'n', 'g', '.', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '\0',
   /* "scandicom.fi", true */ 's', 'c', 'a', 'n', 'd', 'i', 'c', 'o', 'm', '.', 'f', 'i', '\0',
   /* "scandinavia.dating", true */ 's', 'c', 'a', 'n', 'd', 'i', 'n', 'a', 'v', 'i', 'a', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0',
   /* "scanleasing.net", true */ 's', 'c', 'a', 'n', 'l', 'e', 'a', 's', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "scannabi.com", true */ 's', 'c', 'a', 'n', 'n', 'a', 'b', 'i', '.', 'c', 'o', 'm', '\0',
   /* "scanpay.dk", true */ 's', 'c', 'a', 'n', 'p', 'a', 'y', '.', 'd', 'k', '\0',
   /* "scenester.tv", true */ 's', 'c', 'e', 'n', 'e', 's', 't', 'e', 'r', '.', 't', 'v', '\0',
   /* "schachburg.de", true */ 's', 'c', 'h', 'a', 'c', 'h', 'b', 'u', 'r', 'g', '.', 'd', 'e', '\0',
   /* "schadegarant.net", true */ 's', 'c', 'h', 'a', 'd', 'e', 'g', 'a', 'r', 'a', 'n', 't', '.', 'n', 'e', 't', '\0',
@@ -9961,17 +9965,16 @@ static const char kSTSHostTable[] = {
   /* "seamless.no", true */ 's', 'e', 'a', 'm', 'l', 'e', 's', 's', '.', 'n', 'o', '\0',
   /* "seanholcroft.co.uk", true */ 's', 'e', 'a', 'n', 'h', 'o', 'l', 'c', 'r', 'o', 'f', 't', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "search.yahoo.com", false */ 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "searchbrothers.com", true */ 's', 'e', 'a', 'r', 'c', 'h', 'b', 'r', 'o', 't', 'h', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "seasons.nu", true */ 's', 'e', 'a', 's', 'o', 'n', 's', '.', 'n', 'u', '\0',
   /* "seatbeltpledge.com", true */ 's', 'e', 'a', 't', 'b', 'e', 'l', 't', 'p', 'l', 'e', 'd', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "seattlefabrication.com", true */ 's', 'e', 'a', 't', 't', 'l', 'e', 'f', 'a', 'b', 'r', 'i', 'c', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "sebastian-bair.de", true */ 's', 'e', 'b', 'a', 's', 't', 'i', 'a', 'n', '-', 'b', 'a', 'i', 'r', '.', 'd', 'e', '\0',
-  /* "sebastian-lutsch.de", true */ 's', 'e', 'b', 'a', 's', 't', 'i', 'a', 'n', '-', 'l', 'u', 't', 's', 'c', 'h', '.', 'd', 'e', '\0',
   /* "sebastian.expert", true */ 's', 'e', 'b', 'a', 's', 't', 'i', 'a', 'n', '.', 'e', 'x', 'p', 'e', 'r', 't', '\0',
   /* "sebastianblade.com", true */ 's', 'e', 'b', 'a', 's', 't', 'i', 'a', 'n', 'b', 'l', 'a', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "sebastianboegl.de", true */ 's', 'e', 'b', 'a', 's', 't', 'i', 'a', 'n', 'b', 'o', 'e', 'g', 'l', '.', 'd', 'e', '\0',
   /* "sebi.org", true */ 's', 'e', 'b', 'i', '.', 'o', 'r', 'g', '\0',
   /* "sec.ec", true */ 's', 'e', 'c', '.', 'e', 'c', '\0',
   /* "sec.gd", true */ 's', 'e', 'c', '.', 'g', 'd', '\0',
   /* "secboom.com", true */ 's', 'e', 'c', 'b', 'o', 'o', 'm', '.', 'c', 'o', 'm', '\0',
   /* "secctexasgiving.org", false */ 's', 'e', 'c', 'c', 't', 'e', 'x', 'a', 's', 'g', 'i', 'v', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0',
@@ -10022,16 +10025,17 @@ static const char kSTSHostTable[] = {
   /* "seedalpha.com", true */ 's', 'e', 'e', 'd', 'a', 'l', 'p', 'h', 'a', '.', 'c', 'o', 'm', '\0',
   /* "seedboxers.net", true */ 's', 'e', 'e', 'd', 'b', 'o', 'x', 'e', 'r', 's', '.', 'n', 'e', 't', '\0',
   /* "seemeagain.com", true */ 's', 'e', 'e', 'm', 'e', 'a', 'g', 'a', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "seen.life", true */ 's', 'e', 'e', 'n', '.', 'l', 'i', 'f', 'e', '\0',
   /* "seesuite.com", true */ 's', 'e', 'e', 's', 'u', 'i', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "seewhatididhere.com", true */ 's', 'e', 'e', 'w', 'h', 'a', 't', 'i', 'd', 'i', 'd', 'h', 'e', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "sefru.de", true */ 's', 'e', 'f', 'r', 'u', '.', 'd', 'e', '\0',
   /* "segitz.de", true */ 's', 'e', 'g', 'i', 't', 'z', '.', 'd', 'e', '\0',
+  /* "segurosbalboa.com.ec", true */ 's', 'e', 'g', 'u', 'r', 'o', 's', 'b', 'a', 'l', 'b', 'o', 'a', '.', 'c', 'o', 'm', '.', 'e', 'c', '\0',
   /* "segurosocial.gov", false */ 's', 'e', 'g', 'u', 'r', 'o', 's', 'o', 'c', 'i', 'a', 'l', '.', 'g', 'o', 'v', '\0',
   /* "seida.at", true */ 's', 'e', 'i', 'd', 'a', '.', 'a', 't', '\0',
   /* "seifried.org", true */ 's', 'e', 'i', 'f', 'r', 'i', 'e', 'd', '.', 'o', 'r', 'g', '\0',
   /* "seitenwaelzer.de", true */ 's', 'e', 'i', 't', 'e', 'n', 'w', 'a', 'e', 'l', 'z', 'e', 'r', '.', 'd', 'e', '\0',
   /* "selcusters.nl", true */ 's', 'e', 'l', 'c', 'u', 's', 't', 'e', 'r', 's', '.', 'n', 'l', '\0',
   /* "selectary.com", true */ 's', 'e', 'l', 'e', 'c', 't', 'a', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "selectel.ru", true */ 's', 'e', 'l', 'e', 'c', 't', 'e', 'l', '.', 'r', 'u', '\0',
   /* "selectorders.com", true */ 's', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'd', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
@@ -10134,17 +10138,16 @@ static const char kSTSHostTable[] = {
   /* "shagi29.ru", true */ 's', 'h', 'a', 'g', 'i', '2', '9', '.', 'r', 'u', '\0',
   /* "shaitan.eu", true */ 's', 'h', 'a', 'i', 't', 'a', 'n', '.', 'e', 'u', '\0',
   /* "shakes4u.com", true */ 's', 'h', 'a', 'k', 'e', 's', '4', 'u', '.', 'c', 'o', 'm', '\0',
   /* "shalott.org", true */ 's', 'h', 'a', 'l', 'o', 't', 't', '.', 'o', 'r', 'g', '\0',
   /* "shamariki.ru", true */ 's', 'h', 'a', 'm', 'a', 'r', 'i', 'k', 'i', '.', 'r', 'u', '\0',
   /* "shan.io", false */ 's', 'h', 'a', 'n', '.', 'i', 'o', '\0',
   /* "shanae.nl", true */ 's', 'h', 'a', 'n', 'a', 'e', '.', 'n', 'l', '\0',
   /* "shanetully.com", true */ 's', 'h', 'a', 'n', 'e', 't', 'u', 'l', 'l', 'y', '.', 'c', 'o', 'm', '\0',
-  /* "shanewadleigh.com", true */ 's', 'h', 'a', 'n', 'e', 'w', 'a', 'd', 'l', 'e', 'i', 'g', 'h', '.', 'c', 'o', 'm', '\0',
   /* "shannoneichorn.com", true */ 's', 'h', 'a', 'n', 'n', 'o', 'n', 'e', 'i', 'c', 'h', 'o', 'r', 'n', '.', 'c', 'o', 'm', '\0',
   /* "shansing.com", true */ 's', 'h', 'a', 'n', 's', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "shansing.net", true */ 's', 'h', 'a', 'n', 's', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "shansing.space", true */ 's', 'h', 'a', 'n', 's', 'i', 'n', 'g', '.', 's', 'p', 'a', 'c', 'e', '\0',
   /* "shareimg.xyz", true */ 's', 'h', 'a', 'r', 'e', 'i', 'm', 'g', '.', 'x', 'y', 'z', '\0',
   /* "sharepic.xyz", true */ 's', 'h', 'a', 'r', 'e', 'p', 'i', 'c', '.', 'x', 'y', 'z', '\0',
   /* "sharepointdrive.com", true */ 's', 'h', 'a', 'r', 'e', 'p', 'o', 'i', 'n', 't', 'd', 'r', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0',
   /* "sharesplitter.com", true */ 's', 'h', 'a', 'r', 'e', 's', 'p', 'l', 'i', 't', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
@@ -10300,16 +10303,17 @@ static const char kSTSHostTable[] = {
   /* "sirenslove.com", true */ 's', 'i', 'r', 'e', 'n', 's', 'l', 'o', 'v', 'e', '.', 'c', 'o', 'm', '\0',
   /* "siriuspup.com", true */ 's', 'i', 'r', 'i', 'u', 's', 'p', 'u', 'p', '.', 'c', 'o', 'm', '\0',
   /* "sistem-maklumat.com", true */ 's', 'i', 's', 't', 'e', 'm', '-', 'm', 'a', 'k', 'l', 'u', 'm', 'a', 't', '.', 'c', 'o', 'm', '\0',
   /* "sistem-maklumat.com.my", true */ 's', 'i', 's', 't', 'e', 'm', '-', 'm', 'a', 'k', 'l', 'u', 'm', 'a', 't', '.', 'c', 'o', 'm', '.', 'm', 'y', '\0',
   /* "sistemy48.ru", true */ 's', 'i', 's', 't', 'e', 'm', 'y', '4', '8', '.', 'r', 'u', '\0',
   /* "sistersurprise.de", true */ 's', 'i', 's', 't', 'e', 'r', 's', 'u', 'r', 'p', 'r', 'i', 's', 'e', '.', 'd', 'e', '\0',
   /* "sisv.eu", true */ 's', 'i', 's', 'v', '.', 'e', 'u', '\0',
   /* "sitc.sk", true */ 's', 'i', 't', 'c', '.', 's', 'k', '\0',
+  /* "sitehost.io", true */ 's', 'i', 't', 'e', 'h', 'o', 's', 't', '.', 'i', 'o', '\0',
   /* "sitennisclub.com", true */ 's', 'i', 't', 'e', 'n', 'n', 'i', 's', 'c', 'l', 'u', 'b', '.', 'c', 'o', 'm', '\0',
   /* "sites.google.com", true */ 's', 'i', 't', 'e', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "sitesko.de", true */ 's', 'i', 't', 'e', 's', 'k', 'o', '.', 'd', 'e', '\0',
   /* "sizingservers.be", false */ 's', 'i', 'z', 'i', 'n', 'g', 's', 'e', 'r', 'v', 'e', 'r', 's', '.', 'b', 'e', '\0',
   /* "sizzle.co.uk", true */ 's', 'i', 'z', 'z', 'l', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "sjoorm.com", true */ 's', 'j', 'o', 'o', 'r', 'm', '.', 'c', 'o', 'm', '\0',
   /* "skalender.ch", false */ 's', 'k', 'a', 'l', 'e', 'n', 'd', 'e', 'r', '.', 'c', 'h', '\0',
   /* "skanvordoff.ru", true */ 's', 'k', 'a', 'n', 'v', 'o', 'r', 'd', 'o', 'f', 'f', '.', 'r', 'u', '\0',
@@ -10444,17 +10448,16 @@ static const char kSTSHostTable[] = {
   /* "sneed.it", true */ 's', 'n', 'e', 'e', 'd', '.', 'i', 't', '\0',
   /* "sneedit.com", true */ 's', 'n', 'e', 'e', 'd', 'i', 't', '.', 'c', 'o', 'm', '\0',
   /* "sneedit.de", true */ 's', 'n', 'e', 'e', 'd', 'i', 't', '.', 'd', 'e', '\0',
   /* "sneezry.com", true */ 's', 'n', 'e', 'e', 'z', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "snelshops.nl", true */ 's', 'n', 'e', 'l', 's', 'h', 'o', 'p', 's', '.', 'n', 'l', '\0',
   /* "snelwebshop.nl", true */ 's', 'n', 'e', 'l', 'w', 'e', 'b', 's', 'h', 'o', 'p', '.', 'n', 'l', '\0',
   /* "snelxboxlivegold.nl", true */ 's', 'n', 'e', 'l', 'x', 'b', 'o', 'x', 'l', 'i', 'v', 'e', 'g', 'o', 'l', 'd', '.', 'n', 'l', '\0',
   /* "snfdata.com", true */ 's', 'n', 'f', 'd', 'a', 't', 'a', '.', 'c', 'o', 'm', '\0',
-  /* "sniderman.eu.org", true */ 's', 'n', 'i', 'd', 'e', 'r', 'm', 'a', 'n', '.', 'e', 'u', '.', 'o', 'r', 'g', '\0',
   /* "sniep.net", true */ 's', 'n', 'i', 'e', 'p', '.', 'n', 'e', 't', '\0',
   /* "snille.com", true */ 's', 'n', 'i', 'l', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "snip.host", true */ 's', 'n', 'i', 'p', '.', 'h', 'o', 's', 't', '\0',
   /* "snl.no", true */ 's', 'n', 'l', '.', 'n', 'o', '\0',
   /* "snod.land", true */ 's', 'n', 'o', 'd', '.', 'l', 'a', 'n', 'd', '\0',
   /* "snoozedds.com", true */ 's', 'n', 'o', 'o', 'z', 'e', 'd', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "snoupon.com", true */ 's', 'n', 'o', 'u', 'p', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "snow-online.com", true */ 's', 'n', 'o', 'w', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
@@ -10477,17 +10480,16 @@ static const char kSTSHostTable[] = {
   /* "socialworkout.com", true */ 's', 'o', 'c', 'i', 'a', 'l', 'w', 'o', 'r', 'k', 'o', 'u', 't', '.', 'c', 'o', 'm', '\0',
   /* "socialworkout.net", true */ 's', 'o', 'c', 'i', 'a', 'l', 'w', 'o', 'r', 'k', 'o', 'u', 't', '.', 'n', 'e', 't', '\0',
   /* "socialworkout.org", true */ 's', 'o', 'c', 'i', 'a', 'l', 'w', 'o', 'r', 'k', 'o', 'u', 't', '.', 'o', 'r', 'g', '\0',
   /* "socialworkout.tv", true */ 's', 'o', 'c', 'i', 'a', 'l', 'w', 'o', 'r', 'k', 'o', 'u', 't', '.', 't', 'v', '\0',
   /* "societyhilldance.com", true */ 's', 'o', 'c', 'i', 'e', 't', 'y', 'h', 'i', 'l', 'l', 'd', 'a', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "socioambiental.org", true */ 's', 'o', 'c', 'i', 'o', 'a', 'm', 'b', 'i', 'e', 'n', 't', 'a', 'l', '.', 'o', 'r', 'g', '\0',
   /* "sockeye.io", true */ 's', 'o', 'c', 'k', 'e', 'y', 'e', '.', 'i', 'o', '\0',
   /* "sodi.nl", true */ 's', 'o', 'd', 'i', '.', 'n', 'l', '\0',
-  /* "soe-server.com", true */ 's', 'o', 'e', '-', 's', 'e', 'r', 'v', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "sofabedshop.de", true */ 's', 'o', 'f', 'a', 'b', 'e', 'd', 's', 'h', 'o', 'p', '.', 'd', 'e', '\0',
   /* "sofort.com", true */ 's', 'o', 'f', 'o', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "sofortueberweisung.de", true */ 's', 'o', 'f', 'o', 'r', 't', 'u', 'e', 'b', 'e', 'r', 'w', 'e', 'i', 's', 'u', 'n', 'g', '.', 'd', 'e', '\0',
   /* "softanka.com", true */ 's', 'o', 'f', 't', 'a', 'n', 'k', 'a', '.', 'c', 'o', 'm', '\0',
   /* "softwarebetrieb.de", true */ 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', 'b', 'e', 't', 'r', 'i', 'e', 'b', '.', 'd', 'e', '\0',
   /* "softwaredesign.foundation", true */ 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', 'd', 'e', 's', 'i', 'g', 'n', '.', 'f', 'o', 'u', 'n', 'd', 'a', 't', 'i', 'o', 'n', '\0',
   /* "softwerk-edv.de", true */ 's', 'o', 'f', 't', 'w', 'e', 'r', 'k', '-', 'e', 'd', 'v', '.', 'd', 'e', '\0',
   /* "sogravatas.com.br", true */ 's', 'o', 'g', 'r', 'a', 'v', 'a', 't', 'a', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
@@ -10864,39 +10866,41 @@ static const char kSTSHostTable[] = {
   /* "stupendous.net", true */ 's', 't', 'u', 'p', 'e', 'n', 'd', 'o', 'u', 's', '.', 'n', 'e', 't', '\0',
   /* "sturbi.de", true */ 's', 't', 'u', 'r', 'b', 'i', '.', 'd', 'e', '\0',
   /* "sturbock.me", true */ 's', 't', 'u', 'r', 'b', 'o', 'c', 'k', '.', 'm', 'e', '\0',
   /* "stutelage.com", true */ 's', 't', 'u', 't', 'e', 'l', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "stuur.nl", false */ 's', 't', 'u', 'u', 'r', '.', 'n', 'l', '\0',
   /* "stygium.net", true */ 's', 't', 'y', 'g', 'i', 'u', 'm', '.', 'n', 'e', 't', '\0',
   /* "styleci.io", true */ 's', 't', 'y', 'l', 'e', 'c', 'i', '.', 'i', 'o', '\0',
   /* "stylenda.com", true */ 's', 't', 'y', 'l', 'e', 'n', 'd', 'a', '.', 'c', 'o', 'm', '\0',
+  /* "styles.pm", true */ 's', 't', 'y', 'l', 'e', 's', '.', 'p', 'm', '\0',
   /* "stylle.me", true */ 's', 't', 'y', 'l', 'l', 'e', '.', 'm', 'e', '\0',
   /* "su1ph3r.io", true */ 's', 'u', '1', 'p', 'h', '3', 'r', '.', 'i', 'o', '\0',
   /* "suave.io", true */ 's', 'u', 'a', 'v', 'e', '.', 'i', 'o', '\0',
   /* "subeesu.com", true */ 's', 'u', 'b', 'e', 'e', 's', 'u', '.', 'c', 'o', 'm', '\0',
   /* "sublevel.net", false */ 's', 'u', 'b', 'l', 'e', 'v', 'e', 'l', '.', 'n', 'e', 't', '\0',
   /* "subohm.com", true */ 's', 'u', 'b', 'o', 'h', 'm', '.', 'c', 'o', 'm', '\0',
   /* "suborbital.io", true */ 's', 'u', 'b', 'o', 'r', 'b', 'i', 't', 'a', 'l', '.', 'i', 'o', '\0',
   /* "subseq.net", false */ 's', 'u', 'b', 's', 'e', 'q', '.', 'n', 'e', 't', '\0',
   /* "subsys.no", true */ 's', 'u', 'b', 's', 'y', 's', '.', 'n', 'o', '\0',
   /* "suburban-landscape.net", true */ 's', 'u', 'b', 'u', 'r', 'b', 'a', 'n', '-', 'l', 'a', 'n', 'd', 's', 'c', 'a', 'p', 'e', '.', 'n', 'e', 't', '\0',
   /* "suche.org", true */ 's', 'u', 'c', 'h', 'e', '.', 'o', 'r', 'g', '\0',
   /* "suckmyan.us", true */ 's', 'u', 'c', 'k', 'm', 'y', 'a', 'n', '.', 'u', 's', '\0',
   /* "sudaraka.org", true */ 's', 'u', 'd', 'a', 'r', 'a', 'k', 'a', '.', 'o', 'r', 'g', '\0',
+  /* "sudo.im", true */ 's', 'u', 'd', 'o', '.', 'i', 'm', '\0',
   /* "sudo.ws", true */ 's', 'u', 'd', 'o', '.', 'w', 's', '\0',
   /* "sudoschool.com", true */ 's', 'u', 'd', 'o', 's', 'c', 'h', 'o', 'o', 'l', '.', 'c', 'o', 'm', '\0',
-  /* "sufix.cz", true */ 's', 'u', 'f', 'i', 'x', '.', 'c', 'z', '\0',
   /* "suian.or.jp", true */ 's', 'u', 'i', 'a', 'n', '.', 'o', 'r', '.', 'j', 'p', '\0',
   /* "suitocracy.com", true */ 's', 'u', 'i', 't', 'o', 'c', 'r', 'a', 'c', 'y', '.', 'c', 'o', 'm', '\0',
   /* "sulek.eu", true */ 's', 'u', 'l', 'e', 'k', '.', 'e', 'u', '\0',
   /* "summitbankofkc.com", true */ 's', 'u', 'm', 'm', 'i', 't', 'b', 'a', 'n', 'k', 'o', 'f', 'k', 'c', '.', 'c', 'o', 'm', '\0',
   /* "sunbritetv.com", true */ 's', 'u', 'n', 'b', 'r', 'i', 't', 'e', 't', 'v', '.', 'c', 'o', 'm', '\0',
   /* "sundayfundayjapan.com", true */ 's', 'u', 'n', 'd', 'a', 'y', 'f', 'u', 'n', 'd', 'a', 'y', 'j', 'a', 'p', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "suneilpatel.com", true */ 's', 'u', 'n', 'e', 'i', 'l', 'p', 'a', 't', 'e', 'l', '.', 'c', 'o', 'm', '\0',
+  /* "sunflyer.cn", false */ 's', 'u', 'n', 'f', 'l', 'y', 'e', 'r', '.', 'c', 'n', '\0',
   /* "sunjaydhama.com", true */ 's', 'u', 'n', 'j', 'a', 'y', 'd', 'h', 'a', 'm', 'a', '.', 'c', 'o', 'm', '\0',
   /* "sunnyfruit.ru", true */ 's', 'u', 'n', 'n', 'y', 'f', 'r', 'u', 'i', 't', '.', 'r', 'u', '\0',
   /* "sunsetwx.com", true */ 's', 'u', 'n', 's', 'e', 't', 'w', 'x', '.', 'c', 'o', 'm', '\0',
   /* "sunstar.bg", true */ 's', 'u', 'n', 's', 't', 'a', 'r', '.', 'b', 'g', '\0',
   /* "suos.io", true */ 's', 'u', 'o', 's', '.', 'i', 'o', '\0',
   /* "supastuds.com", true */ 's', 'u', 'p', 'a', 's', 't', 'u', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "supcro.com", true */ 's', 'u', 'p', 'c', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "super-o-blog.com", true */ 's', 'u', 'p', 'e', 'r', '-', 'o', '-', 'b', 'l', 'o', 'g', '.', 'c', 'o', 'm', '\0',
@@ -10929,17 +10933,16 @@ static const char kSTSHostTable[] = {
   /* "suspiciousdarknet.xyz", true */ 's', 'u', 's', 'p', 'i', 'c', 'i', 'o', 'u', 's', 'd', 'a', 'r', 'k', 'n', 'e', 't', '.', 'x', 'y', 'z', '\0',
   /* "sustainability.gov", true */ 's', 'u', 's', 't', 'a', 'i', 'n', 'a', 'b', 'i', 'l', 'i', 't', 'y', '.', 'g', 'o', 'v', '\0',
   /* "sustsol.com", true */ 's', 'u', 's', 't', 's', 'o', 'l', '.', 'c', 'o', 'm', '\0',
   /* "suwalls.com", true */ 's', 'u', 'w', 'a', 'l', 'l', 's', '.', 'c', 'o', 'm', '\0',
   /* "sv-turm-hohenlimburg.de", true */ 's', 'v', '-', 't', 'u', 'r', 'm', '-', 'h', 'o', 'h', 'e', 'n', 'l', 'i', 'm', 'b', 'u', 'r', 'g', '.', 'd', 'e', '\0',
   /* "svager.cz", true */ 's', 'v', 'a', 'g', 'e', 'r', '.', 'c', 'z', '\0',
   /* "svarovani.tk", true */ 's', 'v', 'a', 'r', 'o', 'v', 'a', 'n', 'i', '.', 't', 'k', '\0',
   /* "svatba-frantovi.cz", true */ 's', 'v', 'a', 't', 'b', 'a', '-', 'f', 'r', 'a', 'n', 't', 'o', 'v', 'i', '.', 'c', 'z', '\0',
-  /* "svendubbeld.nl", true */ 's', 'v', 'e', 'n', 'd', 'u', 'b', 'b', 'e', 'l', 'd', '.', 'n', 'l', '\0',
   /* "sveneckelmann.de", true */ 's', 'v', 'e', 'n', 'e', 'c', 'k', 'e', 'l', 'm', 'a', 'n', 'n', '.', 'd', 'e', '\0',
   /* "svenluijten.com", true */ 's', 'v', 'e', 'n', 'l', 'u', 'i', 'j', 't', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "svenskacasino.com", true */ 's', 'v', 'e', 'n', 's', 'k', 'a', 'c', 'a', 's', 'i', 'n', 'o', '.', 'c', 'o', 'm', '\0',
   /* "svijet-medija.hr", true */ 's', 'v', 'i', 'j', 'e', 't', '-', 'm', 'e', 'd', 'i', 'j', 'a', '.', 'h', 'r', '\0',
   /* "sw-servers.net", true */ 's', 'w', '-', 's', 'e', 'r', 'v', 'e', 'r', 's', '.', 'n', 'e', 't', '\0',
   /* "swaggerdile.com", true */ 's', 'w', 'a', 'g', 'g', 'e', 'r', 'd', 'i', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "swaleacademiestrust.org.uk", true */ 's', 'w', 'a', 'l', 'e', 'a', 'c', 'a', 'd', 'e', 'm', 'i', 'e', 's', 't', 'r', 'u', 's', 't', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "swansdoor.org", true */ 's', 'w', 'a', 'n', 's', 'd', 'o', 'o', 'r', '.', 'o', 'r', 'g', '\0',
@@ -11004,17 +11007,16 @@ static const char kSTSHostTable[] = {
   /* "szaydon.me", false */ 's', 'z', 'a', 'y', 'd', 'o', 'n', '.', 'm', 'e', '\0',
   /* "szechenyi2020.hu", true */ 's', 'z', 'e', 'c', 'h', 'e', 'n', 'y', 'i', '2', '0', '2', '0', '.', 'h', 'u', '\0',
   /* "szentistvanpt.sk", true */ 's', 'z', 'e', 'n', 't', 'i', 's', 't', 'v', 'a', 'n', 'p', 't', '.', 's', 'k', '\0',
   /* "szongott.net", true */ 's', 'z', 'o', 'n', 'g', 'o', 't', 't', '.', 'n', 'e', 't', '\0',
   /* "t-complex.space", true */ 't', '-', 'c', 'o', 'm', 'p', 'l', 'e', 'x', '.', 's', 'p', 'a', 'c', 'e', '\0',
   /* "t-hawk.com", true */ 't', '-', 'h', 'a', 'w', 'k', '.', 'c', 'o', 'm', '\0',
   /* "t-point.eu", true */ 't', '-', 'p', 'o', 'i', 'n', 't', '.', 'e', 'u', '\0',
   /* "t-shirts4less.nl", true */ 't', '-', 's', 'h', 'i', 'r', 't', 's', '4', 'l', 'e', 's', 's', '.', 'n', 'l', '\0',
-  /* "t-tz.com", true */ 't', '-', 't', 'z', '.', 'c', 'o', 'm', '\0',
   /* "t0dd.eu", false */ 't', '0', 'd', 'd', '.', 'e', 'u', '\0',
   /* "t23m-navi.jp", false */ 't', '2', '3', 'm', '-', 'n', 'a', 'v', 'i', '.', 'j', 'p', '\0',
   /* "t3rror.net", true */ 't', '3', 'r', 'r', 'o', 'r', '.', 'n', 'e', 't', '\0',
   /* "t7e.de", true */ 't', '7', 'e', '.', 'd', 'e', '\0',
   /* "ta-sports.net", true */ 't', 'a', '-', 's', 'p', 'o', 'r', 't', 's', '.', 'n', 'e', 't', '\0',
   /* "tabelfirme.ro", true */ 't', 'a', 'b', 'e', 'l', 'f', 'i', 'r', 'm', 'e', '.', 'r', 'o', '\0',
   /* "tabla-periodica.com", true */ 't', 'a', 'b', 'l', 'a', '-', 'p', 'e', 'r', 'i', 'o', 'd', 'i', 'c', 'a', '.', 'c', 'o', 'm', '\0',
   /* "tablotv.com", false */ 't', 'a', 'b', 'l', 'o', 't', 'v', '.', 'c', 'o', 'm', '\0',
@@ -11097,17 +11099,16 @@ static const char kSTSHostTable[] = {
   /* "tdude.co", true */ 't', 'd', 'u', 'd', 'e', '.', 'c', 'o', '\0',
   /* "teabagdesign.co.uk", true */ 't', 'e', 'a', 'b', 'a', 'g', 'd', 'e', 's', 'i', 'g', 'n', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "teachercreatedmaterials.com", true */ 't', 'e', 'a', 'c', 'h', 'e', 'r', 'c', 'r', 'e', 'a', 't', 'e', 'd', 'm', 'a', 't', 'e', 'r', 'i', 'a', 'l', 's', '.', 'c', 'o', 'm', '\0',
   /* "teachpeople.org", true */ 't', 'e', 'a', 'c', 'h', 'p', 'e